diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b14d842 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/xedit"] + path = lib/xedit + url = git@github.com:TES5Edit/TES5Edit.git +[submodule "lib/loggerpro"] + path = lib/loggerpro + url = git@github.com:danieleteti/loggerpro.git diff --git a/frontend/Fallout3.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat b/frontend/Fallout3.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat deleted file mode 100644 index eadd153..0000000 Binary files a/frontend/Fallout3.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat and /dev/null differ diff --git a/frontend/Fallout4.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat b/frontend/Fallout4.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat deleted file mode 100644 index 8e937e2..0000000 Binary files a/frontend/Fallout4.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat and /dev/null differ diff --git a/frontend/FalloutNV.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat b/frontend/FalloutNV.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat deleted file mode 100644 index c5773d1..0000000 Binary files a/frontend/FalloutNV.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat and /dev/null differ diff --git a/frontend/MatorSmash.dpr b/frontend/MatorSmash.dpr old mode 100644 new mode 100755 index ade3a49..499c299 --- a/frontend/MatorSmash.dpr +++ b/frontend/MatorSmash.dpr @@ -1,16 +1,17 @@ -{******************************************************************************* +{ ******************************************************************************* - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. + The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ -*******************************************************************************} + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + ******************************************************************************* } program MatorSmash; @@ -21,7 +22,6 @@ uses Dialogs, Controls, SysUtils, - // lib\mte CRC32 in '..\lib\mte\CRC32.pas', mteBase in '..\lib\mte\mteBase.pas', mteChangeLogForm in '..\lib\mte\mteChangeLogForm.pas', @@ -35,8 +35,7 @@ uses RttiJson in '..\lib\mte\RttiJson.pas', RttiTranslation in '..\lib\mte\RttiTranslation.pas', W7Taskbar in '..\lib\mte\W7Taskbar.pas', - // lib\xedit - wbBSA in '..\lib\xedit\wbBSA.pas', + wbInit in '..\lib\xedit\wbInit.pas', wbDefinitionsFNV in '..\lib\xedit\wbDefinitionsFNV.pas', wbDefinitionsFO3 in '..\lib\xedit\wbDefinitionsFO3.pas', wbDefinitionsFO4 in '..\lib\xedit\wbDefinitionsFO4.pas', @@ -49,7 +48,6 @@ uses wbLocalization in '..\lib\xedit\wbLocalization.pas', wbSort in '..\lib\xedit\wbSort.pas', wbStreams in '..\lib\xedit\wbStreams.pas', - // Smash msConfiguration in 'msConfiguration.pas', msCore in 'msCore.pas', msLoader in 'msLoader.pas', @@ -57,18 +55,21 @@ uses msChoicePanel in 'msChoicePanel.pas', msSmash in 'msSmash.pas', msAlgorithm in 'msAlgorithm.pas', - msProfileForm in 'msProfileForm.pas' {ProfileForm}, + msProfileForm in 'msProfileForm.pas' {ProfileForm} , msProfilePanel in 'msProfilePanel.pas', - msSmashForm in 'msSmashForm.pas' {SmashForm}, + msSmashForm in 'msSmashForm.pas' {SmashForm} , msThreads in 'msThreads.pas', - msOptionsForm in 'msOptionsForm.pas' {OptionsForm}, - msSplashForm in 'msSplashForm.pas' {SplashForm}, - msEditForm in 'msEditForm.pas' {EditForm}, - msSettingsManager in 'msSettingsManager.pas' {SettingsManager}, - msPluginSelectionForm in 'msPluginSelectionForm.pas' {MiniPluginSelectionForm}, - msConflictForm in 'msConflictForm.pas' {ConflictForm}, - msTagManager in 'msTagManager.pas' {TagManager}, - msTagHelper in 'msTagHelper.pas' {TagHelper}; + msOptionsForm in 'msOptionsForm.pas' {OptionsForm} , + msSplashForm in 'msSplashForm.pas' {SplashForm} , + msEditForm in 'msEditForm.pas' {EditForm} , + msSettingsManager in 'msSettingsManager.pas' {SettingsManager} , + msPluginSelectionForm + in 'msPluginSelectionForm.pas' {MiniPluginSelectionForm} , + msConflictForm in 'msConflictForm.pas' {ConflictForm} , + msTagManager in 'msTagManager.pas' {TagManager} , + msTagHelper in 'msTagHelper.pas' {TagHelper} , + Vcl.Themes, + Vcl.Styles; {$R *.res} {$MAXSTACKSIZE 2097152} @@ -76,32 +77,34 @@ uses const IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020; - -{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} +{$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} var bProfileProvided, bUseUTF8: boolean; sParam, sProfile, sPath: string; i: Integer; aSettings: TSettings; + begin // set important vars SysUtils.FormatSettings.DecimalSeparator := '.'; Application.HintHidePause := 8000; - //ReportMemoryLeaksOnShutdown := true; + // ReportMemoryLeaksOnShutdown := true; PathList.Values['ProgramPath'] := ExtractFilePath(ParamStr(0)); // get current profile if profile switch provided - for i := 1 to ParamCount do begin + for i := 1 to ParamCount do + begin sParam := ParamStr(i); if sParam = '-profile' then sProfile := ParamStr(i + 1); if sParam = '-utf8' then - wbStringEncoding := seUTF8; + wbEncoding := TEncoding.UTF8; end; bProfileProvided := sProfile <> ''; sPath := Format('%sprofiles\%s\settings.ini', [ProgramPath, sProfile]); - if bProfileProvided and FileExists(sPath) then begin + if bProfileProvided and FileExists(sPath) then + begin aSettings := TSettings.Create; TRttiIni.Load(sPath, aSettings); CurrentProfile := TProfile.Create(aSettings.profile); @@ -117,9 +120,10 @@ begin LoadStatistics; // have user select game mode - if not bProfileProvided then begin + if not bProfileProvided then + begin ProfileForm := TProfileForm.Create(nil); - if not (ProfileForm.ShowModal = mrOk) then + if not(ProfileForm.ShowModal = mrOk) then exit; ProfileForm.Free; end; @@ -137,4 +141,5 @@ begin Application.CreateForm(TTagManager, TagManager); Application.CreateForm(TTagHelper, TagHelper); Application.Run; + end. diff --git a/frontend/MatorSmash.dproj b/frontend/MatorSmash.dproj old mode 100644 new mode 100755 index 5dc8112..d62cda5 --- a/frontend/MatorSmash.dproj +++ b/frontend/MatorSmash.dproj @@ -1,220 +1,1302 @@ - - - {12317C9C-736E-45A4-8CB7-E43FF92DD93C} - MatorSmash.dpr - True - Release - Application - VCL - DCC32 - 13.4 - Win32 - 1 - Win32 - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - vcl;rtl;vclx;vclactnband;xmlrtl;VclSmp;vclimg;svnui;svn;bdertl;TeeUI;TeeDB;Tee;vcldb;dbrtl;vcldbx;vcltouch;dsnap;dsnapcon;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_110_150;Intraweb_110_150;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DataSnapClient;dbxcds;DbxClientDriver;DataSnapServer;AzureCloud;DBXInterBaseDriver;DBXMySQLDriver;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver - ..\lib\Imaging\ZLib;..\lib\abbrevia\source;..\lib\Imaging;..\lib\xedit;..\lib\mte;..\lib\superobject;..\lib\xedit\zlib;..\lib\xedit\lz4;$(DCC_UnitSearchPath) - false - false - false - false - false - TES5Edit_Icon.ico - false - false - None - 3081 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;FMX;System.Win;$(DCC_Namespace) - false - 00400000 - false - false - false - false - - - true - DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;$(DCC_Define) - 3 - DetailedSegments - - - .\DebugLite - DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;LiteVersion;$(DCC_Define) - 3 - DetailedSegments - true - - - false - false - false - false - false - 0 - - - - MainSource - - - RC - RC -
smash.res
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ProfileForm
-
- - -
SmashForm
-
- - -
OptionsForm
-
- -
SplashForm
-
- -
EditForm
-
- -
SettingsManager
-
- -
MiniPluginSelectionForm
-
- -
ConflictForm
-
- -
TagManager
-
- -
TagHelper
-
- - - Cfg_2 - Base - - - Cfg_4 - Base - - - Base - - - Cfg_1 - Base - -
- - - - Delphi.Personality.12 - VCLApplication - - - - MatorSmash.dpr - - - True - False - 1 - 0 - 1 - 0 - True - True - False - False - False - 1033 - 1252 - - - - - 1.0.1.0 - - - - - Mator Smash - 1.0 - created by matortheeternal - - - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components - - - - - False - True - - True - - 12 - -
+ + + {12317C9C-736E-45A4-8CB7-E43FF92DD93C} + MatorSmash.dpr + True + Release + Application + VCL + DCC32 + 19.2 + Win64 + 3 + Win32 + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + true + Base + true + + + true + Cfg_4 + true + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + vcl;rtl;vclx;vclactnband;xmlrtl;VclSmp;vclimg;svnui;svn;bdertl;TeeUI;TeeDB;Tee;vcldb;dbrtl;vcldbx;vcltouch;dsnap;dsnapcon;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_110_150;Intraweb_110_150;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DataSnapClient;dbxcds;DbxClientDriver;DataSnapServer;AzureCloud;DBXInterBaseDriver;DBXMySQLDriver;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;$(DCC_UsePackage) + ..\lib\Imaging\ZLib;..\lib\abbrevia\source;..\lib\Imaging;..\lib\xedit;..\lib\mte;..\lib\superobject;..\lib\xedit\lz4;..\lib\xedit\zlib;..\lib\xedit\FileContainer;..\lib\xedit\tools\BSArchive;..\lib\xedit\tools\BSArchive\TForge;..\lib\LoggerPro;$(DCC_UnitSearchPath) + false + false + false + false + false + TES5Edit_Icon.ico + false + false + None + 3081 + CompanyName=;FileDescription=;FileVersion=2.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;FMX;System.Win;$(DCC_Namespace) + false + 00400000 + false + false + false + false + MatorSmash + true + true + true + 2 + + + Resources\smash.png + Resources\smash.png + MatorSmash_Icon.ico + + + Resources\smash.png + Resources\smash.png + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=2.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + MatorSmash_Icon.ico + + + true + DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;$(DCC_Define) + 3 + DetailedSegments + false + 2 + CompanyName=;FileDescription=;FileVersion=1.2.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + + + MatorSmash_Icon.ico + Debug + + + true + PerMonitorV2 + + + .\DebugLite + DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;LiteVersion;$(DCC_Define) + 3 + DetailedSegments + true + + + true + PerMonitorV2 + + + 0 + false + false + false + false + 0 + + + Debug + MatorSmash_Icon.ico + + + true + PerMonitorV2 + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=2.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + MatorSmash_Icon.ico + $(BDS)\bin\default_app.manifest + + + + MainSource + + + RC +
smash.res
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProfileForm
+
+ + +
SmashForm
+
+ + +
OptionsForm
+
+ +
SplashForm
+
+ +
EditForm
+
+ +
SettingsManager
+
+ +
MiniPluginSelectionForm
+
+ +
ConflictForm
+
+ +
TagManager
+
+ +
TagHelper
+
+ + + Base + + + Cfg_4 + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
+ + + + Delphi.Personality.12 + VCLApplication + + + + MatorSmash.dpr + + + True + False + 1 + 0 + 1 + 0 + True + True + False + False + False + 1033 + 1252 + + + + + 1.0.1.0 + + + + + Mator Smash + 1.0 + created by matortheeternal + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + True + True + + False + + + + Assets\ + Logo44x44.png + true + + + + + .\ + true + + + + + MatorSmash.exe + true + + + + + .\ + true + + + + + MatorSmash.exe + true + + + + + Assets\ + Logo44x44.png + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + 12 + + +
diff --git a/frontend/MatorSmash.res b/frontend/MatorSmash.res old mode 100644 new mode 100755 index 9bafe39..fd69226 Binary files a/frontend/MatorSmash.res and b/frontend/MatorSmash.res differ diff --git a/frontend/MatorSmash_Icon.ico b/frontend/MatorSmash_Icon.ico new file mode 100644 index 0000000..c0f9ea8 Binary files /dev/null and b/frontend/MatorSmash_Icon.ico differ diff --git a/frontend/Oblivion.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat b/frontend/Oblivion.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat deleted file mode 100644 index fc7c5e2..0000000 Binary files a/frontend/Oblivion.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat and /dev/null differ diff --git a/frontend/Skyrim.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat b/frontend/Skyrim.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat deleted file mode 100644 index 2d237ce..0000000 Binary files a/frontend/Skyrim.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat and /dev/null differ diff --git a/frontend/lang/russian.lang b/frontend/lang/russian.lang new file mode 100755 index 0000000..f2c844a --- /dev/null +++ b/frontend/lang/russian.lang @@ -0,0 +1,182 @@ +{ TSmashForm } +{ ## QuickBar ## } +msMain_QuickButton_Hint=Быстрый патч|Применить Smash.All к загруженным плагинам и #13#10сгенерировать Smashed Patch.#13#10 +msMain_NewButton_Hint=Создать новый Smashed Patch|Создать новый пустой Smashed Patch. +msMain_BuildButton_Hint=Собрать патчи| +msMain_ManageButton_Hint=Управление настройками Smash|Нажмите здесь, чтобы управлять настройками Smash. +msMain_OptionsButton_Hint=Параметры|Измените параметры, определяющие, как #13#10программа работает.#13#10 +{ #### DYNAMIC #### } +msMain_NoPatches=Нет никаких патчей для сборки или пересборки. +msMain_BuildPatches_Loader=Вы не можете строить патчи, пока фоновый #13#10загручик не загрузится.#13#10 +msMain_BuildAllPatches=Собирает все патчи, которые готовы к сборке или #13#10пересобирает.#13#10 +{ ## Main Panel ## } +{ ## Details Panel ## } +msMain_DetailsLabel_Caption=Детали +msMain_DetailsCopyToClipboardItem_Caption=Скопировать в буфер обмена +{ ## Plugins Tab ## } +msMain_PluginsTabSheet_Caption=Плагины +msMain_PluginsListView_Column0=Индекс +msMain_PluginsListView_Column1=Имя файла +msMain_PluginsListView_Column2=Настройка +msMain_PluginsListView_Column3=Патч +{ #### DYNAMIC #### } +msMain_PluginDetails=Детали плагина +msMain_Filename=Имя файла +msMain_Hash=Хеш +msMain_FileSize=Размер файла +msMain_DateModified=Дата изменения +msMain_NumRecords=Количество записей +msMain_NumOverrides=Количество перезаписей +msMain_Author=Автор +msMain_Description=Описание +msMain_Masters=Мастер-файлы +msMain_ClearTags=Вы уверены, что хотите удалить теги из этих плагинов? +{ ## Plugins Popup Menu ## } +msMain_NewPatchItem_Caption= +msMain_OpenPluginLocationItem_Caption=Открыть расположение плагина +msMain_AddToPatchItem_Caption=Добавить в патч +msMain_ManageTagsItem_Caption=Управление тегами +msMain_SmashSettingItem_Caption=Настройки Smash +{ ## Patches Tab ## } +msMain_PatchesTabSheet_Caption=Патчи +msMain_PatchesListView_Column0=Индекс +msMain_PatchesListView_Column1=Имя +msMain_PatchesListView_Column2=Имя файла +msMain_PatchesListView_Column3=Размер +msMain_PatchesListView_Column4=Дата создания +{ #### DYNAMIC #### } +msMain_PatchDetails=Детали патча +msMain_Status=Статус +msMain_PatchName=Название патча +msMain_PluginCount=Количество плагинов +msMain_DateBuilt=Дата создания +msMain_Plugins=Плагины +msMain_Fails=Ошибки +msMain_TooManyFails=Слишком много ошибок для отображения. +msMain_DeletePatches=Вы уверены, что хотите удалить эти патчи? +{ ## Patches Popup Menu ## } +msMain_ToggleRebuildItem_Caption=Переключить статус пересборки +msMain_OpenInExplorerItem_Caption=Открыть в проводнике +{ ## Plugins Submenu ## } +msMain_MoveItem_Caption=Переместить +msMain_UpItem_Caption=Вверх +msMain_DownItem_Caption=вниз +msMain_ToTopItem_Caption=К началу +msMain_ToBottomItem_Caption=К концу +{ #### DYNAMIC #### } +msMain_BuildPatch=Собрать патч +msMain_RebuildPatch=Пересобрать патч +msMain_BuildPatches=Собрать патчи +msMain_RebuildPatches=Пересобрать патчи +{ ## Log Tab ## } +msMain_LogTabSheet_Caption=Лог +{ #### DYNAMIC #### } +msMain_AppDetails=Детали приложения +msMain_Application=Приложение +msMain_Author=Автор +msMain_Version=Версия +msMain_DateBuilt=Дата создания +msMain_GameMode=Режим игры +msMain_Language=Язык +msMain_TimesRun=Раз запущено +msMain_PatchesBuilt=Создано патчей +msMain_PluginsSmashed=Плагинов пропатчено +msMain_SettingsSubmitted=Настройки Smash отправлены +msMain_RecsSubmitted=Представленные рекомендации +msMain_Website=Веб-сайт +msMain_ApiCredits=Кредиты API +msMain_xEditVersion=Версия xEdit +msMain_xEditCredits=Кредиты xEdit +msMain_Testers=Тестеры +msMain_Translators=Переводчики +msMain_LoadException=Исключение загрузки плагинов +msMain_PluginsNotLoaded=В связи с исключением, не все ваши плагины #13#10были загружены. Вы все еще можете использовать программу. #13#10См. вкладку лога для получения дополнительной информации.#13#10 +msMain_Enable=Включить +msMain_Disable=Выключить +msMain_AutoScroll=Автопрокрутка +{ ## Log Popup Menu ## } +msMain_FilterGroupItem_Caption=Группа фильтров +msMain_FilterLabelItem_Caption=Filter label +msMain_CopyToClipboardItem_Caption=Скопировать +msMain_SaveAndClearItem_Caption=Сохранить и очистить +msMain_ToggleAutoScrollItem_Caption=Отключить автопрокрутку + +{ TOptionsForm } +mpOpt_btnCancel_Caption=Отмена +mpOpt_btnOK_Caption=OK +{ ## General Tab ## } +mpOpt_GeneralTabSheet_Caption=Основные +mpOpt_gbLanguage_Caption=Язык +mpOpt_lblLanguage_Caption=Выбранный язык +mpOpt_gbStyle_Caption=Стиль +mpOpt_kbSimpleDictionary_Caption=Простой просмотр словаря +mpOpt_kbSimplePlugins_Caption=Простой сисок плагинов +{ ## Patching Tab ## } +mpOpt_PatchingTabSheet_Caption=Патчинг +mpOpt_lblDestinationDirectory_Caption=Каталог назначения патча +mpOpt_gbDebug_Caption=Отладка +mpOpt_gbOther_Caption=Остальные опции +{ ## Advanced Tab ## } +mpOpt_AdvancedTabSheet_Caption=Дополнительно +mpOpt_lblCurrentProfile_Caption=Выбранный профиль +mpOpt_gbLogging_Caption=Логирование (создание логов) +mpOpt_lblClientColor_Caption=Client +mpOpt_lblGeneralColor_Caption=Основные +mpOpt_lblLoadColor_Caption=Загрузка +mpOpt_lblPluginColor_Caption=Плагин +mpOpt_lblErrorColor_Caption=Ошибки +mpOpt_lblTemplate_Caption=Образец +mpOpt_lblSample_Caption=Пример + +{ TSettingsManager } +{ ## Settings ## } +msSet_gbFiltering_Caption=Параметры фильтрации +msSet_lvSettings_Column0=Имя +msSet_lvSettings_Column1=Записи +msSet_btnSave_Caption=Сохранить +msSet_btnDiscard_Caption=Отменить +{ ## Settings Popup Menu ## } +msSet_NewSettingItem_Caption=Новая настройка +msSet_CloneSettingItem_Caption=Скопировать настройку +msSet_CombineSettingsItem_Caption=Скомбинировать настройки +msSet_EditSettingItem_Caption=Редактировать настройку +msSet_DeleteSettingItem_Caption=Удалить настройку +{ ## Details ## } +msSet_lblName_Caption=Название +msSet_lblColor_Caption=Цвет +msSet_lblDescription_Caption=Описание +msSet_lblTree_Caption=Дерево +{ ## Tree Popup Menu ## } +msSet_ToggleNodesItem_Caption=Toggle Nodes +msSet_IgnoreDeletionsItem_Caption=Toggle ignore deletions +msSet_SingleEntityItem_Caption=Toggle treat as single entity +msSet_PruneNodesItem_Caption=Prune nodes +msSet_PreserveDeletionsItem_Caption=Toggle preserve deletions + +{ TTagManager } +msTagM_Caption=Manage Tags - %s +{ ## General ## } +msTagM_lblDescription_Caption=Описание +msTagM_btnAdd_Caption=Добавить теги +msTagM_btnRemove_Caption=Удалить теги +msTagM_btnClear_Caption=Очистить теги +msTagM_btnReset_Caption=Сбросить теги +msTagM_btnApply_Caption=Применить +msTagM_btnCancel_Caption=Отмена +msTagM_kbCombine_Caption=Применить скомбинированную настройку + +{ TTagHelper } +msTagH_btnCancel_Caption=Отмена +msTagH_btnOK_Caption=OK +{ #### DYNAMIC #### } +msTagH_AddTags=Добавить теги +msTagH_RemoveTags=Удалить теги +msTagH_PromptAdd=Отметьте теги, которые хотите добавить +msTagH_PromptRemove=Отметьте теги, которые хотите удалить + +{ TProgressForm } +{ #### DYNAMIC #### } +msProg_Closing=Закрытие +msProg_Smashing=Создание патча +msProg_DoneBuilding=Создание патча закончено +msProg_BuildingTree=Создание дерево \ No newline at end of file diff --git a/frontend/msAlgorithm.pas b/frontend/msAlgorithm.pas old mode 100644 new mode 100755 index e028206..4058af4 --- a/frontend/msAlgorithm.pas +++ b/frontend/msAlgorithm.pas @@ -3,7 +3,7 @@ interface uses - SysUtils, Classes, + SysUtils, Classes, Math, // superobject superobject, // mte units @@ -13,10 +13,10 @@ interface // xEdit components wbInterface, wbImplementation; - procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef; - eLink: string; obj: ISuperObject; dstRec: IwbMainRecord); - function rcore(src, mst, dst: IwbElement; dstrec: IwbMainRecord; - obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; +procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef; + eLink: string; obj: ISuperObject; dstRec: IwbMainRecord); +function rcore(src, mst, dst: IwbElement; dstRec: IwbMainRecord; + obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; implementation @@ -24,23 +24,25 @@ implementation firstLink: string; bLinkProcessed: boolean; -{ - ElementByKey: - Gets an element from a container, @e, matching a specified @key. - If @bUseSortKey is true uses SortKey, else uses GetAllValues. -} -function ElementByKey(e: IwbElement; key: string; bUseSortKey: boolean): IwbElement; + { + ElementByKey: + Gets an element from a container, @e, matching a specified @key. + If @bUseSortKey is true uses SortKey, else uses GetAllValues. + } +function ElementByKey(e: IwbElement; key: string; bUseSortKey: boolean) + : IwbElement; var i: Integer; c: IwbContainerElementRef; element: IwbElement; eKey: string; begin - if not Supports(e, IwbContainerElementRef, c) then + if not Supports(e, IwbContainerElementRef, c) then exit; - + // loop through children elements - for i := 0 to Pred(c.ElementCount) do begin + for i := 0 to Pred(c.ElementCount) do + begin element := c.Elements[i]; // get sort key if bUseSortKey, else get values key if bUseSortKey then @@ -48,7 +50,8 @@ function ElementByKey(e: IwbElement; key: string; bUseSortKey: boolean): IwbElem else eKey := GetAllValues(element); // if keys match result is current element - if eKey = key then begin + if eKey = key then + begin Result := element; break; end; @@ -61,7 +64,8 @@ function ElementByKey(e: IwbElement; key: string; bUseSortKey: boolean): IwbElem destination patch record @dstRec. } function HandleElementLife(srcCont, dstCont, mstCont: IwbContainerElementRef; - dstRec: IwbMainRecord; obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; + dstRec: IwbMainRecord; obj: ISuperObject; + bSingle, bDeletions, bOverride: boolean): boolean; var i: Integer; element: IwbElement; @@ -72,7 +76,8 @@ function HandleElementLife(srcCont, dstCont, mstCont: IwbContainerElementRef; Result := false; // handle element creation - for i := 0 to Pred(srcCont.ElementCount) do begin + for i := 0 to Pred(srcCont.ElementCount) do + begin element := srcCont.Elements[i]; // if the element isn't in the destination record @@ -81,67 +86,76 @@ function HandleElementLife(srcCont, dstCont, mstCont: IwbContainerElementRef; // that it was deleted and shouldn't be copied. bInDestination := Assigned(dstCont.ElementByName[element.Name]); bInMaster := Assigned(mstCont.ElementByName[element.Name]); - if (not bInDestination) and (bOverride or not bInMaster) then begin + if (not bInDestination) and (bOverride or not bInMaster) then + begin Result := true; - if bSingle then + if bSingle then exit; // skip according to setting eObj := GetElementObj(obj, element.Name); - process := Assigned(eObj) and (eObj.I['p'] = 1); - if not process then begin + process := Assigned(eObj) and (eObj.i['p'] = 1); + if not process then + begin if settings.debugSkips then - Tracker.Write(' Skipping element creation at '+element.Path); + Tracker.Write(' Skipping element creation at ' + element.FullPath); continue; end; // copy element try if settings.debugChanges then - Tracker.Write(' Created element at '+element.Path); - wbCopyElementToRecord(element, dstRec, false, true); + Tracker.Write(' Created element at ' + element.FullPath); + dstCont.AddIfMissing(element, false, true, '', '', '', '', true); // if another element is linked to the element, copy it eLink := eObj.S['lf']; - if (eLink <> '') then begin + if (eLink <> '') then + begin firstLink := eLink; bLinkProcessed := false; CopyLinkedElement(srcCont, dstCont, eLink, obj, dstRec); end; except on x: Exception do - Tracker.Write(' HandleElementLife: Failed to copy '+element.Path+', '+x.Message); + Tracker.Write(' HandleElementLife: Failed to copy ' + + element.FullPath + ', ' + x.Message); end; end; end; // handle element deletion - if bDeletions then begin - for i := Pred(dstCont.ElementCount) downto 0 do begin + if bDeletions then + begin + for i := Pred(dstCont.ElementCount) downto 0 do + begin element := dstCont.Elements[i]; - if Assigned(mstCont.ElementByName[element.Name]) and - not Assigned(srcCont.ElementByName[element.Name]) then begin + if Assigned(mstCont.ElementByName[element.Name]) and + not Assigned(srcCont.ElementByName[element.Name]) then + begin Result := true; if bSingle then exit; // skip according to setting eObj := GetElementObj(obj, element.Name); - process := Assigned(eObj) and (eObj.I['p'] = 1); - if not process then begin + process := Assigned(eObj) and (eObj.i['p'] = 1); + if not process then + begin if settings.debugSkips then - Tracker.Write(' Skipping element deletion at '+element.Path); + Tracker.Write(' Skipping element deletion at ' + element.FullPath); continue; end; // remove element if settings.debugChanges then - Tracker.Write(' Deleted element at '+element.Path); + Tracker.Write(' Deleted element at ' + element.FullPath); dstCont.RemoveElement(element); // if another element is linked to the element, copy it eLink := eObj.S['lf']; - if (eLink <> '') then begin + if (eLink <> '') then + begin firstLink := eLink; bLinkProcessed := false; CopyLinkedElement(srcCont, dstCont, eLink, obj, dstRec); @@ -152,38 +166,41 @@ function HandleElementLife(srcCont, dstCont, mstCont: IwbContainerElementRef; end; // GetMasterElement: Gets the first instance of an element (the master) -function GetMasterElement(src, se: IwbElement; dstRec: IwbMainRecord): IwbElement; +function GetMasterElement(src, se: IwbElement; dstRec: IwbMainRecord) + : IwbElement; const debugGetMaster = false; var - i: integer; - path, key: string; + i: Integer; + Path, key: string; mstRec, ovr: IwbMainRecord; mst: IwbElement; bSorted: boolean; begin Result := nil; mstRec := dstRec.MasterOrSelf; - path := IndexedPath(src); + Path := IndexedPath(src); bSorted := IsSorted(src); - + // if sorted, use SortKey, else use GetAllValues - if bSorted then + if bSorted then key := se.SortKey[false] else key := GetAllValues(se); - + // debug message - if debugGetMaster then - Tracker.Write(' Called GetMasterElement at path '+path+' looking for key '+key); - + if debugGetMaster then + Tracker.Write(' Called GetMasterElement at path ' + Path + + ' looking for key ' + key); + // loop from override 0 to the second to last override // last override is in our patch, we don't want to process that one - for i := 0 to mstRec.OverrideCount - 2 do begin + for i := 0 to mstRec.OverrideCount - 2 do + begin ovr := mstRec.Overrides[i]; - mst := ElementByIndexedPath(mstRec, path); + mst := ElementByIndexedPath(mstRec, Path); Result := ElementByKey(mst, key, bSorted); - + // break if we found a subrecord matching the sortkey if Result <> nil then break; @@ -196,14 +213,15 @@ function GetMasterElement(src, se: IwbElement; dstRec: IwbMainRecord): IwbElemen Uses SortKey if @bUseSortKeys is true, else uses GetAllValues. } procedure BuildKeyList(container: IwbContainerElementRef; var sl: TStringList; - bUseSortKeys: boolean); + bUseSortKeys: Boolean); var - i, n: integer; + i, n: Integer; childElement: IwbElement; key, adjustedKey: string; begin // loop through children elements - for i := 0 to Pred(container.ElementCount) do begin + for i := 0 to Pred(container.ElementCount) do + begin childElement := container.Elements[i]; // use sort if bUseSortKeys is true, else use GetAllValues @@ -215,7 +233,8 @@ procedure BuildKeyList(container: IwbContainerElementRef; var sl: TStringList; // find a non-colliding key n := 0; adjustedKey := key; - while (sl.IndexOf(adjustedKey) > -1) do begin + while (sl.IndexOf(adjustedKey) > -1) do + begin Inc(n); adjustedKey := key + IntToStr(n); end; @@ -234,10 +253,10 @@ procedure BuildKeyList(container: IwbContainerElementRef; var sl: TStringList; deletions if @bDeletions if true. Tracks @dstRec and @obj for calling rcore on element containers in sorted arrays. } -function MergeArray(src, mst, dst: IwbElement; dstrec: IwbMainRecord; +function MergeArray(src, mst, dst: IwbElement; dstRec: IwbMainRecord; obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; var - i, s_ndx, m_ndx, d_ndx: integer; + i, s_ndx, m_ndx, d_ndx, a_ndx: Integer; se, de: IwbElement; slMst, slDst, slSrc: TStringList; srcCont, dstCont, mstCont, seCont: IwbContainerElementRef; @@ -248,7 +267,7 @@ function MergeArray(src, mst, dst: IwbElement; dstrec: IwbMainRecord; // exit if input array elements can't be treated as a containers if not Supports(src, IwbContainerElementRef, srcCont) then exit; - if not Supports(mst, IwbContainerElementRef, mstCont) then + if Assigned(mst) and not Supports(mst, IwbContainerElementRef, mstCont) then exit; if not Supports(dst, IwbContainerElementRef, dstCont) then exit; @@ -262,27 +281,33 @@ function MergeArray(src, mst, dst: IwbElement; dstrec: IwbMainRecord; slDst := TStringList.Create; try BuildKeyList(srcCont, slSrc, bSorted); - BuildKeyList(mstCont, slMst, bSorted); + if Assigned(mst) then + BuildKeyList(mstCont, slMst, bSorted); BuildKeyList(dstCont, slDst, bSorted); // ELEMENT DELETION: // Remove elements that are in master and destination, but // missing from source if bDeletions then - for i := 0 to Pred(slMst.Count) do begin + for i := 0 to Pred(slMst.Count) do + begin s_ndx := slSrc.IndexOf(slMst[i]); // element from master isn't in source - if (s_ndx = -1) then begin + if (s_ndx = -1) then + begin Result := true; // if we're in a treat as single, exit without removing anything - if bSingle then exit; + if bSingle then + exit; // if element is present in destination, remove it d_ndx := slDst.IndexOf(slMst[i]); - if (d_ndx = -1) then continue; + if (d_ndx = -1) then + continue; if settings.debugArrays then - Tracker.Write(' > Removing element at '+dst.Path+' with key: '+slMst[i]); - dstCont.RemoveElement(d_ndx); + Tracker.Write(' > Removing element at ' + dst.FullPath + + ' with key: ' + slMst[i]); + dstCont.RemoveElement(d_ndx, true); slDst.Delete(d_ndx); end; end; @@ -290,43 +315,67 @@ function MergeArray(src, mst, dst: IwbElement; dstrec: IwbMainRecord; // ELEMENT ADDITION: // Copy array elements in source that aren't in master // or destination - for i := 0 to Pred(slSrc.Count) do begin + for i := 0 to Pred(slSrc.Count) do + begin d_ndx := slDst.IndexOf(slSrc[i]); m_ndx := slMst.IndexOf(slSrc[i]); se := srcCont.Elements[i]; - - if (d_ndx = -1) and ((m_ndx = -1) or bOverride) then begin + if (d_ndx = -1) and ((m_ndx = -1) or bOverride) then + begin Result := true; // if we're in a treat as single, exit without adding anything - if bSingle then exit; + if bSingle then + exit; // add element to destination - if settings.debugArrays then - Tracker.Write(' > Adding element at '+dst.Path+' with key: '+slSrc[i]); - de := dstCont.Assign(dstCont.ElementCount, se, false); if bSorted then - slDst.Insert(dstCont.IndexOf(de), slSrc[i]) + begin + if settings.debugArrays then + Tracker.Write(' > Adding element at ' + dst.FullPath + + ' with key: ' + slSrc[i]); + de := dstCont.Assign(dstCont.ElementCount, se, false); + slDst.Insert(dstCont.IndexOf(de), slSrc[i]); + end else - slDst.Add(slSrc[i]); + begin + a_ndx := Min(i, dstCont.ElementCount); + if settings.debugArrays then + Tracker.Write(' > Adding element at ' + dstCont.FullPath + + ' at index ' + a_ndx.ToString + ' with key: ' + slSrc[i]); + de := dstCont.Assign(dstCont.ElementCount, se, false); + dstCont.ResetMemoryOrder; + // Just inserting at a_ndx didn't work right... + while de.MemoryOrder > a_ndx do + de.MoveUp; + slDst.Insert(a_ndx, slSrc[i]); + end; end // Special handling for sorted arrays // Traverses elements that may have been modified without their sortkey changing - else if bSorted and (d_ndx > -1) and Supports(se, IwbContainerElementRef, seCont) - and (seCont.ElementCount > 0) then begin - if settings.debugArrays then begin - Tracker.Write(' > Traversing element '+se.Path+' with key: '+slSrc[i]); - Tracker.Write(' > Source Element: '+GetAllValues(se)); - Tracker.Write(' > Destination Element: '+GetAllValues(dstCont.Elements[d_ndx])); + else if bSorted and (d_ndx > -1) and Supports(se, IwbContainerElementRef, + seCont) and (seCont.ElementCount > 0) then + begin + if settings.debugArrays then + begin + Tracker.Write(' > Traversing element ' + se.FullPath + + ' with key: ' + slSrc[i]); + Tracker.Write(' > Source Element: ' + GetAllValues(se)); + Tracker.Write(' > Destination Element: ' + + GetAllValues(dstCont.Elements[d_ndx])); end; // traverse element try - Result := rcore(se, GetMasterElement(src, se, dstrec), dstCont.Elements[d_ndx], - dstrec, GetElementObj(obj, se.Name), bSingle, bDeletions, bOverride); + Result := rcore(se, GetMasterElement(src, se, dstRec), + dstCont.Elements[d_ndx], dstRec, GetElementObj(obj, se.Name), + bSingle, bDeletions, bOverride); if Result and bSingle then exit; - except on x : Exception do begin - Tracker.Write(' rcore: Exception at '+se.Path+': '+x.Message); + except + on x: Exception do + begin + Tracker.Write(' rcore: Exception at ' + se.FullPath + ': ' + + x.Message); end; end; end; @@ -339,31 +388,162 @@ function MergeArray(src, mst, dst: IwbElement; dstrec: IwbMainRecord; end; end; -{ +procedure BuildFlagList(container: IwbContainerElementRef; var sl: TStringList); +var + i, n: Integer; + childElement: IwbElement; + key, adjustedKey: string; +begin + // loop through children elements + for i := 0 to Pred(container.ElementCount) do + begin + childElement := container.Elements[i]; + + key := childElement.Name; + + // find a non-colliding key + n := 0; + adjustedKey := key; + while (sl.IndexOf(adjustedKey) > -1) do + begin + Inc(n); + adjustedKey := key + IntToStr(n); + end; + + // add adjusted key to stringlist + sl.Add(adjustedKey); + end; +end; + +function MergeFlags(src, mst, dst: IwbElement; dstRec: IwbMainRecord; + obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; +var + i, s_ndx, m_ndx, d_ndx, fi: Integer; + val: String; + se: IwbElement; + slMst, slDst, slSrc: TStringList; + srcCont, dstCont, mstCont: IwbContainerElementRef; +begin + Result := false; + + // exit if input array elements can't be treated as a containers + if not Supports(src, IwbContainerElementRef, srcCont) then + exit; + if not Supports(mst, IwbContainerElementRef, mstCont) then + exit; + if not Supports(dst, IwbContainerElementRef, dstCont) then + exit; + + // Build lists of element keys in each array for easy comparison + slSrc := TStringList.Create; + slMst := TStringList.Create; + slDst := TStringList.Create; + try + BuildFlagList(srcCont, slSrc); + BuildFlagList(mstCont, slMst); + BuildFlagList(dstCont, slDst); + + // ELEMENT DELETION: + // Remove elements that are in master and destination, but + // missing from source + if bDeletions then + for i := 0 to Pred(slMst.Count) do + begin + s_ndx := slSrc.IndexOf(slMst[i]); + + // element from master isn't in source + if (s_ndx = -1) then + begin + Result := true; + // if we're in a treat as single, exit without removing anything + if bSingle then + exit; + // if element is present in destination, remove it + d_ndx := slDst.IndexOf(slMst[i]); + if (d_ndx = -1) then + continue; + if settings.debugArrays then + Tracker.Write(' > Removing flag at ' + dst.FullPath + + ' with key: ' + slMst[i]); + fi := (mstCont.Elements[i].Def as IwbFlagDef).FlagIndex; + val := dstCont.EditValue; + val[fi + 1] := '0'; + dstCont.EditValue := val; + slDst.Delete(d_ndx); + end; + end; + + // ELEMENT ADDITION: + // Copy array elements in source that aren't in master + // or destination + for i := 0 to Pred(slSrc.Count) do + begin + d_ndx := slDst.IndexOf(slSrc[i]); + m_ndx := slMst.IndexOf(slSrc[i]); + se := srcCont.Elements[i]; + + if (d_ndx = -1) and ((m_ndx = -1) or bOverride) then + begin + Result := true; + // if we're in a treat as single, exit without adding anything + if bSingle then + exit; + // add element to destination + if settings.debugArrays then + Tracker.Write(' > Adding flag at ' + dst.FullPath + ' with key: ' + + slSrc[i]); + fi := (se.Def as IwbFlagDef).FlagIndex; + val := dstCont.EditValue.PadRight(fi + 1, '0'); + val[fi + 1] := '1'; + dstCont.EditValue := val; + slDst.Add(slSrc[i]); + end + end; + finally + // free lists + slMst.Free; + slSrc.Free; + slDst.Free; + end; +end; + +{ CopyElementValue: Copies the edit value of @se to @de. } procedure CopyElementValue(se, me, de: IwbElement); begin - if not de.IsEditable then begin - if settings.debugChanges then begin - Tracker.Write(' Unable to copy element value on '+se.path); + if not de.IsEditable then + begin + if settings.debugChanges then + begin + Tracker.Write(' Unable to copy element value on ' + se.FullPath); Tracker.Write(' Element is not editable'); end; exit; end; - if Assigned(me) and settings.debugChanges then begin + if Assigned(me) and settings.debugChanges then + begin if (not settings.debugTraversal) then - Tracker.Write(' '+se.Path); - Tracker.Write(' > Found differing values: '+se.EditValue+', '+me.EditValue); + Tracker.Write(' ' + se.FullPath); + Tracker.Write(' > Found differing values: ' + se.EditValue + ', ' + + me.EditValue); end; // try to copy element value to destination element from source element try - de.EditValue := se.EditValue; - except on x : Exception do - Tracker.Write(' CopyElementValue: Exception '+x.Message); + + try + // TODO: Why does sinply setting EditValue sometimes do nothing?? + de.container.AddIfMissing(se, false, false, '', '', '', '', true); + except + // If AddIfMissing fails try just setting it... + de.EditValue := se.EditValue; + end; + except + on x: Exception do + Tracker.Write(' CopyElementValue: Exception ' + x.Message); end; end; @@ -380,7 +560,8 @@ procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef; cLink: string; begin // exit if we reached the first link in a chain - if (eLink = firstLink) then begin + if (eLink = firstLink) then + begin if bLinkProcessed then exit; bLinkProcessed := true; @@ -391,13 +572,14 @@ procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef; cObj := GetElementObj(obj, eLink); le := srcCont.ElementByName[eLink]; de := dstCont.ElementByName[eLink]; - if Assigned(le) then begin + if Assigned(le) then + begin if settings.debugLinks then - Tracker.Write(' Copying linked element '+le.Path); + Tracker.Write(' Copying linked element ' + le.FullPath); if Assigned(de) then de.Assign(Low(Integer), le, false) else - dstCont.AddIfMissing(le, true, true, '', '', ''); + dstCont.AddIfMissing(le, true, true, '', '', '', '', true); // follow chain cLink := cObj.S['lf']; if cLink <> '' then @@ -405,13 +587,14 @@ procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef; end; except on x: Exception do - Tracker.Write(' CopyLinkedElement: Failed to copy '+eLink+', '+x.Message); + Tracker.Write(' CopyLinkedElement: Failed to copy ' + eLink + ', ' + + x.Message); end; end; { HandleElement: - Wrapper function around the logic for recursing into child + Wrapper function around the logic for recursing into child elements (rcore), handling an array, or copying element values. } function HandleElement(se, me, de: IwbElement; dstRec: IwbMainRecord; @@ -429,30 +612,34 @@ function HandleElement(se, me, de: IwbElement; dstRec: IwbMainRecord; dstType := GetSmashType(de); // other type information - bIsContainer := Supports(se, IwbContainerElementRef, container) - and (container.ElementCount > 0); - bCanAdd := se.CanAssign(High(Integer), nil, True) - and not (esNotSuitableToAddTo in se.ElementStates); + bIsContainer := Supports(se, IwbContainerElementRef, container) and + (container.ElementCount > 0); + bCanAdd := se.CanAssign(High(Integer), nil, true) and + not(esNotSuitableToAddTo in se.ElementStates); // exit if srcType <> dstType, returning true - if srcType <> dstType then begin - if settings.debugSkips then begin + if srcType <> dstType then + begin + if settings.debugSkips then + begin Tracker.Write(' Source and destination types don''t match'); - Tracker.Write(' '+stToString(srcType)+' != '+stToString(dstType)); - Tracker.Write(' Skipping '+se.Path); + Tracker.Write(' ' + stToString(srcType) + ' != ' + + stToString(dstType)); + Tracker.Write(' Skipping ' + se.FullPath); end; - Result := True; + Result := true; exit; end; // exit if master element not assigned and not array - if not Assigned(me) then begin - if bCanAdd and (srcType in stArrays) then - me := de - else begin - if settings.debugSkips then begin + if not Assigned(me) then + begin + if not (bCanAdd and (srcType in stArrays)) then + begin + if settings.debugSkips then + begin Tracker.Write(' Master element not found!'); - Tracker.Write(' Skipping '+se.Path); + Tracker.Write(' Skipping ' + se.FullPath); end; exit; end; @@ -460,70 +647,105 @@ function HandleElement(se, me, de: IwbElement; dstRec: IwbMainRecord; // debug messages if settings.debugTraversal then - Tracker.Write(' '+se.Path); - if settings.debugTypes then begin - Tracker.Write(' bCanAdd: '+BoolToStr(bCanAdd, true)); - Tracker.Write(' SmashType: '+stToString(srcType)); + Tracker.Write(' ' + se.FullPath); + if settings.debugTypes then + begin + Tracker.Write(' bCanAdd: ' + BoolToStr(bCanAdd, true)); + Tracker.Write(' SmashType: ' + stToString(srcType)); + Tracker.Write(' bIsContainer: ' + BoolToStr(bIsContainer, true)); end; // merge array - if bCanAdd and (srcType in stArrays) then begin + if bCanAdd and (srcType in stArrays) then + begin if settings.debugTraversal then Tracker.Write(' Merging array'); try - Result := MergeArray(se, me, de, dstrec, obj, bSingle, bDeletions, bOverride); - except on x : Exception do - Tracker.Write(' MergeArray: Exception at '+se.Path+': '+x.Message); + Result := MergeArray(se, me, de, dstRec, obj, bSingle, bDeletions, + bOverride); + except + on x: Exception do + Tracker.Write(' MergeArray: Exception at ' + se.FullPath + ': ' + + x.Message); + end; + end + // merge flags + else if bIsContainer and (srcType = stInteger) then + begin + if settings.debugTraversal then + Tracker.Write(' Merging flags'); + try + Result := MergeFlags(se, me, de, dstRec, obj, bSingle, bDeletions, + bOverride); + except + on x: Exception do + Tracker.Write(' MergeFlags: Exception at ' + se.FullPath + ': ' + + x.Message); end; end // else recurse deeper - else if bIsContainer and (srcType <> stInteger) then begin + else if bIsContainer and (srcType <> stInteger) then + begin if settings.debugTraversal then Tracker.Write(' Recursing deeper'); try - Result := rcore(se, me, de, dstrec, obj, bSingle, bDeletions, bOverride); - except on x : Exception do - Tracker.Write(' rcore: Exception at '+se.Path+': '+x.Message); + Result := rcore(se, me, de, dstRec, obj, bSingle, bDeletions, bOverride); + except + on x: Exception do + Tracker.Write(' rcore: Exception at ' + se.FullPath + ': ' + + x.Message); end; end // else copy element value - else if (srcType in stValues) then begin + else if (srcType in stValues) then + begin seVal := se.EditValue; meVal := me.EditValue; - if (seVal <> meVal) then begin + if (seVal <> meVal) then + begin if not bSingle then CopyElementValue(se, me, de); Result := true; end - else if settings.debugSkips then begin + else if settings.debugSkips then + begin Tracker.Write(Format(' Skipping, "%s" = "%s"', [seVal, meVal])); end; end - else if settings.debugSkips then begin + else if settings.debugSkips then + begin Tracker.Write(Format(' Skipping, %s is not a value type', [stToString(srcType)])); end; end; +function MatchingElement(e: IwbElement; i: Integer; + cont: IwbContainerElementRef): IwbElement; +begin + Result := cont.Elements[i]; + if (not Assigned(Result)) or (not Result.Name.Equals(e.Name)) then + Result := cont.ElementByName[e.Name]; +end; + { rcore: Recursively copy overridden elements. Recursively traverses elements, - comparing between a source element (from an override record) @src, a - master element @mst, and a destination element @dst. Tracks the - destination patch record for element copying through @dstRec. Uses a - json tree @obj to determine user settings for traversal. Uses @bSingle - to determine when we're in a "single entity" as specified by the user, - and @bDeletions to determine when it's ok to delete removed elements + comparing between a source element (from an override record) @src, a + master element @mst, and a destination element @dst. Tracks the + destination patch record for element copying through @dstRec. Uses a + json tree @obj to determine user settings for traversal. Uses @bSingle + to determine when we're in a "single entity" as specified by the user, + and @bDeletions to determine when it's ok to delete removed elements from the destination patch record. - + - Uses HandleElementLife to resolve element creation/deletion. - Uses HandleElement to handle arrays, recurse deeper, or copy element - values + values } function rcore(src, mst, dst: IwbElement; dstRec: IwbMainRecord; obj: ISuperObject; bSingle, bDeletions, bOverride: boolean): boolean; var - i: integer; + i: Integer; srcCont, dstCont, mstCont: IwbContainerElementRef; se, me, de: IwbElement; process, eSingle, eDeletions, eOverride: boolean; @@ -533,94 +755,111 @@ function rcore(src, mst, dst: IwbElement; dstRec: IwbMainRecord; Result := false; // prepare containers - if not Supports(src, IwbContainerElementRef, srcCont) then begin - if settings.debugSkips then begin + if not Supports(src, IwbContainerElementRef, srcCont) then + begin + if settings.debugSkips then + begin Tracker.Write(' Source element not a container.'); - Tracker.Write(' Skipping '+src.Path); + Tracker.Write(' Skipping ' + src.FullPath); end; exit; end; - if not Supports(dst, IwbContainerElementRef, dstCont) then begin - if settings.debugSkips then begin + if not Supports(dst, IwbContainerElementRef, dstCont) then + begin + if settings.debugSkips then + begin Tracker.Write(' Destination element not a container.'); - Tracker.Write(' Skipping '+src.Path); + Tracker.Write(' Skipping ' + src.FullPath); end; exit; end; - if not Supports(mst, IwbContainerElementRef, mstCont) then begin - if settings.debugSkips then begin + if not Supports(mst, IwbContainerElementRef, mstCont) then + begin + if settings.debugSkips then + begin Tracker.Write(' Master element not a container.'); - Tracker.Write(' Skipping '+src.Path); + Tracker.Write(' Skipping ' + src.FullPath); end; exit; end; // copy elements from source to destination if missing AND // delete elements missing from source if found in master and destination - Result := HandleElementLife(srcCont, dstCont, mstCont, dstRec, obj, bSingle, bDeletions, bOverride); - if bSingle and Result then begin + Result := HandleElementLife(srcCont, dstCont, mstCont, dstRec, obj, bSingle, + bDeletions, bOverride); + if bSingle and Result then + begin if settings.debugSingle then - Tracker.Write(' Single entity change found at '+src.Path); + Tracker.Write(' Single entity change found at ' + src.FullPath); exit; end; // loop through subelements - for i := 0 to Pred(srcCont.ElementCount) do begin + for i := 0 to Pred(srcCont.ElementCount) do + begin // assign source, destination, master elements se := srcCont.Elements[i]; - de := dstCont.ElementByName[se.Name]; - me := mstCont.ElementByName[se.Name]; + de := MatchingElement(se, i, dstCont); + me := MatchingElement(se, i, mstCont); // skip if destination element not assigned - if not Assigned(de) then begin - if settings.debugSkips then begin + if not Assigned(de) then + begin + if settings.debugSkips then + begin Tracker.Write(' Destination element not found!'); - Tracker.Write(' Skipping '+se.Path); + Tracker.Write(' Skipping ' + se.FullPath); end; continue; end; // skip according to setting eObj := GetElementObj(obj, se.Name); - process := Assigned(eObj) and (eObj.I['p'] = 1); - if not process then begin + process := Assigned(eObj) and (eObj.i['p'] = 1); + if not process then + begin if settings.debugSkips then - Tracker.Write(' Skipping '+se.Path); + Tracker.Write(' Skipping ' + se.FullPath); continue; end; // set element treat as single entity / ignore deletions booleans - eSingle := bSingle or (eObj.I['s'] = 1); - eDeletions := bDeletions or (eObj.I['d'] = 1); - eOverride := bOverride or (eObj.I['o'] = 1); + eSingle := bSingle or (eObj.i['s'] = 1); + eDeletions := bDeletions or (eObj.i['d'] = 1); + eOverride := bOverride or (eObj.i['o'] = 1); // handle element - Result := HandleElement(se, me, de, dstRec, eObj, eSingle, eDeletions, eOverride); + Result := HandleElement(se, me, de, dstRec, eObj, eSingle, eDeletions, + eOverride); // if we're in a single entity and an element is changed, break // we don't need to handle anything anymore - if bSingle and Result then begin + if bSingle and Result then + begin if settings.debugSingle then - Tracker.Write(' Single entity change found at '+se.Path); + Tracker.Write(' Single entity change found at ' + se.FullPath); break; end; // if the element we're processing has the single entity flag set // and we're not currently in a single entity, copy entire element - if eSingle and (not bSingle) and Result then try - if settings.debugSingle then - Tracker.Write(Format(' Copying single entity %s', [se.path])); - de.Assign(Low(Integer), se, false); - except - on x: Exception do - Tracker.Write(' rcore: Failed to copy '+se.Path+', '+x.Message); - end; + if eSingle and (not bSingle) and Result then + try + if settings.debugSingle then + Tracker.Write(Format(' Copying single entity %s', [se.FullPath])); + de.Assign(Low(Integer), se, false); + except + on x: Exception do + Tracker.Write(' rcore: Failed to copy ' + se.FullPath + ', ' + + x.Message); + end; // if another element is linked to the element being processed // and the element being processed has been modified, copy the linked // element eLink := eObj.S['lf']; - if Result and (eLink <> '') then begin + if Result and (eLink <> '') then + begin firstLink := eLink; bLinkProcessed := false; CopyLinkedElement(srcCont, dstCont, eLink, obj, dstRec); diff --git a/frontend/msChoicePanel.pas b/frontend/msChoicePanel.pas old mode 100644 new mode 100755 index 0aa1f64..a1e4cde --- a/frontend/msChoicePanel.pas +++ b/frontend/msChoicePanel.pas @@ -12,6 +12,7 @@ interface type TSenderCallback = procedure(Sender: TObject) of object; + TChoicePanel = class(TPanel) public Selected: boolean; @@ -39,22 +40,21 @@ TChoicePanel = class(TPanel) implementation - -{******************************************************************************} +{ ****************************************************************************** } { TChoicePanel A GUI component for interacting with a profile. } -{******************************************************************************} +{ ****************************************************************************** } constructor TChoicePanel.Create(AOwner: TComponent); begin // set up panel inherited Create(AOwner); Parent := AOwner as TWinControl; - Width := (AOwner as TWinControl).ClientWidth; + width := (AOwner as TWinControl).ClientWidth; Height := 36; Left := 0; - Top := 0; + top := 0; ParentBackground := false; ParentColor := false; ParentDoubleBuffered := false; @@ -65,7 +65,7 @@ constructor TChoicePanel.Create(AOwner: TComponent); // set local variables Selected := false; ColorUnselected := Color; - ColorSelected := $f0ece4; + ColorSelected := $F0ECE4; lstChoices := TList.Create; // create components @@ -74,7 +74,7 @@ constructor TChoicePanel.Create(AOwner: TComponent); // set up lblSig lblSig.Parent := self; - lblSig.Top := 10; + lblSig.top := 10; lblSig.Left := 16; lblSig.Caption := 'SIGN'; lblSig.Cursor := crHandPoint; @@ -83,9 +83,9 @@ constructor TChoicePanel.Create(AOwner: TComponent); // set up cbGame cbChoices.Parent := self; - cbChoices.Top := 8; + cbChoices.top := 8; cbChoices.Left := 75; - cbChoices.Width := Width - cbChoices.Left - 6; + cbChoices.width := width - cbChoices.Left - 6; cbChoices.Style := csDropDownList; cbChoices.Items.Text := ''; cbChoices.Items.Add('Patch'); @@ -110,14 +110,20 @@ destructor TChoicePanel.Destroy; { EVENT HANDLING } procedure TChoicePanel.SettingChanged(Sender: TObject); begin - if Assigned(SelectCallback) then SelectCallback(self); + if Assigned(SelectCallback) then + SelectCallback(self); end; procedure TChoicePanel.ToggleSelect(Sender: TObject); begin - if Cursor = crHandPoint then begin - if Selected then Deselect else Select; - if Assigned(SelectCallback) then SelectCallback(self); + if Cursor = crHandPoint then + begin + if Selected then + Deselect + else + Select; + if Assigned(SelectCallback) then + SelectCallback(self); end; end; diff --git a/frontend/msConfiguration.pas b/frontend/msConfiguration.pas old mode 100644 new mode 100755 index c859e48..b720ab8 --- a/frontend/msConfiguration.pas +++ b/frontend/msConfiguration.pas @@ -18,6 +18,7 @@ interface appIDs: string; bsaOptMode: string; end; + TSettings = class(TObject) public [IniSection('General')] @@ -39,6 +40,9 @@ TSettings = class(TObject) logMessageTemplate: string; preserveTempPath: boolean; allowTagging: boolean; + flagESL: boolean; + smashGhosts: boolean; + multiThreadedSmash: boolean; smashSound: boolean; [IniSection('Patching')] patchDirectory: string; @@ -55,6 +59,7 @@ TSettings = class(TObject) preserveITPOs: boolean; constructor Create; virtual; end; + TStatistics = class(TObject) public [IniSection('Statistics')] @@ -65,35 +70,37 @@ TStatistics = class(TObject) recsSubmitted: integer; constructor Create; virtual; end; + TProfile = class(TObject) public name: string; - gameMode: Integer; + gameMode: integer; gamePath: string; constructor Create(name: string); virtual; procedure Clone(p: TProfile); procedure Delete; procedure Rename(name: string); end; + TProgramStatus = class(TObject) public bInitException, bLoadException, bChangeProfile, bForceTerminate, - bLoaderDone, bInstallUpdate, bUpdatePatchStatus, bClose: boolean; - GameMode: TGameMode; + bLoaderDone, bInstallUpdate, bUpdatePatchStatus, bClose: boolean; + gameMode: TGameMode; Version: String; constructor Create; virtual; end; - procedure DeleteTempPath; - procedure LoadLanguage; - function GetLanguageString(name: string): string; - procedure SaveProfile(var p: TProfile); - procedure LoadSettings; overload; - function LoadSettings(path: string): TSettings; overload; - procedure SaveSettings; overload; - procedure SaveSettings(var s: TSettings; path: string); overload; - procedure LoadStatistics; - procedure SaveStatistics; +procedure DeleteTempPath; +procedure LoadLanguage; +function GetLanguageString(name: string): string; +procedure SaveProfile(var p: TProfile); +procedure LoadSettings; overload; +function LoadSettings(path: string): TSettings; overload; +procedure SaveSettings; overload; +procedure SaveSettings(var s: TSettings; path: string); overload; +procedure LoadStatistics; +procedure SaveStatistics; var settings: TSettings; @@ -107,26 +114,30 @@ TProgramStatus = class(TObject) bTranslationDump = false; // GAME MODES - GameArray: array[1..6] of TGameMode = ( - ( longName: 'Skyrim'; gameName: 'Skyrim'; gameMode: gmTES5; - regName: 'Skyrim'; appName: 'TES5'; exeName: 'TESV.exe'; appIDs: '72850'; - bsaOptMode: 'sk'; ), - ( longName: 'Oblivion'; gameName: 'Oblivion'; gameMode: gmTES4; - regName: 'Oblivion'; appName: 'TES4'; exeName: 'Oblivion.exe'; - appIDs: '22330,900883'; bsaOptMode: 'ob'; ), - ( longName: 'Fallout New Vegas'; gameName: 'FalloutNV'; gameMode: gmFNV; - regName: 'FalloutNV'; appName: 'FNV'; exeName: 'FalloutNV.exe'; - appIDs: '22380,2028016'; bsaOptMode: 'fo'; ), - ( longName: 'Fallout 3'; gameName: 'Fallout3'; gameMode: gmFO3; - regName: 'Fallout3'; appName: 'FO3'; exeName: 'Fallout3.exe'; - appIDs: '22300,22370'; bsaOptMode: 'fo'; ), - ( longName: 'Fallout 4'; gameName: 'Fallout4'; gameMode: gmFO4; - regName: 'Fallout4'; appName: 'FO4'; exeName: 'Fallout4.exe'; - appIDs: '377160'; bsaOptMode: ''; ), - ( longName: 'Skyrim Special Edition'; gameName: 'Skyrim'; gameMode: gmSSE; - regName: 'Skyrim Special Edition'; appName: 'SSE'; - exeName: 'SkyrimSE.exe'; appIDs: '489830'; bsaOptMode: ''; ) - ); + GameArray: array [1 .. 9] of TGameMode = ((longName: 'Skyrim'; + gameName: 'Skyrim'; gameMode: gmTES5; regName: 'Skyrim'; appName: 'TES5'; + exeName: 'TESV.exe'; appIDs: '72850'; bsaOptMode: 'sk'; + ), (longName: 'Oblivion'; gameName: 'Oblivion'; gameMode: gmTES4; + regName: 'Oblivion'; appName: 'TES4'; exeName: 'Oblivion.exe'; + appIDs: '22330,900883'; bsaOptMode: 'ob';), (longName: 'Fallout New Vegas'; + gameName: 'FalloutNV'; gameMode: gmFNV; regName: 'FalloutNV'; + appName: 'FNV'; exeName: 'FalloutNV.exe'; appIDs: '22380,2028016'; + bsaOptMode: 'fo';), (longName: 'Fallout 3'; gameName: 'Fallout3'; + gameMode: gmFO3; regName: 'Fallout3'; appName: 'FO3'; + exeName: 'Fallout3.exe'; appIDs: '22300,22370'; bsaOptMode: 'fo'; + ), (longName: 'Fallout 4'; gameName: 'Fallout4'; gameMode: gmFO4; + regName: 'Fallout4'; appName: 'FO4'; exeName: 'Fallout4.exe'; + appIDs: '377160'; bsaOptMode: '';), (longName: 'Skyrim Special Edition'; + gameName: 'Skyrim'; gameMode: gmSSE; regName: 'Skyrim Special Edition'; + appName: 'SSE'; exeName: 'SkyrimSE.exe'; appIDs: '489830'; bsaOptMode: ''; + ), (longName: 'Skyrim VR'; gameName: 'Skyrim'; gameMode: gmTES5VR; + regName: 'Skyrim VR'; appName: 'TES5VR'; exeName: 'SkyrimVR.exe'; + appIDs: '611670'; bsaOptMode: '';), (longName: 'Enderal'; + gameName: 'Skyrim'; gameMode: gmEnderal; regName: 'Enderal'; + appName: 'Enderal'; exeName: 'TESV.exe'; appIDs: '933480'; bsaOptMode: 'sk'; + ), (longName: 'Enderal Special Edition'; gameName: 'Skyrim'; + gameMode: gmSSE; regName: 'Enderal Special Edition'; appName: 'EnderalSE'; + exeName: 'SkyrimSE.exe'; appIDs: '976620'; bsaOptMode: '';)); implementation @@ -200,7 +211,7 @@ procedure TProfile.Rename(name: string); { TProgramStatus } constructor TProgramStatus.Create; begin - bInitException := false; + bInitException := false; bLoadException := false; bChangeProfile := false; bForceTerminate := false; @@ -218,26 +229,31 @@ procedure DeleteTempPath; procedure LoadLanguage; const - langFile = 'http://raw.githubusercontent.com/matortheeternal/smash/master/frontend/lang/english.lang'; - directions = 'Your english.lang file is missing. Please download it from GitHub. ' + - 'After you click OK, a webpage with the file will be opened. Right-click the ' + - 'page and choose "Save page as", then save it as english.lang in the "lang\" ' + - 'folder where you have MatorSmash.exe installed.'; - accessMessage = 'It looks like Smash doesn''t have permission to read files ' + - 'from disk. Try running the program as administrator or disabling your antivirus.'; + langFile = + 'http://raw.githubusercontent.com/matortheeternal/smash/master/frontend/lang/english.lang'; + directions = + 'Your english.lang file is missing. Please download it from GitHub. ' + + 'After you click OK, a webpage with the file will be opened. Right-click the ' + + 'page and choose "Save page as", then save it as english.lang in the "lang\" ' + + 'folder where you have MatorSmash.exe installed.'; + accessMessage = 'It looks like Smash doesn''t have permission to read files ' + + 'from disk. Try running the program as administrator or disabling your antivirus.'; var filename: string; begin filename := Format('lang\%s.lang', [settings.language]); language := TStringList.Create; - if (not FileExists(filename)) then begin - if settings.language <> 'english' then begin + if (not FileExists(filename)) then + begin + if settings.language <> 'english' then + begin settings.language := 'english'; LoadLanguage; end else if not FileExists('MatorSmash.exe') then MessageDlg(accessMessage, mtConfirmation, [mbOk], 0) - else begin + else + begin MessageDlg(directions, mtConfirmation, [mbOk], 0); ForceDirectories(PathList.Values['ProgramPath'] + 'lang\'); ShellExecute(0, 'open', PChar(langFile), '', '', SW_SHOWNORMAL); @@ -250,7 +266,8 @@ procedure LoadLanguage; function GetLanguageString(name: string): string; begin if language.Values[name] <> '' then - Result := StringReplace(language.Values[name], '#13#10', #13#10, [rfReplaceAll]) + Result := StringReplace(language.Values[name], '#13#10', #13#10, + [rfReplaceAll]) else Result := name; end; @@ -261,13 +278,15 @@ procedure SaveProfile(var p: TProfile); pSettings: TSettings; begin // get profile path - path := PathList.Values['ProgramPath'] + 'profiles\' + p.name + '\settings.ini'; + path := PathList.Values['ProgramPath'] + 'profiles\' + p.name + + '\settings.ini'; ForceDirectories(ExtractFilePath(path)); // load settings if they exist, else create them if FileExists(path) then pSettings := LoadSettings(path) - else begin + else + begin pSettings := TSettings.Create; pSettings.patchDirectory := p.gamePath + 'Data\'; end; @@ -328,12 +347,14 @@ procedure LoadStatistics; end; initialization + begin ProgramStatus := TProgramStatus.Create; PathList := TStringList.Create; end; finalization + begin ProgramStatus.Free; PathList.Free; diff --git a/frontend/msConflict.pas b/frontend/msConflict.pas old mode 100644 new mode 100755 index 31b2aa0..49a8c6a --- a/frontend/msConflict.pas +++ b/frontend/msConflict.pas @@ -13,46 +13,35 @@ interface type // States used in InitNode to indicate states a node shall initially have. - TVirtualNodeInitState = ( - ivsDisabled, - ivsExpanded, - ivsHasChildren, - ivsMultiline, - ivsSelected, - ivsFiltered, - ivsReInit{>>>}, - ivsHidden{<<<} - ); + TVirtualNodeInitState = (ivsDisabled, ivsExpanded, ivsHasChildren, + ivsMultiline, ivsSelected, ivsFiltered, ivsReInit { >>> } , + ivsHidden { <<< } + ); TVirtualNodeInitStates = set of TVirtualNodeInitState; // navnode flags - TNavNodeFlag = ( - nnfInjected, - nnfNotReachable, - nnfReferencesInjected - ); + TNavNodeFlag = (nnfInjected, nnfNotReachable, nnfReferencesInjected); TNavNodeFlags = set of TNavNodeFlag; // navnode data PNavNodeData = ^TNavNodeData; + TNavNodeData = record - Element : IwbElement; - Container : IwbContainer; - ConflictAll : TConflictAll; - ConflictThis : TConflictThis; - Flags : TNavNodeFlags; + Element: IwbElement; + Container: IwbContainer; + ConflictAll: TConflictAll; + ConflictThis: TConflictThis; + Flags: TNavNodeFlags; end; // node flags - TViewNodeFlag = ( - vnfDontShow, - vnfIgnore - ); + TViewNodeFlag = (vnfDontShow, vnfIgnore); TViewNodeFlags = set of TViewNodeFlag; // node data PViewNodeData = ^TViewNodeData; + TViewNodeData = record Element: IwbElement; Container: IwbContainerElementRef; @@ -62,24 +51,24 @@ TViewNodeData = record end; // collections of node datas - TViewNodeDatas = array[Word] of TViewNodeData; + TViewNodeDatas = array [Word] of TViewNodeData; PViewNodeDatas = ^TViewNodeDatas; TDynViewNodeDatas = array of TViewNodeData; // exposed methods - procedure ConflictLevelForMainRecord(const aMainRecord: IwbMainRecord; - out aConflictAll: TConflictAll; out aConflictThis: TConflictThis); - function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; - aSiblingCompare, aInjected: Boolean): TConflictAll; - function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; - aNodeCount: Integer; aSiblingCompare, aInjected: Boolean): TConflictAll; - function ConflictAllForElements(e1, e2: IwbElement; aSiblingCompare, - aInjected: Boolean): TConflictAll; - function ConflictThisForMainRecord(aMainRecord: IwbMainRecord): TConflictThis; - function ConflictAllForMainRecord(aMainRecord: IwbMainRecord): TConflictAll; - function IsITPO(rec: IwbMainRecord): Boolean; - function IsITM(rec: IwbMainRecord): Boolean; +procedure ConflictLevelForMainRecord(const aMainRecord: IwbMainRecord; + out aConflictAll: TConflictAll; out aConflictThis: TConflictThis); +function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; + aSiblingCompare, aInjected: Boolean): TConflictAll; +function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; + aNodeCount: Integer; aSiblingCompare, aInjected: Boolean): TConflictAll; +function ConflictAllForElements(e1, e2: IwbElement; + aSiblingCompare, aInjected: Boolean): TConflictAll; +function ConflictThisForMainRecord(aMainRecord: IwbMainRecord): TConflictThis; +function ConflictAllForMainRecord(aMainRecord: IwbMainRecord): TConflictAll; +function IsITPO(rec: IwbMainRecord): Boolean; +function IsITM(rec: IwbMainRecord): Boolean; implementation @@ -89,12 +78,13 @@ procedure AppendToNodeDatas(var NodeDatas: TDynViewNodeDatas; e: IwbElement); begin SetLength(NodeDatas, Succ(Length(NodeDatas))); NodeDatas[Pred(Length(NodeDatas))].Element := e; - if Supports(e, IwbContainerElementRef, Container) and (Container.ElementCount > 0) then + if Supports(e, IwbContainerElementRef, Container) and + (Container.ElementCount > 0) then NodeDatas[Pred(Length(NodeDatas))].Container := Container; end; -function ConflictAllForElements(e1, e2: IwbElement; aSiblingCompare, - aInjected: Boolean): TConflictAll; +function ConflictAllForElements(e1, e2: IwbElement; + aSiblingCompare, aInjected: Boolean): TConflictAll; var NodeDatas: TDynViewNodeDatas; begin @@ -106,174 +96,204 @@ function ConflictAllForElements(e1, e2: IwbElement; aSiblingCompare, Result := caUnknown; if Length(NodeDatas) > 0 then if Assigned(NodeDatas[0].Container) then - Result := ConflictLevelForChildNodeDatas(NodeDatas, aSiblingCompare, aInjected) + Result := ConflictLevelForChildNodeDatas(NodeDatas, aSiblingCompare, + aInjected) else - Result := ConflictLevelForNodeDatas(@NodeDatas[0], Length(NodeDatas), aSiblingCompare, aInjected); + Result := ConflictLevelForNodeDatas(@NodeDatas[0], Length(NodeDatas), + aSiblingCompare, aInjected); end; -function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord): TDynViewNodeDatas; +function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord) + : TDynViewNodeDatas; var - Master : IwbMainRecord; - Rec : IwbMainRecord; - i, j : Integer; - Records : TStringList; - AnyHidden : Boolean; - IsNonOverride : Boolean; - EditorID : string; - FormID : Cardinal; - LoadOrder : Integer; - Group : IwbGroupRecord; - Signature : TwbSignature; - plugin : TPlugin; - aFile : IwbFile; + Master: IwbMainRecord; + rec: IwbMainRecord; + i, j: Integer; + Records: TStringList; + AnyHidden: Boolean; + IsNonOverride: Boolean; + EditorID: string; + FormID: Cardinal; + LoadOrder: Integer; + Group: IwbGroupRecord; + Signature: TwbSignature; + plugin: TPlugin; + aFile: IwbFile; begin Assert(wbLoaderDone); IsNonOverride := False; AnyHidden := False; - if aMainRecord.Signature = 'GMST' then begin + if aMainRecord.Signature = 'GMST' then + begin IsNonOverride := True; EditorID := aMainRecord.EditorID; SetLength(Result, PluginsList.Count); Master := nil; - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); aFile := plugin._File; Group := aFile.GroupBySignature['GMST']; - if Assigned(Group) then begin - Rec := Group.MainRecordByEditorID[EditorID]; - if Assigned(Rec) then begin + if Assigned(Group) then + begin + rec := Group.MainRecordByEditorID[EditorID]; + if Assigned(rec) then + begin if not Assigned(Master) then - Master := Rec; - Result[i].Element := Rec; + Master := rec; + Result[i].Element := rec; end; end; end; - end else if (aMainRecord.Signature = 'NAVI') (* or (aMainRecord.Signature = 'TES4') *) then begin + end + else if (aMainRecord.Signature = 'NAVI') + (* or (aMainRecord.Signature = 'TES4') *) then + begin IsNonOverride := True; Signature := aMainRecord.Signature; - FormID := aMainRecord.FormID; + FormID := aMainRecord.FormID.ToCardinal; LoadOrder := aMainRecord.GetFile.LoadOrder; SetLength(Result, 0); Master := nil; - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); aFile := plugin._File; - if aFile.LoadOrder = LoadOrder then begin + if aFile.LoadOrder = LoadOrder then + begin Group := aFile.GroupBySignature[Signature]; - if Assigned(Group) then begin - Rec := Group.MainRecordByFormID[FormID]; - if Assigned(Rec) then begin + if Assigned(Group) then + begin + rec := Group.MainRecordByFormID[TwbFormID.fromCardinal(FormID)]; + if Assigned(rec) then + begin j := Length(Result); - SetLength(Result, j+1); + SetLength(Result, j + 1); if not Assigned(Master) then - Master := Rec; - Result[j].Element := Rec; + Master := rec; + Result[j].Element := rec; end; end; end; end; - end else if (aMainRecord.Signature = 'TES4') then begin + end + else if (aMainRecord.Signature = 'TES4') then + begin IsNonOverride := True; Signature := aMainRecord.Signature; LoadOrder := aMainRecord.GetFile.LoadOrder; SetLength(Result, 0); Master := nil; - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); aFile := plugin._File; - if aFile.LoadOrder = LoadOrder then begin + if aFile.LoadOrder = LoadOrder then + begin // header of .dat file, show only itself - if SameText(ExtractFileExt(aMainRecord.GetFile.FileName), '.dat') and not SameText(ExtractFileExt(aFile.FileName), '.dat') then + if SameText(ExtractFileExt(aMainRecord.GetFile.FileName), '.dat') and + not SameText(ExtractFileExt(aFile.FileName), '.dat') then Continue; // skip .dat file header by default - if not SameText(ExtractFileExt(aMainRecord.GetFile.FileName), '.dat') and SameText(ExtractFileExt(aFile.FileName), '.dat') then + if not SameText(ExtractFileExt(aMainRecord.GetFile.FileName), '.dat') + and SameText(ExtractFileExt(aFile.FileName), '.dat') then Continue; - Rec := aFile.Elements[0] as IwbMainRecord; - if Assigned(Rec) then begin + rec := aFile.Elements[0] as IwbMainRecord; + if Assigned(rec) then + begin j := Length(Result); - SetLength(Result, j+1); + SetLength(Result, j + 1); if not Assigned(Master) then - Master := Rec; - Result[j].Element := Rec; + Master := rec; + Result[j].Element := rec; end; end; end; - end else begin + end + else + begin Master := aMainRecord.MasterOrSelf; SetLength(Result, Succ(Master.OverrideCount)); AnyHidden := Master.IsHidden; if not AnyHidden then - for i := 0 to Pred(Master.OverrideCount) do begin + for i := 0 to Pred(Master.OverrideCount) do + begin AnyHidden := Master.Overrides[i].IsHidden; if AnyHidden then Break; end; end; - if (Length(Result) > 1) and ({ModGroupsEnabled or }AnyHidden) or IsNonOverride then begin + if (Length(Result) > 1) and ( { ModGroupsEnabled or } AnyHidden) or IsNonOverride + then + begin Records := TStringList.Create; try - if IsNonOverride then begin + if IsNonOverride then + begin for i := Low(Result) to High(Result) do - if Supports(Result[i].Element, IwbMainRecord, Rec) then - Records.AddObject(Rec._File.FileName, Pointer(Rec)); + if Supports(Result[i].Element, IwbMainRecord, rec) then + Records.AddObject(rec._File.FileName, Pointer(rec)); Result := nil; - end else begin + end + else + begin Records.AddObject(Master._File.FileName, Pointer(Master)); - for i := 0 to Pred(Master.OverrideCount) do begin - Rec := Master.Overrides[i]; - Records.AddObject(Rec._File.FileName, Pointer(Rec)); + for i := 0 to Pred(Master.OverrideCount) do + begin + rec := Master.Overrides[i]; + Records.AddObject(rec._File.FileName, Pointer(rec)); end; end; - {f ModGroupsEnabled then repeat + { f ModGroupsEnabled then repeat MadeChanges := False; sl := TStringList.Create; try - for i := 0 to Pred(ModGroups.Count) do begin - sl.Assign(TStrings(ModGroups.Objects[i])); - for j := Pred(sl.Count) downto 0 do begin - k := Records.IndexOf(sl[j]); - if K > 0 then // >, not >=, never hide the original master - sl.Objects[j] := TObject(k) - else - sl.Delete(j); - end; - if sl.Count > 1 then begin - k := Integer(sl.Objects[0]); - j := 1; - if k = 0 then begin - while (j < sl.Count) and (Integer(sl.Objects[j]) = k + 1) do begin - Records.Objects[Integer(sl.Objects[Pred(j)])] := nil; - Inc(k); - Inc(j); - end; - Inc(j); - end; - while (j < sl.Count) do begin - Records.Objects[Integer(sl.Objects[Pred(j)])] := nil; - Inc(j); - end; - for j := Pred(Records.Count) downto 0 do - if Records.Objects[j] = nil then begin - Records.Delete(j); - MadeChanges := True; - end; - end; - if Records.Count < 2 then - Break; - end; + for i := 0 to Pred(ModGroups.Count) do begin + sl.Assign(TStrings(ModGroups.Objects[i])); + for j := Pred(sl.Count) downto 0 do begin + k := Records.IndexOf(sl[j]); + if K > 0 then // >, not >=, never hide the original master + sl.Objects[j] := TObject(k) + else + sl.Delete(j); + end; + if sl.Count > 1 then begin + k := Integer(sl.Objects[0]); + j := 1; + if k = 0 then begin + while (j < sl.Count) and (Integer(sl.Objects[j]) = k + 1) do begin + Records.Objects[Integer(sl.Objects[Pred(j)])] := nil; + Inc(k); + Inc(j); + end; + Inc(j); + end; + while (j < sl.Count) do begin + Records.Objects[Integer(sl.Objects[Pred(j)])] := nil; + Inc(j); + end; + for j := Pred(Records.Count) downto 0 do + if Records.Objects[j] = nil then begin + Records.Delete(j); + MadeChanges := True; + end; + end; + if Records.Count < 2 then + Break; + end; finally - sl.Free; + sl.Free; end; - until not MadeChanges;} + until not MadeChanges; } i := 0; while (i < Records.Count) and (Records.Count > 1) do @@ -284,14 +304,16 @@ function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord): TDynViewNodeD SetLength(Result, Records.Count); for i := 0 to Pred(Records.Count) do - with Result[i] do begin - Rec := IwbMainRecord(Pointer(Records.Objects[i])); + with Result[i] do + begin + rec := IwbMainRecord(Pointer(Records.Objects[i])); if i = 0 then - Master := Rec; + Master := rec; - Container := Rec as IwbContainerElementRef; + Container := rec as IwbContainerElementRef; Element := Container; - if (Container.ElementCount = 0) or (Rec.Signature <> Master.Signature) then + if (Container.ElementCount = 0) or (rec.Signature <> Master.Signature) + then Container := nil; end; @@ -308,10 +330,12 @@ function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord): TDynViewNodeD Result[0].Container := nil; for i := 0 to Pred(Master.OverrideCount) do - with Result[Succ(i)] do begin + with Result[Succ(i)] do + begin Container := Master.Overrides[i] as IwbContainerElementRef; Element := Container; - if (Container.ElementCount = 0) or (Master.Overrides[i].Signature <> Master.Signature) then + if (Container.ElementCount = 0) or + (Master.Overrides[i].Signature <> Master.Signature) then Container := nil; end; end; @@ -321,19 +345,21 @@ procedure ConflictLevelForMainRecord(const aMainRecord: IwbMainRecord; procedure Fix(const aMainRecord: IwbMainRecord); begin - with aMainRecord do begin + with aMainRecord do + begin ConflictAll := aConflictAll; - if ConflictThis = ctUnknown then begin + if ConflictThis = ctUnknown then + begin ConflictThis := ctHiddenByModGroup; end; end; end; var - NodeDatas : TDynViewNodeDatas; - i : Integer; - Master : IwbMainRecord; - KeepAliveRoot : IwbKeepAliveRoot; + NodeDatas: TDynViewNodeDatas; + i: Integer; + Master: IwbMainRecord; + KeepAliveRoot: IwbKeepAliveRoot; begin KeepAliveRoot := wbCreateKeepAliveRoot; @@ -344,30 +370,39 @@ procedure ConflictLevelForMainRecord(const aMainRecord: IwbMainRecord; Exit; Master := aMainRecord.MasterOrSelf; - if (Master.OverrideCount = 0) and not wbTranslationMode and not (Master.Signature = 'GMST') then begin + if (Master.OverrideCount = 0) and not wbTranslationMode and + not(Master.Signature = 'GMST') then + begin aConflictAll := caOnlyOne; aConflictThis := ctOnlyOne; aMainRecord.ConflictAll := aConflictAll; aMainRecord.ConflictThis := aConflictThis; - end else begin + end + else + begin NodeDatas := NodeDatasForMainRecord(aMainRecord); - if Length(NodeDatas) = 1 then begin + if Length(NodeDatas) = 1 then + begin aConflictAll := caOnlyOne; NodeDatas[0].ConflictAll := caOnlyOne; NodeDatas[0].ConflictThis := ctOnlyOne; - {end else if wbQuickShowConflicts and (Length(NodeDatas) = 2) then begin - aConflictAll := caOverride; - NodeDatas[0].ConflictAll := caOverride; - NodeDatas[1].ConflictAll := caOverride; - NodeDatas[0].ConflictThis := ctMaster; - NodeDatas[1].ConflictThis := ctOverride;} - end else - aConflictAll := ConflictLevelForChildNodeDatas(NodeDatas, False, (aMainRecord.MasterOrSelf.IsInjected and not (aMainRecord.Signature = 'GMST')) ); + { end else if wbQuickShowConflicts and (Length(NodeDatas) = 2) then begin + aConflictAll := caOverride; + NodeDatas[0].ConflictAll := caOverride; + NodeDatas[1].ConflictAll := caOverride; + NodeDatas[0].ConflictThis := ctMaster; + NodeDatas[1].ConflictThis := ctOverride; } + end + else + aConflictAll := ConflictLevelForChildNodeDatas(NodeDatas, False, + (aMainRecord.MasterOrSelf.IsInjected and + not(aMainRecord.Signature = 'GMST'))); for i := Low(NodeDatas) to High(NodeDatas) do with NodeDatas[i] do if Assigned(Element) then - with (Element as IwbMainRecord) do begin + with (Element as IwbMainRecord) do + begin ConflictAll := aConflictAll; ConflictThis := NodeDatas[i].ConflictThis; end; @@ -383,47 +418,52 @@ procedure ConflictLevelForMainRecord(const aMainRecord: IwbMainRecord; procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; var aChildCount: Cardinal); var - NodeData : PNavNodeData; - Container : IwbContainer; - FirstContainer : IwbContainer; - SortableContainer : IwbSortableContainer; - Element : IwbElement; - i, j, k : Integer; - SortedCount : Integer; - NonSortedCount : Integer; - SortedKeys : array of TnxFastStringListCS; - Sortables : array of IwbSortableContainer; - SortKey : string; - LastSortKey : string; - DupCounter : Integer; + NodeData: PNavNodeData; + Container: IwbContainer; + FirstContainer: IwbContainer; + SortableContainer: IwbSortableContainer; + Element: IwbElement; + i, j, k: Integer; + SortedCount: Integer; + NonSortedCount: Integer; + SortedKeys: array of TStringList; + Sortables: array of IwbSortableContainer; + SortKey: string; + LastSortKey: string; + DupCounter: Integer; begin SortedCount := 0; NonSortedCount := 0; FirstContainer := nil; - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin NodeData := @aNodeDatas[i]; Container := NodeData.Container; if not Assigned(FirstContainer) then FirstContainer := Container; if Assigned(Container) then - if Supports(Container, IwbSortableContainer, SortableContainer) and SortableContainer.Sorted then + if Supports(Container, IwbSortableContainer, SortableContainer) and + SortableContainer.Sorted then Inc(SortedCount) else Inc(NonSortedCount); end; - if (NonSortedCount > 0) and (SortedCount > 0) then begin - if Assigned(FirstContainer) then - ;//PostAddMessage('Warning: Comparing sorted and unsorted entry for "' + FirstContainer.Path + '" in "'+FirstContainer.ContainingMainRecord.Name+'"'); + if (NonSortedCount > 0) and (SortedCount > 0) then + begin + if Assigned(FirstContainer) then; + // PostAddMessage('Warning: Comparing sorted and unsorted entry for "' + FirstContainer.Path + '" in "'+FirstContainer.ContainingMainRecord.Name+'"'); SortedCount := 0; end; - if SortedCount > 0 then begin -// Assert(NonSortedCount = 0); + if SortedCount > 0 then + begin + // Assert(NonSortedCount = 0); SetLength(SortedKeys, Succ(aNodeCount)); - for i := Low(SortedKeys) to High(SortedKeys) do begin - SortedKeys[i] := TnxFastStringListCS.Create; + for i := Low(SortedKeys) to High(SortedKeys) do + begin + SortedKeys[i] := TStringList.Create; SortedKeys[i].Sorted := True; SortedKeys[i].Duplicates := dupError; end; @@ -434,16 +474,20 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; SetLength(Sortables, aNodeCount); for i := 0 to Pred(aNodeCount) do - if Supports(aNodeDatas[i].Container, IwbSortableContainer, Sortables[i]) then begin + if Supports(aNodeDatas[i].Container, IwbSortableContainer, Sortables[i]) + then + begin SortableContainer := Sortables[i]; DupCounter := 0; LastSortKey := ''; - for j := 0 to Pred(SortableContainer.ElementCount) do begin + for j := 0 to Pred(SortableContainer.ElementCount) do + begin Element := SortableContainer.Elements[j]; SortKey := Element.SortKey[False]; if SameStr(LastSortKey, SortKey) then Inc(DupCounter) - else begin + else + begin DupCounter := 0; LastSortKey := SortKey; end; @@ -457,7 +501,8 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; aChildCount := SortedKeys[aNodeCount].Count; - for j := 0 to Pred(aChildCount) do begin + for j := 0 to Pred(aChildCount) do + begin SortKey := SortedKeys[aNodeCount].Strings[j]; for i := 0 to Pred(aNodeCount) do if SortedKeys[i].Find(SortKey, k) then @@ -473,23 +518,28 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; end else - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin NodeData := @aNodeDatas[i]; Container := NodeData.Container; - if Assigned(Container) then begin + if Assigned(Container) then + begin case Container.ElementType of - etMainRecord, etSubRecordStruct: begin + etMainRecord, etSubRecordStruct: + begin aChildCount := (Container.Def as IwbRecordDef).MemberCount; Inc(aChildCount, Container.AdditionalElementCount); - if Cardinal(Container.ElementCount) > aChildCount then begin - //PostAddMessage('Error: Container.ElementCount {'+IntToStr(Container.ElementCount)+'} > aChildCount {'+IntToStr(aChildCount)+'} for ' + Container.Path + ' in ' + Container.ContainingMainRecord.Name); - //for j := 0 to Pred(Container.ElementCount) do - //PostAddMessage(' #'+IntToStr(j)+': ' + Container.Elements[j].Name); - //Assert(Cardinal(Container.ElementCount) <= aChildCount); + if Cardinal(Container.ElementCount) > aChildCount then + begin + // PostAddMessage('Error: Container.ElementCount {'+IntToStr(Container.ElementCount)+'} > aChildCount {'+IntToStr(aChildCount)+'} for ' + Container.Path + ' in ' + Container.ContainingMainRecord.Name); + // for j := 0 to Pred(Container.ElementCount) do + // PostAddMessage(' #'+IntToStr(j)+': ' + Container.Elements[j].Name); + // Assert(Cardinal(Container.ElementCount) <= aChildCount); end; end; - etSubRecordArray, etArray, etStruct, etSubRecord, etValue, etUnion, etStructChapter: + etSubRecordArray, etArray, etStruct, etSubRecord, etValue, etUnion, + etStructChapter: if aChildCount < Cardinal(Container.ElementCount) then aChildCount := Container.ElementCount; end; @@ -498,35 +548,38 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; end; procedure InitNodes(const aNodeDatas: PViewNodeDatas; - const aParentDatas: PViewNodeDatas; - aNodeCount: Integer; - aIndex: Cardinal; + const aParentDatas: PViewNodeDatas; aNodeCount: Integer; aIndex: Cardinal; var aInitialStates: TVirtualNodeInitStates); var - NodeData : PViewNodeData; - ParentData : PViewNodeData; - Container : IwbContainerElementRef; - SortableContainer : IwbSortableContainer; - i : Integer; + NodeData: PViewNodeData; + ParentData: PViewNodeData; + Container: IwbContainerElementRef; + SortableContainer: IwbSortableContainer; + i: Integer; begin - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin NodeData := @aNodeDatas[i]; ParentData := @aParentDatas[i]; Container := ParentData.Container; - if Assigned(Container) then begin - if Supports(Container, IwbSortableContainer, SortableContainer) and SortableContainer.Sorted then + if Assigned(Container) then + begin + if Supports(Container, IwbSortableContainer, SortableContainer) and + SortableContainer.Sorted then NodeData.Element := Container.ElementBySortOrder[aIndex] else case Container.ElementType of etMainRecord, etSubRecordStruct: NodeData.Element := Container.ElementBySortOrder[aIndex]; - etSubRecordArray, etArray, etStruct, etSubRecord, etValue, etUnion, etStructChapter: + etSubRecordArray, etArray, etStruct, etSubRecord, etValue, etUnion, + etStructChapter: if aIndex < Cardinal(Container.ElementCount) then NodeData.Element := Container.Elements[aIndex]; end; end; - if Assigned(NodeData.Element) and NodeData.Element.DontShow then begin + if Assigned(NodeData.Element) and NodeData.Element.DontShow then + begin NodeData.Element := nil; Include(NodeData.ViewNodeFlags, vnfDontShow); end; @@ -534,17 +587,21 @@ procedure InitNodes(const aNodeDatas: PViewNodeDatas; aInitialStates := [ivsDisabled]; for i := 0 to Pred(aNodeCount) do - with aNodeDatas[i] do begin + with aNodeDatas[i] do + begin if Assigned(Element) then Exclude(aInitialStates, ivsDisabled) - else - if Assigned(aParentDatas) and ((vnfIgnore in aParentDatas[i].ViewNodeFlags) or (Assigned(aParentDatas[i].Element) and (aParentDatas[i].Element.ConflictPriority = cpIgnore))) then - Include(ViewNodeFlags, vnfIgnore); + else if Assigned(aParentDatas) and + ((vnfIgnore in aParentDatas[i].ViewNodeFlags) or + (Assigned(aParentDatas[i].Element) and + (aParentDatas[i].Element.ConflictPriority = cpIgnore))) then + Include(ViewNodeFlags, vnfIgnore); if not Assigned(Container) then - if Supports(Element, IwbContainerElementRef, Container) then begin - // if Container.ElementCount = 0 then - // Container := nil; + if Supports(Element, IwbContainerElementRef, Container) then + begin + // if Container.ElementCount = 0 then + // Container := nil; end; if Assigned(Container) then @@ -556,29 +613,33 @@ procedure InitNodes(const aNodeDatas: PViewNodeDatas; function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; aSiblingCompare, aInjected: Boolean): TConflictAll; var - ChildCount : Cardinal; - i, j : Integer; - NodeDatas : TDynViewNodeDatas; - InitialStates : TVirtualNodeInitStates; - ConflictAll : TConflictAll; - ConflictThis : TConflictThis; - Element : IwbElement; + ChildCount: Cardinal; + i, j: Integer; + NodeDatas: TDynViewNodeDatas; + InitialStates: TVirtualNodeInitStates; + ConflictAll: TConflictAll; + ConflictThis: TConflictThis; + Element: IwbElement; begin case Length(aNodeDatas) of - 0: Result := caUnknown; - 1: begin - Result := caOnlyOne; - aNodeDatas[0].ConflictThis := ctOnlyOne; - end; + 0: + Result := caUnknown; + 1: + begin + Result := caOnlyOne; + aNodeDatas[0].ConflictThis := ctOnlyOne; + end; else Result := caNoConflict; end; - if wbTranslationMode then begin + if wbTranslationMode then + begin if Result < caOnlyOne then Exit; end - else begin + else + begin if Result < caNoConflict then Exit; end; @@ -586,17 +647,22 @@ function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; ChildCount := 0; InitChilds(@aNodeDatas[0], Length(aNodeDatas), ChildCount); if ChildCount > 0 then - for i := 0 to Pred(ChildCount) do begin + for i := 0 to Pred(ChildCount) do + begin NodeDatas := nil; SetLength(NodeDatas, Length(aNodeDatas)); InitialStates := []; - InitNodes(@NodeDatas[0], @aNodeDatas[0], Length(aNodeDatas), i, InitialStates); - if not (ivsDisabled in InitialStates) then begin + InitNodes(@NodeDatas[0], @aNodeDatas[0], Length(aNodeDatas), i, + InitialStates); + if not(ivsDisabled in InitialStates) then + begin if ivsHasChildren in InitialStates then - ConflictAll := ConflictLevelForChildNodeDatas(NodeDatas, aSiblingCompare, aInjected) + ConflictAll := ConflictLevelForChildNodeDatas(NodeDatas, + aSiblingCompare, aInjected) else - ConflictAll := ConflictLevelForNodeDatas(@NodeDatas[0], Length(NodeDatas), aSiblingCompare, aInjected); + ConflictAll := ConflictLevelForNodeDatas(@NodeDatas[0], + Length(NodeDatas), aSiblingCompare, aInjected); if ConflictAll > Result then Result := ConflictAll; @@ -606,22 +672,27 @@ function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; aNodeDatas[j].ConflictThis := NodeDatas[j].ConflictThis; end - else begin + else + begin ConflictThis := ctNotDefined; - for j := Low(aNodeDatas) to High(aNodeDatas) do begin + for j := Low(aNodeDatas) to High(aNodeDatas) do + begin Element := aNodeDatas[j].Container; if Assigned(Element) then Break; end; - if Assigned(Element) and (Element.ElementType in [etMainRecord, etSubRecordStruct]) then begin + if Assigned(Element) and + (Element.ElementType in [etMainRecord, etSubRecordStruct]) then + begin j := (Element as IwbContainer).AdditionalElementCount; if i >= j then with (Element.Def as IwbRecordDef).Members[i - j] do - if (wbTranslationMode and (ConflictPriority[nil] <> cpTranslate)) or - (wbTranslationMode and (ConflictPriority[nil] = cpIgnore)) then + if (wbTranslationMode and (ConflictPriority[nil] <> cpTranslate)) + or (wbTranslationMode and (ConflictPriority[nil] = cpIgnore)) + then ConflictThis := ctIgnored; end; @@ -635,40 +706,44 @@ function ConflictLevelForChildNodeDatas(const aNodeDatas: TDynViewNodeDatas; function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer; aSiblingCompare, aInjected: Boolean): TConflictAll; var - Element : IwbElement; - CompareElement : IwbElement; - i, j : Integer; - UniqueValues : TnxFastStringListCS; - - MasterPosition : Integer; - FirstElement : IwbElement; - FirstElementNotIgnored : IwbElement; - LastElement : IwbElement; - SameAsLast : Boolean; - SameAsFirst : Boolean; - OverallConflictThis : TConflictThis; - Priority : TwbConflictPriority; - ThisPriority : TwbConflictPriority; - FoundAny : Boolean; + Element: IwbElement; + CompareElement: IwbElement; + i, j: Integer; + UniqueValues: TStringList; + + MasterPosition: Integer; + FirstElement: IwbElement; + FirstElementNotIgnored: IwbElement; + LastElement: IwbElement; + SameAsLast: Boolean; + SameAsFirst: Boolean; + OverallConflictThis: TConflictThis; + Priority: TwbConflictPriority; + ThisPriority: TwbConflictPriority; + FoundAny: Boolean; begin -// if aSiblingCompare then -// Priority := cpBenign -// else -// Priority := cpNormal; -// IgnoreConflicts := False; + // if aSiblingCompare then + // Priority := cpBenign + // else + // Priority := cpNormal; + // IgnoreConflicts := False; FoundAny := False; MasterPosition := 0; OverallConflictThis := ctUnknown; case aNodeCount of - 0: Result := caUnknown; - 1: begin + 0: + Result := caUnknown; + 1: + begin Element := aNodeDatas[0].Element; - if Assigned(Element) then begin + if Assigned(Element) then + begin if Element.ConflictPriority = cpIgnore then aNodeDatas[0].ConflictThis := ctIgnored else aNodeDatas[0].ConflictThis := ctOnlyOne; - end else + end + else aNodeDatas[0].ConflictThis := ctNotDefined; Result := caOnlyOne; end @@ -676,29 +751,36 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; LastElement := aNodeDatas[Pred(aNodeCount)].Element; FirstElement := aNodeDatas[0].Element; - UniqueValues := TnxFastStringListCS.Create; + UniqueValues := TStringList.Create; UniqueValues.Sorted := True; UniqueValues.Duplicates := dupIgnore; Priority := cpNormal; try - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin Element := aNodeDatas[i].Element; - if Assigned(Element) then begin + if Assigned(Element) then + begin FoundAny := True; Priority := Element.ConflictPriority; - if Priority = cpNormalIgnoreEmpty then begin + if Priority = cpNormalIgnoreEmpty then + begin FirstElement := Element; MasterPosition := i; - for j := Pred(aNodeCount) downto i do begin + for j := Pred(aNodeCount) downto i do + begin LastElement := aNodeDatas[j].Element; if Assigned(LastElement) then Break; end; end; - if Element.ConflictPriorityCanChange then begin - for j := Succ(i) to Pred(aNodeCount) do begin + if Element.ConflictPriorityCanChange then + begin + for j := Succ(i) to Pred(aNodeCount) do + begin Element := aNodeDatas[j].Element; - if Assigned(Element) then begin + if Assigned(Element) then + begin ThisPriority := Element.ConflictPriority; if ThisPriority > Priority then Priority := ThisPriority; @@ -715,20 +797,26 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; if aInjected and (Priority >= cpNormal) then Priority := cpCritical; - if (Priority > cpIgnore) and (not Assigned(FirstElement) or (FirstElement.ConflictPriority = cpIgnore)) then + if (Priority > cpIgnore) and + (not Assigned(FirstElement) or + (FirstElement.ConflictPriority = cpIgnore)) then FirstElementNotIgnored := nil else FirstElementNotIgnored := FirstElement; - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin Element := aNodeDatas[i].Element; - if Assigned(Element) then begin + if Assigned(Element) then + begin ThisPriority := Element.ConflictPriority; if ThisPriority <> cpIgnore then UniqueValues.Add(Element.SortKey[True]); - end else begin + end + else + begin ThisPriority := Priority; - if not (vnfIgnore in aNodeDatas[i].ViewNodeFlags) then + if not(vnfIgnore in aNodeDatas[i].ViewNodeFlags) then if Priority <> cpNormalIgnoreEmpty then UniqueValues.Add(''); end; @@ -739,28 +827,31 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; aNodeDatas[i].ConflictThis := ctIgnored else if aSiblingCompare then aNodeDatas[i].ConflictThis := ctOnlyOne - else if i = MasterPosition then begin + else if i = MasterPosition then + begin if Assigned(Element) then aNodeDatas[i].ConflictThis := ctMaster else aNodeDatas[i].ConflictThis := ctUnknown; - end else begin - SameAsLast := (i = Pred(aNodeCount)) or not ( - (Assigned(Element) <> Assigned(LastElement)) or - (Assigned(Element) and not SameStr(Element.SortKey[True], LastElement.SortKey[True])) - ); - - SameAsFirst := not ( - (Assigned(Element) <> Assigned(FirstElementNotIgnored)) or - (Assigned(Element) and not SameStr(Element.SortKey[True], FirstElementNotIgnored.SortKey[True])) - ); - - if not SameAsFirst and - (ThisPriority = cpBenignIfAdded) and - SameAsLast and // We are not overriden later - not Assigned(FirstElementNotIgnored) then begin // The master did not have that element + end + else + begin + SameAsLast := (i = Pred(aNodeCount)) or + not((Assigned(Element) <> Assigned(LastElement)) or + (Assigned(Element) and not SameStr(Element.SortKey[True], + LastElement.SortKey[True]))); + + SameAsFirst := + not((Assigned(Element) <> Assigned(FirstElementNotIgnored)) or + (Assigned(Element) and not SameStr(Element.SortKey[True], + FirstElementNotIgnored.SortKey[True]))); + + if not SameAsFirst and (ThisPriority = cpBenignIfAdded) and + SameAsLast and // We are not overriden later + not Assigned(FirstElementNotIgnored) then + begin // The master did not have that element ThisPriority := cpBenign; Priority := cpBenign; SameAsFirst := True; @@ -774,7 +865,8 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; aNodeDatas[i].ConflictThis := ctConflictLoses; end; - if (ThisPriority = cpBenign) and (aNodeDatas[i].ConflictThis > ctConflictBenign) then + if (ThisPriority = cpBenign) and + (aNodeDatas[i].ConflictThis > ctConflictBenign) then aNodeDatas[i].ConflictThis := ctConflictBenign; if aNodeDatas[i].ConflictThis > OverallConflictThis then @@ -782,15 +874,20 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; end; case UniqueValues.Count of - 0: Result := caNoConflict; - 1: Result := caNoConflict; - 2: begin + 0: + Result := caNoConflict; + 1: + Result := caNoConflict; + 2: + begin Element := aNodeDatas[0].Element; CompareElement := aNodeDatas[Pred(aNodeCount)].Element; if (Assigned(Element) <> Assigned(CompareElement)) or - (Assigned(Element) and not SameStr(Element.SortKey[True], CompareElement.SortKey[True])) then + (Assigned(Element) and not SameStr(Element.SortKey[True], + CompareElement.SortKey[True])) then Result := caOverride - else if (UniqueValues.IndexOf('') >= 0) and Assigned(CompareElement) and (CompareElement.SortKey[True] <> '') then + else if (UniqueValues.IndexOf('') >= 0) and Assigned(CompareElement) + and (CompareElement.SortKey[True] <> '') then Result := caOverride else Result := caConflict; @@ -808,8 +905,10 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; if Result > caNoConflict then case Priority of - cpBenign: Result := caConflictBenign; - cpCritical: begin + cpBenign: + Result := caConflictBenign; + cpCritical: + begin if UniqueValues.Find('', i) then UniqueValues.Delete(i); if UniqueValues.Count > 1 then @@ -827,24 +926,34 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas; ConflictThis := ctConflictWins; if Result in [caNoConflict, caOverride, caConflict] then - for i := 0 to Pred(aNodeCount) do begin + for i := 0 to Pred(aNodeCount) do + begin case aNodeDatas[i].ConflictThis of - ctIdenticalToMaster: case Result of - caNoConflict: ; - caOverride, caConflict: if i = Pred(aNodeCount) then - aNodeDatas[i].ConflictThis := ctIdenticalToMasterWinsConflict + ctIdenticalToMaster: + case Result of + caNoConflict: + ; + caOverride, caConflict: + if i = Pred(aNodeCount) then + aNodeDatas[i].ConflictThis := + ctIdenticalToMasterWinsConflict + end; + ctConflictWins: + case Result of + caNoConflict: + aNodeDatas[i].ConflictThis := ctIdenticalToMaster; + caOverride: + aNodeDatas[i].ConflictThis := ctOverride; + caConflict: + ; end; - ctConflictWins: case Result of - caNoConflict: aNodeDatas[i].ConflictThis := ctIdenticalToMaster; - caOverride: aNodeDatas[i].ConflictThis := ctOverride; - caConflict: ; - end; end; end; if Result < caConflict then for i := 0 to Pred(aNodeCount) do - if aNodeDatas[i].ConflictThis >= ctIdenticalToMasterWinsConflict then begin + if aNodeDatas[i].ConflictThis >= ctIdenticalToMasterWinsConflict then + begin Result := caConflict; Break; end; @@ -880,23 +989,25 @@ function IsITPO(rec: IwbMainRecord): Boolean; begin // get previous override mRec := rec.MasterOrSelf; - prevovr := mRec; - for i := 0 to Pred(mRec.OverrideCount) do begin + prevOvr := mRec; + for i := 0 to Pred(mRec.OverrideCount) do + begin ovr := mRec.Overrides[i]; + if ovr._File.FileName.EndsWith(csDotGhost) then + // Skip ghosted overrides + continue; if ovr.Equals(rec) then Break; - prevovr := ovr; + prevOvr := ovr; end; - Result := ConflictAllForElements(prevovr, rec, False, False) <= caNoConflict; + Result := ConflictAllForElements(prevOvr, rec, False, False) <= caNoConflict; end; function IsITM(rec: IwbMainRecord): Boolean; const - ITMConflictArray: set of TConflictThis = [ - ctIdenticalToMaster, - ctIdenticalToMasterWinsConflict - ]; + ITMConflictArray: set of TConflictThis = [ctIdenticalToMaster, + ctIdenticalToMasterWinsConflict]; begin Result := ConflictThisForMainRecord(rec) in ITMConflictArray; end; diff --git a/frontend/msConflictForm.dfm b/frontend/msConflictForm.dfm old mode 100644 new mode 100755 index 08c2378..382a210 --- a/frontend/msConflictForm.dfm +++ b/frontend/msConflictForm.dfm @@ -68,7 +68,7 @@ object ConflictForm: TConflictForm Left = 408 Top = 24 Bitmap = { - 494C010103000800540010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010103000800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 0000000000000000000000000000000000000000000000000000000000000000 0000D7D7F8FF7373E6FF3434DBFF2121BEFF2121BEFF2D2DDAFF6B6BE4FFD2D2 @@ -213,7 +213,7 @@ object ConflictForm: TConflictForm Left = 336 Top = 24 Bitmap = { - 494C010104000800500011001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010104000800040011001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000440000002200000001002000000000002024 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/frontend/msConflictForm.pas b/frontend/msConflictForm.pas old mode 100644 new mode 100755 index 7904c73..e40bc96 --- a/frontend/msConflictForm.pas +++ b/frontend/msConflictForm.pas @@ -10,7 +10,7 @@ interface // mte units mteHelpers, mteBase, // ms units - msCore, msChoicePanel; + msCore, msChoicePanel, System.ImageList; type TConflictForm = class(TForm) @@ -21,8 +21,8 @@ TConflictForm = class(TForm) FlagIcons: TImageList; StateImages: TImageList; procedure DrawFlag(Canvas: TCanvas; var x, y: Integer; id: Integer); - procedure tvRecordsCustomDrawItem(Sender: TCustomTreeView; - Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure tvRecordsCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; + State: TCustomDrawState; var DefaultDraw: Boolean); procedure PopulateTree(sig: string; aSetting: TSmashSetting); procedure ChoiceSelected(Sender: TObject); procedure CreateChoicePanel(sig: string; var lst: TList); @@ -30,8 +30,8 @@ TConflictForm = class(TForm) procedure FormCreate(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure tvRecordsMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + procedure tvRecordsMouseMove(Sender: TObject; Shift: TShiftState; + x, y: Integer); private { Private declarations } lastHint: string; @@ -52,7 +52,8 @@ implementation {$R *.dfm} -procedure TConflictForm.DrawFlag(Canvas: TCanvas; var x, y: Integer; id: Integer); +procedure TConflictForm.DrawFlag(Canvas: TCanvas; var x, y: Integer; + id: Integer); var icon: TIcon; begin @@ -72,8 +73,9 @@ procedure TConflictForm.tvRecordsCustomDrawItem(Sender: TCustomTreeView; R: TRect; x, y: Integer; begin - if Assigned(node.Data) then begin - e := TElementData(node.Data); + if Assigned(Node.Data) then + begin + e := TElementData(Node.Data); R := Node.DisplayRect(true); x := R.Right + 6; y := R.Top; @@ -88,35 +90,37 @@ procedure TConflictForm.tvRecordsCustomDrawItem(Sender: TCustomTreeView; end; procedure TConflictForm.tvRecordsMouseMove(Sender: TObject; Shift: TShiftState; - X, Y: Integer); + x, y: Integer); var - node: TTreeNode; + Node: TTreeNode; e: TElementData; sHint: string; begin // hide hint and exit if shift is down - if (ssShift in Shift) then begin + if (ssShift in Shift) then + begin Application.HideHint; exit; end; // draw hint if on a node with the link parameter - node := tvRecords.GetNodeAt(X, Y); - if not Assigned(node) then + Node := tvRecords.GetNodeAt(x, y); + if not Assigned(Node) then exit; - e := TElementData(node.Data); + e := TElementData(Node.Data); if not Assigned(e) then exit; // get hint - sHint := node.Text + #13#10'Type: '+stToString(e.smashType); + sHint := Node.Text + #13#10'Type: ' + stToString(e.smashType); if e.linkTo <> '' then - sHint := sHint + #13#10'Linked to: '+e.linkTo; + sHint := sHint + #13#10'Linked to: ' + e.linkTo; if e.linkFrom <> '' then - sHint := sHint + #13#10'Linked from: '+e.linkFrom; + sHint := sHint + #13#10'Linked from: ' + e.linkFrom; // display hint if it isn't the last hint we displayed - if sHint <> lastHint then begin + if sHint <> lastHint then + begin tvRecords.Hint := sHint; Application.ActivateHint(Mouse.CursorPos); lastHint := sHint; @@ -130,7 +134,8 @@ procedure TConflictForm.PopulateTree(sig: string; aSetting: TSmashSetting); begin rootNode := tvRecords.Items[0]; for item in aSetting.tree['records'] do - if Copy(item.S['n'], 1, 4) = sig then begin + if Copy(item.S['n'], 1, 4) = sig then + begin LoadElement(tvRecords, rootNode, item, false); break; end; @@ -144,10 +149,12 @@ procedure TConflictForm.btnOKClick(Sender: TObject); begin // get user selection from choice panels, add it to slConflicts // to be handled later - for i := 0 to Pred(ChoicePanels.Count) do begin + for i := 0 to Pred(ChoicePanels.Count) do + begin aChoicePanel := TChoicePanel(ChoicePanels[i]); aSetting := aChoicePanel.GetSetting; - if Assigned(aSetting) then begin + if Assigned(aSetting) then + begin DeleteMatchingItems(aChoicePanel.GetLabel, slConflicts); slConflicts.AddObject(aChoicePanel.GetLabel, TObject(aSetting)); end; @@ -168,7 +175,8 @@ procedure TConflictForm.ChoiceSelected(Sender: TObject); tvRecords.Items.Add(nil, 'Records'); // populate tree view with selected record nodes - for i := 0 to Pred(ChoicePanels.Count) do begin + for i := 0 to Pred(ChoicePanels.Count) do + begin aChoicePanel := TChoicePanel(ChoicePanels[i]); if not aChoicePanel.Selected then continue; @@ -215,7 +223,8 @@ procedure TConflictForm.FormShow(Sender: TObject); // (retrieved from slConflicts) sl := TStringList.Create; try - for i := 0 to Pred(slConflicts.Count) do begin + for i := 0 to Pred(slConflicts.Count) do + begin aSetting := TSmashSetting(slConflicts.Objects[i]); index := sl.IndexOf(slConflicts[i]); if index = -1 then @@ -225,7 +234,8 @@ procedure TConflictForm.FormShow(Sender: TObject); end; // create choice panels - for i := 0 to Pred(sl.Count) do begin + for i := 0 to Pred(sl.Count) do + begin lst := TList(sl.Objects[i]); if lst.Count > 1 then CreateChoicePanel(sl[i], lst); diff --git a/frontend/msCore.pas b/frontend/msCore.pas old mode 100644 new mode 100755 index 56300a5..7e7d7c9 --- a/frontend/msCore.pas +++ b/frontend/msCore.pas @@ -7,7 +7,9 @@ interface // third party libraries superobject, // mte units - mteBase; + mteBase, + // xEdit + wbInterface; type // SMASH CLASSES @@ -27,6 +29,7 @@ TElementData = class(TObject) overrideDeletions, singleEntity, forceValue: boolean; smashType: TSmashType; linkTo, linkFrom: string); overload; end; + TSmashSetting = class(TObject) public name: string; @@ -41,7 +44,7 @@ TSmashSetting = class(TObject) constructor Clone(s: TSmashSetting); function GetRecordDef(sig: string): ISuperObject; procedure LoadDump(dump: ISuperObject); - function Dump: ISuperObject; + function dump: ISuperObject; procedure UpdateHash; procedure UpdateRecords; procedure Save; @@ -51,8 +54,9 @@ TSmashSetting = class(TObject) function GetTags: String; function GetCombinedTags: String; end; - {TRecommendation = class(TObject) - public + + { TRecommendation = class(TObject) + public game: string; username: string; filename: string; @@ -67,16 +71,18 @@ {TRecommendation = class(TObject) procedure SetNotes(notes: string); function GetNotes: string; procedure Save(const filename: string); - end; } + end; } // SMASH CORE CLASSES - TPatchStatusID = ( psUnknown, psNoPlugins, psDirInvalid, psUnloaded, - psErrors, psFailed, psUpToDate, psUpToDateForced, psBuildReady, - psRebuildReady, psRebuildReadyForced ); - TPatchStatus = Record + TPatchStatusID = (psUnknown, psNoPlugins, psDirInvalid, psUnloaded, psErrors, + psFailed, psUpToDate, psUpToDateForced, psBuildReady, psRebuildReady, + psRebuildReadyForced); + + TPatchStatus = Record id: TPatchStatusID; color: integer; desc: string[64]; end; + TPlugin = class(TBasePlugin) public setting: string; @@ -85,11 +91,11 @@ TPlugin = class(TBasePlugin) constructor Create; override; procedure GetMsData; procedure GetDataPath; - function GetFormIndex: Integer; + function GetFormIndex: integer; function IsInPatch: boolean; procedure LoadInfoDump(obj: ISuperObject); function InfoDump: ISuperObject; - function HasTags: Boolean; + function HasTags: boolean; procedure ApplySettingTags; procedure SetSmashSetting(aSetting: TSmashSetting); procedure LoadTags(sSettingName: String; var sl: TStringList; @@ -98,6 +104,7 @@ TPlugin = class(TBasePlugin) procedure WriteDescription; procedure Save; end; + TPatch = class(TObject) public name: string; @@ -113,7 +120,7 @@ TPatch = class(TObject) fails: TStringList; constructor Create; virtual; destructor Destroy; override; - function Dump: ISuperObject; + function dump: ISuperObject; procedure LoadDump(obj: ISuperObject); function GetTimeCost: integer; procedure UpdateHashes; @@ -128,67 +135,69 @@ TPatch = class(TObject) function FilesExist: boolean; function GetStatusColor: integer; end; + TSettingHelpers = class class function SettingByName(name: String): TSmashSetting; class function SettingByHash(hash: String): TSmashSetting; class function GetSmashSetting(setting: string): TSmashSetting; end; + TPatchHelpers = class class function CreateNewPatch(var patches: TList): TPatch; class function GetPatchForPlugin(filename: string): string; class procedure AssignPatchesToPlugins; class function PatchByName(var patches: TList; name: string): TPatch; - class function PatchByFilename(var patches: TList; filename: string): TPatch; + class function PatchByFilename(var patches: TList; + filename: string): TPatch; end; // Loading/Saving Functions - procedure RenameSavedPlugins; - procedure SavePatches; - procedure LoadPatches; - procedure SaveSmashSettings; - procedure LoadSmashSettings; - procedure SavePluginInfo; - procedure LoadPluginInfo; - procedure LoadSettingTags; - // Helper Functions - procedure HandleCanceled(msg: string); - - procedure UpdatePluginData; - function CreateNewPlugin(sFilename: string): TPlugin; - function PluginLoadOrder(sFilename: string): Integer; - function PluginByFilename(sFilename: string): TPlugin; - procedure PopulateAddList(var AddItem: TMenuItem; Event: TNotifyEvent); - procedure AddAllRecords(currentSetting: TSmashSetting; var tv: TTreeView); - procedure RemoveSettingFromPlugins(aSetting: TSmashSetting); - function GetTagString(var slTags: TStringList): String; - // Tree Helper Functions - procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; - tree: ISuperObject); - procedure SetChildren(node: TTreeNode; state: Integer); - procedure UpdateParent(node: TTreeNode); - procedure CheckBoxManager(node: TTreeNode); - procedure LoadElement(var tv: TTreeView; node: TTreeNode; obj: ISuperObject; - bWithinSingle: boolean); - procedure LoadTree(var tv: TTreeView; aSetting: TSmashSetting); - function GetRecordObject(tree: ISuperObject; sig: string): ISuperObject; - function GetChild(obj: ISuperObject; name: string): ISuperObject; - procedure MergeChildren(srcObj, dstObj: ISuperObject); - function CreateCombinedSetting(var sl: TStringList; name: string; - bVirtual: boolean = false): TSmashSetting; - function CombineSettingTrees(var lst: TList; var slSettings: TStringList): boolean; - // Tag Helper Functions - function ClearTags(sDescription: String): String; - procedure GetMissingTags(var slPresent, slMissing: TStringList); - procedure ExtractTags(var match: TMatch; var sl: TStringList; - var sTagGroup: String); - procedure ParseTags(description: string; var sl: TStringList); +procedure RenameSavedPlugins; +procedure SavePatches; +procedure LoadPatches; +procedure SaveSmashSettings; +procedure LoadSmashSettings; +procedure SavePluginInfo; +procedure LoadPluginInfo; +procedure LoadSettingTags; +// Helper Functions +procedure HandleCanceled(msg: string); +procedure UpdatePluginData; +function CreateNewPlugin(sFilename: string): TPlugin; +function PluginLoadOrder(sFilename: string): integer; +function PluginByFilename(sFilename: string): TPlugin; +procedure PopulateAddList(var AddItem: TMenuItem; Event: TNotifyEvent); +procedure AddAllRecords(currentSetting: TSmashSetting; var tv: TTreeView); +procedure RemoveSettingFromPlugins(aSetting: TSmashSetting); +function GetTagString(var slTags: TStringList): String; +// Tree Helper Functions +procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; + tree: ISuperObject); +procedure SetChildren(node: TTreeNode; state: integer); +procedure UpdateParent(node: TTreeNode); +procedure CheckBoxManager(node: TTreeNode); +procedure LoadElement(var tv: TTreeView; node: TTreeNode; obj: ISuperObject; + bWithinSingle: boolean); +procedure LoadTree(var tv: TTreeView; aSetting: TSmashSetting); +function GetRecordObject(tree: ISuperObject; sig: string): ISuperObject; +function GetChild(obj: ISuperObject; name: string): ISuperObject; +procedure MergeChildren(srcObj, dstObj: ISuperObject); +function CreateCombinedSetting(var sl: TStringList; name: string; + bVirtual: boolean = false): TSmashSetting; +function CombineSettingTrees(var lst: TList; + var slSettings: TStringList): boolean; +// Tag Helper Functions +function ClearTags(sDescription: String): String; +procedure GetMissingTags(var slPresent, slMissing: TStringList); +procedure ExtractTags(var match: TMatch; var sl: TStringList; + var sTagGroup: String); +procedure ParseTags(description: string; var sl: TStringList); const // IMPORTANT CONSTANTS ProgramTesters = ' '; - ProgramTranslators = ' '; - xEditVersion = '3.1.1'; + ProgramTranslators = 'Koriss_'; // CHECKBOX STATES csUnknown = 0; @@ -197,35 +206,37 @@ TPatchHelpers = class csPartiallyChecked = 3; // SMASH TYPE ARRAYS - stArrays = [ stUnsortedArray, stUnsortedStructArray, - stSortedArray, stSortedStructArray ]; - stValues = [ stString, stFloat, stInteger, stByteArray ]; + stArrays = [stUnsortedArray, stUnsortedStructArray, stSortedArray, + stSortedStructArray]; + stValues = [stString, stFloat, stInteger, stByteArray]; // PATCH STATUSES - StatusArray: array[0..10] of TPatchStatus = ( - ( id: psUnknown; color: $808080; desc: 'Unknown'; ), - ( id: psNoPlugins; color: $0000FF; desc: 'Need two or more plugins to patch'; ), - ( id: psDirInvalid; color: $0000FF; desc: 'Directories invalid'; ), - ( id: psUnloaded; color: $0000FF; desc: 'Plugins not loaded'; ), - ( id: psErrors; color: $0000FF; desc: 'Errors in plugins'; ), - ( id: psFailed; color: $0000FF; desc: 'Patch failed'; ), - ( id: psUpToDate; color: $900000; desc: 'Up to date'; ), - ( id: psUpToDateForced; color: $900000; desc: 'Up to date [Forced]'; ), - ( id: psBuildReady; color: $009000; desc: 'Ready to be built'; ), - ( id: psRebuildReady; color: $009000; desc: 'Ready to be rebuilt'; ), - ( id: psRebuildReadyForced; color: $009000; desc: 'Ready to be rebuilt [Forced]'; ) - ); + StatusArray: array [0 .. 10] of TPatchStatus = ((id: psUnknown; + color: $808080; desc: 'Unknown';), (id: psNoPlugins; color: $0000FF; + desc: 'Need two or more plugins to patch'; + ), (id: psDirInvalid; color: $0000FF; desc: 'Directories invalid'; + ), (id: psUnloaded; color: $0000FF; desc: 'Plugins not loaded'; + ), (id: psErrors; color: $0000FF; desc: 'Errors in plugins'; + ), (id: psFailed; color: $0000FF; desc: 'Patch failed'; + ), (id: psUpToDate; color: $900000; desc: 'Up to date'; + ), (id: psUpToDateForced; color: $900000; desc: 'Up to date [Forced]'; + ), (id: psBuildReady; color: $009000; desc: 'Ready to be built'; + ), (id: psRebuildReady; color: $009000; desc: 'Ready to be rebuilt'; + ), (id: psRebuildReadyForced; color: $009000; + desc: 'Ready to be rebuilt [Forced]';)); // STATUS TYPES ErrorStatuses = [psUnknown, psNoPlugins, psDirInvalid, psUnloaded, psErrors]; UpToDateStatuses = [psUpToDate, psUpToDateForced]; - BuildStatuses = [psBuildReady, psRebuildReady, psRebuildReadyForced, psFailed]; + BuildStatuses = [psBuildReady, psRebuildReady, psRebuildReadyForced, + psFailed]; RebuildStatuses = [psRebuildReady, psRebuildReadyForced, psFailed]; ForcedStatuses = [psUpToDateForced, psRebuildReadyForced]; ResolveStatuses = [psNoPlugins, psDirInvalid, psUnloaded, psErrors]; FailedStatuses = [psFailed]; var - PatchesList, SmashSettings, pluginsToHandle, patchesToBuild: TList; + xEditVersion: string; + PatchesList, smashSettings, pluginsToHandle, patchesToBuild: TList; ActiveMods, SavedPluginPaths: TStringList; ActiveModProfile, xEditLogGroup, xEditLogLabel, DictionaryFilename: string; @@ -238,12 +249,13 @@ implementation // mp units msConfiguration, // xEdit units - wbInterface, wbImplementation; + wbImplementation; { TPlugin Constructor } constructor TPlugin.Create; begin patch := ' '; + xEditVersion := VersionString; inherited; end; @@ -256,7 +268,7 @@ procedure TPlugin.GetMsData; GetDataPath; GetHash; - // get numOverrides if not blacklisted + // get numOverrides if not blacklisted if (numRecords < 10000) then numOverrides := CountOverrides(_File); @@ -269,14 +281,15 @@ procedure TPlugin.GetDataPath; dataPath := wbDataPath; end; -function TPlugin.GetFormIndex: Integer; +function TPlugin.GetFormIndex: integer; var Container, MasterFiles: IwbContainer; begin Result := 0; Container := self._File as IwbContainer; Container := Container.Elements[0] as IwbContainer; - if Container.ElementExists['Master Files'] then begin + if Container.ElementExists['Master Files'] then + begin MasterFiles := Container.ElementByPath['Master Files'] as IwbContainer; Result := MasterFiles.ElementCount; end; @@ -294,9 +307,9 @@ function TPlugin.InfoDump: ISuperObject; obj := SO; // filename, hash, errors - obj.S['filename'] := filename; - obj.S['hash'] := hash; - obj.S['setting'] := setting; + obj.s['filename'] := filename; + obj.s['hash'] := hash; + obj.s['setting'] := setting; Result := obj; end; @@ -305,30 +318,32 @@ procedure TPlugin.LoadInfoDump(obj: ISuperObject); var aSetting: TSmashSetting; begin - aSetting := TSettingHelpers.SettingByName(obj.AsObject.S['setting']); + aSetting := TSettingHelpers.SettingByName(obj.AsObject.s['setting']); SetSmashSetting(aSetting); end; procedure TPlugin.SetSmashSetting(aSetting: TSmashSetting); begin - if not Assigned(aSetting) then begin + if not Assigned(aSetting) then + begin setting := 'Skip'; smashSetting := TSettingHelpers.SettingByName(setting); end - else begin + else + begin setting := aSetting.name; smashSetting := aSetting; - Logger.Write('PLUGIN', 'Settings', 'Using '+setting+' for '+filename); + Logger.Write('PLUGIN', 'Settings', 'Using ' + setting + ' for ' + filename); end; end; -function TPlugin.HasTags: Boolean; +function TPlugin.HasTags: boolean; var regex: TRegex; match: TMatch; begin - regex := TRegEx.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); - match := regex.Match(description.Text); + regex := TRegex.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); + match := regex.match(description.Text); Result := match.Success; end; @@ -352,21 +367,25 @@ procedure TPlugin.LoadTags(sSettingName: String; var sl: TStringList; slRecords: TStringList; aSetting: TSmashSetting; settingsToCombine: TList; - i: Integer; + i: integer; begin // if only one setting present, use it - if sl.Count = 1 then begin + if sl.Count = 1 then + begin aSetting := TSettingHelpers.GetSmashSetting(sl[0]); SetSmashSetting(aSetting); end // else make a combined setting - else begin + else + begin settingsToCombine := TList.Create; // loop through found settings - for i := Pred(sl.Count) downto 0 do begin + for i := Pred(sl.Count) downto 0 do + begin aSetting := TSettingHelpers.GetSmashSetting(sl[i]); - if not Assigned(aSetting) then begin + if not Assigned(aSetting) then + begin sl.Delete(i); continue; end; @@ -376,11 +395,12 @@ procedure TPlugin.LoadTags(sSettingName: String; var sl: TStringList; // if settingsToCombine has 0 settings, set to skip setting if settingsToCombine.Count = 0 then SetSmashSetting(nil) - // if settingToCombine has only 1 setting, use that setting + // if settingToCombine has only 1 setting, use that setting else if settingsToCombine.Count = 1 then SetSmashSetting(settingsToCombine[0]) - // else build a combined setting - else begin + // else build a combined setting + else + begin Logger.Write('PLUGIN', 'Settings', 'Building combined setting'); slRecords := TStringList.Create; CombineSettingTrees(settingsToCombine, slRecords); @@ -394,25 +414,28 @@ procedure TPlugin.LoadTags(sSettingName: String; var sl: TStringList; procedure TPlugin.GetSettingTag; var - regex: TRegEx; + regex: TRegex; match: TMatch; sTagGroup: String; sl: TStringList; begin // get setting tags from description - regex := TRegEx.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); - match := regex.Match(description.Text); + regex := TRegex.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); + match := regex.match(description.Text); sl := TStringList.Create; // set to skip setting if no tag is found - if not match.Success then begin - Logger.Write('PLUGIN', 'Tags', 'No tags found for '+filename); + if not match.Success then + begin + Logger.Write('PLUGIN', 'Tags', 'No tags found for ' + filename); setting := 'Skip'; smashSetting := TSettingHelpers.SettingByName(setting); end // else parse settings from tag - else begin - Logger.Write('PLUGIN', 'Tags', 'Found tag '+match.Value+' for '+filename); + else + begin + Logger.Write('PLUGIN', 'Tags', 'Found tag ' + match.Value + ' for ' + + filename); ExtractTags(match, sl, sTagGroup); LoadTags(match.Groups.Item[2].Value, sl, sTagGroup); end; @@ -443,12 +466,19 @@ procedure TPlugin.Save; FileStream := nil; try FileStream := TFileStream.Create(path, fmCreate); - _File.WriteToStream(FileStream, False); + // Force xedit to save everything in file? + { + _File.MarkModifiedRecursive([etFile, etMainRecord, etGroupRecord, + etSubRecord, etSubRecordStruct, etSubRecordArray, etSubRecordUnion, + etArray, etStruct, etValue, etFlag, etStringListTerminator, etUnion, + etStructChapter]); + } + _File.WriteToStream(FileStream, TwbResetModified.rmNo); if SavedPluginPaths.IndexOf(path) = -1 then SavedPluginPaths.Add(dataPath + filename); except on x: Exception do - Tracker.Write('Failed to save: '+x.Message); + Tracker.Write('Failed to save: ' + x.Message); end; TryToFree(FileStream); end; @@ -477,9 +507,8 @@ destructor TPatch.Destroy; inherited; end; - { Produces a dump of the patch. } -function TPatch.Dump: ISuperObject; +function TPatch.dump: ISuperObject; var obj: ISuperObject; i: integer; @@ -487,28 +516,28 @@ function TPatch.Dump: ISuperObject; obj := SO; // normal attributes - obj.S['name'] := name; - obj.S['filename'] := filename; - obj.S['dateBuilt'] := DateTimeToStr(dateBuilt); + obj.s['name'] := name; + obj.s['filename'] := filename; + obj.s['dateBuilt'] := DateTimeToStr(dateBuilt); // plugins, pluginHashes, pluginSettings, masters obj.O['plugins'] := SA([]); for i := 0 to Pred(plugins.Count) do - obj.A['plugins'].S[i] := plugins[i]; + obj.A['plugins'].s[i] := plugins[i]; obj.O['pluginHashes'] := SA([]); for i := 0 to Pred(hashes.Count) do - obj.A['pluginHashes'].S[i] := hashes[i]; + obj.A['pluginHashes'].s[i] := hashes[i]; obj.O['pluginSettings'] := SA([]); for i := 0 to Pred(smashSettings.Count) do - obj.A['pluginSettings'].S[i] := smashSettings[i]; + obj.A['pluginSettings'].s[i] := smashSettings[i]; obj.O['masters'] := SA([]); for i := 0 to Pred(masters.Count) do - obj.A['masters'].S[i] := masters[i]; + obj.A['masters'].s[i] := masters[i]; // files, log, ignored dependencies obj.O['fails'] := SA([]); for i := 0 to Pred(fails.Count) do - obj.A['fails'].S[i] := fails[i]; + obj.A['fails'].s[i] := fails[i]; Result := obj; end; @@ -516,44 +545,46 @@ function TPatch.Dump: ISuperObject; { Loads a dump of a patch. } procedure TPatch.LoadDump(obj: ISuperObject); var - item: ISuperObject; + Item: ISuperObject; begin // load object attributes - name := obj.AsObject.S['name']; - filename := obj.AsObject.S['filename']; + name := obj.AsObject.s['name']; + filename := obj.AsObject.s['filename']; // try loading dateBuilt and parsing to DateTime try - dateBuilt := StrToDateTime(obj.AsObject.S['dateBuilt']); - except on Exception do - dateBuilt := 0; // on exception set to never built + dateBuilt := StrToDateTime(obj.AsObject.s['dateBuilt']); + except + on Exception do + dateBuilt := 0; // on exception set to never built end; // load array attributes - for item in obj['plugins'] do - plugins.Add(item.AsString); - for item in obj['pluginHashes'] do - hashes.Add(item.AsString); + for Item in obj['plugins'] do + plugins.Add(Item.AsString); + for Item in obj['pluginHashes'] do + hashes.Add(Item.AsString); try - for item in obj['pluginSettings'] do - smashSettings.Add(item.AsString); + for Item in obj['pluginSettings'] do + smashSettings.Add(Item.AsString); except on x: Exception do // nothing end; - for item in obj['masters'] do - masters.Add(item.AsString); - for item in obj['fails'] do - fails.Add(item.AsString); + for Item in obj['masters'] do + masters.Add(Item.AsString); + for Item in obj['fails'] do + fails.Add(Item.AsString); end; function TPatch.GetTimeCost: integer; var - i: Integer; + i: integer; plugin: TPlugin; begin Result := 10000; - for i := 0 to Pred(plugins.Count) do begin + for i := 0 to Pred(plugins.Count) do + begin plugin := PluginByFilename(plugins[i]); if Assigned(plugin) then Inc(Result, plugin._File.RecordCount); @@ -569,28 +600,37 @@ function TPatch.PluginsModified: boolean; begin Result := false; // true if number of hashes not equal to number of plugins - if (plugins.Count <> hashes.Count) - or (plugins.Count <> smashSettings.Count) then begin + if (plugins.Count <> hashes.Count) or (plugins.Count <> smashSettings.Count) + then + begin Logger.Write('PATCH', 'Status', name + ' -> Plugin count changed'); Result := true; exit; end; // true if any plugin hash doesn't match - for i := 0 to Pred(plugins.count) do begin + for i := 0 to Pred(plugins.Count) do + begin plugin := PluginByFilename(plugins[i]); - if Assigned(plugin) then begin - if plugin.hash <> hashes[i] then begin - Logger.Write('PATCH', 'Status', name + ' -> '+plugin.filename + ' hash changed.'); + if Assigned(plugin) then + begin + if plugin.hash <> hashes[i] then + begin + Logger.Write('PATCH', 'Status', name + ' -> ' + plugin.filename + + ' hash changed.'); Result := true; end; end; end; // true if any plugin setting doesn't match - for i := 0 to Pred(plugins.count) do begin + for i := 0 to Pred(plugins.Count) do + begin plugin := PluginByFilename(plugins[i]); - if Assigned(plugin) then begin - if plugin.setting <> smashSettings[i] then begin - Logger.Write('PATCH', 'Status', name + ' -> '+plugin.filename + ' smash setting changed.'); + if Assigned(plugin) then + begin + if plugin.setting <> smashSettings[i] then + begin + Logger.Write('PATCH', 'Status', name + ' -> ' + plugin.filename + + ' smash setting changed.'); Result := true; end; end; @@ -612,21 +652,24 @@ procedure TPatch.UpdateDataPath; procedure TPatch.GetStatus; var - i: Integer; + i: integer; plugin: TPlugin; begin Logger.Write('PATCH', 'Status', name + ' -> Getting status'); status := psUnknown; // don't patch if there aren't two or more plugins to patch - if (plugins.Count < 2) then begin - Logger.Write('PATCH', 'Status', name + ' -> Need two or more plugins to patch'); + if (plugins.Count < 2) then + begin + Logger.Write('PATCH', 'Status', + name + ' -> Need two or more plugins to patch'); status := psNoPlugins; exit; end; // don't patch if mod destination directory is blank - if (settings.patchDirectory = '') then begin + if (settings.patchDirectory = '') then + begin Logger.Write('PATCH', 'Status', name + ' -> Patch directory blank'); status := psDirInvalid; exit; @@ -636,26 +679,32 @@ procedure TPatch.GetStatus; UpdateDataPath; // loop through plugins - for i := 0 to Pred(plugins.Count) do begin + for i := 0 to Pred(plugins.Count) do + begin plugin := PluginByFilename(plugins[i]); // see if plugin is loaded - if not Assigned(plugin) then begin - Logger.Write('PATCH', 'Status', name + ' -> Plugin '+plugins[i]+' is missing'); - if status = psUnknown then status := psUnloaded; + if not Assigned(plugin) then + begin + Logger.Write('PATCH', 'Status', name + ' -> Plugin ' + plugins[i] + + ' is missing'); + if status = psUnknown then + status := psUnloaded; continue; end; end; // check plugins were modified or files were deleted before // giving patch the up to date status - if (not PluginsModified) and FilesExist and (status = psUnknown) then begin + if (not PluginsModified) and FilesExist and (status = psUnknown) then + begin Logger.Write('PATCH', 'Status', name + ' -> Up to date'); status := psUpToDate; end; // status green, ready to go - if status = psUnknown then begin + if status = psUnknown then + begin Logger.Write('PATCH', 'Status', name + ' -> Ready to be patchd'); if dateBuilt = 0 then status := psBuildReady @@ -672,11 +721,12 @@ function TPatch.GetStatusColor: integer; // Update the hashes list for the plugins in the patch procedure TPatch.UpdateHashes; var - i: Integer; + i: integer; aPlugin: TPlugin; begin hashes.Clear; - for i := 0 to Pred(plugins.Count) do begin + for i := 0 to Pred(plugins.Count) do + begin aPlugin := PluginByFilename(plugins[i]); if Assigned(aPlugin) then hashes.Add(aPlugin.hash); @@ -686,11 +736,12 @@ procedure TPatch.UpdateHashes; // Update the settings list for the plugins in the patch procedure TPatch.UpdateSettings; var - i: Integer; + i: integer; aPlugin: TPlugin; begin smashSettings.Clear; - for i := 0 to Pred(plugins.Count) do begin + for i := 0 to Pred(plugins.Count) do + begin aPlugin := PluginByFilename(plugins[i]); if Assigned(aPlugin) then smashSettings.Add(aPlugin.setting); @@ -716,7 +767,7 @@ procedure TPatch.SortPlugins; procedure TPatch.Remove(plugin: TPlugin); var - index: Integer; + index: integer; begin // clear plugin's patch property, if it's the name of this patch if plugin.patch = name then @@ -729,7 +780,7 @@ procedure TPatch.Remove(plugin: TPlugin); procedure TPatch.Remove(pluginFilename: string); var - index: Integer; + index: integer; begin index := plugins.IndexOf(pluginFilename); // remove plugin from patch, if present @@ -746,9 +797,11 @@ class function TSettingHelpers.SettingByName(name: string): TSmashSetting; aSetting: TSmashSetting; begin Result := nil; - for i := 0 to Pred(SmashSettings.Count) do begin - aSetting := TSmashSetting(SmashSettings[i]); - if aSetting.name = name then begin + for i := 0 to Pred(smashSettings.Count) do + begin + aSetting := TSmashSetting(smashSettings[i]); + if aSetting.name = name then + begin Result := aSetting; exit; end; @@ -762,9 +815,11 @@ class function TSettingHelpers.SettingByHash(hash: string): TSmashSetting; aSetting: TSmashSetting; begin Result := nil; - for i := 0 to Pred(SmashSettings.Count) do begin - aSetting := TSmashSetting(SmashSettings[i]); - if aSetting.MatchesHash(hash) then begin + for i := 0 to Pred(smashSettings.Count) do + begin + aSetting := TSmashSetting(smashSettings[i]); + if aSetting.MatchesHash(hash) then + begin Result := aSetting; exit; end; @@ -781,7 +836,8 @@ class function TSettingHelpers.GetSmashSetting(setting: string): TSmashSetting; Result := nil; // parse setting name and hash - if Pos('|', setting) > 0 then begin + if Pos('|', setting) > 0 then + begin sl := TStringList.Create; try sl.Delimiter := '|'; @@ -789,7 +845,8 @@ class function TSettingHelpers.GetSmashSetting(setting: string): TSmashSetting; sl.DelimitedText := setting; // if we have a setting name, use it to get a smash setting - if Length(sl[0]) > 0 then begin + if Length(sl[0]) > 0 then + begin smashSetting := SettingByName(sl[0]); // and return it if the hash matches if Assigned(smashSetting) and smashSetting.MatchesHash(sl[1]) then @@ -811,13 +868,15 @@ class function TSettingHelpers.GetSmashSetting(setting: string): TSmashSetting; class function TPatchHelpers.GetPatchForPlugin(filename: string): string; var - i: Integer; + i: integer; patch: TPatch; begin Result := ' '; - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); - if patch.plugins.IndexOf(filename) > -1 then begin + if patch.plugins.IndexOf(filename) > -1 then + begin Result := patch.name; break; end; @@ -826,13 +885,15 @@ class function TPatchHelpers.GetPatchForPlugin(filename: string): string; class procedure TPatchHelpers.AssignPatchesToPlugins; var - i, j: Integer; + i, j: integer; patch: TPatch; plugin: TPlugin; begin - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); - for j := 0 to Pred(patch.plugins.Count) do begin + for j := 0 to Pred(patch.plugins.Count) do + begin plugin := PluginByFilename(patch.plugins[j]); if Assigned(plugin) then plugin.patch := patch.name; @@ -841,32 +902,37 @@ class procedure TPatchHelpers.AssignPatchesToPlugins; end; { Gets a patch matching the given name. } -class function TPatchHelpers.PatchByName(var patches: TList; name: string): TPatch; +class function TPatchHelpers.PatchByName(var patches: TList; + name: string): TPatch; var i: integer; patch: TPatch; begin Result := nil; - for i := 0 to Pred(patches.Count) do begin + for i := 0 to Pred(patches.Count) do + begin patch := TPatch(patches[i]); - if patch.name = name then begin + if patch.name = name then + begin Result := patch; exit; end; end; end; - { Gets a patch matching the given filename. } -class function TPatchHelpers.PatchByFilename(var patches: TList; filename: string): TPatch; +class function TPatchHelpers.PatchByFilename(var patches: TList; + filename: string): TPatch; var i: integer; patch: TPatch; begin Result := nil; - for i := 0 to Pred(patches.Count) do begin + for i := 0 to Pred(patches.Count) do + begin patch := TPatch(patches[i]); - if patch.filename = filename then begin + if patch.filename = filename then + begin Result := patch; exit; end; @@ -876,7 +942,7 @@ class function TPatchHelpers.PatchByFilename(var patches: TList; filename: strin { Create a new patch with non-conflicting name and filename } class function TPatchHelpers.CreateNewPatch(var patches: TList): TPatch; var - i: Integer; + i: integer; patch: TPatch; name: string; begin @@ -885,7 +951,8 @@ class function TPatchHelpers.CreateNewPatch(var patches: TList): TPatch; // deal with conflicting patch names i := 0; name := patch.name; - while Assigned(PatchByName(patches, name)) do begin + while Assigned(PatchByName(patches, name)) do + begin Inc(i); name := 'NewPatch' + IntToStr(i); end; @@ -894,7 +961,8 @@ class function TPatchHelpers.CreateNewPatch(var patches: TList): TPatch; // deal with conflicting patch filenames i := 0; name := patch.filename; - while Assigned(PatchByFilename(patches, name)) do begin + while Assigned(PatchByFilename(patches, name)) do + begin Inc(i); name := 'NewPatch' + IntToStr(i) + '.esp'; end; @@ -913,9 +981,9 @@ constructor TElementData.Create; self.linkFrom := ''; end; -constructor TElementData.Create(priority: Byte; process, preserveDeletions, - overrideDeletions, singleEntity, forceValue: Boolean; smashType: TSmashType; - linkTo, linkFrom: string); +constructor TElementData.Create(priority: byte; + process, preserveDeletions, overrideDeletions, singleEntity, + forceValue: boolean; smashType: TSmashType; linkTo, linkFrom: string); begin self.priority := priority; self.process := process; @@ -931,11 +999,12 @@ constructor TElementData.Create(priority: Byte; process, preserveDeletions, { TSmashSetting } function GetUniqueSettingName(base: string): string; var - i: Integer; + i: integer; begin Result := base; i := 1; - while Assigned(TSettingHelpers.SettingByName(Result)) do begin + while Assigned(TSettingHelpers.SettingByName(Result)) do + begin Inc(i); Result := base + IntToStr(i); end; @@ -959,7 +1028,8 @@ destructor TSmashSetting.Destroy; color := 0; description := ''; records := ''; - if Assigned(tree) then tree._Release; + if Assigned(tree) then + tree._Release; tree := nil; end; @@ -983,15 +1053,15 @@ function TSmashSetting.GetRecordDef(sig: string): ISuperObject; procedure TSmashSetting.LoadDump(dump: ISuperObject); begin - name := dump.S['name']; - color := dump.I['color']; - hash := dump.S['hash']; - description := dump.S['description']; - records := dump.S['records']; + name := dump.s['name']; + color := dump.i['color']; + hash := dump.s['hash']; + description := dump.s['description']; + records := dump.s['records']; tree := dump.O['tree']; end; -function TSmashSetting.Dump: ISuperObject; +function TSmashSetting.dump: ISuperObject; var obj: ISuperObject; begin @@ -1000,11 +1070,11 @@ function TSmashSetting.Dump: ISuperObject; // tree obj.O['tree'] := tree; // normal attributes - obj.S['records'] := records; - obj.S['description'] := description; - obj.I['color'] := color; - obj.S['hash'] := hash; - obj.S['name'] := name; + obj.s['records'] := records; + obj.s['description'] := description; + obj.i['color'] := color; + obj.s['hash'] := hash; + obj.s['name'] := name; Result := obj; end; @@ -1016,7 +1086,7 @@ procedure TSmashSetting.UpdateHash; procedure TSmashSetting.UpdateRecords; var - item: ISuperObject; + Item: ISuperObject; sl: TStringList; begin // prepare comma delimited stringlist @@ -1027,9 +1097,10 @@ procedure TSmashSetting.UpdateRecords; try // loop through records and add their signatures // to the stringlist if they are set to be processed - for item in tree['records'] do begin - if item.I['p'] = 1 then - sl.Add(Copy(item.S['n'], 1, 4)); + for Item in tree['records'] do + begin + if Item.i['p'] = 1 then + sl.Add(Copy(Item.s['n'], 1, 4)); end; // assign records the delimited signatures @@ -1045,18 +1116,18 @@ procedure TSmashSetting.Save; path: string; begin UpdateHash; - path := Format('%s\settings\%s\%s.json', - [PathList.Values['ProgramPath'], ProgramStatus.GameMode.gameName, name]); + path := Format('%s\settings\%s\%s.json', [PathList.Values['ProgramPath'], + ProgramStatus.GameMode.gameName, name]); ForceDirectories(ExtractFilePath(path)); - Dump.SaveTo(path); + dump.SaveTo(path); end; procedure TSmashSetting.Delete; var path: string; begin - path := Format('%s\settings\%s\%s.json', - [PathList.Values['ProgramPath'], ProgramStatus.GameMode.gameName, name]); + path := Format('%s\settings\%s\%s.json', [PathList.Values['ProgramPath'], + ProgramStatus.GameMode.gameName, name]); if FileExists(path) then DeleteToRecycleBin(path, false); end; @@ -1065,19 +1136,20 @@ procedure TSmashSetting.Rename(newName: string); var oldPath, newPath: string; begin - oldPath := Format('%s\settings\%s\%s.json', - [PathList.Values['ProgramPath'], ProgramStatus.GameMode.gameName, name]); - newPath := Format('%s\settings\%s\%s.json', - [PathList.Values['ProgramPath'], ProgramStatus.GameMode.gameName, newName]); - if FileExists(oldpath) then - RenameFile(oldpath, newpath); + oldPath := Format('%s\settings\%s\%s.json', [PathList.Values['ProgramPath'], + ProgramStatus.GameMode.gameName, name]); + newPath := Format('%s\settings\%s\%s.json', [PathList.Values['ProgramPath'], + ProgramStatus.GameMode.gameName, newName]); + if FileExists(oldPath) then + RenameFile(oldPath, newPath); name := newName; end; function TSmashSetting.MatchesHash(hash: string): boolean; begin // result is true if hash is blank - if hash = '' then begin + if hash = '' then + begin Result := true; exit; end; @@ -1089,12 +1161,13 @@ function TSmashSetting.MatchesHash(hash: string): boolean; function TSmashSetting.GetTags: String; var - index: Integer; + index: integer; begin if Pos('Combined setting:', description) = 1 then - Result := GetCombinedTags - // else handle a normal setting - else begin + Result := GetCombinedTags + // else handle a normal setting + else + begin index := Pos('.', name); if (index > 0) and (index < 11) then Result := Format('{{%s}}', [StringReplace(name, '.', ':', [])]) @@ -1125,7 +1198,7 @@ function TSmashSetting.GetCombinedTags: String; procedure SavePatches; var - i: Integer; + i: integer; patch: TPatch; json: ISuperObject; filename: string; @@ -1137,11 +1210,12 @@ procedure SavePatches; // loop through patches Tracker.Write(' '); Tracker.Write('Dumping patches to JSON'); - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin Tracker.UpdateProgress(1); patch := TPatch(PatchesList[i]); - Tracker.Write(' Dumping '+patch.name); - json.A['patches'].Add(patch.Dump); + Tracker.Write(' Dumping ' + patch.name); + json.A['patches'].Add(patch.dump); end; // save and finalize @@ -1172,14 +1246,16 @@ procedure LoadPatches; obj := SO(PChar(sl.Text)); // loop through patches - for patchItem in obj['patches'] do begin + for patchItem in obj['patches'] do + begin patch := TPatch.Create; try patch.LoadDump(patchItem); PatchesList.Add(patch); except - on x: Exception do begin - Logger.Write('LOAD', 'Patch', 'Failed to load patch '+patch.name); + on x: Exception do + begin + Logger.Write('LOAD', 'Patch', 'Failed to load patch ' + patch.name); Logger.Write('LOAD', 'Patch', x.Message); end; end; @@ -1190,16 +1266,18 @@ procedure LoadPatches; sl.Free; end; -function IndexOfDump(a: TSuperArray; plugin: TPlugin): Integer; +function IndexOfDump(A: TSuperArray; plugin: TPlugin): integer; var - i: Integer; + i: integer; obj: ISuperObject; begin Result := -1; - for i := 0 to Pred(a.Length) do begin - obj := a.O[i]; - if (obj.S['filename'] = plugin.filename) - and (obj.S['hash'] = plugin.hash) then begin + for i := 0 to Pred(A.Length) do + begin + obj := A.O[i]; + if (obj.s['filename'] = plugin.filename) and (obj.s['hash'] = plugin.hash) + then + begin Result := i; exit; end; @@ -1209,14 +1287,15 @@ function IndexOfDump(a: TSuperArray; plugin: TPlugin): Integer; procedure SaveSmashSettings; var aSetting: TSmashSetting; - i: Integer; + i: integer; begin Tracker.Write('Saving smash settings'); - for i := 0 to Pred(SmashSettings.Count) do begin - aSetting := TSmashSetting(SmashSettings[i]); + for i := 0 to Pred(smashSettings.Count) do + begin + aSetting := TSmashSetting(smashSettings[i]); if aSetting.bVirtual then continue; - Tracker.Write(' Saving '+aSetting.name); + Tracker.Write(' Saving ' + aSetting.name); aSetting.Save; end; Tracker.Write(' '); @@ -1225,13 +1304,13 @@ procedure SaveSmashSettings; procedure CreateSkipSetting; var skipSetting: TSmashSetting; - index: Integer; + index: integer; begin - index := SmashSettings.Add(TSmashSetting.Create); - skipSetting := SmashSettings[index]; + index := smashSettings.Add(TSmashSetting.Create); + skipSetting := smashSettings[index]; skipSetting.name := 'Skip'; skipSetting.color := clGray; - skipSetting.description := 'Special setting. Any plugin with this setting '+ + skipSetting.description := 'Special setting. Any plugin with this setting ' + 'will be excluded from patch creation.'; skipSetting.tree := SO(); skipSetting.tree.O['records'] := SA([]); @@ -1245,7 +1324,8 @@ procedure LoadSmashSettings; aSetting: TSmashSetting; path: String; begin - path := Format('%ssettings\%s\', [PathList.Values['ProgramPath'], ProgramStatus.GameMode.gameName]); + path := Format('%ssettings\%s\', [PathList.Values['ProgramPath'], + ProgramStatus.GameMode.gameName]); ForceDirectories(path); // load setting files from settings path @@ -1254,21 +1334,25 @@ procedure LoadSmashSettings; repeat sl := TStringList.Create; try - sl.LoadFromFile(path + info.Name); + sl.LoadFromFile(path + info.name); aSetting := TSmashSetting.Create; obj := SO(PChar(sl.Text)); - if Assigned(obj) then begin + if Assigned(obj) then + begin aSetting.LoadDump(obj); if aSetting.name <> '' then - SmashSettings.Add(aSetting); + smashSettings.Add(aSetting); end; sl.Free; obj := nil; except - on x: Exception do begin - if Assigned(sl) then sl.Free; + on x: Exception do + begin + if Assigned(sl) then + sl.Free; obj := nil; - Logger.Write('ERROR', 'Load', 'Failed to load smash setting '+info.Name); + Logger.Write('ERROR', 'Load', 'Failed to load smash setting ' + + info.name); end; end; until FindNext(info) <> 0; @@ -1280,7 +1364,7 @@ procedure LoadSmashSettings; procedure SavePluginInfo; var - i, index: Integer; + i, index: integer; plugin: TPlugin; obj: ISuperObject; filename: string; @@ -1288,14 +1372,16 @@ procedure SavePluginInfo; begin // don't load file if it doesn't exist filename := PathList.Values['ProfilePath'] + 'PluginInfo.json'; - if FileExists(filename) then begin + if FileExists(filename) then + begin // load file text into SuperObject to parse it sl := TStringList.Create; sl.LoadFromFile(filename); obj := SO(PChar(sl.Text)); sl.Free; end - else begin + else + begin // initialize new json object obj := SO; obj.O['plugins'] := SA([]); @@ -1303,31 +1389,33 @@ procedure SavePluginInfo; // loop through plugins Tracker.Write('Dumping plugin errors to JSON'); - for i := 0 to Pred(PluginsList.Count) do try - plugin := PluginsList[i]; - Tracker.UpdateProgress(1); - if not Assigned(plugin.smashSetting) then - continue; - index := IndexOfDump(obj.A['plugins'], plugin); - if plugin.smashSetting.bVirtual or (plugin.setting = 'Skip') then begin - if index <> -1 then - obj.A['plugins'].Delete(index); - continue; + for i := 0 to Pred(PluginsList.Count) do + try + plugin := PluginsList[i]; + Tracker.UpdateProgress(1); + if not Assigned(plugin.smashSetting) then + continue; + index := IndexOfDump(obj.A['plugins'], plugin); + if plugin.smashSetting.bVirtual or (plugin.setting = 'Skip') then + begin + if index <> -1 then + obj.A['plugins'].Delete(index); + continue; + end; + Tracker.Write(' Dumping ' + plugin.filename); + if index = -1 then + obj.A['plugins'].Add(plugin.InfoDump) + else + obj.A['plugins'].O[index] := plugin.InfoDump; + except + on x: Exception do + Tracker.Write(' Exception ' + x.Message); end; - Tracker.Write(' Dumping '+plugin.filename); - if index = -1 then - obj.A['plugins'].Add(plugin.InfoDump) - else - obj.A['plugins'].O[index] := plugin.InfoDump; - except - on x: Exception do - Tracker.Write(' Exception '+x.Message); - end; // save and finalize Tracker.Write(' '); filename := PathList.Values['ProfilePath'] + 'PluginInfo.json'; - Tracker.Write('Saving to '+filename); + Tracker.Write('Saving to ' + filename); Tracker.UpdateProgress(1); obj.SaveTo(filename); obj := nil; @@ -1351,10 +1439,11 @@ procedure LoadPluginInfo; // loop through patches filename := ''; - for pluginItem in obj['plugins'] do begin - filename := pluginItem.AsObject.S['filename']; - hash := pluginItem.AsObject.S['hash']; - plugin := PluginByFileName(filename); + for pluginItem in obj['plugins'] do + begin + filename := pluginItem.AsObject.s['filename']; + hash := pluginItem.AsObject.s['hash']; + plugin := PluginByFilename(filename); if not Assigned(plugin) then continue; if (plugin.hash = hash) and (plugin.filename = filename) then @@ -1368,11 +1457,12 @@ procedure LoadPluginInfo; procedure LoadSettingTags; var - i: Integer; + i: integer; plugin: TPlugin; begin // loop through loaded plugins - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); if plugin.setting <> '' then continue; @@ -1388,34 +1478,58 @@ procedure HandleCanceled(msg: string); procedure RenameSavedPlugins; var - i: Integer; + i: integer; oldFileName, newFileName, bakFileName: string; + next: Boolean; begin // tracker message Tracker.Write(' '); Tracker.Write('Renaming saved plugins'); - for i := Pred(SavedPluginPaths.Count) downto 0 do try - oldFileName := SavedPluginPaths[i]; - newFileName := oldFileName + '.save'; - bakFileName := oldFileName + '.bak'; - Tracker.Write(Format(' Renaming %s to %s', [ExtractFileName(newFileName), ExtractFileName(oldFileName)])); - if FileExists(bakFileName) then - DeleteFile(bakFileName); - RenameFile(oldFileName, bakFileName); - RenameFile(newFileName, oldFileName); - except - on x: Exception do - Tracker.Write(' Failed to rename ' + newFileName); + for i := Pred(SavedPluginPaths.Count) downto 0 do + begin + next := false; + repeat + begin + try + oldFileName := SavedPluginPaths[i]; + newFileName := oldFileName + '.save'; + bakFileName := oldFileName + '.bak'; + Tracker.Write(Format(' Renaming %s to %s', + [ExtractFileName(newFileName), ExtractFileName(oldFileName)])); + if FileExists(oldFileName) and FileExists(bakFileName) then + DeleteFile(bakFileName); + RenameFile(oldFileName, bakFileName); + if not RenameFile(newFileName, oldFileName) then + raise Exception.Create('Failed to rename file'); + next := true; + except + on x: Exception do + begin + Tracker.Write(' Failed to rename ' + newFileName); + case MessageBox(0, PWideChar('Error saving ' + oldFileName + ': ' + + x.ToString), 'Save Error', MB_ICONWARNING or MB_ABORTRETRYIGNORE or + MB_DEFBUTTON2) of + IDABORT: + raise x; + IDRETRY: + next := false; + IDIGNORE: + next := true; + end; + end; + end; + end + until (next) end; end; -end; procedure UpdatePluginData; var - i: Integer; + i: integer; plugin: TPlugin; begin - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); plugin.UpdateData; end; @@ -1426,14 +1540,15 @@ function CreateNewPlugin(sFilename: string): TPlugin; Result := TPlugin(TPluginHelpers.CreateNewBasePlugin(PluginsList, sFilename)); end; -function PluginLoadOrder(sFilename: string): Integer; +function PluginLoadOrder(sFilename: string): integer; begin Result := TPluginHelpers.BasePluginLoadOrder(PluginsList, sFilename); end; function PluginByFilename(sFilename: string): TPlugin; begin - Result := TPlugin(TPluginHelpers.BasePluginByFilename(PluginsList, sFilename)); + Result := TPlugin(TPluginHelpers.BasePluginByFilename(PluginsList, + sFilename)); end; function DefDisplayName(var def: TwbRecordDefEntry): String; @@ -1441,39 +1556,43 @@ function DefDisplayName(var def: TwbRecordDefEntry): String; sig: String; begin sig := String(def.rdeSignature); - Result := def.rdeDef.Name; + Result := def.rdeDef.name; if (Result <> sig) then Result := sig + ' - ' + Result; end; procedure PopulateAddList(var AddItem: TMenuItem; Event: TNotifyEvent); var - i: Integer; + i: integer; recordDef: TwbRecordDefEntry; - item: TMenuItem; + Item: TMenuItem; begin - for i := Low(wbRecordDefs) to High(wbRecordDefs) do begin + for i := Low(wbRecordDefs) to High(wbRecordDefs) do + begin recordDef := wbRecordDefs[i]; - item := TMenuItem.Create(AddItem); - item.Caption := DefDisplayName(recordDef); - item.OnClick := Event; - AddItem.Add(item); + Item := TMenuItem.Create(AddItem); + Item.Caption := DefDisplayName(recordDef); + Item.OnClick := Event; + AddItem.Add(Item); end; end; procedure AddAllRecords(currentSetting: TSmashSetting; var tv: TTreeView); var - i: Integer; + i: integer; recordDef: TwbRecordDefEntry; groupName: String; recObj: ISuperObject; begin - for i := Low(wbRecordDefs) to High(wbRecordDefs) do begin + for i := Low(wbRecordDefs) to High(wbRecordDefs) do + begin recordDef := wbRecordDefs[i]; groupName := DefDisplayName(recordDef); recObj := GetRecordObj(currentSetting.tree, groupName); - if Assigned(recObj) then continue; - if not BuildRecordDef(groupName, recObj) then continue; + if Assigned(recObj) then + continue; + if not BuildRecordDef(groupName, recObj) then + continue; currentSetting.tree.A['records'].Add(recObj); LoadElement(tv, tv.Items[0], recObj, false); end; @@ -1481,12 +1600,14 @@ procedure AddAllRecords(currentSetting: TSmashSetting; var tv: TTreeView); procedure RemoveSettingFromPlugins(aSetting: TSmashSetting); var - i: Integer; + i: integer; plugin: TPlugin; begin - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); - if plugin.setting = aSetting.name then begin + if plugin.setting = aSetting.name then + begin plugin.setting := 'Skip'; plugin.smashSetting := TSettingHelpers.SettingByName('Skip'); end; @@ -1495,30 +1616,33 @@ procedure RemoveSettingFromPlugins(aSetting: TSmashSetting); function GetTagString(var slTags: TStringList): String; var - i, index: Integer; + i, index: integer; tag, sTagGroup, sGroup: String; begin - for i := 0 to Pred(slTags.Count) do begin + for i := 0 to Pred(slTags.Count) do + begin tag := slTags[i]; index := Pos('.', tag); sTagGroup := Copy(tag, 1, index - 1); - if (index > 0) and (index < 11) and (SameText(sGroup, sTagGroup) or (i = 0)) then + if (index > 0) and (index < 11) and (SameText(sGroup, sTagGroup) or (i = 0)) + then sGroup := sTagGroup else sGroup := ''; end; // generate the string of tags - if sGroup <> '' then begin - Result := StringReplace(slTags.CommaText, sGroup + '.', '', [rfReplaceAll, rfIgnoreCase]); + if sGroup <> '' then + begin + Result := StringReplace(slTags.CommaText, sGroup + '.', '', + [rfReplaceAll, rfIgnoreCase]); Result := Format('{{%s:%s}}', [UpperCase(sGroup), Result]) end else Result := Format('{{%s}}', [slTags.CommaText]); end; - -{******************************************************************************} +{ ****************************************************************************** } { Tree Helper Functions - BuildTreeFromPlugins - SetChildren @@ -1526,15 +1650,15 @@ function GetTagString(var slTags: TStringList): String; - CheckBoxManager - LoadElement } -{******************************************************************************} +{ ****************************************************************************** } procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; tree: ISuperObject); var - i, j: Integer; + i, j: integer; plugin: TPlugin; rec: IwbMainRecord; - RecordDef: PwbRecordDef; + recordDef: PwbMainRecordDef; def: TwbRecordDefEntry; sName, sSignature: string; slRecordSignatures: TStringList; @@ -1545,15 +1669,17 @@ procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; slRecordSignatures.Duplicates := dupIgnore; try // loop through plugins - for i := 0 to Pred(sl.Count) do begin - plugin := PluginByFileName(sl[i]); + for i := 0 to Pred(sl.Count) do + begin + plugin := PluginByFilename(sl[i]); if not Assigned(plugin) then continue; if not plugin._File.IsEditable then continue; // loop through records - for j := 0 to Pred(plugin._File.RecordCount) do begin - rec := plugin._File.Records[j]; + for j := 0 to Pred(plugin._File.RecordCount) do + begin + rec := plugin._File.records[j]; // skip non-override records if rec.IsMaster then continue; @@ -1564,15 +1690,16 @@ procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; continue; slRecordSignatures.Add(sSignature); // skip records that aren't defined - if not wbFindRecordDef(AnsiString(sSignature), RecordDef) then + if not wbFindRecordDef(AnsiString(sSignature), recordDef) then continue; // get record def object if it exists - sName := sSignature + ' - ' + RecordDef.Name; + sName := sSignature + ' - ' + recordDef.name; recObj := GetRecordObj(tree, sName); // build record def if it doesn't exist - if not Assigned(recObj) then begin + if not Assigned(recObj) then + begin def := GetRecordDef(rec.Signature); if not BuildRecordDef(sName, def.rdeDef, recObj) then continue; @@ -1592,18 +1719,20 @@ procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList; Sets the StateIndex attribute of all the children of @node to @state. Uses recursion. } -procedure SetChildren(node: TTreeNode; state: Integer); +procedure SetChildren(node: TTreeNode; state: integer); var tmp: TTreeNode; e: TElementData; begin // exit if we don't have a node to work with - if not Assigned(node) then exit; + if not Assigned(node) then + exit; // loop through children setting StateIndex to state // if child has children, recurse into that child tmp := node.getFirstChild; - while Assigned(tmp) do begin + while Assigned(tmp) do + begin tmp.StateIndex := state; e := TElementData(tmp.Data); e.process := state <> csUnChecked; @@ -1623,21 +1752,26 @@ procedure SetChildren(node: TTreeNode; state: Integer); procedure UpdateParent(node: TTreeNode); var tmp: TTreeNode; - state: Integer; + state: integer; e: TElementData; begin // exit if we don't have a node to work with // or if not is set to be treated as a single entity - if not Assigned(node) then exit; + if not Assigned(node) then + exit; e := TElementData(node.Data); - if not Assigned(e) then exit; - if e.singleEntity then exit; + if not Assigned(e) then + exit; + if e.singleEntity then + exit; // parent state is checked if all siblings are checked state := csChecked; tmp := node.getFirstChild; - while Assigned(tmp) do begin - if tmp.StateIndex <> csChecked then begin + while Assigned(tmp) do + begin + if tmp.StateIndex <> csChecked then + begin state := csPartiallyChecked; break; end; @@ -1645,11 +1779,14 @@ procedure UpdateParent(node: TTreeNode); end; // parent state is unchecked if all siblings are unchecked - if state = csPartiallyChecked then begin + if state = csPartiallyChecked then + begin state := csUnChecked; tmp := node.getFirstChild; - while Assigned(tmp) do begin - if tmp.StateIndex <> csUnChecked then begin + while Assigned(tmp) do + begin + if tmp.StateIndex <> csUnChecked then + begin state := csPartiallyChecked; break; end; @@ -1675,12 +1812,14 @@ procedure CheckBoxManager(node: TTreeNode); e: TElementData; begin // exit if we don't have a node to work with - if not Assigned(node) then exit; + if not Assigned(node) then + exit; // if unchecked or partially checked, set to checked and // set all children to checked, update parents - if (node.StateIndex = csUnChecked) - or (node.StateIndex = csPartiallyChecked) then begin + if (node.StateIndex = csUnChecked) or (node.StateIndex = csPartiallyChecked) + then + begin node.StateIndex := csChecked; e := TElementData(node.Data); e.process := true; @@ -1690,7 +1829,8 @@ procedure CheckBoxManager(node: TTreeNode); end // if checked, set to unchecked and set all children to // unchecked, update parents - else if node.StateIndex = csChecked then begin + else if node.StateIndex = csChecked then + begin node.StateIndex := csUnChecked; e := TElementData(node.Data); e.process := false; @@ -1703,11 +1843,11 @@ procedure CheckBoxManager(node: TTreeNode); procedure LoadElement(var tv: TTreeView; node: TTreeNode; obj: ISuperObject; bWithinSingle: boolean); var - item: ISuperObject; + Item: ISuperObject; child, nextChild: TTreeNode; bProcess, bPreserveDeletions, bOverrideDeletions, bIsSingle, - bForceValue: boolean; - priority: Integer; + bForceValue: boolean; + priority: integer; oSmashType: TSmashType; sName, sLinkTo, sLinkFrom: string; e: TElementData; @@ -1716,25 +1856,27 @@ procedure LoadElement(var tv: TTreeView; node: TTreeNode; obj: ISuperObject; exit; // load data from json - sName := obj.S['n']; - priority := obj.I['r']; - bProcess := obj.I['p'] = 1; - bPreserveDeletions := obj.I['d'] = 1; - bOverrideDeletions := obj.I['o'] = 1; - bIsSingle := obj.I['s'] = 1; - bForceValue := obj.I['f'] = 1; + sName := obj.s['n']; + priority := obj.i['r']; + bProcess := obj.i['p'] = 1; + bPreserveDeletions := obj.i['d'] = 1; + bOverrideDeletions := obj.i['o'] = 1; + bIsSingle := obj.i['s'] = 1; + bForceValue := obj.i['f'] = 1; bWithinSingle := bWithinSingle or bIsSingle; - oSmashType := TSmashType(obj.I['t']); - sLinkTo := obj.S['lt']; - sLinkFrom := obj.S['lf']; + oSmashType := TSmashType(obj.i['t']); + sLinkTo := obj.s['lt']; + sLinkFrom := obj.s['lf']; // create child e := TElementData.Create(priority, bProcess, bPreserveDeletions, bOverrideDeletions, bIsSingle, bForceValue, oSmashType, sLinkTo, sLinkFrom); // nodes insert in sorted order for record nodes - if (node.Level = 0) and node.hasChildren then begin + if (node.Level = 0) and node.HasChildren then + begin child := node.getFirstChild; - while (AnsiCompareText(child.Text, sName) < 0) do begin + while (AnsiCompareText(child.Text, sName) < 0) do + begin nextChild := child.getNextSibling; if not Assigned(nextChild) then break; @@ -1755,20 +1897,21 @@ procedure LoadElement(var tv: TTreeView; node: TTreeNode; obj: ISuperObject; child.StateIndex := csUnChecked; // recurse into children - if Assigned(obj.O['c']) then try - for item in obj['c'] do - LoadElement(tv, child, item, bWithinSingle); - if not bWithinSingle then - UpdateParent(child); - except - on x : Exception do - // nothing - end; + if Assigned(obj.O['c']) then + try + for Item in obj['c'] do + LoadElement(tv, child, Item, bWithinSingle); + if not bWithinSingle then + UpdateParent(child); + except + on x: Exception do + // nothing + end; end; procedure LoadTree(var tv: TTreeView; aSetting: TSmashSetting); var - obj, item: ISuperObject; + obj, Item: ISuperObject; rootNode: TTreeNode; e: TElementData; begin @@ -1780,18 +1923,20 @@ procedure LoadTree(var tv: TTreeView; aSetting: TSmashSetting); if not Assigned(obj['records']) then exit; - for item in obj['records'] do - LoadElement(tv, rootNode, item, false); + for Item in obj['records'] do + LoadElement(tv, rootNode, Item, false); end; function GetRecordObject(tree: ISuperObject; sig: string): ISuperObject; var - item: ISuperObject; + Item: ISuperObject; begin Result := nil; - for item in tree['records'] do begin - if Copy(item.S['n'], 1, 4) = sig then begin - Result := item; + for Item in tree['records'] do + begin + if Copy(Item.s['n'], 1, 4) = sig then + begin + Result := Item; break; end; end; @@ -1802,8 +1947,10 @@ function GetChild(obj: ISuperObject; name: string): ISuperObject; child: ISuperObject; begin Result := nil; - for child in obj['c'] do begin - if child.S['n'] = name then begin + for child in obj['c'] do + begin + if child.s['n'] = name then + begin Result := child; exit; end; @@ -1814,33 +1961,36 @@ procedure MergeChildren(srcObj, dstObj: ISuperObject); var srcChild, dstChild: ISuperObject; begin - for srcChild in srcObj['c'] do begin - dstChild := GetChild(dstObj, srcChild.S['n']); + for srcChild in srcObj['c'] do + begin + dstChild := GetChild(dstObj, srcChild.s['n']); if not Assigned(dstChild) then dstObj.A['c'].Add(srcChild.Clone) - else begin + else + begin // merge force value - if srcChild.I['f'] = 1 then - dstChild.I['f'] := 1; + if srcChild.i['f'] = 1 then + dstChild.i['f'] := 1; // merge treat as single - if srcChild.I['s'] = 1 then - dstChild.I['s'] := 1; + if srcChild.i['s'] = 1 then + dstChild.i['s'] := 1; // merge preserve deletions - if srcChild.I['d'] = 1 then - dstChild.I['d'] := 1; + if srcChild.i['d'] = 1 then + dstChild.i['d'] := 1; // merge override deletions - if srcChild.I['o'] = 1 then - dstChild.I['o'] := 1; + if srcChild.i['o'] = 1 then + dstChild.i['o'] := 1; // merge process - if srcChild.I['p'] = 1 then - dstChild.I['p'] := 1; + if srcChild.i['p'] = 1 then + dstChild.i['p'] := 1; // merge links - if srcChild.S['lt'] <> '' then - dstChild.S['lt'] := srcChild.S['lt']; - if srcChild.S['lf'] <> '' then - dstChild.S['lf'] := srcChild.S['lf']; + if srcChild.s['lt'] <> '' then + dstChild.s['lt'] := srcChild.s['lt']; + if srcChild.s['lf'] <> '' then + dstChild.s['lf'] := srcChild.s['lf']; // recurse into children if present - if Assigned(srcChild.A['c']) then begin + if Assigned(srcChild.A['c']) then + begin if Assigned(dstChild.A['c']) then MergeChildren(srcChild, dstChild) else @@ -1853,7 +2003,7 @@ procedure MergeChildren(srcObj, dstObj: ISuperObject); function CreateCombinedSetting(var sl: TStringList; name: string; bVirtual: boolean = false): TSmashSetting; var - i, index: Integer; + i, index: integer; newSetting, aSetting: TSmashSetting; recordObj, existingRecordObj: ISuperObject; begin @@ -1861,7 +2011,8 @@ function CreateCombinedSetting(var sl: TStringList; name: string; newSetting.tree := SO; newSetting.tree.O['records'] := SA([]); - for i := 0 to Pred(sl.Count) do begin + for i := 0 to Pred(sl.Count) do + begin aSetting := TSmashSetting(sl.Objects[i]); recordObj := GetRecordObject(aSetting.tree, sl[i]); existingRecordObj := GetRecordObject(newSetting.tree, sl[i]); @@ -1869,7 +2020,7 @@ function CreateCombinedSetting(var sl: TStringList; name: string; // merge the record objects if Assigned(existingRecordObj) then MergeChildren(recordObj, existingRecordObj) - // else just add it to the tree + // else just add it to the tree else newSetting.tree.A['records'].Add(recordObj.Clone); end; @@ -1881,34 +2032,40 @@ function CreateCombinedSetting(var sl: TStringList; name: string; newSetting.description := 'Combined setting:'#13#10 + name; index := Pos('.', name); if (index > 0) and (index < 11) then - newSetting.name := Format('%sCombined-%s', [Copy(name, 1, index), newSetting.hash]) + newSetting.name := Format('%sCombined-%s', + [Copy(name, 1, index), newSetting.hash]) else - newSetting.name := 'Combined-'+newSetting.hash; + newSetting.name := 'Combined-' + newSetting.hash; // add new setting to SmashSettings list aSetting := TSettingHelpers.SettingByName(newSetting.name); - if not Assigned(aSetting) then begin - SmashSettings.Add(newSetting); + if not Assigned(aSetting) then + begin + smashSettings.Add(newSetting); Result := newSetting; end - else begin + else + begin newSetting.Free; Result := aSetting; end; end; -function CombineSettingTrees(var lst: TList; var slSettings: TStringList): boolean; +function CombineSettingTrees(var lst: TList; + var slSettings: TStringList): boolean; var setting: TSmashSetting; sl: TStringList; - i, j: Integer; + i, j: integer; begin sl := TStringList.Create; Result := false; - for i := 0 to Pred(lst.Count) do begin + for i := 0 to Pred(lst.Count) do + begin setting := TSmashSetting(lst[i]); sl.CommaText := setting.records; - for j := 0 to Pred(sl.Count) do begin + for j := 0 to Pred(sl.Count) do + begin if slSettings.IndexOf(sl[j]) > -1 then Result := true; slSettings.AddObject(sl[j], TObject(setting)); @@ -1919,15 +2076,14 @@ function CombineSettingTrees(var lst: TList; var slSettings: TStringList): boole sl.Free; end; - -{******************************************************************************} +{ ****************************************************************************** } { Tag Helper Functions - ClearTags - GetMissingTags - ExtractTags - GetTags } -{******************************************************************************} +{ ****************************************************************************** } function ClearTags(sDescription: String): String; var @@ -1936,10 +2092,11 @@ function ClearTags(sDescription: String): String; begin // find tags regex := TRegex.Create('{{([^}]*)}}'); - match := regex.Match(sDescription); + match := regex.match(sDescription); // delete tags - while match.Success do begin + while match.Success do + begin sDescription := StringReplace(sDescription, match.Value, '', []); match := match.NextMatch; end; @@ -1950,11 +2107,12 @@ function ClearTags(sDescription: String): String; procedure GetMissingTags(var slPresent, slMissing: TStringList); var - i: Integer; + i: integer; aSetting: TSmashSetting; begin - for i := 0 to Pred(SmashSettings.Count) do begin - aSetting := TSmashSetting(SmashSettings[i]); + for i := 0 to Pred(smashSettings.Count) do + begin + aSetting := TSmashSetting(smashSettings[i]); if slPresent.IndexOf(aSetting.name) = -1 then slMissing.Add(aSetting.name); end; @@ -1963,7 +2121,7 @@ procedure GetMissingTags(var slPresent, slMissing: TStringList); procedure ExtractTags(var match: TMatch; var sl: TStringList; var sTagGroup: String); var - i: Integer; + i: integer; begin sTagGroup := ''; @@ -1978,7 +2136,8 @@ procedure ExtractTags(var match: TMatch; var sl: TStringList; // if tags are presented under a group, append the group name // and a . to the beginning of each setting name in the tag - if match.Groups.Item[1].Value <> '' then begin + if match.Groups.Item[1].Value <> '' then + begin sTagGroup := TitleCase(match.Groups.Item[1].Value); SetLength(sTagGroup, Length(sTagGroup) - 1); Logger.Write('PLUGIN', 'Tags', 'Parsing as ' + sTagGroup + ' tags'); @@ -1989,30 +2148,32 @@ procedure ExtractTags(var match: TMatch; var sl: TStringList; procedure ParseTags(description: string; var sl: TStringList); var - regex: TRegEx; + regex: TRegex; match: TMatch; sTagGroup: String; begin // get setting tags from description - regex := TRegEx.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); - match := regex.Match(description); + regex := TRegex.Create('{{([a-zA-Z]{1,10}:){0,1}([^}]*)}}'); + match := regex.match(description); // if match found, put the tags into the stringlist - if match.success then + if match.Success then ExtractTags(match, sl, sTagGroup); end; initialization + begin PatchesList := TList.Create; - SmashSettings := TList.Create; + smashSettings := TList.Create; SavedPluginPaths := TStringList.Create; end; finalization + begin FreeList(PatchesList); - FreeList(SmashSettings); + FreeList(smashSettings); SavedPluginPaths.Free; end; diff --git a/frontend/msEditForm.dfm b/frontend/msEditForm.dfm old mode 100644 new mode 100755 index df71cc9..0854842 --- a/frontend/msEditForm.dfm +++ b/frontend/msEditForm.dfm @@ -28,6 +28,10 @@ object EditForm: TEditForm TabWidth = 60 object EditTabSheet: TTabSheet Caption = 'Edit' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object lblName: TLabel Left = 12 Top = 13 diff --git a/frontend/msEditForm.pas b/frontend/msEditForm.pas old mode 100644 new mode 100755 index ba77d20..9ba3afb --- a/frontend/msEditForm.pas +++ b/frontend/msEditForm.pas @@ -64,7 +64,8 @@ function TEditForm.NameValid: boolean; exit; // return false if patch with specified name already exists - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin aPatch := TPatch(PatchesList[i]); if (aPatch.name = edName.Text) and (aPatch <> patch) then exit; @@ -100,8 +101,9 @@ function TEditForm.ESPFilenameValid: boolean; plugin := PluginByFilename(edFilename.Text); loadOrder := PluginLoadOrder(edFilename.Text); highLoadOrder := MaxInt; - if patch.plugins.Count > 0 then begin - sFilename := patch.plugins[patch.plugins.Count -1]; + if patch.plugins.Count > 0 then + begin + sFilename := patch.plugins[patch.plugins.Count - 1]; highLoadOrder := PluginLoadOrder(sFilename); end; @@ -110,9 +112,10 @@ function TEditForm.ESPFilenameValid: boolean; exit; // return false if patch exists - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin aPatch := TPatch(PatchesList[i]); - if (aPatch.filename = edFileName.Text) and (aPatch <> patch) then + if (aPatch.filename = edFilename.Text) and (aPatch <> patch) then exit; end; @@ -126,19 +129,19 @@ procedure TEditForm.edFilenameChange(Sender: TObject); begin // if invalid disable btnOk, show hint, and make font color red valid := ESPFilenameValid; - btnOk.Enabled := valid and NameValid; + btnOK.Enabled := valid and NameValid; edFilename.ShowHint := valid; if valid then edFilename.Font.Color := clWindowText else - edFilename.Font.Color := $0000ff; + edFilename.Font.Color := $0000FF; end; procedure TEditForm.edFilenameEnter(Sender: TObject); begin // change selection to not include the .esp - if (edFilename.SelLength = Length(edFilename.Text)) - and StrEndsWith(edFilename.Text, '.esp') then + if (edFilename.SelLength = Length(edFilename.Text)) and + StrEndsWith(edFilename.Text, '.esp') then edFilename.SelLength := edFilename.SelLength - 4; end; @@ -147,14 +150,14 @@ procedure TEditForm.edNameChange(Sender: TObject); valid, exists: boolean; begin valid := NameValid; - exists := DirectoryExists(settings.patchDirectory + edName.Text) - and (edName.Text <> patch.name); + exists := DirectoryExists(settings.patchDirectory + edName.Text) and + (edName.Text <> patch.name); // if invalid show hint and make font color red - btnOk.Enabled := valid and ESPFilenameValid; + btnOK.Enabled := valid and ESPFilenameValid; edName.ShowHint := (not valid) or exists; if (not valid) or exists then - edName.Font.Color := $0000ff + edName.Font.Color := $0000FF else edName.Font.Color := clWindowText; end; @@ -163,9 +166,10 @@ procedure TEditForm.edNameChange(Sender: TObject); procedure TEditForm.edKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin - if (HiWord(GetKeyState(vk_Return)) <> 0) and btnOk.Enabled then begin - btnOkClick(nil); - ModalResult := mrOk; + if (HiWord(GetKeyState(vk_Return)) <> 0) and btnOK.Enabled then + begin + btnOKClick(nil); + ModalResult := mrOK; end; end; diff --git a/frontend/msLoader.pas b/frontend/msLoader.pas old mode 100644 new mode 100755 index e9de76c..7831c92 --- a/frontend/msLoader.pas +++ b/frontend/msLoader.pas @@ -9,26 +9,28 @@ interface // mp units msConfiguration; - { Initialization Methods } - function InitBase: boolean; - function GamePathValid(path: string; id: integer): boolean; - procedure SetGame(id: integer); - function GetGameID(name: string): integer; - function GetLanguageFileSuffix: String; - function GetGamePath(mode: TGameMode): string; - procedure LoadDefinitions; - procedure LoadBSAs; - { Load order functions } - procedure RemoveCommentsAndEmpty(var sl: TStringList); - procedure RemoveMissingFiles(var sl: TStringList); - procedure RemoveSmashedPatches(var sl: TStringList); - procedure FixLoadOrder(var sl: TStringList; const filename: String; var index: Integer); - procedure AddBaseMasters(var sl: TStringList); - procedure AddMissingFiles(var sl: TStringList); - function PluginListCompare(List: TStringList; Index1, Index2: Integer): Integer; - procedure LoadPluginsList(const sLoadPath: String; var sl: TStringList; noDelete: Boolean = False); - procedure LoadLoadOrder(const sLoadPath: String; var slLoadOrder: TStringList); - procedure PrepareLoadOrder(var slLoadOrder, slPlugins: TStringList); +{ Initialization Methods } +function InitBase: boolean; +function GamePathValid(path: string; id: integer): boolean; +procedure SetGame(id: integer); +function GetGameID(name: string): integer; +function GetLanguageFileSuffix: String; +function GetGamePath(mode: TGameMode): string; +procedure LoadDefinitions; +procedure LoadBSAs; +{ Load order functions } +procedure RemoveCommentsAndEmpty(var sl: TStringList); +procedure RemoveMissingFiles(var sl: TStringList); +procedure RemoveSmashedPatches(var sl: TStringList); +procedure FixLoadOrder(var sl: TStringList; const filename: String; + var index: integer); +procedure AddBaseMasters(var sl: TStringList); +procedure AddMissingFiles(var sl: TStringList); +function PluginListCompare(List: TStringList; Index1, Index2: integer): integer; +procedure LoadPluginsList(const sLoadPath: String; var sl: TStringList; + noDelete: boolean = False); +procedure LoadLoadOrder(const sLoadPath: String; var slLoadOrder: TStringList); +procedure PrepareLoadOrder(var slLoadOrder, slPlugins: TStringList); var slPlugins, slLanguageMap: TStringList; @@ -48,8 +50,7 @@ implementation wbDefinitionsFNV, wbDefinitionsFO3, wbDefinitionsTES3, wbDefinitionsTES4, wbDefinitionsTES5, wbDefinitionsFO4; - -{******************************************************************************} +{ ****************************************************************************** } { Initialization Methods Methods that are used for initialization. @@ -62,39 +63,42 @@ implementation - LoadDefinitions - InitPapyrus } -{******************************************************************************} +{ ****************************************************************************** } function InitBase: boolean; var slLoadOrder: TStringList; psForm: TPluginSelectionForm; begin - Result := false; + Result := False; // INITIALIZE VARIABLES LogPath := PathList.Values['ProgramPath'] + 'logs\'; PathList.Values['TempPath'] := PathList.Values['ProgramPath'] + 'temp\'; - PathList.Values['ProfilePath'] := PathList.Values['ProgramPath'] + - 'profiles\'+ CurrentProfile.name + '\'; + PathList.Values['ProfilePath'] := PathList.Values['ProgramPath'] + 'profiles\' + + CurrentProfile.name + '\'; ForceDirectories(PathList.Values['TempPath']); ForceDirectories(LogPath); ForceDirectories(PathList.Values['ProfilePath']); // SET GAME VARS SetGame(CurrentProfile.gameMode); - wbVWDInTemporary := wbGameMode in [gmSSE, gmTES5, gmFO3, gmFNV]; + wbVWDInTemporary := wbGameMode in [gmSSE, gmTES5VR, gmTES5, gmEnderal, + gmFO3, gmFNV]; wbVWDAsQuestChildren := wbGameMode = gmFO4; wbArchiveExtension := IfThen(wbGameMode = gmFO4, '.ba2', '.bsa'); - wbLoadBSAs := wbGameMode in [gmFO4, gmSSE, gmTES5, gmTES4]; - Logger.Write('GENERAL', 'Game', 'Using '+wbGameName); - Logger.Write('GENERAL', 'Path', 'Using '+wbDataPath); - Logger.Write('GENERAL', 'GameIni', 'Using '+wbTheGameIniFileName); + wbLoadBSAs := wbGameMode in [gmFO4, gmSSE, gmTES5VR, gmTES5, + gmEnderal, gmTES4]; + Logger.Write('GENERAL', 'Game', 'Using ' + wbGameName); + Logger.Write('GENERAL', 'Path', 'Using ' + wbDataPath); + Logger.Write('GENERAL', 'GameIni', 'Using ' + wbTheGameIniFileName); // INITIALIZE SETTINGS FOR GAME LoadSettings; LoadLanguage; // INITIALIZE XEDIT + wbBuildRefs := settings.buildRefs; wbDisplayLoadOrderFormID := True; wbSortSubRecords := True; wbDisplayShorterNames := True; @@ -106,9 +110,15 @@ function InitBase: boolean; wbEditAllowed := True; wbContainerHandler := wbCreateContainerHandler; wbContainerHandler._AddRef; + wbToolSource := tsPlugins; + wbSourceName := 'Plugins'; + wbToolMode := tmEdit; + wbToolName := 'Edit'; + wbAlignArrayElements := True; // INITIALIZE DEFINITIONS - Logger.Write('GENERAL', 'Definitions', 'Using '+wbAppName+'Edit Definitions'); + Logger.Write('GENERAL', 'Definitions', 'Using ' + wbAppName + + 'Edit Definitions'); LoadDefinitions; // LOAD SMASH SETTINGS @@ -142,27 +152,27 @@ function InitBase: boolean; FreeList(HeaderList); // ALL DONE - Result := true; + Result := True; end; - + { Check if game paths are valid } function GamePathValid(path: string; id: integer): boolean; begin - Result := FileExists(path + GameArray[id].exeName) - and DirectoryExists(path + 'Data'); + Result := FileExists(path + GameArray[id].exeName) and + DirectoryExists(path + 'Data'); end; { Sets the game mode in the TES5Edit API } procedure SetGame(id: integer); -var +var sMyDocumentsPath: string; sIniPath: string; begin - ProgramStatus.GameMode := GameArray[id]; - wbGameName := ProgramStatus.GameMode.gameName; - wbGameName2 := ProgramStatus.GameMode.regName; - wbGameMode := ProgramStatus.GameMode.gameMode; - wbAppName := ProgramStatus.GameMode.appName; + ProgramStatus.gameMode := GameArray[id]; + wbGameName := ProgramStatus.gameMode.gameName; + wbGameName2 := ProgramStatus.gameMode.regName; + wbGameMode := ProgramStatus.gameMode.gameMode; + wbAppName := ProgramStatus.gameMode.appName; wbDataPath := CurrentProfile.gamePath + 'Data\'; // set general paths @@ -171,7 +181,8 @@ procedure SetGame(id: integer); // find game ini inside the user's documents folder. sMyDocumentsPath := GetCSIDLShellFolder(CSIDL_PERSONAL); - if sMyDocumentsPath <> '' then begin + if sMyDocumentsPath <> '' then + begin sIniPath := sMyDocumentsPath + 'My Games\' + wbGameName2 + '\'; if wbGameMode in [gmFO3, gmFNV] then wbTheGameIniFileName := sIniPath + 'Fallout.ini' @@ -187,7 +198,8 @@ function GetGameID(name: string): integer; begin Result := 0; for i := Low(GameArray) to High(GameArray) do - if GameArray[i].longName = name then begin + if GameArray[i].longName = name then + begin Result := i; exit; end; @@ -196,22 +208,22 @@ function GetGameID(name: string): integer; { Gets language file suffix } function GetLanguageFileSuffix: String; begin - Result := settings.language; - if (wbGameMode = gmFO4) and (slLanguageMap.IndexOfName(Result) > -1) then - Result := slLanguageMap.Values[Result]; + Result := settings.language; + if (wbGameMode = gmFO4) and (slLanguageMap.IndexOfName(Result) > -1) then + Result := slLanguageMap.Values[Result]; end; { Gets the path of a game from registry key or app path } function GetGamePath(mode: TGameMode): string; const - sBethRegKey = '\SOFTWARE\Bethesda Softworks\'; - sBethRegKey64 = '\SOFTWARE\Wow6432Node\Bethesda Softworks\'; - sSteamRegKey = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+ + sBethRegKey = '\SOFTWARE\Bethesda Softworks\'; + sBethRegKey64 = '\SOFTWARE\Wow6432Node\Bethesda Softworks\'; + sSteamRegKey = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + 'Steam App '; - sSteamRegKey64 = '\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\'+ + sSteamRegKey64 = '\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\' + 'Uninstall\Steam App '; var - i: Integer; + i: integer; regName: string; keys, appIDs: TStringList; begin @@ -226,7 +238,8 @@ function GetGamePath(mode: TGameMode): string; // add keys to check keys.Add(sBethRegKey + regName + '\Installed Path'); keys.Add(sBethRegKey64 + regName + '\Installed Path'); - for i := 0 to Pred(appIDs.Count) do begin + for i := 0 to Pred(appIDs.Count) do + begin keys.Add(sSteamRegKey + appIDs[i] + '\InstallLocation'); keys.Add(sSteamRegKey64 + appIDs[i] + '\InstallLocation'); end; @@ -247,12 +260,16 @@ function GetGamePath(mode: TGameMode): string; procedure LoadDefinitions; begin case wbGameMode of - gmTES5: DefineTES5; - gmFNV: DefineFNV; - gmTES4: DefineTES4; - gmFO3: DefineFO3; - gmFO4: DefineFO4; - gmSSE: DefineTES5; + gmTES5, gmTES5VR, gmSSE, gmEnderal: + DefineTES5; + gmFNV: + DefineFNV; + gmTES4: + DefineTES4; + gmFO3: + DefineFO3; + gmFO4: + DefineFO4; end; end; @@ -260,57 +277,58 @@ procedure LoadBSAFile(sFileName: String); var sFileExt: String; begin - sFileExt := ExtractFileExt(sFileName); - Logger.Write('LOAD', 'Resources', 'Loading resources from ' + sFileName); - if sFileExt = '.bsa' then - wbContainerHandler.AddBSA(wbDataPath + sFileName) - else if sFileExt = '.ba2' then - wbContainerHandler.AddBA2(wbDataPath + sFileName); + sFileExt := ExtractFileExt(sFileName); + Logger.Write('LOAD', 'Resources', 'Loading resources from ' + sFileName); + if sFileExt = '.bsa' then + wbContainerHandler.AddBSA(wbDataPath + sFileName) + else if sFileExt = '.ba2' then + wbContainerHandler.AddBA2(wbDataPath + sFileName); end; { Loads all of the BSAs specified in the game ini and by plugins } procedure LoadBSAs; -var +var slBSAFileNames: TStringList; slErrors: TStringList; - i: Integer; - modIndex: Integer; + i: integer; + modIndex: integer; plugin: TPlugin; - bIsTES5: Boolean; + bIsTES5: boolean; begin - slBSAFileNames := TStringList.Create; + slBSAFileNames := TStringList.Create; try - slErrors:= TStringList.Create; + + slErrors := TStringList.Create; try - FindBSAs(wbTheGameIniFileName, wbDataPath, slBSAFileNames, slErrors); - for i := 0 to slBSAFileNames.Count - 1 do - LoadBSAFile(slBSAFileNames[i]); - for i := 0 to slErrors.Count - 1 do - Logger.Write('ERROR', 'Load', slErrors[i] + ' was not found'); - - for modIndex := 0 to PluginsList.Count - 1 do begin - slBSAFileNames.Clear; - slErrors.Clear; - plugin := TPlugin(PluginsList[modIndex]); - bIsTES5 := wbGameMode in [gmTES5, gmSSE]; - - HasBSAs(ChangeFileExt(plugin.filename, ''), wbDataPath, bIsTES5, - bIsTES5, slBSAFileNames, slErrors); - for i := 0 to slBSAFileNames.Count - 1 do - LoadBSAFile(slBSAFileNames[i]); - for i := 0 to slErrors.Count - 1 do - Logger.Write('ERROR', 'Load', slErrors[i] + ' was not found'); - end; - finally - slErrors.Free; + FindBSAs(wbTheGameIniFileName, wbDataPath, slBSAFileNames, slErrors); + for i := 0 to slBSAFileNames.Count - 1 do + LoadBSAFile(slBSAFileNames[i]); + for i := 0 to slErrors.Count - 1 do + Logger.Write('ERROR', 'Load', slErrors[i] + ' was not found'); + + for modIndex := 0 to PluginsList.Count - 1 do + begin + slBSAFileNames.Clear; + slErrors.Clear; + plugin := TPlugin(PluginsList[modIndex]); + bIsTES5 := wbGameMode in [gmTES5, gmEnderal, gmSSE, gmTES5VR]; + + HasBSAs(ChangeFileExt(plugin.filename, ''), wbDataPath, bIsTES5, + bIsTES5, slBSAFileNames, slErrors); + for i := 0 to slBSAFileNames.Count - 1 do + LoadBSAFile(slBSAFileNames[i]); + for i := 0 to slErrors.Count - 1 do + Logger.Write('ERROR', 'Load', slErrors[i] + ' was not found'); + end; + finally + slErrors.Free; end; - finally - slBSAFileNames.Free; + finally + slBSAFileNames.Free; end; end; - -{******************************************************************************} +{ ****************************************************************************** } { Load order functions Set of functions for building a working load order. @@ -319,25 +337,26 @@ procedure LoadBSAs; - RemoveMissingFiles - AddMissingFiles - PluginListCompare -{******************************************************************************} - -{ Remove comments and empty lines from a stringlist } -procedure RemoveCommentsAndEmpty(var sl: TStringList); -var - i, j, k: integer; - s: string; -begin - for i := Pred(sl.Count) downto 0 do begin - s := Trim(sl.Strings[i]); - j := Pos('#', s); - k := Pos('*', s); - if j > 0 then - System.Delete(s, j, High(Integer)); - if s = '' then - sl.Delete(i); - if k = 1 then - sl[i] := Copy(s, 2, Length(s)); - end; + {****************************************************************************** } + +{ Remove comments and empty lines from a stringlist } +procedure RemoveCommentsAndEmpty(var sl: TStringList); +var + i, j, k: integer; + s: string; +begin + for i := Pred(sl.Count) downto 0 do + begin + s := Trim(sl.Strings[i]); + j := Pos('#', s); + k := Pos('*', s); + if j > 0 then + System.Delete(s, j, High(integer)); + if s = '' then + sl.Delete(i); + if k = 1 then + sl[i] := Copy(s, 2, Length(s)); + end; end; { Remove nonexistent files from stringlist } @@ -347,7 +366,10 @@ procedure RemoveMissingFiles(var sl: TStringList); begin for i := Pred(sl.Count) downto 0 do if not FileExists(wbDataPath + sl.Strings[i]) then - sl.Delete(i); + if FileExists(wbDataPath + sl.Strings[i] + csDotGhost) then + sl.Strings[i] := sl.Strings[i] + csDotGhost + else + sl.Delete(i); end; { Remove smashed patch plugins from stringlist } @@ -359,78 +381,110 @@ procedure RemoveSmashedPatches(var sl: TStringList); if Assigned(TPatchHelpers.PatchByFilename(PatchesList, sl[i])) then sl.Delete(i); end; - -{ Forces a plugin to load at a specific position } -procedure FixLoadOrder(var sl: TStringList; const filename: String; var index: Integer); -var - oldIndex: Integer; -begin - oldIndex := sl.IndexOf(filename); - if (oldIndex > -1) then begin - if oldIndex <> index then begin - sl.Delete(oldIndex); - sl.Insert(index, filename); - end; - end - else if FileExists(wbDataPath + filename) then - sl.Insert(index, filename) - else - exit; - Inc(index); -end; - -procedure AddBaseMasters(var sl: TStringList); -var - index: Integer; -begin - index := 0; - FixLoadOrder(sl, wbGameName + '.esm', index); - if (wbGameMode = gmTES5) then - FixLoadOrder(sl, 'Update.esm', index) - else if (wbGameMode = gmSSE) then begin - FixLoadOrder(sl, 'Update.esm', index); - FixLoadOrder(sl, 'Dawnguard.esm', index); - FixLoadOrder(sl, 'HearthFires.esm', index); - FixLoadOrder(sl, 'Dragonborn.esm', index); - end - else if (wbGameMode = gmFO4) then begin - FixLoadOrder(sl, 'DLCRobot.esm', index); - FixLoadOrder(sl, 'DLCworkshop01.esm', index); - FixLoadOrder(sl, 'DLCCoast.esm', index); - FixLoadOrder(sl, 'DLCworkshop02.esm', index); - FixLoadOrder(sl, 'DLCworkshop03.esm', index); - FixLoadOrder(sl, 'DLCNukaWorld.esm', index); - FixLoadOrder(sl, 'DLCUltraHighResolution.esm', index); - end; + +{ Forces a plugin to load at a specific position } +procedure FixLoadOrder(var sl: TStringList; const filename: String; + var index: integer); +var + oldIndex: integer; +begin + oldIndex := sl.IndexOf(filename); + if (oldIndex > -1) then + begin + if oldIndex <> index then + begin + sl.Delete(oldIndex); + sl.Insert(index, filename); + end; + end + else if FileExists(wbDataPath + filename) then + sl.Insert(index, filename) + else + exit; + Inc(index); +end; + +procedure AddBaseMasters(var sl: TStringList); +var + index: integer; +begin + index := 0; + FixLoadOrder(sl, wbGameName + '.esm', index); + if (wbGameMode = gmTES5) or (wbGameMode = gmEnderal) then + FixLoadOrder(sl, 'Update.esm', index) + else if (wbGameMode = gmSSE) or (wbGameMode = gmTES5VR) then + begin + FixLoadOrder(sl, 'Update.esm', index); + FixLoadOrder(sl, 'Dawnguard.esm', index); + FixLoadOrder(sl, 'HearthFires.esm', index); + FixLoadOrder(sl, 'Dragonborn.esm', index); + if (wbGameMode = gmTES5VR) then + FixLoadOrder(sl, 'SkyrimVR.esm', index); + + end + else if (wbGameMode = gmFO4) then + begin + FixLoadOrder(sl, 'DLCRobot.esm', index); + FixLoadOrder(sl, 'DLCworkshop01.esm', index); + FixLoadOrder(sl, 'DLCCoast.esm', index); + FixLoadOrder(sl, 'DLCworkshop02.esm', index); + FixLoadOrder(sl, 'DLCworkshop03.esm', index); + FixLoadOrder(sl, 'DLCNukaWorld.esm', index); + FixLoadOrder(sl, 'DLCUltraHighResolution.esm', index); + end; +end; + +// Put Creation Club plugins in load order +procedure AddCCPlugins(var slLoadOrder: TStringList); +var + sPath: string; + slCC: TStringList; + i: integer; + index: integer; +begin + slCC := TStringList.Create; + sPath := CurrentProfile.gamePath + wbGameName + '.ccc'; + if (wbGameMode <> gmSSE) and (wbGameMode <> gmFO4) then + exit; + if FileExists(sPath) then + begin + slCC.LoadFromFile(sPath); + index := 0; + for i := 0 to Pred(slCC.Count) do + FixLoadOrder(slLoadOrder, slCC[i], index); + end; end; function GetPluginDate(const aFileName: string): Cardinal; const - DateOmitYears = 60; - DatePrecision = 100000; -var - F: TSearchRec; -begin - // Try to fit a meaningful modified date of a file into 32 bits integer value - // For relative load order sorting only - // Oblivion GOG version has dates from 1969 year and FileAge() doesn't support them - if FindFirst(aFileName, faAnyFile, F) = 0 then begin - Result := Round((F.TimeStamp - 364 * DateOmitYears) * DatePrecision); - FindClose(F); - end else + DateOmitYears = 60; + DatePrecision = 100000; +var + F: TSearchRec; +begin + // Try to fit a meaningful modified date of a file into 32 bits integer value + // For relative load order sorting only + // Oblivion GOG version has dates from 1969 year and FileAge() doesn't support them + if FindFirst(aFileName, faAnyFile, F) = 0 then + begin + Result := Round((F.TimeStamp - 364 * DateOmitYears) * DatePrecision); + FindClose(F); + end + else Result := 0; end; { Compare function for sorting load order by date modified/esms } -function PluginListCompare(List: TStringList; Index1, Index2: Integer): Integer; +function PluginListCompare(List: TStringList; Index1, Index2: integer): integer; var - IsESM1, IsESM2: Boolean; - FileSK1, FileSK2: Integer; + IsESM1, IsESM2: boolean; + FileSK1, FileSK2: integer; begin - IsESM1 := IsFileESM(List[Index1]); - IsESM2 := IsFileESM(List[Index2]); + IsESM1 := List[Index1].EndsWith(csDotESM); + IsESM2 := List[Index2].EndsWith(csDotESM); - if IsESM1 = IsESM2 then begin + if IsESM1 = IsESM2 then + begin FileSK1 := Cardinal(List.Objects[Index1]); FileSK2 := Cardinal(List.Objects[Index2]); @@ -441,7 +495,8 @@ function PluginListCompare(List: TStringList; Index1, Index2: Integer): Integer; else Result := 0; - end else if IsESM1 then + end + else if IsESM1 then Result := -1 else Result := 1; @@ -458,18 +513,20 @@ procedure AddMissingFiles(var sl: TStringList); slNew := TStringList.Create; try // search for missing plugins and masters - if FindFirst(wbDataPath + '*.*', faAnyFile, F) = 0 then try - repeat - if not (IsFileESM(F.Name) or IsFileESP(F.Name) or IsFileESL(F.Name)) then - continue; - if sl.IndexOf(F.Name) = -1 then begin - fileSortKey := GetPluginDate(wbDataPath + F.Name); - slNew.AddObject(F.Name, TObject(fileSortKey)); - end; - until FindNext(F) <> 0; - finally - FindClose(F); - end; + if FindFirst(wbDataPath + '*.*', faAnyFile, F) = 0 then + try + repeat + if not(wbIsPlugin(F.name)) then + continue; + if sl.IndexOf(F.name) = -1 then + begin + fileSortKey := GetPluginDate(wbDataPath + F.name); + slNew.AddObject(F.name, TObject(fileSortKey)); + end; + until FindNext(F) <> 0; + finally + FindClose(F); + end; // sort the list slNew.CustomSort(PluginListCompare); @@ -481,16 +538,19 @@ procedure AddMissingFiles(var sl: TStringList); else // find position of last master for j := Pred(sl.Count) downto 0 do - if IsFileESM(sl[j]) then + if sl[j].EndsWith(csDotESM) then Break; // add esm masters after the last master, add esp plugins at the end Inc(j); - for i := 0 to Pred(slNew.Count) do begin - if IsFileESM(slNew[i]) then begin + for i := 0 to Pred(slNew.Count) do + begin + if (slNew[i].EndsWith(csDotESM)) then + begin sl.InsertObject(j, slNew[i], slNew.Objects[i]); Inc(j); - end else + end + else sl.AddObject(slNew[i], slNew.Objects[i]); end; finally @@ -498,129 +558,135 @@ procedure AddMissingFiles(var sl: TStringList); end; end; -procedure ProcessAsterisks(var sl: TStringList; index: Integer; noDelete: Boolean); -var - s: String; -begin - s := sl[index]; - if s[1] <> '*' then begin - if not noDelete then sl.Delete(index); - end - else - sl[index] := Copy(s, 2, Length(s)); -end; - -procedure ProcessPluginsFormat(var sl: TStringList; noDelete: Boolean); -var - i: Integer; -begin - for i := Pred(sl.Count) downto 0 do - ProcessAsterisks(sl, i, noDelete); +procedure ProcessAsterisks(var sl: TStringList; index: integer; + noDelete: boolean); +var + s: String; +begin + s := sl[index]; + if s[1] <> '*' then + begin + if not noDelete then + if not (settings.smashGhosts and s.EndsWith(csDotGhost)) then + sl.Delete(index); + end + else + sl[index] := Copy(s, 2, Length(s)); end; - -procedure LoadPluginsList(const sLoadPath: String; var sl: TStringList; noDelete: Boolean = False); -var - sPath: String; -begin - sPath := sLoadPath + 'plugins.txt'; - if FileExists(sPath) then begin - sl.LoadFromFile(sPath); - if (wbGameMode = gmSSE) or (wbGameMode = gmFO4) then - ProcessPluginsFormat(sl, noDelete); - end - else - AddMissingFiles(sl); - - // remove comments and missing files - AddBaseMasters(sl); - RemoveCommentsAndEmpty(sl); - RemoveMissingFiles(sl); - if noDelete then AddMissingFiles(sl); - RemoveSmashedPatches(sl); + +procedure ProcessPluginsFormat(var sl: TStringList; noDelete: boolean); +var + i: integer; +begin + for i := Pred(sl.Count) downto 0 do + ProcessAsterisks(sl, i, noDelete); +end; + +procedure LoadPluginsList(const sLoadPath: String; var sl: TStringList; + noDelete: boolean = False); +var + sPath: String; +begin + + sPath := sLoadPath + 'plugins.txt'; + if FileExists(sPath) then + begin + sl.LoadFromFile(sPath); + if (wbGameMode = gmSSE) or (wbGameMode = gmTES5VR) or (wbGameMode = gmFO4) + then + ProcessPluginsFormat(sl, noDelete); + end + else + AddMissingFiles(sl); + + AddCCPlugins(sl); + AddBaseMasters(sl); + // remove comments and missing files + RemoveCommentsAndEmpty(sl); + RemoveMissingFiles(sl); + if noDelete then + AddMissingFiles(sl); + RemoveSmashedPatches(sl); end; - -procedure LoadLoadOrder(const sLoadPath: String; var slLoadOrder: TStringList); -var - sPath: String; -begin - sPath := sLoadPath + 'loadorder.txt'; - if (wbGameMode <> gmSSE) and (wbGameMode <> gmFO4) - and FileExists(sPath) then begin - slLoadOrder.LoadFromFile(sPath); - - // remove comments and add/remove files - AddBaseMasters(slLoadOrder); - RemoveCommentsAndEmpty(slLoadOrder); - RemoveMissingFiles(slLoadOrder); - AddMissingFiles(slLoadOrder); - RemoveSmashedPatches(slLoadOrder); - end - else - LoadPluginsList(sLoadPath, slLoadOrder, True); + +procedure LoadLoadOrder(const sLoadPath: String; var slLoadOrder: TStringList); +var + sPath: String; +begin + sPath := sLoadPath + 'loadorder.txt'; + if (wbGameMode <> gmSSE) and (wbGameMode <> gmTES5VR) and + (wbGameMode <> gmFO4) and FileExists(sPath) then + begin + slLoadOrder.LoadFromFile(sPath); + + // remove comments and add/remove files + AddBaseMasters(slLoadOrder); + RemoveCommentsAndEmpty(slLoadOrder); + RemoveMissingFiles(slLoadOrder); + AddMissingFiles(slLoadOrder); + RemoveSmashedPatches(slLoadOrder); + end + else + LoadPluginsList(sLoadPath, slLoadOrder, True); end; procedure PrepareLoadOrder(var slLoadOrder, slPlugins: TStringList); var sLoadPath: String; begin - sLoadPath := GetCSIDLShellFolder(CSIDL_LOCAL_APPDATA) + wbGameName2 +'\'; - LoadPluginsList(sLoadPath, slPlugins); + sLoadPath := GetCSIDLShellFolder(CSIDL_LOCAL_APPDATA) + wbGameName2 + '\'; + LoadPluginsList(sLoadPath, slPlugins); LoadLoadOrder(sLoadPath, slLoadOrder); - end; + +end; { Log Initialization } procedure InitLog; begin // INITIALIZE GROUP FILTERS - GroupFilters.Add(TFilter.Create('GENERAL', true)); - GroupFilters.Add(TFilter.Create('LOAD', true)); - GroupFilters.Add(TFilter.Create('CLIENT', true)); - GroupFilters.Add(TFilter.Create('MERGE', true)); - GroupFilters.Add(TFilter.Create('PLUGIN', true)); - GroupFilters.Add(TFilter.Create('ERROR', true)); + GroupFilters.Add(TFilter.Create('GENERAL', True)); + GroupFilters.Add(TFilter.Create('LOAD', True)); + GroupFilters.Add(TFilter.Create('CLIENT', True)); + GroupFilters.Add(TFilter.Create('MERGE', True)); + GroupFilters.Add(TFilter.Create('PLUGIN', True)); + GroupFilters.Add(TFilter.Create('ERROR', True)); // INITIALIZE LABEL FILTERS - LabelFilters.Add(TFilter.Create('GENERAL', 'Game', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Status', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Path', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Definitions', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Dictionary', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Load Order', true)); - LabelFilters.Add(TFilter.Create('GENERAL', 'Log', true)); - LabelFilters.Add(TFilter.Create('LOAD', 'Order', false)); - LabelFilters.Add(TFilter.Create('LOAD', 'Plugins', false)); - LabelFilters.Add(TFilter.Create('LOAD', 'Background', true)); - LabelFilters.Add(TFilter.Create('CLIENT', 'Connect', true)); - LabelFilters.Add(TFilter.Create('CLIENT', 'Login', true)); - LabelFilters.Add(TFilter.Create('CLIENT', 'Response', true)); - LabelFilters.Add(TFilter.Create('CLIENT', 'Update', true)); - LabelFilters.Add(TFilter.Create('CLIENT', 'Report', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Status', false)); - LabelFilters.Add(TFilter.Create('PATCH', 'Create', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Edit', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Check', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Clean', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Delete', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Build', true)); - LabelFilters.Add(TFilter.Create('PATCH', 'Report', true)); - LabelFilters.Add(TFilter.Create('PLUGIN', 'Report', true)); - LabelFilters.Add(TFilter.Create('PLUGIN', 'Check', true)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Game', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Status', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Path', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Definitions', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Dictionary', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Load Order', True)); + LabelFilters.Add(TFilter.Create('GENERAL', 'Log', True)); + LabelFilters.Add(TFilter.Create('LOAD', 'Order', False)); + LabelFilters.Add(TFilter.Create('LOAD', 'Plugins', False)); + LabelFilters.Add(TFilter.Create('LOAD', 'Background', True)); + LabelFilters.Add(TFilter.Create('CLIENT', 'Connect', True)); + LabelFilters.Add(TFilter.Create('CLIENT', 'Login', True)); + LabelFilters.Add(TFilter.Create('CLIENT', 'Response', True)); + LabelFilters.Add(TFilter.Create('CLIENT', 'Update', True)); + LabelFilters.Add(TFilter.Create('CLIENT', 'Report', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Status', False)); + LabelFilters.Add(TFilter.Create('PATCH', 'Create', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Edit', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Check', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Clean', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Delete', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Build', True)); + LabelFilters.Add(TFilter.Create('PATCH', 'Report', True)); + LabelFilters.Add(TFilter.Create('PLUGIN', 'Report', True)); + LabelFilters.Add(TFilter.Create('PLUGIN', 'Check', True)); end; initialization - slLanguageMap := TStringList.Create; - slLanguageMap.Text := - 'English=en'#13 + - 'French=fr'#13 + - 'German=de'#13 + - 'Italian=it'#13 + - 'Spanish=es'#13 + - 'Russian=ru'#13 + - 'Polish=pl'#13 + - 'Japanese=ja'#13 + - 'Portugese=pt'#13 + - 'Chinese=zh'; + +slLanguageMap := TStringList.Create; +slLanguageMap.Text := 'English=en'#13 + 'French=fr'#13 + 'German=de'#13 + + 'Italian=it'#13 + 'Spanish=es'#13 + 'Russian=ru'#13 + 'Polish=pl'#13 + + 'Japanese=ja'#13 + 'Portugese=pt'#13 + 'Chinese=zh'; finalization - slLanguageMap.Free; + +slLanguageMap.Free; end. diff --git a/frontend/msOptionsForm.dfm b/frontend/msOptionsForm.dfm old mode 100644 new mode 100755 index 301c791..1aaed27 --- a/frontend/msOptionsForm.dfm +++ b/frontend/msOptionsForm.dfm @@ -2,7 +2,7 @@ object OptionsForm: TOptionsForm Left = 0 Top = 0 Caption = 'Settings' - ClientHeight = 447 + ClientHeight = 446 ClientWidth = 584 Color = clBtnFace Constraints.MaxHeight = 485 @@ -31,6 +31,10 @@ object OptionsForm: TOptionsForm TabWidth = 80 object GeneralTabSheet: TTabSheet Caption = 'General' + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object gbStyle: TGroupBox Left = 6 Top = 69 @@ -107,6 +111,8 @@ object OptionsForm: TOptionsForm ImageIndex = 1 ExplicitLeft = 0 ExplicitTop = 28 + ExplicitWidth = 0 + ExplicitHeight = 0 object gbGeneral: TGroupBox Left = 3 Top = 3 @@ -259,6 +265,10 @@ object OptionsForm: TOptionsForm object AdvancedTabSheet: TTabSheet Caption = 'Advanced' ImageIndex = 2 + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object gbLogging: TGroupBox Left = 6 Top = 72 @@ -514,7 +524,7 @@ object OptionsForm: TOptionsForm Left = 16 Top = 400 Bitmap = { - 494C0101010008007C0110001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010101000800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/frontend/msOptionsForm.pas b/frontend/msOptionsForm.pas old mode 100644 new mode 100755 index bdea1bc..0e47dd8 --- a/frontend/msOptionsForm.pas +++ b/frontend/msOptionsForm.pas @@ -8,63 +8,63 @@ interface // mte units mteHelpers, RttiTranslation, // mp units - msConfiguration; + msConfiguration, System.ImageList; type TOptionsForm = class(TForm) [FormPrefix('mpOpt')] - SettingsPageControl: TPageControl; - btnCancel: TButton; - btnOK: TButton; - IconList: TImageList; - [FormSection('General Tab')] - GeneralTabSheet: TTabSheet; - gbLanguage: TGroupBox; - lblLanguage: TLabel; - gbStyle: TGroupBox; - kbSimpleDictionary: TCheckBox; - kbSimplePlugins: TCheckBox; - [FormSection('DontTranslate')] - cbLanguage: TComboBox; - [FormSection('Patching Tab')] - PatchingTabSheet: TTabSheet; - gbGeneral: TGroupBox; - edPatchDirectory: TEdit; - lblDestinationDirectory: TLabel; - btnBrowsePatchDirectory: TSpeedButton; - gbDebug: TGroupBox; - kbDebugPatchStatus: TCheckBox; - kbDebugMasters: TCheckBox; - kbDebugArrays: TCheckBox; - kbDebugSkips: TCheckBox; - kbDebugTraversal: TCheckBox; - kbDebugTypes: TCheckBox; - kbDebugChanges: TCheckBox; - kbDebugSingle: TCheckBox; - kbDebugLinks: TCheckBox; - gbOther: TGroupBox; - kbBuildRefs: TCheckBox; - kbPreserveITPOs: TCheckBox; - [FormSection('Advanced Tab')] - AdvancedTabSheet: TTabSheet; - lblCurrentProfile: TLabel; - gbLogging: TGroupBox; - lblClientColor: TLabel; - cbClientColor: TColorBox; - lblGeneralColor: TLabel; - cbGeneralColor: TColorBox; - lblLoadColor: TLabel; - cbLoadColor: TColorBox; - lblPluginColor: TLabel; - cbPluginColor: TColorBox; - lblErrorColor: TLabel; - cbErrorColor: TColorBox; - lblTemplate: TLabel; - meTemplate: TMemo; - lblSample: TLabel; - [FormSection('DontTranslate')] - lblCurrentProfileName: TLabel; - lblSampleValue: TLabel; + SettingsPageControl: TPageControl; + btnCancel: TButton; + btnOK: TButton; + IconList: TImageList; + [FormSection('General Tab')] + GeneralTabSheet: TTabSheet; + gbLanguage: TGroupBox; + lblLanguage: TLabel; + gbStyle: TGroupBox; + kbSimpleDictionary: TCheckBox; + kbSimplePlugins: TCheckBox; + [FormSection('DontTranslate')] + cbLanguage: TComboBox; + [FormSection('Patching Tab')] + PatchingTabSheet: TTabSheet; + gbGeneral: TGroupBox; + edPatchDirectory: TEdit; + lblDestinationDirectory: TLabel; + btnBrowsePatchDirectory: TSpeedButton; + gbDebug: TGroupBox; + kbDebugPatchStatus: TCheckBox; + kbDebugMasters: TCheckBox; + kbDebugArrays: TCheckBox; + kbDebugSkips: TCheckBox; + kbDebugTraversal: TCheckBox; + kbDebugTypes: TCheckBox; + kbDebugChanges: TCheckBox; + kbDebugSingle: TCheckBox; + kbDebugLinks: TCheckBox; + gbOther: TGroupBox; + kbBuildRefs: TCheckBox; + kbPreserveITPOs: TCheckBox; + [FormSection('Advanced Tab')] + AdvancedTabSheet: TTabSheet; + lblCurrentProfile: TLabel; + gbLogging: TGroupBox; + lblClientColor: TLabel; + cbClientColor: TColorBox; + lblGeneralColor: TLabel; + cbGeneralColor: TColorBox; + lblLoadColor: TLabel; + cbLoadColor: TColorBox; + lblPluginColor: TLabel; + cbPluginColor: TColorBox; + lblErrorColor: TLabel; + cbErrorColor: TColorBox; + lblTemplate: TLabel; + meTemplate: TMemo; + lblSample: TLabel; + [FormSection('DontTranslate')] + lblCurrentProfileName: TLabel; + lblSampleValue: TLabel; procedure FormCreate(Sender: TObject); procedure LoadLanguageOptions; @@ -95,7 +95,8 @@ procedure TOptionsForm.btnBrowsePatchDirectoryClick(Sender: TObject); procedure TOptionsForm.btnOKClick(Sender: TObject); begin // check if we need to update patch status afterwards - ProgramStatus.bUpdatePatchStatus := settings.patchDirectory <> edPatchDirectory.Text; + ProgramStatus.bUpdatePatchStatus := settings.patchDirectory <> + edPatchDirectory.Text; // General > Language settings.language := cbLanguage.Text; @@ -119,10 +120,10 @@ procedure TOptionsForm.btnOKClick(Sender: TObject); settings.preserveITPOs := kbPreserveITPOs.Checked; // Advanced > Logging - settings.clientMessageColor := cbClientColor.Selected ; + settings.clientMessageColor := cbClientColor.Selected; settings.generalMessageColor := cbGeneralColor.Selected; settings.loadMessageColor := cbLoadColor.Selected; - //settings.patchMessageColor := cbPatchColor.Selected; + // settings.patchMessageColor := cbPatchColor.Selected; settings.pluginMessageColor := cbPluginColor.Selected; settings.errorMessageColor := cbErrorColor.Selected; settings.logMessageTemplate := meTemplate.Lines.Text; @@ -215,7 +216,7 @@ procedure TOptionsForm.FormCreate(Sender: TObject); cbClientColor.Selected := TColor(settings.clientMessageColor); cbGeneralColor.Selected := TColor(settings.generalMessageColor); cbLoadColor.Selected := TColor(settings.loadMessageColor); - //cbPatchColor.Selected := TColor(settings.patchMessageColor); + // cbPatchColor.Selected := TColor(settings.patchMessageColor); cbPluginColor.Selected := TColor(settings.pluginMessageColor); cbErrorColor.Selected := TColor(settings.errorMessageColor); meTemplate.Lines.Text := settings.logMessageTemplate; diff --git a/frontend/msPluginSelectionForm.dfm b/frontend/msPluginSelectionForm.dfm old mode 100644 new mode 100755 diff --git a/frontend/msPluginSelectionForm.pas b/frontend/msPluginSelectionForm.pas old mode 100644 new mode 100755 index ce3c98a..2607e30 --- a/frontend/msPluginSelectionForm.pas +++ b/frontend/msPluginSelectionForm.pas @@ -44,7 +44,8 @@ procedure TMiniPluginSelectionForm.btnOKClick(Sender: TObject); i: Integer; begin selectionList.Clear; - for i := 0 to Pred(CheckListBox.Items.Count) do begin + for i := 0 to Pred(CheckListBox.Items.Count) do + begin if CheckListBox.Checked[i] then selectionList.Add(CheckListBox.Items[i]); end; @@ -57,16 +58,18 @@ procedure TMiniPluginSelectionForm.CheckListBoxClick(Sender: TObject); i: Integer; begin btnOK.Enabled := false; - for i := 0 to Pred(CheckListBox.Items.Count) do begin - if CheckListBox.Checked[i] then begin + for i := 0 to Pred(CheckListBox.Items.Count) do + begin + if CheckListBox.Checked[i] then + begin btnOK.Enabled := true; break; end; end; end; -procedure TMiniPluginSelectionForm.CheckListBoxKeyUp(Sender: TObject; var Key: Word; - Shift: TShiftState); +procedure TMiniPluginSelectionForm.CheckListBoxKeyUp(Sender: TObject; + var Key: Word; Shift: TShiftState); begin CheckListBoxClick(nil); end; @@ -76,7 +79,8 @@ procedure TMiniPluginSelectionForm.FormShow(Sender: TObject); i, index: Integer; begin CheckListBox.Items.Text := pluginsList.Text; - for i := 0 to Pred(selectionList.Count) do begin + for i := 0 to Pred(selectionList.Count) do + begin index := pluginsList.IndexOf(selectionList[i]); if index > -1 then CheckListBox.Checked[index] := true; diff --git a/frontend/msProfileForm.dfm b/frontend/msProfileForm.dfm old mode 100644 new mode 100755 index 7aff553..06c29b3 --- a/frontend/msProfileForm.dfm +++ b/frontend/msProfileForm.dfm @@ -294,7 +294,7 @@ object ProfileForm: TProfileForm Left = 24 Top = 416 Bitmap = { - 494C0101060008004C0060006000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010106000800040060006000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 000000000000360000002800000080010000C000000001002000000000000080 0400000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -9822,7 +9822,7 @@ object ProfileForm: TProfileForm Left = 96 Top = 416 Bitmap = { - 494C0101020008004C0010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010102000800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/frontend/msProfileForm.pas b/frontend/msProfileForm.pas old mode 100644 new mode 100755 index 7b7aa62..8640ac4 --- a/frontend/msProfileForm.pas +++ b/frontend/msProfileForm.pas @@ -8,7 +8,7 @@ interface // mte components RttiIni, mteHelpers, // mp components - msConfiguration, msLoader, msProfilePanel; + msConfiguration, msLoader, msProfilePanel, System.ImageList; type TProfileForm = class(TForm) @@ -37,12 +37,12 @@ TProfileForm = class(TForm) procedure SelectionChanged(Sender: TObject); procedure DeleteClicked(Sender: TObject); procedure DeleteProfileItemClick(Sender: TObject); - function ProfileNameTaken(name: string): boolean; + function ProfileNameTaken(name: string): Boolean; procedure NewProfileImageClick(Sender: TObject); procedure NewProfilePanelClick(Sender: TObject); procedure NewProfileLabelClick(Sender: TObject); - procedure NewProfilePanelMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + procedure NewProfilePanelMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); private FOldWndProc: TWndMethod; FMouseInPanel: Boolean; @@ -63,15 +63,16 @@ implementation procedure TProfileForm.DeleteProfileItemClick(Sender: TObject); var - bApproved: boolean; + bApproved: Boolean; aProfile: TProfile; begin // get user verification aProfile := MouseOverProfile.GetProfile; - bApproved := MessageDlg('Are you sure you want to delete '+ - aProfile.name + '?', mtConfirmation, mbOKCancel, 0) = mrOk; + bApproved := MessageDlg('Are you sure you want to delete ' + aProfile.name + + '?', mtConfirmation, mbOKCancel, 0) = mrOk; - if not (bApproved and Assigned(MouseOverProfile)) then exit; + if not(bApproved and Assigned(MouseOverProfile)) then + exit; ProfilePanels.Delete(ProfilePanels.IndexOf(MouseOverProfile)); aProfile.Delete; MouseOverProfile.Free; @@ -89,7 +90,8 @@ procedure TProfileForm.RealignPanels; // adjust tops NewProfilePanel.Top := 100 * pCount - vPos; - for i := Pred(pCount) downto 0 do begin + for i := Pred(pCount) downto 0 do + begin p := TProfilePanel(ProfilePanels[i]); p.SetTop(100 * i - vPos); end; @@ -97,7 +99,8 @@ procedure TProfileForm.RealignPanels; // adjust widths NewProfilePanel.Width := ScrollBox.ClientWidth; - for i := Pred(pCount) downto 0 do begin + for i := Pred(pCount) downto 0 do + begin p := TProfilePanel(ProfilePanels[i]); p.SetWidth(ScrollBox.ClientWidth); end; @@ -110,7 +113,8 @@ procedure TProfileForm.FormClose(Sender: TObject; var Action: TCloseAction); aProfile: TProfile; begin // save all profiles - for i := 0 to Pred(ProfilePanels.Count) do begin + for i := 0 to Pred(ProfilePanels.Count) do + begin p := TProfilePanel(ProfilePanels[i]); aProfile := p.GetProfile; try @@ -122,10 +126,13 @@ procedure TProfileForm.FormClose(Sender: TObject; var Action: TCloseAction); end; // set profile if user clicked OK - if ModalResult = mrOK then begin - for i := 0 to Pred(ProfilePanels.Count) do begin + if ModalResult = mrOk then + begin + for i := 0 to Pred(ProfilePanels.Count) do + begin p := TProfilePanel(ProfilePanels[i]); - if p.Selected then begin + if p.Selected then + begin CurrentProfile := TProfile.Create(''); CurrentProfile.Clone(p.GetProfile); break; @@ -151,7 +158,7 @@ procedure TProfileForm.FormCreate(Sender: TObject); procedure TProfileForm.FormDestroy(Sender: TObject); begin - NewProfilePanel.WindowProc:= FOldWndProc; + NewProfilePanel.WindowProc := FOldWndProc; end; procedure TProfileForm.LoadProfiles; @@ -169,14 +176,15 @@ procedure TProfileForm.LoadProfiles; exit; // add found profiles repeat - if IsDotFile(info.Name) then + if IsDotFile(info.name) then continue; - settingsPath := path + info.Name + '\settings.ini'; + settingsPath := path + info.name + '\settings.ini'; if not FileExists(settingsPath) then continue; aSettings := TSettings.Create; TRttiIni.Load(settingsPath, aSettings); - if aSettings.profile <> '' then begin + if aSettings.profile <> '' then + begin p := CreateNewProfile(aSettings.profile); p.SetGame(aSettings.gameMode); p.SetPath(aSettings.gamePath); @@ -191,9 +199,11 @@ function TProfileForm.ProfileExists(gameMode: Integer): Boolean; profile: TProfile; begin Result := False; - for i := 0 to Pred(ProfilePanels.Count) do begin + for i := 0 to Pred(ProfilePanels.Count) do + begin profile := TProfilePanel(ProfilePanels[i]).GetProfile; - if profile.gameMode = gameMode then begin + if profile.gameMode = gameMode then + begin Result := True; break; end; @@ -206,11 +216,14 @@ procedure TProfileForm.CreateDefaultProfiles; path, name: string; p: TProfilePanel; begin - for i := Low(GameArray) to High(GameArray) do begin - if ProfileExists(i) then continue; + for i := Low(GameArray) to High(GameArray) do + begin + if ProfileExists(i) then + continue; path := GetGamePath(GameArray[i]); name := GameArray[i].appName; - if path <> '' then begin + if path <> '' then + begin p := CreateNewProfile(name); p.SetGame(i); p.SetPath(path); @@ -258,16 +271,18 @@ procedure TProfileForm.NewProfilePanelClick(Sender: TObject); NewProfileItemClick(nil); end; -function TProfileForm.ProfileNameTaken(name: string): boolean; +function TProfileForm.ProfileNameTaken(name: string): Boolean; var i: Integer; pName: string; begin - Result := false; - for i := 0 to Pred(ProfilePanels.Count) do begin + Result := False; + for i := 0 to Pred(ProfilePanels.Count) do + begin pName := TProfilePanel(ProfilePanels[i]).GetProfile.name; - if SameText(pName, name) then begin - Result := true; + if SameText(pName, name) then + begin + Result := True; break; end; end; @@ -294,10 +309,11 @@ procedure TProfileForm.SelectionChanged(Sender: TObject); var i: Integer; p: TProfilePanel; - bSelected: boolean; + bSelected: Boolean; begin // deselect all panels except the sender - for i := 0 to Pred(ProfilePanels.Count) do begin + for i := 0 to Pred(ProfilePanels.Count) do + begin p := TProfilePanel(ProfilePanels[i]); if p <> TProfilePanel(Sender) then p.Deselect @@ -306,8 +322,10 @@ procedure TProfileForm.SelectionChanged(Sender: TObject); // enable and focus ok button if profile panel is selected bSelected := TProfilePanel(Sender).Selected; btnOk.Enabled := bSelected; - if bSelected then self.FocusControl(btnOk) - else self.FocusControl(btnCancel); + if bSelected then + self.FocusControl(btnOk) + else + self.FocusControl(btnCancel); end; procedure TProfileForm.DeleteClicked(Sender: TObject); @@ -316,26 +334,28 @@ procedure TProfileForm.DeleteClicked(Sender: TObject); DeleteProfileItemClick(nil); end; -procedure TProfileForm.NewProfilePanelMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); +procedure TProfileForm.NewProfilePanelMouseMove(Sender: TObject; + Shift: TShiftState; X, Y: Integer); var mEvnt: TTrackMouseEvent; begin - if not FMouseInPanel then begin + if not FMouseInPanel then + begin mEvnt.cbSize := SizeOf(mEvnt); mEvnt.dwFlags := TME_LEAVE; mEvnt.hwndTrack := NewProfilePanel.Handle; TrackMouseEvent(mEvnt); - NewProfilePanel.Color:= $f0e8d8; - FMouseInPanel:= True; + NewProfilePanel.Color := $F0E8D8; + FMouseInPanel := True; end; end; procedure TProfileForm.PanelWndProc(var Message: TMessage); begin - if Message.Msg = WM_MOUSELEAVE then begin - NewProfilePanel.Color:= clBtnFace; - FMouseInPanel:= False; + if Message.Msg = WM_MOUSELEAVE then + begin + NewProfilePanel.Color := clBtnFace; + FMouseInPanel := False; end; FOldWndProc(Message); end; diff --git a/frontend/msProfilePanel.pas b/frontend/msProfilePanel.pas old mode 100644 new mode 100755 index 420ec37..d83f6ff --- a/frontend/msProfilePanel.pas +++ b/frontend/msProfilePanel.pas @@ -26,7 +26,7 @@ TProfilePanel = class(TPanel) function GetProfile: TProfile; procedure SetSelectCallback(callback: TNotifyEvent); procedure SetDeleteCallback(callback: TNotifyEvent); - procedure SetGame(i: integer); + procedure SetGame(i: Integer); procedure SetPath(path: string); private aProfile: TProfile; @@ -54,30 +54,27 @@ TProfilePanel = class(TPanel) implementation - -{******************************************************************************} +{ ****************************************************************************** } { TProfilePanel A GUI component for interacting with a profile. } -{******************************************************************************} +{ ****************************************************************************** } constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; GeneralIcons: TImageList; name: string); const GameItems = 'The Elder Scrolls V: Skyrim'#13#10 + - 'The Elder Scrolls IV: Oblivion'#13#10 + - 'Fallout: New Vegas'#13#10 + - 'Fallout 3'#13#10 + - 'Fallout 4'#13#10 + - 'Skyrim: Special Edition'; + 'The Elder Scrolls IV: Oblivion'#13#10 + 'Fallout: New Vegas'#13#10 + + 'Fallout 3'#13#10 + 'Fallout 4'#13#10 + 'Skyrim: Special Edition'#13#10 + + 'Skyrim: VR'#13#10 + 'Enderal'#13#10 + 'Enderal: Special Edition'; begin // set up panel inherited Create(AOwner); Parent := AOwner as TWinControl; - Width := (AOwner as TWinControl).ClientWidth; + width := (AOwner as TWinControl).ClientWidth; Height := 100; Left := 0; - Top := 0; + top := 0; ParentBackground := false; ParentColor := false; ParentDoubleBuffered := false; @@ -89,9 +86,9 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; aProfile := TProfile.Create(name); self.GameIcons := GameIcons; Selected := false; - ColorInvalid := $d8d8f0; - ColorValid := $d8f0d8; - ColorSelected := $f0e8d8; + ColorInvalid := $D8D8F0; + ColorValid := $D8F0D8; + ColorSelected := $F0E8D8; // create components GameImage := TImage.Create(self); @@ -106,10 +103,10 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up GameImage GameImage.Parent := self; - GameImage.Top := 2; + GameImage.top := 2; GameImage.Left := 2; GameImage.Height := 96; - GameImage.Width := 96; + GameImage.width := 96; GameImage.Cursor := crDefault; GameImage.Transparent := true; GameImage.Align := alCustom; @@ -117,7 +114,7 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up lblName lblName.Parent := self; - lblName.Top := 11; + lblName.top := 11; lblName.Left := 112; lblName.Caption := 'Name'; lblName.Align := alCustom; @@ -125,7 +122,7 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up lblGame lblGame.Parent := self; - lblGame.Top := 38; + lblGame.top := 38; lblGame.Left := 112; lblGame.Caption := 'Game'; lblGame.Align := alCustom; @@ -133,7 +130,7 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up lblPath lblPath.Parent := self; - lblPath.Top := 65; + lblPath.top := 65; lblPath.Left := 112; lblPath.Caption := 'Path'; lblPath.Align := alCustom; @@ -141,18 +138,18 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up edName edName.Parent := self; - edName.Top := 8; + edName.top := 8; edName.Left := 177; - edName.Width := 227; + edName.width := 227; edName.Text := name; edName.Align := alCustom; edName.Anchors := [akLeft, akTop]; // set up cbGame cbGame.Parent := self; - cbGame.Top := 35; + cbGame.top := 35; cbGame.Left := 177; - cbGame.Width := 227; + cbGame.width := 227; cbGame.Style := csDropDownList; cbGame.Items.Text := GameItems; cbGame.ItemIndex := 0; @@ -161,17 +158,17 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up edPath edPath.Parent := self; - edPath.Top := 62; + edPath.top := 62; edPath.Left := 177; - edPath.Width := 227; + edPath.width := 227; edPath.Align := alCustom; edPath.Anchors := [akLeft, akTop]; // set up btnBrowse btnBrowse.Parent := self; - btnBrowse.Top := 61; + btnBrowse.top := 61; btnBrowse.Left := 410; - btnBrowse.Width := 22; + btnBrowse.width := 22; btnBrowse.Height := 23; btnBrowse.Flat := true; btnBrowse.Transparent := true; @@ -181,9 +178,9 @@ constructor TProfilePanel.ICreate(AOwner: TComponent; GameIcons: TImageList; // set up btnDelete btnDelete.Parent := self; - btnDelete.Top := 4; + btnDelete.top := 4; btnDelete.Left := 410; - btnDelete.Width := 22; + btnDelete.width := 22; btnDelete.Height := 23; btnDelete.Flat := true; btnDelete.Transparent := true; @@ -226,9 +223,14 @@ destructor TProfilePanel.Destroy; { EVENT HANDLING } procedure TProfilePanel.ToggleSelect(Sender: TObject); begin - if Cursor = crHandPoint then begin - if Selected then Deselect else Select; - if Assigned(SelectCallback) then SelectCallback(self); + if Cursor = crHandPoint then + begin + if Selected then + Deselect + else + Select; + if Assigned(SelectCallback) then + SelectCallback(self); end; end; @@ -257,13 +259,15 @@ procedure TProfilePanel.Browse(Sender: TObject); procedure TProfilePanel.Delete(Sender: TObject); begin - if Assigned(DeleteCallback) then DeleteCallback(self); + if Assigned(DeleteCallback) then + DeleteCallback(self); end; procedure TProfilePanel.NameChanged(Sender: TObject); begin if FileNameValid(edName.Text) and - (not DirectoryExists(PathList.Values['ProgramPath'] + 'profiles\' + edName.Text)) then + (not DirectoryExists(PathList.Values['ProgramPath'] + 'profiles\' + + edName.Text)) then aProfile.Rename(edName.Text); end; @@ -286,13 +290,15 @@ procedure TProfilePanel.PathChanged(Sender: TObject); aProfile.gamePath := AppendIfMissing(edPath.Text, '\'); // reflect validity in the GUI - if GamePathValid(aProfile.gamePath, aProfile.gameMode) then begin + if GamePathValid(aProfile.gamePath, aProfile.gamemode) then + begin Valid := true; Cursor := crHandPoint; GameImage.Cursor := crHandPoint; Color := ColorValid; end - else begin + else + begin Valid := false; Cursor := crDefault; GameImage.Cursor := crDefault; diff --git a/frontend/msSettingsManager.dfm b/frontend/msSettingsManager.dfm old mode 100644 new mode 100755 index 2e8dadc..f7af668 --- a/frontend/msSettingsManager.dfm +++ b/frontend/msSettingsManager.dfm @@ -352,7 +352,7 @@ object SettingsManager: TSettingsManager Left = 752 Top = 504 Bitmap = { - 494C010104000800000111001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010104000800040011001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000440000002200000001002000000000002024 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -664,7 +664,7 @@ object SettingsManager: TSettingsManager Left = 824 Top = 504 Bitmap = { - 494C0101050008004C0110001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010105000800040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000002000000001002000000000000020 00000000000000000000000000000000000000000000D1D1D12E4F4F4FB01B1B 1BE42B2B2BD48282827DF7F7F708000000000000000000000000000000000000 diff --git a/frontend/msSettingsManager.pas b/frontend/msSettingsManager.pas old mode 100644 new mode 100755 index 112e076..9e0624e --- a/frontend/msSettingsManager.pas +++ b/frontend/msSettingsManager.pas @@ -11,74 +11,75 @@ interface // mte units mteHelpers, mteLogger, mteProgressForm, mteBase, RttiTranslation, // ms units - msCore, msConfiguration, msPluginSelectionForm, msConflictForm, msThreads; + msCore, msConfiguration, msPluginSelectionForm, msConflictForm, msThreads, + System.ImageList; type TSettingsManager = class(TForm) [FormPrefix('msSet')] - Splitter: TSplitter; - [FormSection('Settings')] - pnlEntries: TPanel; - lvSettings: TListView; - [FormSection('Settings Popup Menu')] - SettingsPopupMenu: TPopupMenu; - NewSettingItem: TMenuItem; - DeleteSettingItem: TMenuItem; - CloneSettingItem: TMenuItem; - CombineSettingsItem: TMenuItem; - [FormSection('Details')] - pnlDetails: TPanel; - lblName: TLabel; - edName: TEdit; - lblColor: TLabel; - cbColor: TColorBox; - lblHash: TLabel; - edHash: TEdit; - lblDescription: TLabel; - meDescription: TMemo; - btnSave: TButton; - btnDiscard: TButton; - [FormSection('Tree')] - lblTree: TLabel; - edSearch: TEdit; - tvRecords: TTreeView; - StateImages: TImageList; - FlagIcons: TImageList; - [FormSection('TreePopupMenu')] - TreePopupMenu: TPopupMenu; - LinkItem: TMenuItem; - PruneItem: TMenuItem; - BuildItem: TMenuItem; - ToggleItem: TMenuItem; - AddItem: TMenuItem; - AddAllRecordsItem: TMenuItem; - BuildFromPluginsItem: TMenuItem; - AutosetItem: TMenuItem; - SelectSimilarNodesItem: TMenuItem; - ToggleNodesItem: TMenuItem; - PreserveDeletionsItem: TMenuItem; - OverrideDeletionsItem: TMenuItem; - SingleEntityItem: TMenuItem; - ForceValueItem: TMenuItem; - ChainNodesItem: TMenuItem; - LinkNodeToItem: TMenuItem; - UnlinkNodeItem: TMenuItem; - AutoPruneItem: TMenuItem; - PruneNodesItem: TMenuItem; + Splitter: TSplitter; + [FormSection('Settings')] + pnlEntries: TPanel; + lvSettings: TListView; + [FormSection('Settings Popup Menu')] + SettingsPopupMenu: TPopupMenu; + NewSettingItem: TMenuItem; + DeleteSettingItem: TMenuItem; + CloneSettingItem: TMenuItem; + CombineSettingsItem: TMenuItem; + [FormSection('Details')] + pnlDetails: TPanel; + lblName: TLabel; + edName: TEdit; + lblColor: TLabel; + cbColor: TColorBox; + lblHash: TLabel; + edHash: TEdit; + lblDescription: TLabel; + meDescription: TMemo; + btnSave: TButton; + btnDiscard: TButton; + [FormSection('Tree')] + lblTree: TLabel; + edSearch: TEdit; + tvRecords: TTreeView; + StateImages: TImageList; + FlagIcons: TImageList; + [FormSection('TreePopupMenu')] + TreePopupMenu: TPopupMenu; + LinkItem: TMenuItem; + PruneItem: TMenuItem; + BuildItem: TMenuItem; + ToggleItem: TMenuItem; + AddItem: TMenuItem; + AddAllRecordsItem: TMenuItem; + BuildFromPluginsItem: TMenuItem; + AutosetItem: TMenuItem; + SelectSimilarNodesItem: TMenuItem; + ToggleNodesItem: TMenuItem; + PreserveDeletionsItem: TMenuItem; + OverrideDeletionsItem: TMenuItem; + SingleEntityItem: TMenuItem; + ForceValueItem: TMenuItem; + ChainNodesItem: TMenuItem; + LinkNodeToItem: TMenuItem; + UnlinkNodeItem: TMenuItem; + AutoPruneItem: TMenuItem; + PruneNodesItem: TMenuItem; // TREE METHODS procedure DrawFlag(Canvas: TCanvas; var x, y: Integer; id: Integer); - procedure tvRecordsCustomDrawItem(Sender: TCustomTreeView; - Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure tvRecordsCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; + State: TCustomDrawState; var DefaultDraw: Boolean); procedure tvRecordsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure tvRecordsMouseDown(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); + Shift: TShiftState; x, y: Integer); procedure tvRecordsCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean); procedure tvRecordsKeyPress(Sender: TObject; var Key: Char); - procedure tvRecordsMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + procedure tvRecordsMouseMove(Sender: TObject; Shift: TShiftState; + x, y: Integer); procedure LinkNodeItemClick(Sender: TObject); procedure TreePopupMenuPopup(Sender: TObject); procedure AddItemClick(Sender: TObject); @@ -94,11 +95,11 @@ TSettingsManager = class(TForm) procedure UnlinkNodeItemClick(Sender: TObject); procedure LinkNodes(node1, node2: TTreeNode); procedure ChainNodesItemClick(Sender: TObject); - function DumpElement(node: TTreeNode): ISuperObject; + function DumpElement(Node: TTreeNode): ISuperObject; procedure DumpTree; procedure DeleteNodes(var aList: TList); - procedure DeleteChildren(node: TTreeNode); - function CanPruneRecords: boolean; + procedure DeleteChildren(Node: TTreeNode); + function CanPruneRecords: Boolean; procedure AutoPrune; procedure AutoPruneItemClick(Sender: TObject); procedure Autoset(parentNode: TTreeNode); @@ -158,7 +159,8 @@ implementation procedure TSettingsManager.edSearchClick(Sender: TObject); begin // On search field click set bSearchActive to false - if (bSearchActive) and (MessageDlg('Start new search?', mtConfirmation, [mbyes, mbno], 0) = mrYes) then + if (bSearchActive) and (MessageDlg('Start new search?', mtConfirmation, + [mbyes, mbno], 0) = mrYes) then bSearchActive := False; // Empties the search field when clicked and a search is active if not bSearchActive then @@ -168,7 +170,7 @@ procedure TSettingsManager.edSearchClick(Sender: TObject); procedure TSettingsManager.edSearchKeyPress(Sender: TObject; var Key: Char); var i: Integer; - node: TTreeNode; + Node: TTreeNode; begin // Exit if no records are available if tvRecords.Items.Count = 0 then @@ -177,21 +179,24 @@ procedure TSettingsManager.edSearchKeyPress(Sender: TObject; var Key: Char); if Key <> #13 then exit; // Tell the user to enter search term - if (edSearch.Text = 'Search...') or (edSearch.Text = '') then begin + if (edSearch.Text = 'Search...') or (edSearch.Text = '') then + begin ShowMessage('Please enter a search term!'); exit; end; // Do a search when bSearchActive is false - if not bSearchActive then begin + if not bSearchActive then + begin // Clear old results slSearchResults.Clear; - for i := 0 to Pred(tvRecords.Items.Count) do begin - node := tvRecords.Items[i]; + for i := 0 to Pred(tvRecords.Items.Count) do + begin + Node := tvRecords.Items[i]; // Check if search-string is contained in node-text - if ContainsText(node.Text, edSearch.Text) then - slSearchResults.AddObject(node.Text,TObject(node)); + if ContainsText(Node.Text, edSearch.Text) then + slSearchResults.AddObject(Node.Text, TObject(Node)); end; - bSearchActive := True; + bSearchActive := true; // Show result NextSearchResult; Key := #0; @@ -200,10 +205,11 @@ procedure TSettingsManager.edSearchKeyPress(Sender: TObject; var Key: Char); procedure TSettingsManager.NextSearchResult(); var - node: TTreeNode; + Node: TTreeNode; begin // Notify the user of an unsuccessful search and reset search - if slSearchResults.Count = 0 then begin + if slSearchResults.Count = 0 then + begin ShowMessage('No results could be found!'); ResetSearch; exit; @@ -214,18 +220,20 @@ procedure TSettingsManager.NextSearchResult(); exit; // Increase the SearchIndex - Searchindex := Searchindex + 1; + SearchIndex := SearchIndex + 1; // Display the amount of results and the current position in the search field - edSearch.Text := ('Result: ' + InttoStr(Searchindex+1) + ' / ' + InttoStr(slSearchResults.Count+1)); + edSearch.Text := ('Result: ' + InttoStr(SearchIndex + 1) + ' / ' + + InttoStr(slSearchResults.Count + 1)); // Go back to the beginning if end is reached - if Searchindex > Pred(slSearchResults.Count) then begin - Searchindex := 0; + if SearchIndex > Pred(slSearchResults.Count) then + begin + SearchIndex := 0; end; // select the node and set focus - node := TTreeNode(slSearchResults.Objects[Searchindex]); + Node := TTreeNode(slSearchResults.Objects[SearchIndex]); tvRecords.SetFocus; - node.Selected := true; - node.Focused := true; + Node.Selected := true; + Node.Focused := true; end; procedure TSettingsManager.ResetSearch(); @@ -235,7 +243,8 @@ procedure TSettingsManager.ResetSearch(); end; { Tree methods } -procedure TSettingsManager.DrawFlag(Canvas: TCanvas; var x, y: Integer; id: Integer); +procedure TSettingsManager.DrawFlag(Canvas: TCanvas; var x, y: Integer; + id: Integer); var icon: TIcon; begin @@ -259,8 +268,9 @@ procedure TSettingsManager.tvRecordsCustomDrawItem(Sender: TCustomTreeView; R: TRect; x, y: Integer; begin - if Assigned(node.Data) then begin - e := TElementData(node.Data); + if Assigned(Node.Data) then + begin + e := TElementData(Node.Data); R := Node.DisplayRect(true); x := R.Right + 6; y := R.Top; @@ -288,7 +298,8 @@ procedure TSettingsManager.tvRecordsKeyDown(Sender: TObject; var Key: Word; var i: Integer; begin - if (Key = VK_SPACE) then begin + if (Key = VK_SPACE) then + begin for i := 0 to Pred(tvRecords.SelectionCount) do CheckboxManager(tvRecords.Selections[i]); // repaint tree view in case a single entity flag was unset @@ -300,24 +311,26 @@ procedure TSettingsManager.tvRecordsKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then NextSearchResult; - Key := #0; + Key := #0; if Key = ' ' then Key := #0; end; -procedure TSettingsManager.tvRecordsMouseDown(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); +procedure TSettingsManager.tvRecordsMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; x, y: Integer); var HT: THitTests; - node: TTreeNode; + Node: TTreeNode; begin // this allows right clicking to be used to select nodes - if Button = mbRight then begin - node := tvRecords.GetNodeAt(X, Y); - if Assigned(node) and not node.Selected then begin - tvRecords.ClearSelection(false); - tvRecords.Select(node); + if Button = mbRight then + begin + Node := tvRecords.GetNodeAt(x, y); + if Assigned(Node) and not Node.Selected then + begin + tvRecords.ClearSelection(False); + tvRecords.Select(Node); end; end; @@ -330,36 +343,37 @@ procedure TSettingsManager.tvRecordsMouseDown(Sender: TObject; Button: TMouseBut // seconds if Now - LastCollapseTime < collapseHitTestDelay then exit; - HT := tvRecords.GetHitTestInfoAt(X, Y); + HT := tvRecords.GetHitTestInfoAt(x, y); if (HT - [htOnStateIcon] <> HT) then - CheckBoxManager(tvRecords.Selected); + CheckboxManager(tvRecords.Selected); // repaint tree view in case a single entity flag was unset tvRecords.Repaint; end; procedure TSettingsManager.tvRecordsMouseMove(Sender: TObject; - Shift: TShiftState; X, Y: Integer); + Shift: TShiftState; x, y: Integer); var - node: TTreeNode; + Node: TTreeNode; e: TElementData; sHint: string; begin // hide hint and exit if shift is down - if (ssShift in Shift) then begin + if (ssShift in Shift) then + begin Application.HideHint; exit; end; // draw hint if on a node - node := tvRecords.GetNodeAt(X, Y); - if not Assigned(node) then + Node := tvRecords.GetNodeAt(x, y); + if not Assigned(Node) then exit; - e := TElementData(node.Data); + e := TElementData(Node.Data); if not Assigned(e) then exit; // get hint - sHint := node.Text + #13#10'Type: '+stToString(e.smashType); + sHint := Node.Text + #13#10'Type: ' + stToString(e.smashType); if e.singleEntity then sHint := sHint + #13#10'Treated as a single entity'; if e.forceValue then @@ -367,26 +381,29 @@ procedure TSettingsManager.tvRecordsMouseMove(Sender: TObject; if e.preserveDeletions then sHint := sHint + #13#10'Preserving deletions'; if e.linkTo <> '' then - sHint := sHint + #13#10'Linked to: '+e.linkTo; + sHint := sHint + #13#10'Linked to: ' + e.linkTo; if e.linkFrom <> '' then - sHint := sHint + #13#10'Linked from: '+e.linkFrom; + sHint := sHint + #13#10'Linked from: ' + e.linkFrom; // display hint if it isn't the last hint we displayed - if sHint <> lastHint then begin + if sHint <> lastHint then + begin tvRecords.Hint := sHint; Application.ActivateHint(Mouse.CursorPos); lastHint := sHint; end; end; -function GetSiblingNode(node: TTreeNode; text: string): TTreeNode; +function GetSiblingNode(Node: TTreeNode; Text: string): TTreeNode; var aNode: TTreeNode; begin Result := nil; - aNode := node.Parent.getFirstChild; - while Assigned(aNode) do begin - if aNode.Text = text then begin + aNode := Node.Parent.getFirstChild; + while Assigned(aNode) do + begin + if aNode.Text = Text then + begin Result := aNode; exit; end; @@ -394,23 +411,27 @@ function GetSiblingNode(node: TTreeNode; text: string): TTreeNode; end; end; -procedure UnlinkNode(node: TTreeNode; bTo, bFrom: boolean); +procedure UnlinkNode(Node: TTreeNode; bTo, bFrom: Boolean); var linkedNode: TTreeNode; e, le: TElementData; begin - e := TElementData(node.Data); - if bTo and (e.linkTo <> '') then begin - linkedNode := GetSiblingNode(node, e.linkTo); - if Assigned(linkedNode) then begin + e := TElementData(Node.Data); + if bTo and (e.linkTo <> '') then + begin + linkedNode := GetSiblingNode(Node, e.linkTo); + if Assigned(linkedNode) then + begin le := TElementData(linkedNode.Data); le.linkFrom := ''; end; e.linkTo := ''; end; - if bFrom and (e.linkFrom <> '') then begin - linkedNode := GetSiblingNode(node, e.linkFrom); - if Assigned(linkedNode) then begin + if bFrom and (e.linkFrom <> '') then + begin + linkedNode := GetSiblingNode(Node, e.linkFrom); + if Assigned(linkedNode) then + begin le := TElementData(linkedNode.Data); le.linkTo := ''; end; @@ -421,12 +442,13 @@ procedure UnlinkNode(node: TTreeNode; bTo, bFrom: boolean); procedure TSettingsManager.UnlinkNodeItemClick(Sender: TObject); var i: Integer; - node: TTreeNode; + Node: TTreeNode; begin // unset link element data attribute for each selected node - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - UnlinkNode(node, true, true); + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + UnlinkNode(Node, true, true); end; // update gui @@ -442,8 +464,8 @@ procedure TSettingsManager.LinkNodes(node1, node2: TTreeNode); exit; // unlink nodes as necessary - UnlinkNode(node1, true, false); - UnlinkNode(node2, false, true); + UnlinkNode(node1, true, False); + UnlinkNode(node2, False, true); // link nodes e := TElementData(node1.Data); @@ -455,18 +477,19 @@ procedure TSettingsManager.LinkNodes(node1, node2: TTreeNode); procedure TSettingsManager.ChainNodesItemClick(Sender: TObject); var i: Integer; - prevNode, node: TTreeNode; + prevNode, Node: TTreeNode; begin - node := tvRecords.Selections[0]; - for i := 1 to Pred(tvRecords.SelectionCount) do begin - prevNode := node; - node := tvRecords.Selections[i]; - LinkNodes(prevNode, node); + Node := tvRecords.Selections[0]; + for i := 1 to Pred(tvRecords.SelectionCount) do + begin + prevNode := Node; + Node := tvRecords.Selections[i]; + LinkNodes(prevNode, Node); end; // link last node to first node - prevNode := node; - node := tvRecords.Selections[0]; - LinkNodes(prevNode, node); + prevNode := Node; + Node := tvRecords.Selections[0]; + LinkNodes(prevNode, Node); // repaint tvRecords.Repaint; @@ -474,20 +497,20 @@ procedure TSettingsManager.ChainNodesItemClick(Sender: TObject); procedure TSettingsManager.LinkNodeItemClick(Sender: TObject); var - item: TMenuItem; + Item: TMenuItem; targetNodeText: string; - node, targetNode: TTreeNode; + Node, targetNode: TTreeNode; begin // get the target node to link to from the menu item clicked - node := tvRecords.Selections[0]; - item := TMenuItem(Sender); - targetNodeText := StringReplace(item.Caption, '&', '', [rfReplaceAll]); - targetNode := GetSiblingNode(node, targetNodeText); + Node := tvRecords.Selections[0]; + Item := TMenuItem(Sender); + targetNodeText := StringReplace(Item.Caption, '&', '', [rfReplaceAll]); + targetNode := GetSiblingNode(Node, targetNodeText); if not Assigned(targetNode) then exit; // link the nodes - LinkNodes(node, targetNode); + LinkNodes(Node, targetNode); // update gui tvRecords.Repaint; @@ -496,9 +519,9 @@ procedure TSettingsManager.LinkNodeItemClick(Sender: TObject); procedure TSettingsManager.TreePopupMenuPopup(Sender: TObject); var bHasSelection, bTreeSelected, bHasMultiSelection, bSubrecordSelected, - bHasChildren, bRecordsSelected, bSomeUnChecked, bIsContainer: boolean; + bHasChildren, bRecordsSelected, bSomeUnChecked, bIsContainer: Boolean; i: Integer; - node: TTreeNode; + Node: TTreeNode; MenuItem: TMenuItem; begin // clear link node submenu @@ -506,20 +529,23 @@ procedure TSettingsManager.TreePopupMenuPopup(Sender: TObject); // get selection booleans bHasSelection := tvRecords.SelectionCount > 0; - bTreeSelected := (tvRecords.SelectionCount = 1) - and (tvRecords.Selections[0].Level = 0); + bTreeSelected := (tvRecords.SelectionCount = 1) and + (tvRecords.Selections[0].Level = 0); bHasMultiSelection := tvRecords.SelectionCount > 1; - bSubrecordSelected := (tvRecords.SelectionCount = 1) - and (tvRecords.Selections[0].Level > 1); + bSubrecordSelected := (tvRecords.SelectionCount = 1) and + (tvRecords.Selections[0].Level > 1); // get multiselection booleans - bHasChildren := false; + bHasChildren := False; bRecordsSelected := true; - bSomeUnChecked := false; - for i := 0 to Pred(tvRecords.SelectionCount) do begin + bSomeUnChecked := False; + for i := 0 to Pred(tvRecords.SelectionCount) do + begin bHasChildren := bHasChildren or tvRecords.Selections[i].HasChildren; - bRecordsSelected := bRecordsSelected and (tvRecords.Selections[i].Level = 1); - bSomeUnChecked := bSomeUnChecked or (tvRecords.Selections[i].StateIndex = csUnChecked); + bRecordsSelected := bRecordsSelected and + (tvRecords.Selections[i].Level = 1); + bSomeUnChecked := bSomeUnChecked or + (tvRecords.Selections[i].StateIndex = csUnChecked); end; // enable/disable menu items @@ -531,44 +557,49 @@ procedure TSettingsManager.TreePopupMenuPopup(Sender: TObject); SingleEntityItem.Enabled := bIsContainer and not bRecordsSelected; ForceValueItem.Enabled := bHasSelection and bRecordsSelected; AutoPruneItem.Enabled := CanPruneRecords; - PruneNodesItem.Enabled := bHasSelection and bRecordsSelected and bSomeUnChecked; + PruneNodesItem.Enabled := bHasSelection and bRecordsSelected and + bSomeUnChecked; UnlinkNodeItem.Enabled := bHasSelection and not bTreeSelected; ChainNodesItem.Enabled := bHasMultiSelection and not bTreeSelected; LinkNodeToItem.Enabled := bSubrecordSelected and not bTreeSelected; // build LinkNodeToItem submenu - if bSubrecordSelected then begin - node := tvRecords.Selected.Parent.getFirstChild; - while Assigned(node) do begin - if node = tvRecords.Selections[0] then begin - node := node.getNextSibling; + if bSubrecordSelected then + begin + Node := tvRecords.Selected.Parent.getFirstChild; + while Assigned(Node) do + begin + if Node = tvRecords.Selections[0] then + begin + Node := Node.getNextSibling; continue; end; MenuItem := TMenuItem.Create(LinkNodeToItem); - MenuItem.Caption := node.Text; + MenuItem.Caption := Node.Text; MenuItem.OnClick := LinkNodeItemClick; LinkNodeToItem.Add(MenuItem); - node := node.getNextSibling; + Node := Node.getNextSibling; end; end; end; procedure TSettingsManager.AddItemClick(Sender: TObject); var - item: TMenuItem; + Item: TMenuItem; groupName: string; recObj: ISuperObject; begin - item := (Sender as TMenuItem); - groupName := StringReplace(item.Caption, '&', '', [rfReplaceAll]); + Item := (Sender as TMenuItem); + groupName := StringReplace(Item.Caption, '&', '', [rfReplaceAll]); recObj := GetRecordObj(currentSetting.tree, groupName); // build record def if it isn't already present - if not Assigned(recObj) then begin + if not Assigned(recObj) then + begin if not BuildRecordDef(groupName, recObj) then exit; currentSetting.tree.A['records'].Add(recObj); - LoadElement(tvRecords, tvRecords.Items[0], recObj, false); + LoadElement(tvRecords, tvRecords.Items[0], recObj, False); end; // update gui @@ -591,14 +622,15 @@ procedure TSettingsManager.BuildFromPluginsItemClick(Sender: TObject); // build list of plugin filenames slPlugins := TStringList.Create; slSelection := TStringList.Create; - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); slPlugins.Add(plugin.filename); end; // prompt user for plugin selectcion selectionForm := TMiniPluginSelectionForm.Create(self); - selectionForm.pluginsList := slPlugins; + selectionForm.PluginsList := slPlugins; selectionForm.selectionList := slSelection; mr := selectionForm.ShowModal; if mr = mrOK then @@ -613,7 +645,7 @@ procedure TSettingsManager.BuildFromPluginsItemClick(Sender: TObject); procedure TSettingsManager.SelectSimilarNodesItemClick(Sender: TObject); var i, index: Integer; - node: TTreeNode; + Node: TTreeNode; reqSmashType, currentSmashType: TSmashtype; slSelection: TStringList; begin @@ -622,24 +654,27 @@ procedure TSettingsManager.SelectSimilarNodesItemClick(Sender: TObject); try // Add "Text" and "SmashType" of selected nodes to StringList // Note: "SmashType" has to be converted to be used in a StringList - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - reqSmashType := TElementData(node.Data).smashType; + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + reqSmashType := TElementData(Node.Data).smashType; // "SmashType" converted into TObject - slSelection.AddObject(node.Text, TObject(reqSmashType)); + slSelection.AddObject(Node.Text, TObject(reqSmashType)); end; // Go through all nodes and check if their "Text" is in StringList - for i := 0 to Pred(tvRecords.Items.Count) do begin - node := tvRecords.Items[i]; - currentSmashType := TElementData(node.Data).smashType; - index := slSelection.IndexOf(node.Text); + for i := 0 to Pred(tvRecords.Items.Count) do + begin + Node := tvRecords.Items[i]; + currentSmashType := TElementData(Node.Data).smashType; + index := slSelection.IndexOf(Node.Text); // If a "Text" is found, get associated "SmashType" from StringList - if (index > -1) then begin + if (index > -1) then + begin // Convert "SmashType" back to TSmashType - reqSmashType := TSmashType(slSelection.Objects[index]); - // Check if node's and saved "SmashType" match and if node is selected - if (currentSmashType = reqSmashType) and not node.Selected then - tvRecords.Select(node, [ssCtrl]); + reqSmashType := TSmashtype(slSelection.Objects[index]); + // Check if node's and saved "SmashType" match and if node is selected + if (currentSmashType = reqSmashType) and not Node.Selected then + tvRecords.Select(Node, [ssCtrl]); end; end; finally @@ -659,14 +694,15 @@ procedure TSettingsManager.ToggleNodesItemClick(Sender: TObject); procedure TSettingsManager.PreserveDeletionsItemClick(Sender: TObject); var i: Integer; - node: TTreeNode; + Node: TTreeNode; e: TElementData; begin - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - if not node.hasChildren then + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + if not Node.HasChildren then continue; - e := TElementData(node.Data); + e := TElementData(Node.Data); e.preserveDeletions := not e.preserveDeletions; end; tvRecords.Repaint; @@ -675,14 +711,15 @@ procedure TSettingsManager.PreserveDeletionsItemClick(Sender: TObject); procedure TSettingsManager.OverrideDeletionsItemClick(Sender: TObject); var i: Integer; - node: TTreeNode; + Node: TTreeNode; e: TElementData; begin - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - if not node.hasChildren then + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + if not Node.HasChildren then continue; - e := TElementData(node.Data); + e := TElementData(Node.Data); e.overrideDeletions := not e.overrideDeletions; end; tvRecords.Repaint; @@ -691,27 +728,29 @@ procedure TSettingsManager.OverrideDeletionsItemClick(Sender: TObject); procedure TSettingsManager.SingleEntityItemClick(Sender: TObject); var i, expectedLevel: Integer; - node: TTreeNode; + Node: TTreeNode; e: TElementData; begin expectedLevel := 0; - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; if expectedLevel = 0 then - expectedLevel := node.Level; - if not node.hasChildren then + expectedLevel := Node.Level; + if not Node.HasChildren then continue; - if expectedLevel <> node.Level then + if expectedLevel <> Node.Level then continue; - e := TElementData(node.Data); + e := TElementData(Node.Data); e.singleEntity := not e.singleEntity; if e.singleEntity then - node.StateIndex := csPartiallyChecked - else begin - SetChildren(node, csChecked); - node.StateIndex := csChecked; + Node.StateIndex := csPartiallyChecked + else + begin + SetChildren(Node, csChecked); + Node.StateIndex := csChecked; end; - UpdateParent(node.Parent); + UpdateParent(Node.Parent); end; tvRecords.Repaint; end; @@ -719,12 +758,13 @@ procedure TSettingsManager.SingleEntityItemClick(Sender: TObject); procedure TSettingsManager.ForceValueItemClick(Sender: TObject); var i: Integer; - node: TTreeNode; + Node: TTreeNode; e: TElementData; begin - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - e := TElementData(node.Data); + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + e := TElementData(Node.Data); e.forceValue := not e.forceValue; end; tvRecords.Repaint; @@ -737,97 +777,96 @@ procedure TSettingsManager.AutoPruneItemClick(Sender: TObject); procedure TSettingsManager.Autoset(parentNode: TTreeNode); const - disabledElements: array[0..2] of string = ( - 'Record Header', - 'Unused', - 'Unknown' - ); - disabledRecords: array[0..5] of string = ( - 'DOBJ', - 'LCTN', - 'IDLE', - 'NAVM', - 'NAVI', - 'RACE' - ); + disabledElements: array [0 .. 2] of string = ('Record Header', 'Unused', + 'Unknown'); + disabledRecords: array [0 .. 4] of string = ('DOBJ', 'LCTN', 'IDLE', 'NAVM', + 'NAVI'); var i: Integer; - node, nextNode: TTreeNode; + Node, nextNode: TTreeNode; e: TElementData; - bParentIsRoot, bParentIsRecord: boolean; + bParentIsRoot, bParentIsRecord: Boolean; begin // get parent booleans bParentIsRoot := parentNode.Level = 0; bParentIsRecord := parentNode.Level = 1; // loop through children - node := parentNode.getFirstChild; - while Assigned(node) do begin - node.StateIndex := csChecked; - e := TElementData(node.Data); - - if Assigned(e) then begin + Node := parentNode.getFirstChild; + while Assigned(Node) do + begin + Node.StateIndex := csChecked; + e := TElementData(Node.Data); + + if Assigned(e) then + begin // if parent is root, preserve deletions if bParentIsRoot then e.preserveDeletions := true; // if parent is record, perform case statement on type - if bParentIsRecord then begin + if bParentIsRecord then + begin case Ord(e.smashType) of - Ord(stStruct): begin - e.singleEntity := true; - node.StateIndex := csPartiallyChecked; - end; - Ord(stUnsortedStructArray): begin - e.singleEntity := true; - e.preserveDeletions := true; - node.StateIndex := csPartiallyChecked; - end; - Ord(stSortedArray), - Ord(stSortedStructArray): + Ord(stStruct): + begin + e.singleEntity := true; + Node.StateIndex := csPartiallyChecked; + end; + Ord(stUnsortedStructArray): + begin + e.singleEntity := true; + e.preserveDeletions := true; + Node.StateIndex := csPartiallyChecked; + end; + Ord(stSortedArray), Ord(stSortedStructArray): e.preserveDeletions := true; Ord(stByteArray): - node.StateIndex := csUnChecked; + Node.StateIndex := csUnChecked; end; end; end; // if we're not on the root, disable elements that match // a string in the disableElements array - if not bParentIsRoot then begin + if not bParentIsRoot then + begin for i := Low(disabledElements) to High(disabledElements) do - if Pos(disabledElements[i], node.Text) > 0 then begin - node.StateIndex := csUnChecked; - e.singleEntity := false; - e.preserveDeletions := false; + if Pos(disabledElements[i], Node.Text) > 0 then + begin + Node.StateIndex := csUnChecked; + e.singleEntity := False; + e.preserveDeletions := False; end; end // else disable records that match a string in the // disabledRecords array - else begin + else + begin for i := Low(disabledRecords) to High(disabledRecords) do - if Pos(disabledRecords[i], node.Text) = 1 then begin - node.StateIndex := csUnChecked; - e.singleEntity := false; - e.preserveDeletions := false; + if Pos(disabledRecords[i], Node.Text) = 1 then + begin + Node.StateIndex := csUnChecked; + e.singleEntity := False; + e.preserveDeletions := False; end; end; // disable count elements - if bParentIsRecord then begin - nextNode := node.getNextSibling; - if Assigned(nextNode) - and (TElementData(nextNode.Data).smashType in stArrays) - and (Pos('Count', node.Text) > 0) then - node.StateIndex := csUnChecked; + if bParentIsRecord then + begin + nextNode := Node.getNextSibling; + if Assigned(nextNode) and (TElementData(nextNode.Data).smashType + in stArrays) and (Pos('Count', Node.Text) > 0) then + Node.StateIndex := csUnChecked; end; // recurse - if (node.HasChildren) and (node.StateIndex <> csUnChecked) then - Autoset(node); + if (Node.HasChildren) and (Node.StateIndex <> csUnChecked) then + Autoset(Node); // go to next sibling - node := node.getNextSibling; + Node := Node.getNextSibling; end; // update parent node @@ -845,9 +884,10 @@ procedure TSettingsManager.AutosetItemClick(Sender: TObject); begin // confirm with the user that this is what they // really want to do - mr := MessageDlg(msg, mtConfirmation, [mbYes, mbNo], 0); - if mr = mrYes then begin - Enabled := false; + mr := MessageDlg(msg, mtConfirmation, [mbyes, mbno], 0); + if mr = mrYes then + begin + Enabled := False; Autoset(tvRecords.Items[0]); Enabled := true; end; @@ -856,21 +896,22 @@ procedure TSettingsManager.AutosetItemClick(Sender: TObject); procedure TSettingsManager.PruneNodesItemClick(Sender: TObject); var i: Integer; - node: TTreeNode; + Node: TTreeNode; nodesToPrune: TList; begin nodesToPrune := TList.Create; - for i := 0 to Pred(tvRecords.SelectionCount) do begin - node := tvRecords.Selections[i]; - if (node.Level = 1) and (node.StateIndex = csUnChecked) then - nodesToPrune.Add(node); + for i := 0 to Pred(tvRecords.SelectionCount) do + begin + Node := tvRecords.Selections[i]; + if (Node.Level = 1) and (Node.StateIndex = csUnChecked) then + nodesToPrune.Add(Node); end; DeleteNodes(nodesToPrune); nodesToPrune.Free; UpdateParent(tvRecords.Items[0].getFirstChild); end; -function TSettingsManager.DumpElement(node: TTreeNode): ISuperObject; +function TSettingsManager.DumpElement(Node: TTreeNode): ISuperObject; var obj: ISuperObject; child: TTreeNode; @@ -879,35 +920,37 @@ function TSettingsManager.DumpElement(node: TTreeNode): ISuperObject; begin obj := SO; // get name - obj.S['n'] := node.Text; + obj.S['n'] := Node.Text; // get data properties - e := TElementData(node.Data); + e := TElementData(Node.Data); if (e.priority > 0) then - obj.I['r'] := e.priority; - if (node.StateIndex <> csUnChecked) then - obj.I['p'] := 1; + obj.i['r'] := e.priority; + if (Node.StateIndex <> csUnChecked) then + obj.i['p'] := 1; if (e.preserveDeletions) then - obj.I['d'] := 1; + obj.i['d'] := 1; if (e.overrideDeletions) then - obj.I['o'] := 1; + obj.i['o'] := 1; if (e.singleEntity) then - obj.I['s'] := 1; + obj.i['s'] := 1; if (e.forceValue) then - obj.I['f'] := 1; + obj.i['f'] := 1; if (e.smashType <> stUnknown) then - obj.I['t'] := Ord(e.smashType); + obj.i['t'] := Ord(e.smashType); if (e.linkTo <> '') then obj.S['lt'] := e.linkTo; if (e.linkFrom <> '') then obj.S['lf'] := e.linkFrom; // exit if no children to dump - if node.hasChildren then begin + if Node.HasChildren then + begin // dump subrecords (children) obj.O['c'] := SA([]); - child := node.getFirstChild; + child := Node.getFirstChild; i := 0; - while Assigned(child) do begin + while Assigned(child) do + begin obj.A['c'].O[i] := DumpElement(child); child := child.getNextSibling; Inc(i); @@ -921,19 +964,20 @@ procedure TSettingsManager.DumpTree; var i: Integer; obj: ISuperObject; - node, rootNode: TTreeNode; + Node, rootNode: TTreeNode; begin obj := SO; obj.O['records'] := SA([]); rootNode := tvRecords.Items[0]; // loop through records - node := rootNode.getFirstChild; + Node := rootNode.getFirstChild; i := 0; - while Assigned(node) do begin - obj.A['records'].O[i] := DumpElement(node); + while Assigned(Node) do + begin + obj.A['records'].O[i] := DumpElement(Node); Inc(i); - node := node.getNextSibling; + Node := Node.getNextSibling; end; currentSetting.tree := obj; @@ -950,26 +994,28 @@ procedure TSettingsManager.edNameChange(Sender: TObject); procedure TSettingsManager.DeleteNodes(var aList: TList); var i: Integer; - node: TTreeNode; + Node: TTreeNode; begin // delete nodes in reverse order - for i := Pred(aList.Count) downto 0 do begin - node := TTreeNode(aList[i]); - if node.HasChildren then - DeleteChildren(node); - tvRecords.Items.Delete(node); + for i := Pred(aList.Count) downto 0 do + begin + Node := TTreeNode(aList[i]); + if Node.HasChildren then + DeleteChildren(Node); + tvRecords.Items.Delete(Node); end; end; -procedure TSettingsManager.DeleteChildren(node: TTreeNode); +procedure TSettingsManager.DeleteChildren(Node: TTreeNode); var nodesToDelete: TList; child: TTreeNode; begin nodesToDelete := TList.Create; - child := node.getFirstChild; + child := Node.getFirstChild; // get nodes to prune - while Assigned(child) do begin + while Assigned(child) do + begin nodesToDelete.Add(child); child := child.getNextSibling; end; @@ -982,18 +1028,20 @@ procedure TSettingsManager.AutoPrune; var mr: Integer; nodesToPrune: TList; - node: TTreeNode; + Node: TTreeNode; begin - mr := MessageDlg('Your setting tree has records that can be pruned. '+ - 'Would you like to prune them?', mtConfirmation, [mbYes, mbNo], 0); - if mr = mrYes then begin + mr := MessageDlg('Your setting tree has records that can be pruned. ' + + 'Would you like to prune them?', mtConfirmation, [mbyes, mbno], 0); + if mr = mrYes then + begin nodesToPrune := TList.Create; - node := tvRecords.Items[0].getFirstChild; + Node := tvRecords.Items[0].getFirstChild; // get nodes to prune - while Assigned(node) do begin - if node.StateIndex = csUnChecked then - nodesToPrune.Add(node); - node := node.getNextSibling; + while Assigned(Node) do + begin + if Node.StateIndex = csUnChecked then + nodesToPrune.Add(Node); + Node := Node.getNextSibling; end; // prune nodes DeleteNodes(nodesToPrune); @@ -1001,36 +1049,40 @@ procedure TSettingsManager.AutoPrune; end; end; -function TSettingsManager.CanPruneRecords: boolean; +function TSettingsManager.CanPruneRecords: Boolean; var - node: TTreeNode; + Node: TTreeNode; begin - Result := false; - node := tvRecords.Items[0].getFirstChild; - while Assigned(node) do begin - if node.StateIndex = csUnChecked then begin + Result := False; + Node := tvRecords.Items[0].getFirstChild; + while Assigned(Node) do + begin + if Node.StateIndex = csUnChecked then + begin Result := true; break; end; - node := node.getNextSibling; + Node := Node.getNextSibling; end; end; - -{******************************************************************************} +{ ****************************************************************************** } { Settings Manager Events } -{******************************************************************************} +{ ****************************************************************************** } -function TSettingsManager.GetGroup(name: string; var group: TListGroup): Boolean; +function TSettingsManager.GetGroup(name: string; var group: TListGroup) + : Boolean; var i: Integer; begin - Result := false; + Result := False; // get the group - for i := 0 to Pred(lvSettings.Groups.Count) do begin + for i := 0 to Pred(lvSettings.Groups.Count) do + begin group := lvSettings.Groups[i]; - if SameText(group.Header, name) then begin + if SameText(group.Header, name) then + begin Result := true; break; end; @@ -1041,32 +1093,33 @@ procedure TSettingsManager.AddSettingItem(aSetting: TSmashSetting; bSelect: Boolean = true); var index: Integer; - item: TListItem; + Item: TListItem; sGroupName: string; group: TListGroup; begin // add item to list view - item := lvSettings.Items.Add; - item.Caption := aSetting.name; - item.SubItems.Add(aSetting.records); + Item := lvSettings.Items.Add; + Item.Caption := aSetting.name; + Item.SubItems.Add(aSetting.records); // get group sGroupName := 'Ungrouped'; index := Pos('.', aSetting.name); if index > 0 then sGroupName := Copy(aSetting.name, 1, index - 1); - if not GetGroup(sGroupName, group) then begin + if not GetGroup(sGroupName, group) then + begin group := lvSettings.Groups.Add; group.Header := sGroupName; group.State := [lgsCollapsible]; end; // assign group - item.GroupID := group.ID; + Item.GroupID := group.id; // set selected item to the new setting if bSelect then - SelectSetting(item.Index); + SelectSetting(Item.index); end; procedure TSettingsManager.FormCreate(Sender: TObject); @@ -1087,9 +1140,10 @@ procedure TSettingsManager.FormCreate(Sender: TObject); lvSettings.Items.Count := SmashSettings.Count; // prepare groups and load items - for i := 0 to Pred(SmashSettings.Count) do begin + for i := 0 to Pred(SmashSettings.Count) do + begin aSetting := TSmashSetting(SmashSettings[i]); - AddSettingItem(aSetting, false); + AddSettingItem(aSetting, False); end; // Create the StringList for the Search @@ -1114,8 +1168,8 @@ procedure TSettingsManager.FormShow(Sender: TObject); TVS_NOTOOLTIPS = $0080; begin // disable tool tips on tree view - SetWindowLong(tvRecords.Handle, GWL_STYLE, - GetWindowLong(tvRecords.Handle, GWL_STYLE) or TVS_NOTOOLTIPS); + SetWindowLong(tvRecords.Handle, GWL_STYLE, GetWindowLong(tvRecords.Handle, + GWL_STYLE) or TVS_NOTOOLTIPS); // build AddItem submenu PopulateAddList(AddItem, AddItemClick); @@ -1138,18 +1192,19 @@ procedure TSettingsManager.lvSettingsChange(Sender: TObject; Item: TListItem; Change: TItemChange); begin tvRecords.Items.Clear; - if (lvSettings.ItemIndex = -1) then begin + if (lvSettings.ItemIndex = -1) then + begin currentSetting := nil; edName.Text := ''; - edName.Enabled := false; + edName.Enabled := False; cbColor.Selected := clBlack; - cbColor.Enabled := false; + cbColor.Enabled := False; edHash.Text := '$00000000'; meDescription.Text := ''; - meDescription.Enabled := false; - tvRecords.Enabled := false; - btnSave.Enabled := false; - btnDiscard.Enabled := false; + meDescription.Enabled := False; + tvRecords.Enabled := False; + btnSave.Enabled := False; + btnDiscard.Enabled := False; exit; end; @@ -1198,7 +1253,8 @@ procedure TSettingsManager.btnSaveClick(Sender: TObject); // we can prune records, // then dump the records tree index := NewSettings.IndexOf(currentSetting); - if (index > -1) then begin + if (index > -1) then + begin if CanPruneRecords then AutoPrune; NewSettings.Delete(index); @@ -1213,7 +1269,7 @@ procedure TSettingsManager.btnSaveClick(Sender: TObject); // adjust the current setting in the list view GetGroup(currentSetting.name, group); - currentSettingItem.GroupID := group.ID; + currentSettingItem.GroupID := group.id; currentSettingItem.Caption := currentSetting.name; currentSettingItem.SubItems[0] := currentSetting.records; @@ -1224,48 +1280,50 @@ procedure TSettingsManager.btnSaveClick(Sender: TObject); procedure TSettingsManager.lvSettingsDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var - i, x, y: integer; + i, x, y: Integer; lv: TListView; aSetting: TSmashSetting; begin lv := TListView(Sender); // get color - aSetting := TSmashSetting(SmashSettings[Item.Index]); - lv.Canvas.Font.Color := aSetting.color; + aSetting := TSmashSetting(SmashSettings[Item.index]); + lv.Canvas.Font.color := aSetting.color; lv.Canvas.Font.Style := [fsBold]; lv.Canvas.Refresh; // draw selected rect - if Item.Selected then begin - lv.Canvas.Brush.Color := $FFEEDD; + if Item.Selected then + begin + lv.Canvas.Brush.color := $FFEEDD; lv.Canvas.FillRect(Rect); end; // draw item x := Rect.Left; y := (Rect.Bottom - Rect.Top - lv.Canvas.TextHeight('Hg')) div 2 + Rect.Top; - lv.Canvas.TextOut(x, y, ' '+Item.Caption); + lv.Canvas.TextOut(x, y, ' ' + Item.Caption); // draw subitems - for i := 0 to Item.SubItems.Count - 1 do begin - Inc(x, ListView_GetColumnWidth(lv.Handle, lv.Columns[i].Index)); - lv.Canvas.TextOut(x, y, ' '+Item.SubItems[i]); + for i := 0 to Item.SubItems.Count - 1 do + begin + Inc(x, ListView_GetColumnWidth(lv.Handle, lv.Columns[i].index)); + lv.Canvas.TextOut(x, y, ' ' + Item.SubItems[i]); end; end; -{******************************************************************************} +{ ****************************************************************************** } { SettingPopupMenu methods Methods for dealing with the popup menu for the settings list view. - NewSettingItemClick - EditSettingItemClick - DeleteSettingItemClick } -{******************************************************************************} +{ ****************************************************************************** } procedure TSettingsManager.SettingsPopupMenuPopup(Sender: TObject); var - bHasSelection, bHasMultiSelection: boolean; + bHasSelection, bHasMultiSelection: Boolean; begin bHasSelection := Assigned(lvSettings.Selected); bHasMultiSelection := lvSettings.SelCount > 1; @@ -1290,7 +1348,8 @@ procedure TSettingsManager.DeleteSettingItemClick(Sender: TObject); i, index: Integer; setting: TSmashSetting; begin - for i := Pred(lvSettings.Items.Count) downto 0 do begin + for i := Pred(lvSettings.Items.Count) downto 0 do + begin if not lvSettings.Items[i].Selected then continue; lvSettings.Items.Delete(i); @@ -1312,7 +1371,7 @@ procedure TSettingsManager.CloneSettingItemClick(Sender: TObject); setting, clonedSetting: TSmashSetting; begin clonedSetting := TSmashSetting.Create; - setting := TSmashSetting(SmashSettings[lvSettings.Selected.Index]); + setting := TSmashSetting(SmashSettings[lvSettings.Selected.index]); clonedSetting.Clone(setting); SmashSettings.Add(clonedSetting); // add setting to list view @@ -1337,7 +1396,8 @@ procedure TSettingsManager.CombineSettingsItemClick(Sender: TObject); try // add selected settings to the settingsToCombine list - for i := 0 to Pred(lvSettings.Items.Count) do begin + for i := 0 to Pred(lvSettings.Items.Count) do + begin ListItem := lvSettings.Items[i]; if not ListItem.Selected then continue; @@ -1348,19 +1408,22 @@ procedure TSettingsManager.CombineSettingsItemClick(Sender: TObject); // build a list of the record objects in the settings // if conflicts found, have user resolve them - if CombineSettingTrees(settingsToCombine, slRecords) then begin + if CombineSettingTrees(settingsToCombine, slRecords) then + begin cForm := TConflictForm.Create(self); cForm.slConflicts := slRecords; if cForm.ShowModal = mrOK then CreateCombinedSetting(slRecords, sl.DelimitedText); end // else just create the combined setting - else begin + else + begin CreateCombinedSetting(slRecords, sl.DelimitedText); end; finally // update lvSettings if we created a new setting - if SmashSettings.Count > lvSettings.Items.Count then begin + if SmashSettings.Count > lvSettings.Items.Count then + begin setting := TSmashSetting(SmashSettings[Pred(SmashSettings.Count)]); AddSettingItem(setting); end; diff --git a/frontend/msSmash.pas b/frontend/msSmash.pas old mode 100644 new mode 100755 index dc5e225..186060b --- a/frontend/msSmash.pas +++ b/frontend/msSmash.pas @@ -1,9 +1,7 @@ unit msSmash; - interface - uses - Windows, SysUtils, Classes, ShellAPI, Controls, Dialogs, + Windows, SysUtils, Classes, ShellAPI, Controls, Dialogs, Generics.Collections, // superobject superobject, // mte units @@ -12,38 +10,38 @@ interface msCore, msConfiguration, msConflict, msAlgorithm, // xEdit units wbInterface, wbImplementation; - - procedure BuildPatch(var patch: TPatch); - procedure RebuildPatch(var patch: TPatch); - +procedure BuildPatch(var patch: TPatch); +procedure RebuildPatch(var patch: TPatch); implementation - procedure BuildPluginsList(var patch: TPatch; var lst: TList); var i: Integer; plugin: TPlugin; begin - for i := 0 to Pred(patch.plugins.Count) do begin + for i := 0 to Pred(patch.plugins.Count) do + begin plugin := PluginByFileName(patch.plugins[i]); if not Assigned(plugin) then - raise Exception.Create('Couldn''t find plugin '+patch.plugins[i]); + raise Exception.Create('Couldn''t find plugin ' + patch.plugins[i]); lst.Add(plugin); end; end; - procedure SetPatchAttributes(var patch: TPatch); var patchFile: IwbFile; - fileHeader: IwbContainer; + fileHeader: IwbMainRecord; begin patchFile := patch.plugin._File; - fileHeader := patchFile.Elements[0] as IwbContainer; + fileHeader := patchFile.Elements[0] as IwbMainRecord; // set author - fileHeader.ElementEditValues['CNAM'] := 'Mator Smash v' + ProgramStatus.Version; + fileHeader.ElementEditValues['CNAM'] := 'Mator Smash v' + + ProgramStatus.Version; // set description - fileHeader.ElementEditValues['SNAM'] := 'Smashed patch:'#13#10 + patch.plugins.Text; + fileHeader.ElementEditValues['SNAM'] := 'Smashed patch:'#13#10 + + patch.plugins.Text; + // set ESL flag + fileHeader.IsESL := settings.flagESL; end; - function GetPatchFile(var patch: TPatch; var lst: TList): IwbFile; var plugin: TPlugin; @@ -53,192 +51,263 @@ function GetPatchFile(var patch: TPatch; var lst: TList): IwbFile; begin // get plugin if it exists // else create it - plugin := PluginByFilename(patch.filename); + plugin := PluginByFileName(patch.filename); patch.plugin := nil; - if Assigned(plugin) then begin + if Assigned(plugin) then + begin bUsedExistingFile := true; patch.plugin := plugin; end - else begin + else + begin bUsedExistingFile := false; patch.plugin := CreateNewPlugin(patch.filename); end; - // don't patch if patchFile not assigned - if not Assigned(patch.plugin) then + if not Assigned(patch.plugin) then raise Exception.Create('Couldn''t assign patch file'); - // don't patch if patchFile is at an invalid load order position relative // to the plugins being patched - if bUsedExistingFile then begin - for i := 0 to Pred(lst.Count) do begin + if bUsedExistingFile then + begin + for i := 0 to Pred(lst.Count) do + begin plugin := TPlugin(lst[i]); if PluginsList.IndexOf(plugin) > PluginsList.IndexOf(patch.plugin) then - raise Exception.Create(Format('%s is at a lower load order position than %s', + raise Exception.Create + (Format('%s is at a lower load order position than %s', [plugin.filename, patch.filename])); end; - // clean up the patch file patchFile := patch.plugin._File; for i := Pred(patchFile.RecordCount) downto 0 do patchFile.Records[i].Remove; end; - // set result Result := patch.plugin._File; Tracker.Write(' '); - Tracker.Write('Patch is using plugin: '+patch.plugin.filename); + Tracker.Write('Patch is using plugin: ' + patch.plugin.filename); +end; +function CompareLoadOrder(List: TStringList; Index1, Index2: Integer): Integer; +begin + if Index1 = Index2 then + begin + Result := 0; + Exit; + end; + Result := CmpI32(IwbFile(Pointer(List.Objects[Index1])).LoadOrder, + IwbFile(Pointer(List.Objects[Index2])).LoadOrder); end; - -procedure AddRequiredMasters(var patch: TPatch; var lst: TList); +procedure AddRequiredMasters(var aFile: IwbFile; const el: IwbElement); var slMasters: TStringList; - i: Integer; - plugin: TPlugin; + i, j: Integer; begin slMasters := TStringList.Create; + slMasters.Sorted := true; + slMasters.Duplicates := dupIgnore; try - Tracker.Write('Adding masters...'); - for i := 0 to Pred(lst.Count) do begin - plugin := TPlugin(lst[i]); - GetMasters(plugin._File, slMasters); - slMasters.AddObject(plugin.filename, patch.plugins.Objects[i]); - end; try - slMasters.CustomSort(LoadOrderCompare); - AddMasters(patch.plugin._File, slMasters); - if settings.debugMasters then begin - Tracker.Write('Masters added:'); - Tracker.Write(slMasters.Text); - slMasters.Clear; - GetMasters(patch.plugin._File, slMasters); - Tracker.Write('Actual masters:'); - Tracker.Write(slMasters.Text); + el.ReportRequiredMasters(slMasters, false, true, false); + if settings.debugMasters then + Tracker.Write(' Element ' + el.Name + ' from ' + el._File.filename + + ' requires masters: ' + slMasters.CommaText); + for i := 0 to Pred(aFile.MasterCount[true]) do + if slMasters.Find(aFile.Masters[i, true].filename, j) then + slMasters.Delete(j); + if slMasters.Find(aFile.filename, j) then + slMasters.Delete(j); + if slMasters.Count > 0 then + begin + for i := 0 to Pred(slMasters.Count) do + if IwbFile(Pointer(slMasters.Objects[i])).LoadOrder >= aFile.LoadOrder + then + raise Exception.Create('The required master "' + slMasters[i] + + '" can not be added to "' + aFile.filename + + '" as it has a higher load order'); + slMasters.Sorted := false; + slMasters.CustomSort(CompareLoadOrder); + if (aFile.MasterCount[true] + slMasters.Count >= 253) then + aFile.CleanMasters; + aFile.AddMasters(slMasters); + Logger.Write('PATCH', 'MASTERS', 'Added masters: ' + + slMasters.CommaText); + if settings.debugMasters then + Tracker.Write(' Adding masters: ' + slMasters.CommaText); end; except - on x: Exception do begin + on x: Exception do + begin Tracker.Write('Critical exception adding masters!'); Tracker.Write(x.Message); raise x; end; - end; + end finally slMasters.Free; if Tracker.Cancel then raise Exception.Create('User cancelled smashing.'); - Tracker.Write('Done adding masters'); end; end; - +procedure ListParents(const rec: IwbMainRecord; var parents: TInterfaceList); +var + grup: IwbGroupRecord; +begin + if Supports(rec.Container, IwbGroupRecord, grup) and Assigned(grup.ChildrenOf) + then + begin + if parents.IndexOf(grup.ChildrenOf) = -1 then + begin + parents.Add(grup.ChildrenOf); + ListParents(grup.ChildrenOf, parents); + end + end; +end; +procedure AddParents(var patchFile: IwbFile; const rec: IwbElement); +var + grup: IwbGroupRecord; +begin + if Supports(rec.Container, IwbGroupRecord, grup) and Assigned(grup.ChildrenOf) + then + begin + if not Assigned(patchFile.RecordByFormID[grup.ChildrenOf.FormID, + true, true]) then + begin + AddParents(patchFile, grup.ChildrenOf); + Tracker.Write(Format(' Copying parent record %s of %s', + [grup.ChildrenOf.Name, rec.Name])); + AddRequiredMasters(patchFile, grup.ChildrenOf); + grup.ChildrenOf.CopyInto(patchFile, false, false, '', + '', '', ''); + end + end; +end; procedure BuildOverridesList(var patch: TPatch; var lst: TList; - var records: TInterfaceList); + var Records: TInterfaceList); var i, j, recCount: Integer; plugin: TPlugin; aSetting: TSmashSetting; aFile: IwbFile; - rec: IwbMainRecord; + rec, ovr: IwbMainRecord; recObj: ISuperObject; begin Tracker.Write(' '); Tracker.Write('Processing files'); - for i := 0 to Pred(lst.Count) do begin - if Tracker.Cancel then break; + for i := 0 to Pred(lst.Count) do + begin + if Tracker.Cancel then + break; plugin := TPlugin(lst[i]); - // get file and setting for later use aFile := plugin._File; aSetting := plugin.smashSetting; - + Tracker.Write('Processing ' + aFile.Name); // loop through file records - Tracker.Write('Processing '+plugin.filename); recCount := Pred(aFile.RecordCount); - for j := 0 to recCount do begin - if Tracker.Cancel then break; - rec := aFile.Records[j]; - if j mod 500 = 499 then - Tracker.UpdateProgress(500); - - try - // skip non-override records - if rec.IsMaster then - continue; + if aFile.Name.EndsWith(csDotGhost) then begin + for j := 0 to recCount do begin + rec := aFile.Records[j]; + // add parent record(s) to list first so they get smashed first? + ListParents(rec, Records); rec := rec.Master; - - if OverrideCountInFiles(rec, patch.plugins) < 2 then - continue; - - // skip records according to smash setting - recObj := aSetting.GetRecordDef(rec.Signature); - if not Assigned(recObj) then - continue; - if (recObj.I['p'] <> 1) then - continue; - // skip non-conflicting records - if ConflictAllForMainRecord(rec) < caConflict then - continue; - // add record to overrides list - if records.IndexOf(rec) = -1 then - records.Add(rec); - except - on x: Exception do begin - Tracker.Write(' Error processing ' + rec.Name + ', ' + x.Message); - continue; + if Records.IndexOf(rec) = -1 then + Records.Add(rec); + end; + // update progress bar for file + Tracker.UpdateProgress(recCount); + end + else begin + for j := 0 to recCount do + begin + if Tracker.Cancel then + break; + rec := aFile.Records[j]; + ovr := rec; + if j mod 500 = 499 then + Tracker.UpdateProgress(500); + try + // skip non-override records + if rec.IsMaster then + continue; + rec := rec.Master; + { + if (OverrideCountInFiles(rec, patch.plugins) < 2) then + continue; + } + // skip records according to smash setting + recObj := aSetting.GetRecordDef(rec.Signature); + if not Assigned(recObj) then + continue; + if (recObj.i['p'] <> 1) then + continue; + // skip non-conflicting records + if ConflictAllForMainRecord(rec) < caConflict then + continue; + // add parent record(s) to list first so they get smashed first? + ListParents(ovr, Records); + // add record to overrides list + if Records.IndexOf(rec) = -1 then + Records.Add(rec); + except + on x: Exception do + begin + Tracker.Write(' Error processing ' + rec.Name + ', ' + x.Message); + continue; + end; end; end; + // update progress bar for file + Tracker.UpdateProgress(recCount mod 500); end; - - // update progress bar for file - Tracker.UpdateProgress(recCount mod 500); end; end; - procedure UpdateCounts(var rec: IwbMainRecord); var - container, arrayContainer: IwbContainerElementRef; + Container, arrayContainer: IwbContainerElementRef; i: Integer; element, nextElement: IwbElement; begin // if reocrd is not editable, exit if not rec.IsEditable then - exit; - + Exit; // if record can't be treated as a container, exit - if not Supports(rec, IwbContainerElementRef, container) then - exit; - + if not Supports(rec, IwbContainerElementRef, Container) then + Exit; // loop through top-level elements - for i := 0 to container.ElementCount - 2 do begin - element := container.Elements[i]; - nextElement := container.Elements[i + 1]; + for i := 0 to Container.ElementCount - 2 do + begin + element := Container.Elements[i]; + nextElement := Container.Elements[i + 1]; if not Supports(nextElement, IwbContainerElementRef, arrayContainer) then continue; - // if next element is an array element and current element has the // word count in its name update the count to be the number of elements // in the array - if (GetSmashType(nextElement) in stArrays) - and (Pos('Count', element.Name) > 0) then try - element.NativeValue := arrayContainer.ElementCount; - except - on x: Exception do - Tracker.Write(' Exception updating count at '+element.Path); - end; + if (GetSmashType(nextElement) in stArrays) and + (GetSmashType(element) = stInteger) and (Pos('Count', element.Name) > 0) + then + try + element.NativeValue := arrayContainer.ElementCount; + except + on x: Exception do + Tracker.Write(' Exception updating count at ' + element.FullPath); + end; end; end; - -function HasPartialFormFlag(rec: IwbMainRecord): Boolean; +function HasPartialFormFlag(rec: IwbMainRecord): boolean; begin Result := ((rec.Signature = 'QUST') or (rec.Signature = 'LCTN')) and (rec.Flags._Flags and $00004000 <> 0); end; - -procedure SmashRecords(var patch: TPatch; var records: TInterfaceList); +procedure SmashRecords(var patch: TPatch; var Records: TInterfaceList); var - i, j: Integer; + i, j, k, ndx: Integer; incProgress, currentProgress: Real; rec, mst, ovr, patchRec: IwbMainRecord; + msts: TList; + ovrs: TStringList; f, patchFile, forceFile: IwbFile; plugin: TPlugin; aSetting: TSmashSetting; @@ -249,111 +318,167 @@ procedure SmashRecords(var patch: TPatch; var records: TInterfaceList); Tracker.Write(' '); Tracker.Write('Smashing records'); patchFile := patch.plugin._File; - // loop through records to smash currentProgress := Tracker.GetProgress; - incProgress := (Tracker.GetMaxProgress - Tracker.GetProgress) / records.Count; - for i := 0 to Pred(records.Count) do begin - if Tracker.Cancel then break; - if not Supports(records[i], IwbMainRecord, rec) then - exit; + incProgress := (Tracker.GetMaxProgress - Tracker.GetProgress) / Records.Count; + for i := 0 to Pred(Records.Count) do + begin + if Tracker.Cancel then + break; + if not Supports(Records[i], IwbMainRecord, rec) then + Exit; Tracker.StatusMessage(Format('Smashing records (%d/%d)', - [i + 1, records.Count])); + [i + 1, Records.Count])); currentProgress := currentProgress + incProgress; Tracker.SetProgress(Round(currentProgress)); - - // loop through record's overrides - patchRec := nil; - forceFile := nil; - for j := 0 to Pred(rec.OverrideCount) do begin - if Tracker.Cancel then break; - ovr := rec.Overrides[j]; - f := ovr._File; - // skip overrides that are in plugins we aren't patching - if patch.plugins.IndexOf(f.FileName) = -1 then - continue; - plugin := PluginByFileName(f.FileName); - if not Assigned(plugin) then - continue; - // skip ctIdenticalToMaster overrides - if (ConflictThisForMainRecord(ovr) = ctIdenticalToMaster) then - continue; - - // skip plugins that have the skip setting - if plugin.setting = 'Skip' then - continue; - - // skip overrides according to smash setting - aSetting := plugin.smashSetting; - recObj := aSetting.GetRecordDef(ovr.Signature); - if not Assigned(recObj) then - continue; - if (recObj.I['p'] <> 1) then - continue; - bForce := recObj.I['f'] = 1; - if bForce then begin - if Assigned(patchRec) then begin - patchRec.Remove; - patchRec := nil; - end; - forceFile := f; + // loop through record's overrides to find which ones to smash + ovrs := TStringList.Create; + try + for j := 0 to Pred(rec.OverrideCount) do + begin + ovr := rec.Overrides[j]; + f := ovr._File; + // skip overrides that are in plugins we aren't patching + if patch.plugins.IndexOf(f.filename) = -1 then + continue; + plugin := PluginByFileName(f.filename); + if not Assigned(plugin) then + continue; + // skip plugins that have the skip setting + if plugin.setting = 'Skip' then + continue; + // skip overrides according to smash setting + aSetting := plugin.smashSetting; + recObj := aSetting.GetRecordDef(ovr.Signature); + if not Assigned(recObj) then + continue; + if (recObj.i['p'] <> 1) then + continue; + // this is an override to smash + ovrs.AddObject(f.Name, Pointer(ovr)); + // don't bother to smash this override's masters? + for k := 0 to Pred(f.MasterCount[false]) do + if ovrs.Find(f.Masters[k,false].Name, ndx) then + ovrs.Delete(ndx); end; - - // copy record to smashed patch if it hasn't been copied yet - if not Assigned(patchRec) then try - if bForce then - e := ovr - else - e := WinningOverrideInFiles(rec, patch.plugins); - Tracker.Write(Format(' [%d] Copying record %s', [i + 1, e.Name])); - eCopy := wbCopyElementToFile(e, patchFile, false, true, '', '' ,''); - patchRec := eCopy as IwbMainRecord; - if bForce then continue; - except - on x: Exception do begin - Tracker.Write(' Exception copying record '+ovr.Name+' : '+x.Message); - patch.fails.Add('Exception copying record '+ovr.Name+' : '+x.Message); + // If only one override to smash just copy it in + if ovrs.Count = 1 then begin + ovr := IwbMainRecord(Pointer(ovrs.Objects[0])); + { + if ovr.IsWinningOverride then continue; + } + try + // be sure we include the parent? + AddParents(patchFile, ovr); + Tracker.Write(Format(' [%d] Copying record %s from %s', + [i + 1, ovr.Name, ovr._File.Name])); + AddRequiredMasters(patchFile, ovr); + ovr.CopyInto(patchFile, false, false, '', '', '', ''); + except + on x: Exception do + begin + Tracker.Write(' Exception copying record ' + e.Name + + ' from file ' + e._File.filename + ': ' + x.Message); + patch.fails.Add('Exception copying record ' + ovr.Name + ' : ' + + x.Message); + end; end; - end; - - // skip if we're forcing and plugin doesn't require forceFile - if Assigned(forceFile) and not bForce - and (plugin.masters.IndexOf(forceFile.FileName) = -1) then continue; - - // finally, recursively copy overridden elements - try - bDeletions := recObj.I['d'] = 1; - if (wbGameMode = gmFO4) and HasPartialFormFlag(ovr) then - bDeletions := False; - bOverride := recObj.I['o'] = 1; + end; + // loop through overrides to smash + patchRec := nil; + forceFile := nil; + for j := 0 to Pred(ovrs.Count) do + begin + if Tracker.Cancel then + break; + ovr := IwbMainRecord(Pointer(ovrs.Objects[j])); + f := ovr._File; + bForce := recObj.i['f'] = 1; if bForce then - mst := e as IwbMainRecord - else - mst := WinningOverrideInFiles(rec, plugin.masters); - Tracker.Write(Format(' Smashing override from: %s, master: %s', - [f.FileName, mst._File.FileName])); - rcore(IwbElement(ovr), IwbElement(mst), IwbElement(patchRec), patchRec, - recObj, false, bDeletions, bOverride); - except - on x: Exception do begin - Tracker.Write(' Exception smashing record: '+ovr.Name+' : '+x.Message); - patch.fails.Add('Exception smashing record: '+ovr.Name+' : '+x.Message); + begin + if Assigned(patchRec) then + begin + patchRec.Remove; + patchRec := nil; + end; + forceFile := f; end; + // copy record to smashed patch if it hasn't been copied yet + if not Assigned(patchRec) then + try + if bForce then + e := ovr + else + e := WinningOverrideInFiles(rec, patch.plugins); + // be sure we include the parent? + AddParents(patchFile, e); + Tracker.Write(Format(' [%d] Copying record %s from %s', + [i + 1, e.Name, e._File.Name])); + AddRequiredMasters(patchFile, e); + eCopy := e.CopyInto(patchFile, false, false, '', '', '', ''); + patchRec := eCopy as IwbMainRecord; + if bForce then + continue; + except + on x: Exception do + begin + Tracker.Write(' Exception copying record ' + e.Name + + ' from file ' + e._File.filename + ': ' + x.Message); + patch.fails.Add('Exception copying record ' + ovr.Name + ' : ' + + x.Message); + continue; + end; + end; + // skip if we're forcing and plugin doesn't require forceFile + if Assigned(forceFile) and not bForce and + (plugin.Masters.IndexOf(forceFile.filename) = -1) then + continue; + // finally, recursively copy overridden elements + try + bDeletions := recObj.i['d'] = 1; + if (wbGameMode = gmFO4) and HasPartialFormFlag(ovr) then + bDeletions := false; + bOverride := recObj.i['o'] = 1; + msts := TList.Create; + try + if bForce then + msts.Add(e as IwbMainRecord) + else + OverridesInMasters(ovr, msts); + for k := 0 to Pred(msts.Count) do begin + mst := msts.Items[k]; + Tracker.Write(Format(' Smashing override of %s from: %s, master: %s', + [ovr.Name, f.filename, mst._File.filename])); + AddRequiredMasters(patch.plugin._File, ovr); + rcore(IwbElement(ovr), IwbElement(mst), IwbElement(patchRec), patchRec, + recObj, false, bDeletions, bOverride); + end; + finally + msts.Free; + end + except + on x: Exception do + begin + Tracker.Write(' Exception smashing record: ' + ovr.Name + ' : ' + + x.Message); + patch.fails.Add('Exception smashing record: ' + ovr.Name + ' : ' + + x.Message); + end; + end; + // update any count elements on the record + UpdateCounts(patchRec); end; - - // update any count elements on the record - UpdateCounts(patchRec); + finally + ovrs.Free; end; end; end; - -function IsChildGroup(group: IwbGroupRecord): Boolean; +function IsChildGroup(group: IwbGroupRecord): boolean; begin - Result := group.GroupType in [1,6,7]; + Result := group.GroupType in [1, 6, 7]; end; - function NativeContainer(element: IwbElement): IwbContainer; var group: IwbGroupRecord; @@ -365,33 +490,29 @@ function NativeContainer(element: IwbElement): IwbContainer; if not Assigned(Result) then raise Exception.Create('Could not find container for ' + element.Name); end; - procedure RemoveEmptyContainers(aContainer: IwbContainer); var - container, nextContainer: IwbContainer; + Container, nextContainer: IwbContainer; rec: IwbMainRecord; - bITM, bITPO: Boolean; + bITM, bITPO: boolean; begin - container := aContainer; + Container := aContainer; // traverse up container until we find an IwbMainRecord - while Assigned(container) and - not Supports(container, IwbMainRecord, rec) do begin + while Assigned(Container) and not Supports(Container, IwbMainRecord, rec) do + begin // break if container still has elements in it - if container.ElementCount > 0 then - exit; - + if Container.ElementCount > 0 then + Exit; // else remove it and traverse up to next container - nextContainer := NativeContainer(container); - container.Remove; - container := nextContainer; + nextContainer := NativeContainer(Container); + Container.Remove; + Container := nextContainer; end; - // exit if record is not ITM or ITPO bITM := IsITM(rec); bITPO := IsITPO(rec); - if not (bITM or bITPO) then - exit; - + if not(bITM or bITPO) then + Exit; // else remove MainRecord and recurse if bITM then Tracker.Write(' Removing ITM: ' + rec.Name) @@ -401,76 +522,132 @@ procedure RemoveEmptyContainers(aContainer: IwbContainer); rec.Remove; RemoveEmptyContainers(nextContainer); end; - +function FindITPO(e: IwbMainRecord): boolean; +begin + // skip master records + if e.IsMaster then + Exit(false); + // skip records that have elements in child group (WRLD, CELL, DIAL) + if Assigned(e.ChildGroup) and (e.ChildGroup.ElementCount > 0) then + Exit(false); + // remove record if no conflicts + if not IsITPO(e) then + Exit(false); + Result := true; + Tracker.Write(' Removing ITPO: ' + e.Name); +end; +type + TITPOThread = class(TThread) + private + Fe: IwbMainRecord; + procedure Execute; override; + public + constructor Create(const e: IwbMainRecord); + property ReturnValue; + end; +constructor TITPOThread.Create; +begin + inherited Create(false); + Fe := e; +end; +procedure TITPOThread.Execute; +begin + if FindITPO(Fe) then + ReturnValue := 1 + else + ReturnValue := 0; +end; procedure RemoveITPOs(aFile: IwbFile); var i, CountITPO: Integer; - e, m: IwbMainRecord; - container: IwbContainer; + e: IwbMainRecord; + Container: IwbContainer; ITPOs: TDynMainRecords; + ThreadRefs: array of TITPOThread; + ThreadHandles: array of THandle; begin Tracker.Write(' '); Tracker.Write('Removing ITPO records from patch'); CountITPO := 0; - - // loop through file's records - for i := Pred(aFile.RecordCount) downto 0 do begin - if Tracker.Cancel then break; - e := aFile.Records[i]; - m := e.MasterOrSelf; - - // skip master records - if e.IsMaster then - continue; - - // skip records that have elements in child group (WRLD, CELL, DIAL) - if Assigned(e.ChildGroup) and (e.ChildGroup.ElementCount > 0) then - continue; - - // remove record if no conflicts - if IsITPO(e) then begin - Tracker.Write(' Removing ITPO: ' + e.Name); - - // add ITPO to list of records to remove - SetLength(ITPOs, CountITPO + 1); - ITPOs[CountITPO] := e; - Inc(CountITPO); + if settings.multiThreadedSmash then + begin + SetLength(ThreadRefs, aFile.RecordCount); + SetLength(ThreadHandles, aFile.RecordCount); + // loop through file's records + for i := Pred(aFile.RecordCount) downto 0 do + begin + if Tracker.Cancel then + break; + e := aFile.Records[i]; + ThreadRefs[i] := TITPOThread.Create(e); + ThreadHandles[i] := ThreadRefs[i].Handle; + end; + // Wait for Threads + WaitForMultipleObjects(Length(ThreadRefs), Pointer(ThreadHandles), true, + INFINITE); + // loop through threads and get results + for i := Pred(Length(ThreadRefs)) downto 0 do + begin + // remove record if no conflicts + if ThreadRefs[i].ReturnValue = 1 then + begin + // add ITPO to list of records to remove + SetLength(ITPOs, CountITPO + 1); + ITPOs[CountITPO] := e; + Inc(CountITPO); + end; + end; + end + else + begin + // loop through file's records + for i := Pred(aFile.RecordCount) downto 0 do + begin + e := aFile.Records[i]; + if FindITPO(e) then + begin + // add ITPO to list of records to remove + SetLength(ITPOs, CountITPO + 1); + ITPOs[CountITPO] := e; + Inc(CountITPO); + end; end; end; - // remove the records - for i := Pred(Length(ITPOs)) downto 0 do begin + for i := Pred(Length(ITPOs)) downto 0 do + begin e := ITPOs[i]; - container := e.Container; + Container := e.Container; e.Remove; try - RemoveEmptyContainers(container); + RemoveEmptyContainers(Container); except on x: Exception do - Tracker.Write(' Exception removing empty containers: '+x.Message); + Tracker.Write(' Exception removing empty containers: ' + + x.Message); end; end; - // finalization message Tracker.Write(Format(' Removed %d ITPO records', [CountITPO])); end; - procedure CleanPatch(var patch: TPatch); var patchFile: IwbFile; begin patchFile := patch.plugin._File; - - // remove ITPOs try + // remove ITPOs if not settings.preserveITPOs then RemoveITPOs(patchFile); + // Mator didn't like cleaning the masters unnecessarily + // patchFIle.CleanMasters; except on x: Exception do - Tracker.Write(' Exception removing ITPOs: '+x.Message); + Tracker.Write(' Exception removing ITPOs: ' + x.Message); end; + Tracker.Write('Sorting patch masters according to current load order'); + patchFile.SortMasters; end; - procedure SavePatchFiles(var patch: TPatch); var patchFilePrefix, patchPath: string; @@ -478,21 +655,17 @@ procedure SavePatchFiles(var patch: TPatch); // update patch plugin hashes and settings patch.UpdateHashes; patch.UpdateSettings; - // get path to save file at patchPath := patch.dataPath + 'smash\'; ForceDirectories(patchPath); - // save patch plugin patch.plugin.dataPath := patch.dataPath; patch.plugin.Save; - // save files, fails, plugins patchFilePrefix := patchPath + ChangeFileExt(patch.filename, ''); - patch.fails.SaveToFile(patchFilePrefix+'_fails.txt'); - patch.plugins.SaveToFile(patchFilePrefix+'_plugins.txt'); + patch.fails.SaveToFile(patchFilePrefix + '_fails.txt'); + patch.plugins.SaveToFile(patchFilePrefix + '_plugins.txt'); end; - procedure BuildPatch(var patch: TPatch); var patchFile: IwbFile; @@ -502,69 +675,57 @@ procedure BuildPatch(var patch: TPatch); msg: string; begin // initialize - Tracker.Write('Building patch: '+patch.name); + Tracker.Write('Building patch: ' + patch.Name); time := Now; patch.fails.Clear; pluginsToPatch := TList.Create; msg := 'User cancelled smashing patches.'; - try // build list of plugins to patch BuildPluginsList(patch, pluginsToPatch); HandleCanceled(msg); - // identify or create patch file patchFile := GetPatchFile(patch, pluginsToPatch); SetPatchAttributes(patch); - // add masters to patch file - AddRequiredMasters(patch, pluginsToPatch); - HandleCanceled(msg); - + // AddRequiredMasters(patch, pluginsToPatch); + // HandleCanceled(msg); // build list of overrides recordsList := TInterfaceList.Create; BuildOverridesList(patch, pluginsToPatch, recordsList); HandleCanceled(msg); - // stop smashing if no records to smash if recordsList.Count = 0 then - raise Exception.create('No records to patch!'); - + raise Exception.Create('No records to patch!'); // smash records SmashRecords(patch, recordsList); HandleCanceled(msg); - // clean patch (ITPOs) CleanPatch(patch); - // save patch and associated files SavePatchFiles(patch); - // update statistics if patch.status = psBuildReady then Inc(sessionStatistics.pluginsPatched, patch.plugins.Count); Inc(sessionStatistics.patchesBuilt); - // finalization messages time := (Now - time) * 86400; patch.dateBuilt := Now; patch.status := psUpToDate; - Tracker.Write(Format('Done smashing %s (%.3f)', [patch.name, Real(time)])); + Tracker.Write(Format('Done smashing %s (%.3f)', [patch.Name, Real(time)])); except - on x: Exception do begin + on x: Exception do + begin patch.status := psFailed; - Tracker.Write(Format('Failed to patch %s, %s', [patch.name, x.Message])); + Tracker.Write(Format('Failed to patch %s, %s', [patch.Name, x.Message])); end; end; - // clean up TryToFree(pluginsToPatch); TryToFree(recordsList); end; - procedure RebuildPatch(var patch: TPatch); begin BuildPatch(patch); end; - end. diff --git a/frontend/msSmashForm.dfm b/frontend/msSmashForm.dfm old mode 100644 new mode 100755 index c6f2153..b4c629f --- a/frontend/msSmashForm.dfm +++ b/frontend/msSmashForm.dfm @@ -163,10 +163,6 @@ object SmashForm: TSmashForm object PatchesTabSheet: TTabSheet Caption = 'Patches' ImageIndex = 1 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object PatchesListView: TListView Left = 3 Top = 3 @@ -216,10 +212,6 @@ object SmashForm: TSmashForm object LogTabSheet: TTabSheet Caption = 'Log' ImageIndex = 2 - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object LogListView: TListView Left = 3 Top = 3 @@ -525,7 +517,7 @@ object SmashForm: TSmashForm Left = 1048 Top = 8 Bitmap = { - 494C010105001400CC0240002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010105001400040040002000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000000100004000000001002000000000000000 0100000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000E2E2 diff --git a/frontend/msSmashForm.pas b/frontend/msSmashForm.pas old mode 100644 new mode 100755 index 8494932..d6a0d66 --- a/frontend/msSmashForm.pas +++ b/frontend/msSmashForm.pas @@ -18,83 +18,83 @@ interface msCore, msConfiguration, msLoader, msThreads, msOptionsForm, msEditForm, msSettingsManager, msTagManager, msSplashForm, // tes5edit units - wbBSA, wbHelpers, wbInterface, wbImplementation; + wbBSA, wbHelpers, wbInterface, wbImplementation, System.ImageList; type TSmashForm = class(TForm) [FormPrefix('msMain')] - XPManifest: TXPManifest; - IconList: TImageList; - TaskTimer: TTimer; - [FormSection('QuickBar')] - QuickBar: TPanel; - QuickButton: TSpeedButton; - NewButton: TSpeedButton; - BuildButton: TSpeedButton; - ManageButton: TSpeedButton; - OptionsButton: TSpeedButton; - bhQuick: TBalloonHint; - bhNew: TBalloonHint; - bhBuild: TBalloonHint; - bhManage: TBalloonHint; - bhOptions: TBalloonHint; - [FormSection('Main Panel')] - MainPanel: TPanel; - Splitter: TSplitter; - PageControl: TPageControl; - DetailsPanel: TPanel; - [FormSection('Details Panel')] - DetailsLabel: TLabel; - DetailsGrid: TStringGrid; - DetailsPopupMenu: TPopupMenu; - DetailsCopyToClipboardItem: TMenuItem; - [FormSection('Plugins Tab')] - PluginsTabSheet: TTabSheet; - PluginsListView: TListView; - [FormSection('Plugins Popup Menu')] - PluginsPopupMenu: TPopupMenu; - AddToPatchItem: TMenuItem; - RemoveFromPatchItem: TMenuItem; - TagsItem: TMenuItem; - ManageTagsItem: TMenuItem; - ApplySettingTagsItem: TMenuItem; - ClearTagsItem: TMenuItem; - OpenPluginLocationItem: TMenuItem; - SmashSettingItem: TMenuItem; - [FormSection('Patches Tab')] - PatchesTabSheet: TTabSheet; - PatchesListView: TListView; - [FormSection('Patches Popup Menu')] - PatchesPopupMenu: TPopupMenu; - ToggleRebuildItem: TMenuItem; - OpenInExplorerItem: TMenuItem; - BuildPatchItem: TMenuItem; - EditPatchItem: TMenuItem; - RemoveUnloadedPluginsItem: TMenuItem; - DeletePatchItem: TMenuItem; - [FormSection('Move Submenu')] - MoveItem: TMenuItem; - UpItem: TMenuItem; - DownItem: TMenuItem; - ToTopItem: TMenuItem; - ToBottomItem: TMenuItem; - [FormSection('Log Tab')] - LogTabSheet: TTabSheet; - LogListView: TListView; - [FormSection('Log Popup Menu')] - LogPopupMenu: TPopupMenu; - FilterGroupItem: TMenuItem; - FilterLabelItem: TMenuItem; - CopyToClipboardItem: TMenuItem; - SaveAndClearItem: TMenuItem; - ToggleAutoScrollItem: TMenuItem; - [FormSection('Status Bar')] - StatusPanel: TPanel; - StatusPanelMessage: TPanel; - StatusPanelLanguage: TPanel; - StatusPanelVersion: TPanel; - ImageBuild: TImage; - bhLoadException: TBalloonHint; + XPManifest: TXPManifest; + IconList: TImageList; + TaskTimer: TTimer; + [FormSection('QuickBar')] + QuickBar: TPanel; + QuickButton: TSpeedButton; + NewButton: TSpeedButton; + BuildButton: TSpeedButton; + ManageButton: TSpeedButton; + OptionsButton: TSpeedButton; + bhQuick: TBalloonHint; + bhNew: TBalloonHint; + bhBuild: TBalloonHint; + bhManage: TBalloonHint; + bhOptions: TBalloonHint; + [FormSection('Main Panel')] + MainPanel: TPanel; + Splitter: TSplitter; + PageControl: TPageControl; + DetailsPanel: TPanel; + [FormSection('Details Panel')] + DetailsLabel: TLabel; + DetailsGrid: TStringGrid; + DetailsPopupMenu: TPopupMenu; + DetailsCopyToClipboardItem: TMenuItem; + [FormSection('Plugins Tab')] + PluginsTabSheet: TTabSheet; + PluginsListView: TListView; + [FormSection('Plugins Popup Menu')] + PluginsPopupMenu: TPopupMenu; + AddToPatchItem: TMenuItem; + RemoveFromPatchItem: TMenuItem; + TagsItem: TMenuItem; + ManageTagsItem: TMenuItem; + ApplySettingTagsItem: TMenuItem; + ClearTagsItem: TMenuItem; + OpenPluginLocationItem: TMenuItem; + SmashSettingItem: TMenuItem; + [FormSection('Patches Tab')] + PatchesTabSheet: TTabSheet; + PatchesListView: TListView; + [FormSection('Patches Popup Menu')] + PatchesPopupMenu: TPopupMenu; + ToggleRebuildItem: TMenuItem; + OpenInExplorerItem: TMenuItem; + BuildPatchItem: TMenuItem; + EditPatchItem: TMenuItem; + RemoveUnloadedPluginsItem: TMenuItem; + DeletePatchItem: TMenuItem; + [FormSection('Move Submenu')] + MoveItem: TMenuItem; + UpItem: TMenuItem; + DownItem: TMenuItem; + ToTopItem: TMenuItem; + ToBottomItem: TMenuItem; + [FormSection('Log Tab')] + LogTabSheet: TTabSheet; + LogListView: TListView; + [FormSection('Log Popup Menu')] + LogPopupMenu: TPopupMenu; + FilterGroupItem: TMenuItem; + FilterLabelItem: TMenuItem; + CopyToClipboardItem: TMenuItem; + SaveAndClearItem: TMenuItem; + ToggleAutoScrollItem: TMenuItem; + [FormSection('Status Bar')] + StatusPanel: TPanel; + StatusPanelMessage: TPanel; + StatusPanelLanguage: TPanel; + StatusPanelVersion: TPanel; + ImageBuild: TImage; + bhLoadException: TBalloonHint; // SMASH FORM EVENTS procedure UpdateLog; @@ -106,7 +106,7 @@ TSmashForm = class(TForm) procedure LoaderStatus(s: string); procedure LoaderDone; procedure FormDestroy(Sender: TObject); - procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); + procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure SaveDone; procedure ProgressDone; function ShouldDisplay(bh: TBalloonHint): boolean; @@ -132,7 +132,8 @@ TSmashForm = class(TForm) Rect: TRect; State: TGridDrawState); // PLUGINS LIST VIEW EVENTS procedure UpdatePluginDetails; - procedure AddPluginToPatch(var plugin: TPlugin; var patch: TPatch; i: Integer); + procedure AddPluginToPatch(var plugin: TPlugin; var patch: TPatch; + i: Integer); procedure AddPluginsToPatch(var patch: TPatch); procedure ChangePatchSetting(aSetting: TSmashSetting); procedure PluginsListViewChange(Sender: TObject; Item: TListItem; @@ -179,7 +180,8 @@ TSmashForm = class(TForm) procedure ToBottomItemClick(Sender: TObject); // LOG LIST VIEW EVENTS procedure LogListViewData(Sender: TObject; Item: TListItem); - procedure LogListViewDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); + procedure LogListViewDrawItem(Sender: TCustomListView; Item: TListItem; + Rect: TRect; State: TOwnerDrawState); // LOG POPUP MENU EVENTS procedure LogPopupMenuPopup(Sender: TObject); procedure ToggleGroupFilter(Sender: TObject); @@ -222,9 +224,7 @@ TSmashForm = class(TForm) implementation {$R *.dfm} - - -{******************************************************************************} +{ ****************************************************************************** } { Patch Form Events Events for the Patch Form. - UpdateLog @@ -235,7 +235,7 @@ implementation - LoaderDone - FormClose } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.UpdateLog; var @@ -244,9 +244,10 @@ procedure TSmashForm.UpdateLog; LogListView.Items.Count := Log.Count; bLogActive := PageControl.ActivePage = LogTabSheet; // autoscroll if active - if bAutoScroll and bLogActive then begin - //LogListView.ClearSelection; - //LogListView.Items[Pred(LogListView.Items.Count)].MakeVisible(false); + if bAutoScroll and bLogActive then + begin + // LogListView.ClearSelection; + // LogListView.Items[Pred(LogListView.Items.Count)].MakeVisible(false); SendMessage(LogListView.Handle, WM_VSCROLL, SB_LINEDOWN, 0); end; // correct width if active @@ -259,14 +260,13 @@ procedure TSmashForm.LogMessage(const group, &label, text: string); var msg: TLogMessage; begin - msg := TLogMessage.Create( - FormatDateTime('hh:nn:ss', Now), - FormatDateTime('hh:nn:ss', Now - AppStartTime), - group, &label, text); + msg := TLogMessage.Create(FormatDateTime('hh:nn:ss', Now), + FormatDateTime('hh:nn:ss', Now - AppStartTime), group, &label, text); BaseLog.Add(msg); // if message is enabled, add to log - if MessageEnabled(msg) then begin + if MessageEnabled(msg) then + begin Log.Add(msg); // if patch form is created, update log list view if bCreated then @@ -332,15 +332,16 @@ procedure TSmashForm.FormCreate(Sender: TObject); AppStartTime := Now; InitLog; Logger.OnLogEvent := LogMessage; - //bAutoScroll := true; + // bAutoScroll := true; InitializeTaskbarAPI; SetTaskbarProgressState(tbpsIndeterminate); xEditLogGroup := 'LOAD'; xEditLogLabel := 'Plugins'; - wbProgressCallback := ProgressMessage; + _wbProgressCallback := ProgressMessage; StatusCallback := LoaderStatus; - if not InitBase then begin + if not InitBase then + begin ProgramStatus.bClose := true; exit; end; @@ -391,7 +392,8 @@ procedure TSmashForm.ToggleFormState(bEnabled: boolean); procedure TSmashForm.WMSize(var AMessage: TMessage); begin - if bCreated and (Now - LastMessageTime > MessageDelay) then begin + if bCreated and (Now - LastMessageTime > MessageDelay) then + begin LastMessageTime := Now; if (AMessage.WParam <> SIZE_MINIMIZED) then DisplayHints; @@ -401,7 +403,8 @@ procedure TSmashForm.WMSize(var AMessage: TMessage); procedure TSmashForm.WMMove(var AMessage: TMessage); begin - if bCreated and (Now - LastMessageTime > MessageDelay) then begin + if bCreated and (Now - LastMessageTime > MessageDelay) then + begin LastMessageTime := Now; if (AMessage.WParam <> SIZE_MINIMIZED) then DisplayHints; @@ -411,7 +414,8 @@ procedure TSmashForm.WMMove(var AMessage: TMessage); procedure TSmashForm.WMActivateApp(var AMessage: TMessage); begin - if bCreated and (Now - LastMessageTime > MessageDelay) then begin + if bCreated and (Now - LastMessageTime > MessageDelay) then + begin LastMessageTime := Now; if AMessage.WParam = 1 then DisplayHints @@ -430,18 +434,23 @@ procedure TSmashForm.InitDone; procedure TSmashForm.FormShow(Sender: TObject); begin // CLOSE IF PLUGIN SELECTION CANCELED - if ProgramStatus.bClose then begin + if ProgramStatus.bClose then + begin bClosing := true; Close; exit; end; // DISABLE GUI IF INITIALIZATION EXCEPTION - if ProgramStatus.bInitException then begin + if ProgramStatus.bInitException then + begin StatusPanelMessage.Caption := 'The application failed to initialize'; - Logger.Write('ERROR', 'Load', 'There was an exception initializing the application'); - Logger.Write('ERROR', 'Load', 'Review your log messages to resolve the issue'); - Logger.Write('ERROR', 'Load', 'You can also change the program''s settings, if necessary'); + Logger.Write('ERROR', 'Load', + 'There was an exception initializing the application'); + Logger.Write('ERROR', 'Load', + 'Review your log messages to resolve the issue'); + Logger.Write('ERROR', 'Load', + 'You can also change the program''s settings, if necessary'); PluginsTabSheet.Enabled := false; PluginsTabSheet.TabVisible := false; PatchesTabSheet.Enabled := false; @@ -473,9 +482,10 @@ procedure TSmashForm.FormShow(Sender: TObject); UpdatePatches; UpdatePluginsPopupMenu; UpdateStatusBar; - UpdateQuickBar; + UpdateQuickbar; - if not ProgramStatus.bInitException then begin + if not ProgramStatus.bInitException then + begin // START BACKGROUND LOADER LoaderCallback := LoaderDone; SetTaskbarProgressState(tbpsIndeterminate); @@ -494,7 +504,8 @@ procedure TSmashForm.FormShow(Sender: TObject); // initialize task handler TaskHandler := TTaskHandler.Create; bLogTasks := false; - TaskHandler.AddTask(TTask.Create('Disable Hints', 12.0 * seconds, DisableHints)); + TaskHandler.AddTask(TTask.Create('Disable Hints', 12.0 * seconds, + DisableHints)); TaskHandler.AddTask(TTask.Create('Refresh GUI', 3.0 * seconds, RefreshGUI)); TaskTimer.Enabled := true; end; @@ -519,21 +530,22 @@ procedure TSmashForm.LoaderDone; SetTaskbarProgressState(tbpsNone); xEditLogGroup := 'GENERAL'; xEditLogLabel := 'xEdit'; - FlashWindow(Application.Handle, True); + FlashWindow(Application.Handle, true); UpdateQuickbar; end; -procedure TSmashForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); +procedure TSmashForm.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin CanClose := ProgramStatus.bClose; - if not bClosing then begin + if not bClosing then + begin bClosing := true; Enabled := false; // show progress form - pForm := TProgressForm.Create(Self); - pForm.pfLogPath := LogPath + 'save\'; - pForm.PopupParent := Self; + pForm := TProgressForm.Create(self); + //pForm.pfLogPath := LogPath + 'save\'; + pForm.PopupParent := self; pForm.Caption := GetLanguageString('msProg_Closing'); pForm.SetMaxProgress(PluginsList.Count + PatchesList.Count + 2); pForm.Show; @@ -549,15 +561,17 @@ procedure TSmashForm.SaveDone; begin // clean up pForm, close form pForm.SetProgress(pForm.ProgressBar.Max); - pForm.SaveLog; + //pForm.SaveLog; pForm.Free; // restart program if update applied if ProgramStatus.bInstallUpdate then - ShellExecute(Application.Handle, 'runas', PChar(ParamStr(0)), '', '', SW_SHOWNORMAL); + ShellExecute(Application.Handle, 'runas', PChar(ParamStr(0)), '', '', + SW_SHOWNORMAL); // restart program if user wants patch profile change if ProgramStatus.bChangeProfile then - ShellExecute(Application.Handle, 'runas', PChar(ParamStr(0)), '', '', SW_SHOWNORMAL); + ShellExecute(Application.Handle, 'runas', PChar(ParamStr(0)), '', '', + SW_SHOWNORMAL); // allow close and close SaveLog(BaseLog); @@ -568,9 +582,9 @@ procedure TSmashForm.SaveDone; procedure TSmashForm.ProgressDone; begin xEditLogGroup := 'GENERAL'; - pForm.SaveLog; + //pForm.SaveLog; pForm.Visible := false; - FlashWindow(Application.Handle, True); + FlashWindow(Application.Handle, true); pForm.ShowModal; pForm.Free; Enabled := true; @@ -578,9 +592,12 @@ procedure TSmashForm.ProgressDone; SetForegroundWindow(Application.Handle); // free lists - if Assigned(timeCosts) then timeCosts.Free; - if Assigned(pluginsToHandle) then pluginsToHandle.Free; - if Assigned(patchesToBuild) then patchesToBuild.Free; + if Assigned(timeCosts) then + timeCosts.Free; + if Assigned(pluginsToHandle) then + pluginsToHandle.Free; + if Assigned(patchesToBuild) then + patchesToBuild.Free; // update patches and gui UpdateListViews; @@ -609,7 +626,8 @@ procedure TSmashForm.DisplayHints; var pt: TPoint; begin - if ProgramStatus.bLoadException and ShouldDisplay(bhLoadException) then begin + if ProgramStatus.bLoadException and ShouldDisplay(bhLoadException) then + begin pt.X := 126; pt.Y := 16; pt := MainPanel.ClientToScreen(pt); @@ -619,7 +637,8 @@ procedure TSmashForm.DisplayHints; procedure TSmashForm.RefreshGUI; begin - if not bClosing then UpdateStatusBar; + if not bClosing then + UpdateStatusBar; end; procedure TSmashForm.OnTaskTimer(Sender: TObject); @@ -636,11 +655,13 @@ procedure TSmashForm.UpdateStatusBar; procedure TSmashForm.UpdateListViews; begin - if PageControl.ActivePage = PluginsTabSheet then begin + if PageControl.ActivePage = PluginsTabSheet then + begin UpdatePluginDetails; PluginsListView.Repaint; end; - if PageControl.ActivePage = PatchesTabSheet then begin + if PageControl.ActivePage = PatchesTabSheet then + begin UpdatePatchDetails; PatchesListView.Repaint; end; @@ -648,7 +669,7 @@ procedure TSmashForm.UpdateListViews; LogListView.Repaint; end; -{******************************************************************************} +{ ****************************************************************************** } { Details Editor Events Methods for helping with the DetailsGrid control. Methods include: - AddDetailsItem @@ -656,10 +677,10 @@ procedure TSmashForm.UpdateListViews; - PageControlChange - UpdateApplicationDetails } -{******************************************************************************} +{ ****************************************************************************** } { - Adds a ListItem to DetailsView with @name and @value + Adds a ListItem to DetailsView with @name and @value } procedure TSmashForm.AddDetailsItem(name, value: string); begin @@ -672,9 +693,10 @@ procedure TSmashForm.AddDetailsItem(name, value: string); } procedure TSmashForm.AddDetailsList(name: string; sl: TStringList); var - i: integer; + i: Integer; begin - if sl.Count > 0 then begin + if sl.Count > 0 then + begin for i := 0 to Pred(sl.Count) do slDetails.Add(Format('%s[%d]=%s', [name, i, sl[i]])); end @@ -687,22 +709,25 @@ procedure TSmashForm.AddDetailsList(name: string; sl: TStringList); } procedure TSmashForm.PageControlChange(Sender: TObject); var - ndx: integer; + ndx: Integer; begin ndx := TPageControl(Sender).ActivePageIndex; case ndx of - 0: begin - UpdatePluginDetails; - ListView_CorrectWidth(PluginsListView); - end; - 1: begin - UpdatePatchDetails; - ListView_CorrectWidth(PatchesListView); - end; - 2: begin - UpdateApplicationDetails; - ListView_CorrectWidth(LogListView); - end; + 0: + begin + UpdatePluginDetails; + ListView_CorrectWidth(PluginsListView); + end; + 1: + begin + UpdatePatchDetails; + ListView_CorrectWidth(PatchesListView); + end; + 2: + begin + UpdateApplicationDetails; + ListView_CorrectWidth(LogListView); + end; end; end; @@ -715,22 +740,32 @@ procedure TSmashForm.UpdateApplicationDetails; // add details items AddDetailsItem(GetLanguageString('msMain_Application'), 'Mator Smash'); AddDetailsItem(GetLanguageString('msMain_Author'), 'matortheeternal'); + AddDetailsItem('v2 ' + GetLanguageString('msMain_Author'), 'chuckseven1'); AddDetailsItem(GetLanguageString('msMain_Version'), ProgramStatus.Version); - AddDetailsItem(GetLanguageString('msMain_DateBuilt'), DateTimeToStr(GetLastModified(ParamStr(0)))); + AddDetailsItem(GetLanguageString('msMain_DateBuilt'), + DateTimeToStr(GetLastModified(ParamStr(0)))); AddDetailsItem(' ', ' '); AddDetailsItem(GetLanguageString('msMain_GameMode'), wbGameName); AddDetailsItem(GetLanguageString('msMain_Language'), settings.language); AddDetailsItem(' ', ' '); - AddDetailsItem(GetLanguageString('msMain_TimesRun'), IntToStr(statistics.timesRun + sessionStatistics.timesRun)); - AddDetailsItem(GetLanguageString('msMain_PatchesBuilt'), IntToStr(statistics.patchesBuilt + sessionStatistics.patchesBuilt)); - AddDetailsItem(GetLanguageString('msMain_PluginsSmashed'), IntToStr(statistics.pluginsPatched + sessionStatistics.pluginsPatched)); - AddDetailsItem(GetLanguageString('msMain_SettingsSubmitted'), IntToStr(statistics.settingsSubmitted + sessionStatistics.settingsSubmitted)); - AddDetailsItem(GetLanguageString('msMain_RecsSubmitted'), IntToStr(statistics.recsSubmitted + sessionStatistics.recsSubmitted)); + AddDetailsItem(GetLanguageString('msMain_TimesRun'), + IntToStr(statistics.timesRun + sessionStatistics.timesRun)); + AddDetailsItem(GetLanguageString('msMain_PatchesBuilt'), + IntToStr(statistics.patchesBuilt + sessionStatistics.patchesBuilt)); + AddDetailsItem(GetLanguageString('msMain_PluginsSmashed'), + IntToStr(statistics.pluginsPatched + sessionStatistics.pluginsPatched)); + AddDetailsItem(GetLanguageString('msMain_SettingsSubmitted'), + IntToStr(statistics.settingsSubmitted + + sessionStatistics.settingsSubmitted)); + AddDetailsItem(GetLanguageString('msMain_RecsSubmitted'), + IntToStr(statistics.recsSubmitted + sessionStatistics.recsSubmitted)); AddDetailsItem(' ', ' '); AddDetailsItem(GetLanguageString('msMain_Website'), '-'); - AddDetailsItem(GetLanguageString('msMain_ApiCredits'), 'superobject, TurboPower Abbrevia, xEdit'); + AddDetailsItem(GetLanguageString('msMain_ApiCredits'), + 'superobject, TurboPower Abbrevia, LoggerPro, xEdit'); AddDetailsItem(GetLanguageString('msMain_xEditVersion'), xEditVersion); - AddDetailsItem(GetLanguageString('msMain_xEditCredits'), 'zilav, hlp, Sharlikran, ElminsterAU'); + AddDetailsItem(GetLanguageString('msMain_xEditCredits'), + 'zilav, hlp, Sharlikran, ElminsterAU'); AddDetailsItem(GetLanguageString('msMain_Testers'), ProgramTesters); AddDetailsItem(GetLanguageString('msMain_Translators'), ProgramTranslators); @@ -752,26 +787,29 @@ procedure TSmashForm.DetailsCopyToClipboardItemClick(Sender: TObject); // empty names and empty values name := ' '; value := ' '; - for i := 0 to Pred(slDetails.Count) do begin + for i := 0 to Pred(slDetails.Count) do + begin previousName := name; name := slDetails.Names[i]; previousValue := value; value := slDetails.ValueFromIndex[i]; if (name <> ' ') then sl.Add(Format('%s: %s', [name, value])) - else if (value <> ' ') then begin - if (previousName <> ' ') then begin + else if (value <> ' ') then + begin + if (previousName <> ' ') then + begin sl[sl.Count - 1] := previousName + ':'; - sl.Add('- '+previousValue); + sl.Add('- ' + previousValue); end; - sl.Add('- '+value); + sl.Add('- ' + value); end else sl.Add(' '); end; // copy to clipboard - Clipboard.AsText := sl.Text; + Clipboard.AsText := sl.text; sl.Free; end; @@ -785,7 +823,7 @@ procedure TSmashForm.DetailsPanelResize(Sender: TObject); procedure TSmashForm.DetailsGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var - ACol, ARow: integer; + ACol, ARow: Integer; value: string; begin // don't change cursor if in help mode @@ -794,7 +832,8 @@ procedure TSmashForm.DetailsGridMouseMove(Sender: TObject; Shift: TShiftState; DetailsGrid.MouseToCell(X, Y, ACol, ARow); // use default cursor on cells in column 0, or at an invalid cell - if (ACol = 0) or (ARow > Pred(slDetails.Count)) then begin + if (ACol = 0) or (ARow > Pred(slDetails.Count)) then + begin Screen.Cursor := crDefault; exit; end; @@ -811,7 +850,7 @@ procedure TSmashForm.DetailsGridMouseMove(Sender: TObject; Shift: TShiftState; procedure TSmashForm.DetailsGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var - ACol, ARow: integer; + ACol, ARow: Integer; value: string; begin // only process left clicks @@ -825,7 +864,8 @@ procedure TSmashForm.DetailsGridMouseUp(Sender: TObject; Button: TMouseButton; try value := slDetails.ValueFromIndex[ARow]; - if IsURL(value) and ((Now - LastURLTime) * 86400 > 1.0) then begin + if IsURL(value) and ((Now - LastURLTime) * 86400 > 1.0) then + begin ShellExecute(0, 'open', PChar(value), '', '', SW_SHOWNORMAL); LastURLTime := Now; end; @@ -849,8 +889,9 @@ procedure TSmashForm.DetailsGridDrawCell(Sender: TObject; ACol, ARow: Integer; DetailsGrid.Font.Color := clBlack; // draw name - if ACol = 0 then begin - DetailsGrid.Canvas.Brush.Color := TColor($00f6f4f3); + if ACol = 0 then + begin + DetailsGrid.Canvas.Brush.Color := TColor($00F6F4F3); DetailsGrid.Canvas.Rectangle(Rect); DetailsGrid.Canvas.Brush.Color := clWindow; DetailsGrid.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, iHalfBottom); @@ -863,26 +904,31 @@ procedure TSmashForm.DetailsGridDrawCell(Sender: TObject; ACol, ARow: Integer; exit; DetailsGrid.Canvas.Brush.Style := bsClear; - DetailsGrid.Canvas.TextOut(Rect.Left + 4, Rect.Top + (iPadding div 2), sText); + DetailsGrid.Canvas.TextOut(Rect.Left + 4, + Rect.Top + (iPadding div 2), sText); end // draw value - else if ACol = 1 then begin + else if ACol = 1 then + begin DetailsGrid.Canvas.Brush.Color := clWindow; DetailsGrid.Canvas.Rectangle(Rect); if Assigned(slDetails) and (slDetails.Count > ARow) then sText := slDetails.ValueFromIndex[ARow]; // handle special drawing of urls and master files - if (Pred(slDetails.Count) > ARow) then begin + if (Pred(slDetails.Count) > ARow) then + begin sNextVal := slDetails.ValueFromIndex[ARow + 1]; sNextName := slDetails.Names[ARow + 1]; // urls blue and underlined - if IsURL(sNextVal) then begin + if IsURL(sNextVal) then + begin DetailsGrid.Font.Style := [fsUnderline]; DetailsGrid.Font.Color := clBlue; end // esps and esms red if not loaded - else if Pos('Plugins[', sNextName) = 1 then begin + else if Pos('Plugins[', sNextName) = 1 then + begin if not Assigned(PluginByFileName(sNextVal)) then DetailsGrid.Font.Color := clRed; end; @@ -890,11 +936,12 @@ procedure TSmashForm.DetailsGridDrawCell(Sender: TObject; ACol, ARow: Integer; // draw text DetailsGrid.Canvas.Brush.Style := bsClear; - DetailsGrid.Canvas.TextOut(Rect.Left + 4, Rect.Top + (iPadding div 2), sText); + DetailsGrid.Canvas.TextOut(Rect.Left + 4, + Rect.Top + (iPadding div 2), sText); end; end; -{******************************************************************************} +{ ****************************************************************************** } { PluginsListView Events Events involving the PluginsListView control. Events include: - UpdatePluginDetails @@ -906,12 +953,12 @@ procedure TSmashForm.DetailsGridDrawCell(Sender: TObject; ACol, ARow: Integer; - PluginsListViewDrawItem - PluginsListViewMouseMove } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.UpdatePluginDetails; var plugin: TPlugin; - index: integer; + index: Integer; begin // don't do anything if no item selected if not Assigned(PluginsListView.Selected) then @@ -924,17 +971,21 @@ procedure TSmashForm.UpdatePluginDetails; // get plugin information index := PluginsListView.ItemIndex; plugin := TPlugin(PluginsList[index]); - if not plugin.hasData then plugin.GetData(PluginsList); + if not plugin.hasData then + plugin.GetData(PluginsList); // add details items AddDetailsItem(GetLanguageString('msMain_Filename'), plugin.filename); AddDetailsItem(GetLanguageString('msMain_Hash'), '$' + plugin.hash); - AddDetailsItem(GetLanguageString('msMain_FileSize'), FormatByteSize(plugin.fileSize)); + AddDetailsItem(GetLanguageString('msMain_FileSize'), + FormatByteSize(plugin.fileSize)); AddDetailsItem(GetLanguageString('msMain_DateModified'), plugin.dateModified); - AddDetailsItem(GetLanguageString('msMain_NumRecords'), IntToStr(plugin.numRecords)); - AddDetailsItem(GetLanguageString('msMain_NumOverrides'), IntToStr(plugin.numOverrides)); + AddDetailsItem(GetLanguageString('msMain_NumRecords'), + IntToStr(plugin.numRecords)); + AddDetailsItem(GetLanguageString('msMain_NumOverrides'), + IntToStr(plugin.numOverrides)); AddDetailsItem(GetLanguageString('msMain_Author'), plugin.author); - AddDetailsList(GetLanguageString('msMain_Description'), plugin.description); + AddDetailsList(GetLanguageString('msMain_Description'), plugin.Description); AddDetailsList(GetLanguageString('msMain_Masters'), plugin.masters); // update gui @@ -950,7 +1001,8 @@ procedure TSmashForm.ChangePatchSetting(aSetting: TSmashSetting); plugin: TPlugin; begin // loop through plugins list, adding selected plugins to patch - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin ListItem := PluginsListView.Items[i]; if not ListItem.Selected then continue; @@ -966,9 +1018,11 @@ procedure TSmashForm.ChangePatchSetting(aSetting: TSmashSetting); UpdateStatusBar; end; -procedure TSmashForm.AddPluginToPatch(var plugin: TPlugin; var patch: TPatch; i: Integer); +procedure TSmashForm.AddPluginToPatch(var plugin: TPlugin; var patch: TPatch; + i: Integer); begin - Logger.Write('PLUGIN', 'Patch', 'Added '+plugin.filename+' to patch '+patch.name); + Logger.Write('PLUGIN', 'Patch', 'Added ' + plugin.filename + ' to patch ' + + patch.name); if not plugin.hasData then plugin.GetData(PluginsList); if plugin.patch = patch.name then @@ -979,12 +1033,13 @@ procedure TSmashForm.AddPluginToPatch(var plugin: TPlugin; var patch: TPatch; i: procedure TSmashForm.AddPluginsToPatch(var patch: TPatch); var - i: integer; + i: Integer; ListItem: TListItem; plugin: TPlugin; begin // loop through plugins list, adding selected plugins to patch - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin ListItem := PluginsListView.Items[i]; if not ListItem.Selected then continue; @@ -1011,48 +1066,53 @@ procedure TSmashForm.PluginsListViewData(Sender: TObject; Item: TListItem); var plugin: TPlugin; begin - if Item.Index > Pred(PluginsList.Count) then + if Item.index > Pred(PluginsList.Count) then exit; - plugin := TPlugin(PluginsList[Item.Index]); - Item.Caption := IntToHex(Item.Index, 2); + plugin := TPlugin(PluginsList[Item.index]); + Item.Caption := IntToHex(Item.index, 2); Item.SubItems.Add(plugin.filename); Item.SubItems.Add(plugin.setting); Item.SubItems.Add(plugin.patch); if Assigned(plugin.smashSetting) then - PluginsListView.Canvas.Font.Color := plugin.smashSetting.color + PluginsListView.Canvas.Font.Color := plugin.smashSetting.Color else PluginsListView.Canvas.Font.Color := clGray; - PluginsListView.Canvas.Font.Style := PluginsListView.Canvas.Font.Style + [fsBold]; + PluginsListView.Canvas.Font.Style := PluginsListView.Canvas.Font.Style + + [fsBold]; end; procedure TSmashForm.PluginsListViewDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var - i, x, y: integer; + i, X, Y: Integer; ListView: TListView; R: TRect; begin ListView := TListView(Sender); - if Item.Selected then begin + if Item.Selected then + begin ListView.Canvas.Brush.Color := $FFEEDD; ListView.Canvas.FillRect(Rect); end; R := Rect; R.Right := R.Left + ListView.Columns[0].Width - 3; - x := Rect.Left + 3; - y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + Rect.Top; - ListView.Canvas.TextRect(R, x, y, Item.Caption); - for i := 0 to Item.SubItems.Count - 1 do begin + X := Rect.Left + 3; + Y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + + Rect.Top; + ListView.Canvas.TextRect(R, X, Y, Item.Caption); + for i := 0 to Item.SubItems.Count - 1 do + begin R.Left := R.Right + 3; // fixes drawing bug - R.Right := R.Left + ListView_GetColumnWidth(ListView.Handle, ListView.Columns[i + 1].Index); - x := R.Left; - ListView.Canvas.TextRect(R, x, y, Item.SubItems[i]); + R.Right := R.Left + ListView_GetColumnWidth(ListView.Handle, + ListView.Columns[i + 1].index); + X := R.Left; + ListView.Canvas.TextRect(R, X, Y, Item.SubItems[i]); end; end; -{******************************************************************************} +{ ****************************************************************************** } { Plugins Popup Menu methods Methods for dealing with the popup menu for the PluginsListView. - PluginsPopupMenuPopup @@ -1062,11 +1122,11 @@ procedure TSmashForm.PluginsListViewDrawItem(Sender: TCustomListView; - CheckForErrorsClick - RemoveFromPatchClick } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.PluginsPopupMenuPopup(Sender: TObject); var - i: integer; + i: Integer; bPluginInPatch, bHasSelection, bAllPluginsInPatch, bAllHaveTags: boolean; ListItem: TListItem; plugin: TPlugin; @@ -1078,7 +1138,8 @@ procedure TSmashForm.PluginsPopupMenuPopup(Sender: TObject); bAllHaveTags := true; // loop through selection - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin ListItem := PluginsListView.Items[i]; if not ListItem.Selected then continue; @@ -1118,7 +1179,8 @@ procedure TSmashForm.UpdatePluginsPopupMenu; AddToPatchItem.Add(MenuItem); // add patches to submenu - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); MenuItem := TMenuItem.Create(AddToPatchItem); MenuItem.Caption := patch.name; @@ -1127,7 +1189,8 @@ procedure TSmashForm.UpdatePluginsPopupMenu; end; // add smash settings to submenu - for i := 0 to Pred(SmashSettings.Count) do begin + for i := 0 to Pred(SmashSettings.Count) do + begin aSetting := TSmashSetting(SmashSettings[i]); // parse setting group @@ -1138,7 +1201,8 @@ procedure TSmashForm.UpdatePluginsPopupMenu; // get group menu item or create it if missing GroupItem := SmashSettingItem.Find(sGroup); - if not Assigned(GroupItem) then begin + if not Assigned(GroupItem) then + begin GroupItem := TMenuItem.Create(SmashSettingItem); GroupItem.Caption := sGroup; SmashSettingItem.Add(GroupItem); @@ -1163,9 +1227,10 @@ procedure TSmashForm.AddToPatchClick(Sender: TObject); patch := TPatchHelpers.PatchByName(PatchesList, name); if Assigned(patch) then AddPluginsToPatch(patch) - else begin + else + begin ToggleFormState(false); - ShowMessage('Error: Could not find patch '+name); + ShowMessage('Error: Could not find patch ' + name); ToggleFormState(true); end; @@ -1182,9 +1247,10 @@ procedure TSmashForm.ChangeSettingClick(Sender: TObject); aSetting := TSettingHelpers.SettingByName(name); if Assigned(aSetting) then ChangePatchSetting(aSetting) - else begin + else + begin ToggleFormState(false); - ShowMessage('Error: Could not find setting '+name); + ShowMessage('Error: Could not find setting ' + name); ToggleFormState(true); end; end; @@ -1200,12 +1266,13 @@ procedure TSmashForm.AddToNewPatchClick(Sender: TObject); procedure TSmashForm.ManageTagsItemClick(Sender: TObject); var - i: integer; + i: Integer; ListItem: TListItem; tmForm: TTagManager; plugin: TPlugin; begin - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin // only process selected list items ListItem := PluginsListView.Items[i]; if not ListItem.Selected then @@ -1231,11 +1298,12 @@ procedure TSmashForm.ManageTagsItemClick(Sender: TObject); procedure TSmashForm.ApplySettingTagsItemClick(Sender: TObject); var - i: integer; + i: Integer; ListItem: TListItem; plugin: TPlugin; begin - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin // only process selected list items ListItem := PluginsListView.Items[i]; if not ListItem.Selected then @@ -1256,12 +1324,12 @@ procedure TSmashForm.ApplySettingTagsItemClick(Sender: TObject); procedure TSmashForm.ClearTagsItemClick(Sender: TObject); var - i: integer; + i: Integer; ListItem: TListItem; pluginNames: String; plugin: TPlugin; pluginsToClear: TList; - bApproved: Boolean; + bApproved: boolean; frmDialog: TForm; begin // initialize variables @@ -1272,9 +1340,11 @@ procedure TSmashForm.ClearTagsItemClick(Sender: TObject); // use a try-finally to make certain the list is freed try // add selected list items to the list - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin ListItem := PluginsListView.Items[i]; - if ListItem.Selected then begin + if ListItem.Selected then + begin plugin := TPlugin(PluginsList[i]); pluginsToClear.Add(plugin); pluginNames := pluginNames + #13#10' - ' + plugin.filename; @@ -1282,7 +1352,8 @@ procedure TSmashForm.ClearTagsItemClick(Sender: TObject); end; // prompt user if a plugin was selected - if pluginsToClear.Count > 0 then begin + if pluginsToClear.Count > 0 then + begin frmDialog := CreateMessageDialog(GetLanguageString('msMain_ClearTags') + pluginNames, mtConfirmation, mbOKCancel, mbOk); frmDialog.PopupParent := self; @@ -1296,10 +1367,11 @@ procedure TSmashForm.ClearTagsItemClick(Sender: TObject); exit; // clear tags on plugins in the list - for i := 0 to Pred(pluginsToClear.Count) do begin + for i := 0 to Pred(pluginsToClear.Count) do + begin plugin := TPlugin(pluginsToClear[i]); - Logger.Write('PLUGIN', 'Tags', 'Clearing tags on '+plugin.filename); - plugin.description.Text := ClearTags(plugin.description.Text); + Logger.Write('PLUGIN', 'Tags', 'Clearing tags on ' + plugin.filename); + plugin.Description.text := ClearTags(plugin.Description.text); plugin.GetSettingTag; plugin.WriteDescription; // plugin.Save; @@ -1318,13 +1390,14 @@ procedure TSmashForm.ClearTagsItemClick(Sender: TObject); { Remove from Patch } procedure TSmashForm.RemoveFromPatchItemClick(Sender: TObject); var - i: integer; + i: Integer; ListItem: TListItem; pluginName, patchName: string; patch: TPatch; plugin: TPlugin; begin - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin // only process selected list items ListItem := PluginsListView.Items[i]; if not ListItem.Selected then @@ -1334,7 +1407,8 @@ procedure TSmashForm.RemoveFromPatchItemClick(Sender: TObject); plugin := TPlugin(PluginsList[i]); pluginName := plugin.filename; patchName := plugin.patch; - if patchName <> ' ' then begin + if patchName <> ' ' then + begin patch := TPatchHelpers.PatchByName(PatchesList, patchName); if Assigned(patch) then patch.plugins.Delete(patch.plugins.IndexOf(pluginName)); @@ -1351,11 +1425,12 @@ procedure TSmashForm.RemoveFromPatchItemClick(Sender: TObject); procedure TSmashForm.OpenPluginLocationItemClick(Sender: TObject); var - i: integer; - listItem: TListItem; + i: Integer; + ListItem: TListItem; plugin: TPlugin; begin - for i := 0 to Pred(PluginsListView.Items.Count) do begin + for i := 0 to Pred(PluginsListView.Items.Count) do + begin // only process selected list items ListItem := PluginsListView.Items[i]; if not ListItem.Selected then @@ -1368,7 +1443,7 @@ procedure TSmashForm.OpenPluginLocationItemClick(Sender: TObject); end; end; -{******************************************************************************} +{ ****************************************************************************** } { Patch List View Events Events involving the PatchesListView control. Events include: - UpdatePatchDetails @@ -1378,7 +1453,7 @@ procedure TSmashForm.OpenPluginLocationItemClick(Sender: TObject); - PatchesListViewDrawItem - SavePatchEdit } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.UpdatePatchDetails; var @@ -1396,17 +1471,21 @@ procedure TSmashForm.UpdatePatchDetails; // get patch information patch := PatchesList[PatchesListView.ItemIndex]; - AddDetailsItem(GetLanguageString('msMain_Status'), StatusArray[Ord(patch.status)].desc); + AddDetailsItem(GetLanguageString('msMain_Status'), + StatusArray[Ord(patch.status)].desc); AddDetailsItem(GetLanguageString('msMain_PatchName'), patch.name); AddDetailsItem(GetLanguageString('msMain_Filename'), patch.filename); - AddDetailsItem(GetLanguageString('msMain_PluginCount'), IntToStr(patch.plugins.Count)); - AddDetailsItem(GetLanguageString('msMain_DateBuilt'), DateBuiltString(patch.dateBuilt)); + AddDetailsItem(GetLanguageString('msMain_PluginCount'), + IntToStr(patch.plugins.Count)); + AddDetailsItem(GetLanguageString('msMain_DateBuilt'), + DateBuiltString(patch.dateBuilt)); AddDetailsList(GetLanguageString('msMain_Plugins'), patch.plugins); AddDetailsItem(' ', ' '); if patch.fails.Count < 250 then AddDetailsList(GetLanguageString('msMain_Fails'), patch.fails) else - AddDetailsItem(GetLanguageString('msMain_Fails'), GetLanguageString('msMain_TooManyFails')); + AddDetailsItem(GetLanguageString('msMain_Fails'), + GetLanguageString('msMain_TooManyFails')); // update gui StringGrid_CorrectWidth(DetailsGrid); @@ -1416,19 +1495,20 @@ procedure TSmashForm.UpdatePatchDetails; procedure TSmashForm.UpdatePatches; var - i: integer; + i: Integer; patch: TPatch; begin // update patch count PatchesListView.Items.Count := PatchesList.Count; - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); // sort plugins in patch patch.SortPlugins; // get status of each patch - if not ((patch.status in ForcedStatuses) - or (patch.status in FailedStatuses)) then + if not((patch.status in ForcedStatuses) or (patch.status in FailedStatuses)) + then patch.GetStatus; end; end; @@ -1442,11 +1522,12 @@ function TSmashForm.NewPatch: TPatch; patch := TPatchHelpers.CreateNewPatch(PatchesList); // edit patch immediately after its creation - EditPatch := TEditForm.Create(Self); + EditPatch := TEditForm.Create(self); EditPatch.patch := patch; - if EditPatch.ShowModal = mrOk then begin + if EditPatch.ShowModal = mrOk then + begin patch := EditPatch.patch; - LogMessage('PATCH', 'New', 'Created new patch '+patch.name); + LogMessage('PATCH', 'New', 'Created new patch ' + patch.name); // add patch to list and update views PatchesList.Add(patch); UpdatePatches; @@ -1470,58 +1551,62 @@ procedure TSmashForm.PatchesListViewData(Sender: TObject; Item: TListItem); var patch: TPatch; begin - if Item.Index > Pred(PatchesList.Count) then + if Item.index > Pred(PatchesList.Count) then exit; - patch := TPatch(PatchesList[Item.Index]); - Item.Caption := IntToHex(Item.Index, 2); + patch := TPatch(PatchesList[Item.index]); + Item.Caption := IntToHex(Item.index, 2); Item.SubItems.Add(patch.name); Item.SubItems.Add(patch.filename); - Item.SubItems.Add(IntToStr(patch.plugins.count)); + Item.SubItems.Add(IntToStr(patch.plugins.Count)); Item.SubItems.Add(DateBuiltString(patch.dateBuilt)); - PatchesListView.Canvas.Font.Color := StatusArray[Ord(patch.status)].color; - PatchesListView.Canvas.Font.Style := PatchesListView.Canvas.Font.Style + [fsBold]; + PatchesListView.Canvas.Font.Color := StatusArray[Ord(patch.status)].Color; + PatchesListView.Canvas.Font.Style := PatchesListView.Canvas.Font.Style + + [fsBold]; end; procedure TSmashForm.PatchesListViewDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var - i, x, y: integer; + i, X, Y: Integer; ListView: TListView; R: TRect; begin ListView := TListView(Sender); - if Item.Selected then begin + if Item.Selected then + begin ListView.Canvas.Brush.Color := $FFEEDD; ListView.Canvas.FillRect(Rect); end; R := Rect; R.Right := R.Left + ListView.Columns[0].Width - 3; - x := Rect.Left + 3; - y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + Rect.Top; - ListView.Canvas.TextRect(R, x, y, Item.Caption); - for i := 0 to Item.SubItems.Count - 1 do begin + X := Rect.Left + 3; + Y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + + Rect.Top; + ListView.Canvas.TextRect(R, X, Y, Item.Caption); + for i := 0 to Item.SubItems.Count - 1 do + begin R.Left := R.Right + 3; // fixes drawing error - R.Right := R.Left + ListView_GetColumnWidth(ListView.Handle, ListView.Columns[i + 1].Index); - x := R.Left; - ListView.Canvas.TextRect(R, x, y, Item.SubItems[i]); + R.Right := R.Left + ListView_GetColumnWidth(ListView.Handle, + ListView.Columns[i + 1].index); + X := R.Left; + ListView.Canvas.TextRect(R, X, Y, Item.SubItems[i]); end; end; - -{******************************************************************************} +{ ****************************************************************************** } { LogListView methods } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.LogListViewData(Sender: TObject; Item: TListItem); var msg: TLogMessage; begin - if (Item.Index > Pred(Log.Count)) then + if (Item.index > Pred(Log.Count)) then exit; - msg := TLogMessage(Log[Item.Index]); + msg := TLogMessage(Log[Item.index]); Item.Caption := msg.time; Item.SubItems.Add(msg.appTime); Item.SubItems.Add(msg.group); @@ -1546,14 +1631,15 @@ procedure TSmashForm.LogListViewData(Sender: TObject; Item: TListItem); procedure TSmashForm.LogListViewDrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var - i, x, y: integer; + i, X, Y: Integer; ListView: TListView; R: TRect; msg: string; map: TStringList; begin ListView := TListView(Sender); - if Item.Selected then begin + if Item.Selected then + begin ListView.Canvas.Brush.Color := $FFEEDD; ListView.Canvas.FillRect(Rect); end; @@ -1567,19 +1653,19 @@ procedure TSmashForm.LogListViewDrawItem(Sender: TCustomListView; // prepare text rect R := Rect; R.Right := R.Left + ListView.Width - 3; - x := Rect.Left + 3; - y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + Rect.Top; + X := Rect.Left + 3; + Y := (Rect.Bottom - Rect.Top - ListView.Canvas.TextHeight('Hg')) div 2 + + Rect.Top; // draw message msg := ApplyTemplate(settings.logMessageTemplate, map); - ListView.Canvas.TextRect(R, x, y, msg); + ListView.Canvas.TextRect(R, X, Y, msg); // clean up map.Free; end; - -{******************************************************************************} +{ ****************************************************************************** } { Log Popup Menu events - LogPopupMenuPopup - FilterInitItemClick @@ -1590,55 +1676,61 @@ procedure TSmashForm.LogListViewDrawItem(Sender: TCustomListView; - CopyToClipboardItemClick - SaveAndClearItemClick } -{******************************************************************************} +{ ****************************************************************************** } function EnableStr(var b: boolean): string; begin - Result := IfThen(not b, GetLanguageString('msMain_Enable'), GetLanguageString('msMain_Disable')); + Result := IfThen(not b, GetLanguageString('msMain_Enable'), + GetLanguageString('msMain_Disable')); end; procedure TSmashForm.LogPopupMenuPopup(Sender: TObject); var i: Integer; - item: TMenuItem; + Item: TMenuItem; filter: TFilter; begin // rebuild group filter items FilterGroupItem.Clear; - for i := 0 to Pred(GroupFilters.Count) do begin + for i := 0 to Pred(GroupFilters.Count) do + begin filter := TFilter(GroupFilters[i]); - item := TMenuItem.Create(FilterGroupItem); - item.Caption := EnableStr(filter.enabled) + ' ' + filter.group; - item.OnClick := ToggleGroupFilter; - FilterGroupItem.Add(item); + Item := TMenuItem.Create(FilterGroupItem); + Item.Caption := EnableStr(filter.Enabled) + ' ' + filter.group; + Item.OnClick := ToggleGroupFilter; + FilterGroupItem.Add(Item); end; // rebuild label filter items FilterLabelItem.Clear; - for i := 0 to Pred(LabelFilters.Count) do begin + for i := 0 to Pred(LabelFilters.Count) do + begin filter := TFilter(LabelFilters[i]); - item := TMenuItem.Create(FilterLabelItem); - item.Caption := Format('%s %s, %s', [EnableStr(filter.enabled), filter.group, filter.&label]); - item.OnClick := ToggleLabelFilter; - FilterLabelItem.Add(item); + Item := TMenuItem.Create(FilterLabelItem); + Item.Caption := Format('%s %s, %s', [EnableStr(filter.Enabled), + filter.group, filter.&label]); + Item.OnClick := ToggleLabelFilter; + FilterLabelItem.Add(Item); end; // toggle copy to clipboard item based on whether or not log items are selected CopyToClipboardItem.Enabled := Assigned(LogListView.Selected); // rename toggle auto scroll item based on whether or not auto scroll is enabled - ToggleAutoScrollItem.Caption := Format('%s %s', [EnableStr(bAutoScroll), GetLanguageString('msMain_AutoScroll')]); + ToggleAutoScrollItem.Caption := + Format('%s %s', [EnableStr(bAutoScroll), + GetLanguageString('msMain_AutoScroll')]); end; // toggles a group filter for the LogListView procedure TSmashForm.ToggleGroupFilter(Sender: TObject); var - index: integer; + index: Integer; filter: TFilter; begin index := FilterGroupItem.IndexOf(TMenuItem(Sender)); filter := GroupFilters[index]; - filter.enabled := not filter.enabled; + filter.Enabled := not filter.Enabled; LogListView.Items.Count := 0; RebuildLog; LogListView.Items.Count := Log.Count; @@ -1648,12 +1740,12 @@ procedure TSmashForm.ToggleGroupFilter(Sender: TObject); // toggles a label filter for the LogListView procedure TSmashForm.ToggleLabelFilter(Sender: TObject); var - index: integer; + index: Integer; filter: TFilter; begin index := FilterLabelItem.IndexOf(TMenuItem(Sender)); filter := LabelFilters[index]; - filter.enabled := not filter.enabled; + filter.Enabled := not filter.Enabled; LogListView.Items.Count := 0; RebuildLog; LogListView.Items.Count := Log.Count; @@ -1675,16 +1767,18 @@ procedure TSmashForm.CopyToClipboardItemClick(Sender: TObject); sl := TStringList.Create; // put selected messages in stringlist - for i := 0 to Pred(Log.Count) do begin + for i := 0 to Pred(Log.Count) do + begin if not LogListView.Items[i].Selected then continue; msg := TLogMessage(Log[i]); - sl.Add(Format('[%s] (%s) %s: %s', [msg.time, msg.group, msg.&label, msg.text])); + sl.Add(Format('[%s] (%s) %s: %s', [msg.time, msg.group, msg.&label, + msg.text])); end; // put stringlist in clipboard, then free - Clipboard.AsText := sl.Text; + Clipboard.AsText := sl.text; sl.Free; end; @@ -1697,8 +1791,7 @@ procedure TSmashForm.SaveAndClearItemClick(Sender: TObject); LogMessage('GENERAL', 'Log', 'Saved and cleared log.'); end; - -{******************************************************************************} +{ ****************************************************************************** } { PatchesPopupMenu methods Methods for dealing with the popup menu for the PatchesListView. - PatchesPopupMenuPopup @@ -1713,12 +1806,12 @@ procedure TSmashForm.SaveAndClearItemClick(Sender: TObject); - PatchesListViewDblClick - PatchesListViewKeyDown } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.PatchesPopupMenuPopup(Sender: TObject); var - bNeverBuilt, bHasBuildStatus, bHasUpToDateStatus, bHasSelection, - bIsNotTop, bIsNotBottom: boolean; + bNeverBuilt, bHasBuildStatus, bHasUpToDateStatus, bHasSelection, bIsNotTop, + bIsNotBottom: boolean; patch: TPatch; i, patchesSelected: Integer; sBuild, sRebuild: string; @@ -1731,17 +1824,21 @@ procedure TSmashForm.PatchesPopupMenuPopup(Sender: TObject); patchesSelected := 0; // loop through list view to find selection - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); Inc(patchesSelected); // update booleans - if i = 0 then bIsNotTop := false; - if i = Pred(PatchesList.Count) then bIsNotBottom := false; + if i = 0 then + bIsNotTop := false; + if i = Pred(PatchesList.Count) then + bIsNotBottom := false; bNeverBuilt := bNeverBuilt or (patch.dateBuilt = 0); bHasBuildStatus := bHasBuildStatus or (patch.status in BuildStatuses); - bHasUpToDateStatus := bHasUpToDateStatus or (patch.status in UpToDateStatuses); + bHasUpToDateStatus := bHasUpToDateStatus or + (patch.status in UpToDateStatuses); end; bHasSelection := (patchesSelected > 0); @@ -1760,11 +1857,13 @@ procedure TSmashForm.PatchesPopupMenuPopup(Sender: TObject); ToBottomItem.Enabled := bHasSelection and bIsNotBottom; // one or multiple patchs? - if (patchesSelected = 1) then begin + if (patchesSelected = 1) then + begin sBuild := 'msMain_BuildPatch'; sRebuild := 'msMain_RebuildPatch'; end - else begin + else + begin sBuild := 'msMain_BuildPatches'; sRebuild := 'msMain_RebuildPatches'; end; @@ -1773,7 +1872,8 @@ procedure TSmashForm.PatchesPopupMenuPopup(Sender: TObject); BuildPatchItem.Caption := GetLanguageString(sBuild) else if bHasBuildStatus then BuildPatchItem.Caption := GetLanguageString(sRebuild) - else begin + else + begin BuildPatchItem.Enabled := false; BuildPatchItem.Caption := GetLanguageString(sRebuild); end; @@ -1782,24 +1882,27 @@ procedure TSmashForm.PatchesPopupMenuPopup(Sender: TObject); procedure TSmashForm.EditPatchItemClick(Sender: TObject); var EditPatch: TEditForm; - i, j: integer; + i, j: Integer; plugin: TPlugin; patch: TPatch; begin // loop through patches - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); - Logger.Write('PATCH', 'Edit', 'Editing '+patch.name); + Logger.Write('PATCH', 'Edit', 'Editing ' + patch.name); // create EditForm - EditPatch := TEditForm.Create(Self); + EditPatch := TEditForm.Create(self); EditPatch.patch := patch; - if EditPatch.ShowModal = mrOk then begin + if EditPatch.ShowModal = mrOk then + begin patch := EditPatch.patch; // update plugin.patch properties - for j := 0 to Pred(patch.plugins.Count) do begin - plugin := PluginByFilename(patch.plugins[j]); + for j := 0 to Pred(patch.plugins.Count) do + begin + plugin := PluginByFileName(patch.plugins[j]); if Assigned(plugin) then plugin.patch := patch.name; end; @@ -1817,16 +1920,17 @@ procedure TSmashForm.EditPatchItemClick(Sender: TObject); procedure TSmashForm.UpItemClick(Sender: TObject); var - i, max: Integer; + i, Max: Integer; begin - max := Pred(PatchesListView.Items.Count); + Max := Pred(PatchesListView.Items.Count); // if patch at index 0 is selected, exit // we can't move it up! if PatchesListView.Items[0].Selected then exit; // loop through patches - for i := 0 to max do begin + for i := 0 to Max do + begin if not PatchesListView.Items[i].Selected then continue; PatchesList.Move(i, i - 1); @@ -1840,17 +1944,18 @@ procedure TSmashForm.UpItemClick(Sender: TObject); procedure TSmashForm.DownItemClick(Sender: TObject); var - i, max: Integer; + i, Max: Integer; begin - max := Pred(PatchesListView.Items.Count); + Max := Pred(PatchesListView.Items.Count); // if patch at max index is selected, exit // we can't move it down! - if PatchesListView.Items[max].Selected then + if PatchesListView.Items[Max].Selected then exit; // loop through patches in reverse so we don't move the same patch // multiple times - for i := max downto 0 do begin + for i := Max downto 0 do + begin if not PatchesListView.Items[i].Selected then continue; PatchesList.Move(i, i + 1); @@ -1864,10 +1969,10 @@ procedure TSmashForm.DownItemClick(Sender: TObject); procedure TSmashForm.ToTopItemClick(Sender: TObject); var - i, max, iIndex: Integer; + i, Max, iIndex: Integer; tempList: TList; begin - max := Pred(PatchesListView.Items.Count); + Max := Pred(PatchesListView.Items.Count); // if patch at index 0 is selected, exit // we can't move it up! if PatchesListView.Items[0].Selected then @@ -1878,11 +1983,14 @@ procedure TSmashForm.ToTopItemClick(Sender: TObject); // loop through patches to build new list iIndex := 0; - for i := 0 to max do begin - if not PatchesListView.Items[i].Selected then begin + for i := 0 to Max do + begin + if not PatchesListView.Items[i].Selected then + begin tempList.Add(PatchesList[i]); end - else begin + else + begin tempList.Insert(iIndex, PatchesList[i]); Inc(iIndex); end; @@ -1890,11 +1998,12 @@ procedure TSmashForm.ToTopItemClick(Sender: TObject); // set PatchesList to tempList PatchesList.Clear; - for i := 0 to max do PatchesList.Add(tempList[i]); + for i := 0 to Max do + PatchesList.Add(tempList[i]); tempList.Free; // update selection - for i := 0 to max do + for i := 0 to Max do PatchesListView.Items[i].Selected := i < iIndex; // update gui @@ -1903,13 +2012,13 @@ procedure TSmashForm.ToTopItemClick(Sender: TObject); procedure TSmashForm.ToBottomItemClick(Sender: TObject); var - i, max, iIndex: Integer; + i, Max, iIndex: Integer; tempList: TList; begin - max := Pred(PatchesListView.Items.Count); + Max := Pred(PatchesListView.Items.Count); // if patch at max index is selected, exit // we can't move it down! - if PatchesListView.Items[max].Selected then + if PatchesListView.Items[Max].Selected then exit; // create tempList @@ -1917,23 +2026,27 @@ procedure TSmashForm.ToBottomItemClick(Sender: TObject); // loop through patches to build new list iIndex := 0; - for i := 0 to max do begin - if not PatchesListView.Items[i].Selected then begin + for i := 0 to Max do + begin + if not PatchesListView.Items[i].Selected then + begin tempList.Insert(iIndex, PatchesList[i]); Inc(iIndex); end - else begin + else + begin tempList.Add(PatchesList[i]); end; end; // set PatchesList to tempList PatchesList.Clear; - for i := 0 to max do PatchesList.Add(tempList[i]); + for i := 0 to Max do + PatchesList.Add(tempList[i]); tempList.Free; // update selection - for i := 0 to max do + for i := 0 to Max do PatchesListView.Items[i].Selected := i >= iIndex; // update gui @@ -1943,21 +2056,25 @@ procedure TSmashForm.ToBottomItemClick(Sender: TObject); { Remove unloaded plugins and plugins with errors } procedure TSmashForm.RemovePluginsItemClick(Sender: TObject); var - i, j: integer; + i, j: Integer; plugin: TPlugin; patch: TPatch; begin // loop through patches - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); - Logger.Write('PATCH', 'Plugins', 'Removing plugins from '+patch.name); + Logger.Write('PATCH', 'Plugins', 'Removing plugins from ' + patch.name); // remove plugins that aren't loaded or have errors - for j := Pred(patch.plugins.Count) downto 0 do begin - plugin := PluginByFilename(patch.plugins[j]); - if not Assigned(plugin) then begin - Logger.Write('PATCH', 'Plugins', 'Removing '+patch.plugins[j]+', plugin not loaded'); + for j := Pred(patch.plugins.Count) downto 0 do + begin + plugin := PluginByFileName(patch.plugins[j]); + if not Assigned(plugin) then + begin + Logger.Write('PATCH', 'Plugins', 'Removing ' + patch.plugins[j] + + ', plugin not loaded'); patch.plugins.Delete(j); continue; end; @@ -1969,16 +2086,20 @@ procedure TSmashForm.RemovePluginsItemClick(Sender: TObject); UpdateListViews; end; -procedure TSmashform.RemoveUnloadedPlugins(patch: TPatch); +procedure TSmashForm.RemoveUnloadedPlugins(patch: TPatch); var - i: integer; + i: Integer; plugin: TPlugin; begin - Logger.Write('PATCH', 'Plugins', 'Removing unloaded plugins from '+patch.name); - for i := Pred(patch.plugins.Count) downto 0 do begin - plugin := PluginByFilename(patch.plugins[i]); - if not Assigned(plugin) then begin - Logger.Write('PATCH', 'Plugins', 'Removing '+patch.plugins[i]+', plugin not loaded'); + Logger.Write('PATCH', 'Plugins', 'Removing unloaded plugins from ' + + patch.name); + for i := Pred(patch.plugins.Count) downto 0 do + begin + plugin := PluginByFileName(patch.plugins[i]); + if not Assigned(plugin) then + begin + Logger.Write('PATCH', 'Plugins', 'Removing ' + patch.plugins[i] + + ', plugin not loaded'); patch.plugins.Delete(i); end; end; @@ -1986,11 +2107,12 @@ procedure TSmashform.RemoveUnloadedPlugins(patch: TPatch); procedure TSmashForm.RemoveUnloadedPluginsItemClick(Sender: TObject); var - i: integer; + i: Integer; patch: TPatch; begin // loop through patches - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); @@ -2018,7 +2140,8 @@ procedure TSmashForm.DeletePatchItemClick(Sender: TObject); patchesToDelete := TList.Create; patchNames := ''; for i := 0 to Pred(PatchesListView.Items.Count) do - if PatchesListView.Items[i].Selected then begin + if PatchesListView.Items[i].Selected then + begin patch := TPatch(PatchesList[i]); patchesToDelete.Add(patch); PatchesListView.Items[i].Selected := false; @@ -2026,7 +2149,8 @@ procedure TSmashForm.DeletePatchItemClick(Sender: TObject); end; // show multi-patch prompt if multiple patches selected - if patchesToDelete.Count > 0 then begin + if patchesToDelete.Count > 0 then + begin frmDialog := CreateMessageDialog(GetLanguageString('msMain_DeletePatches') + patchNames, mtConfirmation, mbOKCancel, mbOk); frmDialog.PopupParent := self; @@ -2037,19 +2161,21 @@ procedure TSmashForm.DeletePatchItemClick(Sender: TObject); // exit if user didn't approve deletion if not bApproved then - Exit; + exit; // clear details grid slDetails.Clear; // loop through patches - for i := Pred(patchesToDelete.Count) downto 0 do begin + for i := Pred(patchesToDelete.Count) downto 0 do + begin patch := TPatch(patchesToDelete[i]); - Logger.Write('PATCH', 'Delete', 'Deleting patch '+patch.name); + Logger.Write('PATCH', 'Delete', 'Deleting patch ' + patch.name); PatchesListView.Items.Count := PatchesListView.Items.Count - 1; // remove patch from plugin patch properties - for j := 0 to Pred(PluginsList.Count) do begin + for j := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[j]); if plugin.patch = patch.name then plugin.patch := ' '; @@ -2077,22 +2203,24 @@ procedure TSmashForm.BuildPatchItemClick(Sender: TObject); patchesToBuild := TList.Create; // get timecosts - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); - if not (patch.status in BuildStatuses) then + if not(patch.status in BuildStatuses) then continue; // else calculate time cost and build patch - Logger.Write('PATCH', 'Build', 'Building '+patch.name); + Logger.Write('PATCH', 'Build', 'Building ' + patch.name); timeCost := patch.GetTimeCost * 2; timeCosts.Add(IntToStr(timeCost)); patchesToBuild.Add(patch); end; // free and exit if no patches to check for errors - if patchesToBuild.Count = 0 then begin + if patchesToBuild.Count = 0 then + begin timeCosts.Free; patchesToBuild.Free; exit; @@ -2101,9 +2229,9 @@ procedure TSmashForm.BuildPatchItemClick(Sender: TObject); // Show progress form self.Enabled := false; xEditLogGroup := 'PATCH'; - pForm := TProgressForm.Create(Self); - pForm.pfLogPath := LogPath + 'patch\'; - pForm.PopupParent := Self; + pForm := TProgressForm.Create(self); + //pForm.pfLogPath := LogPath + 'patch\'; + pForm.PopupParent := self; pForm.Caption := GetLanguageString('msProg_Smashing'); pForm.SetMaxProgress(IntegerListSum(timeCosts, Pred(timeCosts.Count))); pForm.Show; @@ -2120,7 +2248,8 @@ procedure TSmashForm.OpenInExplorerItemClick(Sender: TObject); patch: TPatch; begin // loop through patches - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); @@ -2138,29 +2267,30 @@ procedure TSmashForm.ToggleRebuildItemClick(Sender: TObject); patch: TPatch; begin // loop through patches - for i := 0 to Pred(PatchesListView.Items.Count) do begin + for i := 0 to Pred(PatchesListView.Items.Count) do + begin if not PatchesListView.Items[i].Selected then continue; patch := TPatch(PatchesList[i]); - Logger.Write('PATCH', 'Status', 'Toggled rebuild status on '+patch.name); + Logger.Write('PATCH', 'Status', 'Toggled rebuild status on ' + patch.name); // if forced up to date, set to Ready to be rebuilt if patch.status = psUpToDateForced then patch.status := psRebuildReady - // if normal up to date, set to Ready to rebuilt [forced] + // if normal up to date, set to Ready to rebuilt [forced] else if patch.status = psUpToDate then - patch.Status := psRebuildReadyForced - // if force rebuild, set to Up to date + patch.status := psRebuildReadyForced + // if force rebuild, set to Up to date else if patch.status = psRebuildReadyForced then patch.status := psUpToDate - // if normal rebuild, set to Up to date [Forced] + // if normal rebuild, set to Up to date [Forced] else if patch.status = psRebuildReady then - patch.Status := psUpToDateForced; + patch.status := psUpToDateForced; end; // update UpdatePatches; UpdateListViews; - UpdateQuickBar; + UpdateQuickbar; end; { Double click to edit patch } @@ -2177,7 +2307,7 @@ procedure TSmashForm.PatchesListViewKeyDown(Sender: TObject; var Key: Word; DeletePatchItemClick(nil); end; -{******************************************************************************} +{ ****************************************************************************** } { QuickBar Button Events Events involving buttons on the QuickBar. Events include: - CreatePatchButtonClick @@ -2188,7 +2318,7 @@ procedure TSmashForm.PatchesListViewKeyDown(Sender: TObject; var Key: Word; - UpdateButtonClick - HelpButtonClick } -{******************************************************************************} +{ ****************************************************************************** } procedure TSmashForm.UpdateQuickbar; var @@ -2197,7 +2327,8 @@ procedure TSmashForm.UpdateQuickbar; sTitle: string; begin // DISABLE ALL BUTTONS IF INITIALIZATION EXCEPTION - if ProgramStatus.bInitException then begin + if ProgramStatus.bInitException then + begin QuickButton.Enabled := false; NewButton.Enabled := false; BuildButton.Enabled := false; @@ -2209,7 +2340,8 @@ procedure TSmashForm.UpdateQuickbar; // BUILD BUTTON bPatchesToBuild := false; bPatchesToCheck := false; - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); if (patch.status in BuildStatuses) then bPatchesToBuild := true; @@ -2231,10 +2363,11 @@ procedure TSmashForm.UpdateQuickbar; function TSmashForm.GetSmashedPatch: TPatch; begin - Result := TPatchHelpers.PatchByName(PatchesList, 'Smashed Patch'); + Result := TPatchHelpers.PatchByName(PatchesList, 'Smashed Patch'); if Assigned(Result) then RemoveUnloadedPlugins(Result) - else begin + else + begin Result := TPatchHelpers.CreateNewPatch(PatchesList); Result.name := 'Smashed Patch'; Result.filename := 'Smashed Patch.esp'; @@ -2247,10 +2380,10 @@ procedure TSmashForm.StartPatching; // make and show progress form self.Enabled := false; xEditLogGroup := 'PATCH'; - pForm := TProgressForm.Create(Self); - pForm.pfLogPath := LogPath + 'patch\'; + pForm := TProgressForm.Create(self); + //pForm.pfLogPath := LogPath + 'patch\'; pForm.bDetailsVisible := false; - pForm.PopupParent := Self; + pForm.PopupParent := self; pForm.Caption := GetLanguageString('msProg_Smashing'); pForm.SetMaxProgress(IntegerListSum(timeCosts, Pred(timeCosts.Count))); pForm.Show; @@ -2271,14 +2404,16 @@ procedure TSmashForm.QuickButtonClick(Sender: TObject); smashAll := TSettingHelpers.SettingByName('Smash.All'); // STEP 2: if Smash.All setting not found, exit - if not Assigned(smashAll) then exit; + if not Assigned(smashAll) then + exit; // STEP 3: find and clear or create smashed patch smashedPatch := GetSmashedPatch; // STEP 5: apply Smash.All to all loaded plugins except game ESM // STEP 6: add all loaded plugins except game ESM to smashed patch - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin plugin := TPlugin(PluginsList[i]); if SameText(plugin.filename, wbGameName + '.esm') then continue; @@ -2296,11 +2431,11 @@ procedure TSmashForm.QuickButtonClick(Sender: TObject); // check/fix smashed patch status if smashedPatch.status = psUpToDate then smashedPatch.status := psRebuildReadyForced; - if not (smashedPatch.status in BuildStatuses) then + if not(smashedPatch.status in BuildStatuses) then exit; // STEP 7: build smashed patch - Logger.Write('PATCH', 'Build', 'Building '+smashedPatch.name); + Logger.Write('PATCH', 'Build', 'Building ' + smashedPatch.name); patchesToBuild := TList.Create; timeCosts := TStringList.Create; patchesToBuild.Add(smashedPatch); @@ -2319,13 +2454,15 @@ procedure TSmashForm.BuildButtonClick(Sender: TObject); patch: TPatch; begin // exit if the loader isn't done - if not wbLoaderDone then begin + if not wbLoaderDone then + begin Logger.Write('ERROR', 'Patch', 'Loader not done, can''t patch yet!'); exit; end; // exit if there are no patches - if PatchesList.Count = 0 then begin + if PatchesList.Count = 0 then + begin Logger.Write('ERROR', 'Patch', 'There are no patches!'); exit; end; @@ -2333,18 +2470,20 @@ procedure TSmashForm.BuildButtonClick(Sender: TObject); // calculate time costs, prepare patches timeCosts := TStringList.Create; patchesToBuild := TList.Create; - for i := 0 to Pred(PatchesList.Count) do begin + for i := 0 to Pred(PatchesList.Count) do + begin patch := TPatch(PatchesList[i]); - if not (patch.status in BuildStatuses) then + if not(patch.status in BuildStatuses) then continue; - Logger.Write('PATCH', 'Build', 'Building '+patch.name); + Logger.Write('PATCH', 'Build', 'Building ' + patch.name); timeCost := patch.GetTimeCost; patchesToBuild.Add(patch); timeCosts.Add(IntToStr(timeCost)); end; // exit if no patches to build - if timeCosts.Count = 0 then begin + if timeCosts.Count = 0 then + begin Logger.Write('ERROR', 'Patch', 'No patches to build!'); timeCosts.Free; patchesToBuild.Free; @@ -2380,7 +2519,7 @@ procedure TSmashForm.OptionsButtonClick(Sender: TObject); begin prevLanguage := settings.language; // Create and show options form - OptionsForm := TOptionsForm.Create(Self); + OptionsForm := TOptionsForm.Create(self); OptionsForm.ShowModal; OptionsForm.Free; @@ -2391,7 +2530,8 @@ procedure TSmashForm.OptionsButtonClick(Sender: TObject); RebuildLog; // if user changed language, update language displayed - if settings.language <> prevLanguage then begin + if settings.language <> prevLanguage then + begin LoadLanguage; TRttiTranslation.Load(language, self); end; @@ -2399,7 +2539,7 @@ procedure TSmashForm.OptionsButtonClick(Sender: TObject); // update gui UpdatePatches; UpdateListViews; - UpdateQuickBar; + UpdateQuickbar; UpdateStatusBar; // if user selected to change game mode, close application diff --git a/frontend/msSplashForm.dfm b/frontend/msSplashForm.dfm old mode 100644 new mode 100755 index 65a3751..bde45f7 --- a/frontend/msSplashForm.dfm +++ b/frontend/msSplashForm.dfm @@ -14044,9 +14044,9 @@ object SplashForm: TSplashForm object lblAuthor: TLabel Left = 24 Top = 168 - Width = 93 + Width = 133 Height = 13 - Caption = 'by matortheeternal' + Caption = 'created by matortheeternal' Color = clWhite Font.Charset = DEFAULT_CHARSET Font.Color = clBlack @@ -14089,4 +14089,19 @@ object SplashForm: TSplashForm ParentColor = False ParentFont = False end + object lblAuthor2: TLabel + Left = 24 + Top = 181 + Width = 92 + Height = 13 + Caption = 'v2 by chuckseven1' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentColor = False + ParentFont = False + end end diff --git a/frontend/msSplashForm.pas b/frontend/msSplashForm.pas old mode 100644 new mode 100755 index 8382718..a077ab2 --- a/frontend/msSplashForm.pas +++ b/frontend/msSplashForm.pas @@ -17,6 +17,7 @@ TSplashForm = class(TForm) lblAuthor: TLabel; lblProgress: TLabel; lblVersion: TLabel; + lblAuthor2: TLabel; procedure ProgressMessage(const s: string); procedure FormCreate(Sender: TObject); private @@ -34,14 +35,14 @@ implementation procedure TSplashForm.ProgressMessage(const s: string); begin - lblProgress.Caption := ' '+s; + lblProgress.Caption := ' ' + s; Application.ProcessMessages; end; procedure TSplashForm.FormCreate(Sender: TObject); begin Tracker.OnLogEvent := ProgressMessage; - lblVersion.Caption := 'v'+GetVersionMem; + lblVersion.Caption := 'v' + GetVersionMem; if settings.simpleSplash then lblProgress.GlowSize := 0; diff --git a/frontend/msTagHelper.dfm b/frontend/msTagHelper.dfm old mode 100644 new mode 100755 diff --git a/frontend/msTagHelper.pas b/frontend/msTagHelper.pas old mode 100644 new mode 100755 index bba6bf7..6b32919 --- a/frontend/msTagHelper.pas +++ b/frontend/msTagHelper.pas @@ -40,7 +40,8 @@ procedure TTagHelper.FormClose(Sender: TObject; var Action: TCloseAction); begin slTags.Clear; if ModalResult = mrOK then - for i := 0 to Pred(CheckList.Items.Count) do begin + for i := 0 to Pred(CheckList.Items.Count) do + begin if CheckList.Checked[i] then slTags.Add(CheckList.Items[i]); end; @@ -60,14 +61,16 @@ procedure TTagHelper.FormShow(Sender: TObject); begin // update lblPrompt case iMode of - -1: begin - Caption := GetLanguageString('msTagH_RemoveTags'); - lblPrompt.Caption := GetLanguageString('msTagH_PromptRemove'); - end; - 1: begin - Caption := GetLanguageString('msTagH_AddTags'); - lblPrompt.Caption := GetLanguageString('msTagH_PromptAdd'); - end; + - 1: + begin + Caption := GetLanguageString('msTagH_RemoveTags'); + lblPrompt.Caption := GetLanguageString('msTagH_PromptRemove'); + end; + 1: + begin + Caption := GetLanguageString('msTagH_AddTags'); + lblPrompt.Caption := GetLanguageString('msTagH_PromptAdd'); + end; end; // populate checklist diff --git a/frontend/msTagManager.dfm b/frontend/msTagManager.dfm old mode 100644 new mode 100755 diff --git a/frontend/msTagManager.pas b/frontend/msTagManager.pas old mode 100644 new mode 100755 index 97ba8e4..c873102 --- a/frontend/msTagManager.pas +++ b/frontend/msTagManager.pas @@ -111,7 +111,8 @@ procedure TTagManager.FormShow(Sender: TObject); procedure TTagManager.FormClose(Sender: TObject; var Action: TCloseAction); begin - if ModalResult = mrOK then begin + if ModalResult = mrOK then + begin plugin.description.Text := meDescription.Lines.Text; if kbCombine.Checked then plugin.GetSettingTag; diff --git a/frontend/msThreads.pas b/frontend/msThreads.pas old mode 100644 new mode 100755 index 24558dc..15425a8 --- a/frontend/msThreads.pas +++ b/frontend/msThreads.pas @@ -12,25 +12,28 @@ interface // ms units msCore, msConfiguration, msLoader, msSmash, // xedit units - wbBSA, wbInterface, wbImplementation; - + wbBSA, wbHardcoded, wbInterface, wbImplementation, wbLoadOrder; type // THREADS AND CALLBACKS TCallback = procedure of object; TStatusCallback = procedure(s: string) of object; + TInitThread = class(TThread) protected procedure Execute; override; end; + TLoaderThread = class(TThread) protected procedure Execute; override; end; + TPatchThread = class(TThread) protected procedure Execute; override; end; + TSaveThread = class(TThread) protected procedure Execute; override; @@ -38,13 +41,12 @@ TSaveThread = class(TThread) var InitCallback, LoaderCallback, ErrorCheckCallback, ErrorFixCallback, - PatchCallback, SaveCallback: TCallback; + PatchCallback, SaveCallback: TCallback; StatusCallback: TStatusCallback; implementation - -{******************************************************************************} +{ ****************************************************************************** } { THREAD METHODS These are threads that the program will run for various large jobs which need to be decoupled from general program operation and the GUI. @@ -57,19 +59,21 @@ implementation - TPatchThread.Execute - TSaveThread.Execute } -{******************************************************************************} +{ ****************************************************************************** } { TInitThread } procedure TInitThread.Execute; var i: integer; plugin: TPlugin; + b: TBytes; aFile: IwbFile; + aModule: PwbModuleInfo; begin try // PRINT LOAD ORDER TO LOG for i := 0 to Pred(slPlugins.Count) do - Logger.Write('LOAD', 'Order', '['+IntToHex(i, 2)+'] '+slPlugins[i]); + Logger.Write('LOAD', 'Order', '[' + IntToHex(i, 2) + '] ' + slPlugins[i]); // LOAD RESOURCES Tracker.Write('Loading Resources'); @@ -77,36 +81,49 @@ procedure TInitThread.Execute; LoadBSAs; // LOAD PLUGINS - for i := 0 to Pred(slPlugins.Count) do begin - Tracker.Write('Loading '+slPlugins[i]); + for i := 0 to Pred(slPlugins.Count) do + begin + Tracker.Write('Loading ' + slPlugins[i]); try plugin := TPlugin.Create; plugin.filename := slPlugins[i]; - plugin._File := wbFile(wbDataPath + slPlugins[i], i, '', False, False); + // aModule := wbModuleByName(slPlugins[i]); + plugin._File := wbFile(slPlugins[i], i); plugin._File._AddRef; plugin.GetMsData; PluginsList.Add(Pointer(plugin)); except - on x: Exception do begin - Logger.Write('ERROR', 'Load', 'Exception loading '+slPlugins[i]); + on x: Exception do + begin + Logger.Write('ERROR', 'Load', 'Exception loading ' + slPlugins[i]); Logger.Write('ERROR', 'Load', x.Message); ProgramStatus.bLoadException := true; end; end; // load hardcoded dat - if i = 0 then try - aFile := wbFile(wbProgramPath + wbGameName + wbHardcodedDat, 0); - aFile._AddRef; - except - on x: Exception do begin - Logger.Write('ERROR', 'Load', 'Exception loading '+wbGameName+wbHardcodedDat); - Logger.Write('ERROR', 'Load', 'Please download and install this dat file!'); - raise x; + if i = 0 then + try + b := TwbHardCodedContainer.GetHardCodedDat; + aFile := wbFile(wbGameExeName, 0, '', [fsIsHardcoded], b); + aFile._AddRef; + except + on x: Exception do + begin + Logger.Write('ERROR', 'Load', 'Exception loading ' + wbGameName + + ' hardcoded dat'); + Logger.Write('ERROR', 'Load', + 'Please download and install this dat file!'); + raise x; + end; end; - end; end; + // LOAD RESOURCES + Tracker.Write('Loading Resources'); + wbContainerHandler.AddFolder(wbDataPath); + LoadBSAs; + // LOAD PLUGIN INFORMATION Tracker.Write('Loading plugin information'); TPatchHelpers.AssignPatchesToPlugins; @@ -116,7 +133,8 @@ procedure TInitThread.Execute; // CLEAN UP slPlugins.Free; except - on x: Exception do begin + on x: Exception do + begin if Assigned(slPlugins) then slPlugins.Free; ProgramStatus.bInitException := true; @@ -139,7 +157,7 @@ procedure LoaderProgress(const s: string); procedure TLoaderThread.Execute; var - i: Integer; + i: integer; f: IwbFile; plugin: TPlugin; begin @@ -147,23 +165,27 @@ procedure TLoaderThread.Execute; StatusCallback(Format('%s (%d/%d)', [GetLanguageString('msMain_LoaderInProgress'), 1, PluginsList.Count])); try - for i := 0 to Pred(PluginsList.Count) do begin + for i := 0 to Pred(PluginsList.Count) do + begin StatusCallback(Format('%s (%d/%d)', - [GetLanguageString('msMain_LoaderInProgress'), i + 1, PluginsList.Count])); + [GetLanguageString('msMain_LoaderInProgress'), i + 1, + PluginsList.Count])); plugin := TPlugin(PluginsList[i]); f := plugin._File; if SameText(plugin.filename, wbGameName + '.esm') then continue; LoaderProgress('[' + plugin.filename + '] Building reference info.'); f.BuildRef; - if ProgramStatus.bForceTerminate then begin + if ProgramStatus.bForceTerminate then + begin LoaderProgress('Aborted.'); break; end; end; except - on E: Exception do begin - LoaderProgress('Fatal: <' + e.ClassName + ': ' + e.Message + '>'); + on E: Exception do + begin + LoaderProgress('Fatal: <' + E.ClassName + ': ' + E.Message + '>'); wbLoaderError := true; ProgramStatus.bInitException := true; end; @@ -182,11 +204,14 @@ procedure PlaySmashSound; PWav: Pointer; begin HResource := FindResource(HInstance, PChar('SMASH'), 'WAV'); - if HResource = 0 then exit; + if HResource = 0 then + exit; HResData := LoadResource(HInstance, HResource); - if HResData = 0 then exit; + if HResData = 0 then + exit; PWav := LockResource(HResData); - if not Assigned(PWav) then exit; + if not Assigned(PWav) then + exit; sndPlaySound(nil, SND_NODEFAULT); sndPlaySound(PWav, SND_ASYNC or SND_MEMORY); end; @@ -196,20 +221,25 @@ procedure TPatchThread.Execute; i: integer; patch: TPatch; begin + Tracker.Tag := 'patch'; FreeOnTerminate := true; // build patches - for i := 0 to Pred(patchesToBuild.Count) do begin - if Tracker.Cancel then break; + for i := 0 to Pred(patchesToBuild.Count) do + begin + if Tracker.Cancel then + break; patch := TPatch(patchesToBuild[i]); StatusCallback(Format('%s "%s" (%d/%d)', - [GetLanguageString('msProg_Smashing'), patch.name, i + 1, patchesToBuild.Count])); + [GetLanguageString('msProg_Smashing'), patch.name, i + 1, + patchesToBuild.Count])); try if (patch.status in RebuildStatuses) then RebuildPatch(patch) else BuildPatch(patch); except - on x : Exception do begin + on x: Exception do + begin patch.status := psFailed; Tracker.Write('Exception: ' + x.Message); end; @@ -223,10 +253,12 @@ procedure TPatchThread.Execute; end; // say thread is done if it wasn't cancelled - if not Tracker.Cancel then begin + if not Tracker.Cancel then + begin Tracker.Write('All done!'); try - if settings.smashSound then PlaySmashSound; + if settings.smashSound then + PlaySmashSound; except on x: Exception do Tracker.Write('Failed to play Smash sound.'); @@ -246,13 +278,15 @@ procedure TSaveThread.Execute; FreeOnTerminate := true; // save ESPs only if it's safe to do so - if not ProgramStatus.bInitException then begin + if not ProgramStatus.bInitException then + begin // Save plugin errors try + Tracker.Tag := 'save'; SavePluginInfo; except on x: Exception do - Tracker.Write('Exception saving plugin errors '+x.Message); + Tracker.Write('Exception saving plugin errors ' + x.Message); end; Tracker.SetProgress(PluginsList.Count + 1); diff --git a/frontend/settings/Fallout4/Smash.All.json b/frontend/settings/Fallout4/Smash.All.json old mode 100644 new mode 100755 index b03f935..01c7c2f --- a/frontend/settings/Fallout4/Smash.All.json +++ b/frontend/settings/Fallout4/Smash.All.json @@ -1 +1 @@ -{"records":"ACHR,ACTI,ADDN,AECH,ALCH,AMDL,AMMO,ANIO,AORU,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BNDS,BOOK,BPTD,CAMS,CELL,CLAS,CLFM,CLMT,CMPO,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DFOB,DIAL,DLBR,DLVW,DMGT,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,FACT,FLOR,FLST,FSTP,FSTS,FURN,GDRY,GLOB,GMST,GRAS,HAZD,HDPT,IDLM,IMAD,IMGS,INFO,INGR,INNR,IPCT,IPDS,KEYM,KSSM,KYWD,LAND,LAYR,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MSWP,MUSC,MUST,NOTE,NPC_,OMOD,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,PKIN,PMIS,PROJ,QUST,REFR,REGN,RELA,REVB,RFCT,RFGP,SCCO,SCEN,SCOL,SCSN,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAG,STAT,TACT,TERM,TREE,TRNS,TXST,VTYP,WATR,WEAP,WRLD,WTHR,ZOOM,AACT","description":"Smashes all the things. Produced using autoset attributes on all record types found in Fallout4.esm.\r\n\r\nLast updated 05\/01\/2018.","tree":{"records":[{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"STCP - Sound"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":6,"s":1,"p":1,"n":"RADR - Radio Receiver","c":[{"t":3,"p":1,"n":"Sound Model"},{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Volume"},{"t":3,"p":1,"n":"Starts Active"},{"t":3,"p":1,"n":"No Signal Static"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"LNAM - Light"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"AECH - Audio Effect Chain","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"KNAM - Type"},{"t":6,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Enabled"},{"t":5,"p":1,"n":"Input Gain"},{"t":5,"p":1,"n":"Center Freq"},{"t":5,"p":1,"n":"Feedback %"},{"t":5,"p":1,"n":"Output Gain"},{"t":5,"p":1,"n":"Q Value"},{"t":5,"p":1,"n":"Wet Mix %"},{"t":5,"p":1,"n":"Upper Threshold"},{"t":3,"p":1,"n":"Filter Mode"},{"t":3,"p":1,"n":"Delay MS"},{"t":5,"p":1,"n":"Lower Threshold"},{"t":11,"n":"Unused"}]}]}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":2,"p":1,"n":"DNAM - Addiction Name"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMDL - Aim Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Cone of Fire - Min Angle"},{"t":5,"p":1,"n":"Cone of Fire - Max Angle"},{"t":5,"p":1,"n":"Cone of Fire - Increase Per Shot"},{"t":5,"p":1,"n":"Cone of Fire - Decrease Per Sec"},{"t":3,"p":1,"n":"Cone of Fire - Decrease Delay MS"},{"t":5,"p":1,"n":"Cone of Fire - Sneak Mult"},{"t":5,"p":1,"n":"Recoil - Diminish Spring Force"},{"t":5,"p":1,"n":"Recoil - Diminish Sights Mult"},{"t":5,"p":1,"n":"Recoil - Max Per Shot"},{"t":5,"p":1,"n":"Recoil - Min Per Shot"},{"t":5,"p":1,"n":"Recoil - Hip Mult"},{"t":3,"p":1,"n":"Runaway - Recoil Shots"},{"t":5,"p":1,"n":"Recoil - Arc"},{"t":5,"p":1,"n":"Recoil - Arc Rotate"},{"t":5,"p":1,"n":"Cone of Fire - Iron Sights Mult"},{"t":5,"p":1,"n":"Stability - Base Stability"}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Health"}]},{"t":2,"p":1,"n":"ONAM - Short Name"},{"t":2,"p":1,"n":"NAM1 - Casing Model"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"AORU - Attraction Rule","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"AOR2 - Data","c":[{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Delay"},{"t":5,"p":1,"n":"Max Delay"},{"t":3,"p":1,"n":"Requires Line of Sight"},{"t":3,"p":1,"n":"Combat Target"},{"t":11,"n":"Unused"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male"},{"t":3,"p":1,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"},{"t":5,"p":1,"n":"MO2C - Color Remapping Index"},{"t":11,"n":"MO2F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO3S - Material Swap"},{"t":5,"p":1,"n":"MO3C - Color Remapping Index"},{"t":11,"n":"MO3F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO5S - Material Swap"},{"t":5,"p":1,"n":"MO5C - Color Remapping Index"},{"t":11,"n":"MO5F - Unknown"}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin Texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"s":1,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"},{"t":8,"s":1,"p":1,"n":"Bone Data","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"BSMP - Gender"},{"t":8,"p":1,"n":"Bones","c":[{"t":6,"p":1,"n":"Bone","c":[{"t":2,"p":1,"n":"BSMB - Name"},{"t":7,"p":1,"n":"BSMS - Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"}]},{"t":2,"p":1,"n":"ICON - Male Inventory Image"},{"t":2,"p":1,"n":"MICO - Male Message Icon"},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"}]},{"t":2,"p":1,"n":"ICO2 - Female Inventory Image"},{"t":2,"p":1,"n":"MIC2 - Female Message Icon"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":3,"p":1,"n":"INDX - Addon Index"},{"t":3,"p":1,"n":"MODL - Armor Addon"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Health"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":3,"p":1,"n":"Armor Rating"},{"t":3,"p":1,"n":"Base Addon Index"},{"t":3,"p":1,"n":"Stagger Rating"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMA - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"TNAM - Template Armor"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type"},{"t":3,"p":1,"n":"XTRI - Is Interior"},{"t":3,"p":1,"n":"WNAM - Weather Attenuation (dB)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":5,"p":1,"n":"NAM0 - Default Value"},{"t":3,"p":1,"n":"AVFL - Flags"},{"t":3,"p":1,"n":"NAM1 - Type"}]},{"t":1,"p":1,"n":"BNDS - Bendable Spline","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Default Number of Tiles"},{"t":3,"p":1,"n":"Default Number of Slices"},{"t":3,"p":1,"n":"Default Number of Tiles - Relative to Length"},{"t":6,"p":1,"n":"Default Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Wind Settings - Sensibility"},{"t":5,"p":1,"n":"Wind Settings - Flexibility"}]},{"t":3,"p":1,"n":"TNAM - Texture"}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Perk"},{"t":6,"p":1,"n":"Text Offset","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":2,"p":1,"n":"CNAM - Description"},{"t":3,"p":1,"n":"INAM - Inventory Art"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":6,"p":1,"n":"BPND - ","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":5,"p":1,"n":"Cut - Min"},{"t":5,"p":1,"n":"Cut - Max"},{"t":5,"p":1,"n":"Cut - Radius"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate X"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate Y"},{"t":5,"p":1,"n":"Cut - Tesselation"},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":5,"p":1,"n":"Explodable - Limb Replacement Scale"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Non-Lethal Dismemberment Chance"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":3,"p":1,"n":"Geometry Segment Index"},{"t":3,"p":1,"n":"On Cripple - Art Object"},{"t":3,"p":1,"n":"On Cripple - Debris"},{"t":3,"p":1,"n":"On Cripple - Explosion"},{"t":3,"p":1,"n":"On Cripple - Impact DataSet"},{"t":5,"p":1,"n":"On Cripple - Debris Scale"},{"t":3,"p":1,"n":"On Cripple - Debris Count"},{"t":3,"p":1,"n":"On Cripple - Decal Count"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"},{"t":2,"p":1,"n":"ENAM - Hit Reaction - Start"},{"t":2,"p":1,"n":"FNAM - Hit Reaction - End"},{"t":3,"p":1,"n":"BNAM - Gore Effects - Dismember Blood Art"},{"t":3,"p":1,"n":"INAM - Gore Effects - Blood Impact Material Type"},{"t":3,"p":1,"n":"JNAM - On Cripple - Blood Impact Material Type"},{"t":3,"p":1,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"p":1,"n":"NAM2 - Collar TextureSet"},{"t":2,"p":1,"n":"DNAM - Twist Variable Prefix"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"},{"t":5,"p":1,"n":"Location Spring"},{"t":5,"p":1,"n":"Target Spring"},{"t":6,"p":1,"n":"Rotation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land"}]},{"t":11,"n":"VISI - PreVis Files Timestamp"},{"t":3,"p":1,"n":"RVIS - In PreVis File Of"},{"t":11,"n":"PCMB - PreCombined Files Timestamp"},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits"},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":3,"p":1,"n":"CNAM - Precombined Object Level XY"},{"t":3,"p":1,"n":"ZNAM - Precombined Object Level Z"},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":6,"s":1,"p":1,"n":"XILW - Exterior LOD","c":[{"t":3,"p":1,"n":"Worldspace"},{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"}]},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"},{"t":3,"p":1,"n":"XGDR - God Rays"},{"t":7,"p":1,"n":"XPRI - Physics References","c":[{"t":3,"p":1,"n":"Reference"}]},{"t":6,"s":1,"p":1,"n":"XCRI - Combined References","c":[{"t":3,"p":1,"n":"Meshes Count"},{"t":3,"p":1,"n":"References Count"},{"t":7,"p":1,"n":"Meshes","c":[{"t":3,"p":1,"n":"Combined Mesh"}]},{"t":7,"p":1,"n":"References","c":[{"t":6,"p":1,"n":"Reference","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Combined Mesh"}]}]}]}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Bleedout Default"}]}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CNAM - Color\/Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"CMPO - Component","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":3,"p":1,"n":"DATA - Auto Calc Value"},{"t":3,"p":1,"n":"MNAM - Scrap Item"},{"t":3,"p":1,"n":"GNAM - Mod Scrap Scalar"}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":7,"p":1,"n":"FVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":11,"n":"NAM1 - Unused"},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":3,"p":1,"n":"ANAM - Menu Art Object"},{"t":7,"p":1,"n":"FNAM - Category","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"INTV - Data","c":[{"t":3,"p":1,"n":"Created Object Count"},{"t":3,"p":1,"n":"Priority"}]}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"},{"t":3,"p":1,"n":"TNAM - Sound - Take All"},{"t":3,"p":1,"n":"ONAM - Filter List"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Related Camera Path"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom \/ Flags"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"},{"t":5,"p":1,"n":"Dodge Threat Chance"},{"t":5,"p":1,"n":"Evade Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"},{"t":5,"p":1,"n":"Block When Staggered Mult"},{"t":5,"p":1,"n":"Attack When Staggered Mult"}]},{"t":5,"p":1,"n":"CSRA - Ranged Accuracy Mult"},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Dueling - Circle Mult"},{"t":5,"p":1,"n":"Dueling - Fallback Mult"},{"t":5,"p":1,"n":"Flanking - Flank Distance"},{"t":5,"p":1,"n":"Flanking - Stalk Time"},{"t":5,"p":1,"n":"Charging - Charge Distance"},{"t":5,"p":1,"n":"Charging - Throw Probability"},{"t":5,"p":1,"n":"Charging - Sprint Fast Probability"},{"t":5,"p":1,"n":"Charging - Sideswipe Probability"},{"t":5,"p":1,"n":"Charging - Disengane Probability"},{"t":3,"p":1,"n":"Charging - Throw Max Targets"},{"t":5,"p":1,"n":"Flanking - Flank Variance"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"},{"t":5,"p":1,"n":"Adjust Range Mult"},{"t":5,"p":1,"n":"Crouch Mult"},{"t":5,"p":1,"n":"Wait Mult"},{"t":5,"p":1,"n":"Range Mult"}]},{"t":5,"p":1,"n":"CSCV - Cover Search Distance Mult"},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DFOB - Default Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Object"}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags"},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"p":1,"n":"DMGT - Damage Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"Damage Types","c":[{"t":3,"p":1,"n":"Actor Value Index"}]}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"ONAM - Alternate Text - Open"},{"t":2,"p":1,"n":"CNAM - Alternate Text - Close"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Holes Animation - Start Time"},{"t":5,"p":1,"n":"Holes Animation - End Time"},{"t":5,"p":1,"n":"Holes Animation - Start Value"},{"t":5,"p":1,"n":"Holes Animation - End Value"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"}]},{"t":6,"s":1,"p":1,"n":"Data (old format)","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Parent"}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"ANAM - Condition Actor Value"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Inner Radius"},{"t":5,"p":1,"n":"Outer Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Sound Level"},{"t":5,"p":1,"n":"Placed Object AutoFade Delay"},{"t":3,"p":1,"n":"Stagger"},{"t":6,"p":1,"n":"Spawn","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"},{"t":5,"p":1,"n":"Spread Degrees"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"Relations","d":1,"c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf (unused)"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"p":1,"n":"INAM - Insignia (unused)"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Buys Stolen Items"},{"t":3,"p":1,"n":"Buy\/Sell Everything Not In List?"},{"t":3,"p":1,"n":"Buys NonStolen Items"},{"t":3,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"n":"XCNT - Count","c":[{"t":3,"n":"Walking"},{"t":3,"n":"Running"},{"t":3,"n":"Sprinting"},{"t":3,"n":"Sneaking"},{"t":3,"n":"Swimming"}]},{"t":7,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"WNAM - Drinking Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Form"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points"}]}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points"}]}]},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"GDRY - God Rays","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Back Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":6,"p":1,"n":"Fwd Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Intensity"},{"t":5,"p":1,"n":"Air Color - Scale"},{"t":5,"p":1,"n":"Back Color - Scale"},{"t":5,"p":1,"n":"Fwd Color - Scale"},{"t":5,"p":1,"n":"Back Phase"},{"t":6,"p":1,"n":"Air Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Fwd Phase"}]}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Effect"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"},{"t":6,"p":1,"n":"Taper Effectiveness","c":[{"t":5,"p":1,"n":"Full Effect Radius"},{"t":5,"p":1,"n":"Taper Weight"},{"t":5,"p":1,"n":"Taper Curse"}]}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - Filename"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","d":1,"c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Behavior Graph"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Related Idle Animation"}]},{"t":6,"n":"DATA - ","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]},{"t":2,"n":"GNAM - Animation File"}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":3,"n":"QNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags"},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags"},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":6,"s":1,"p":1,"n":"Radial Blur","c":[{"t":7,"p":1,"n":"RNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SNAM - RampUp","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"UNAM - Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM1 - RampDown","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - DownStart","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":6,"s":1,"p":1,"n":"Depth of Field","c":[{"t":7,"p":1,"n":"WNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"XNAM - Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM5 - Vignette Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM6 - Vignette Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unused"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Tonemap E"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Auto Exposure Max"},{"t":5,"p":1,"n":"Auto Exposure Min"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Middle Gray"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"},{"t":5,"p":1,"n":"Vignette Radius"},{"t":5,"p":1,"n":"Vignette Strength"}]},{"t":2,"p":1,"n":"TX00 - LUT"}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"DNAM - Shared INFO"},{"t":3,"n":"GNAM - Unknown"},{"t":2,"p":1,"n":"IOVR - Override Filename"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDA - Response Data","c":[{"t":3,"p":1,"n":"Emotion"},{"t":3,"p":1,"n":"Response number"},{"t":11,"n":"Unused"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Percentage"},{"t":3,"p":1,"n":"Camera Target Alias"},{"t":3,"p":1,"n":"Camera Location Alias"}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":2,"p":1,"n":"NAM4 - Alternate LIP Text"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"},{"t":3,"p":1,"n":"TNAM - Interrupt Percentage"},{"t":11,"p":1,"n":"NAM9 - Text Hash"},{"t":3,"p":1,"n":"SRAF - Camera Path"},{"p":1,"n":"WZMD - Stop on Scene End"}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TSCE - Start Scene"},{"t":3,"p":1,"n":"ALFA - Forced Alias"},{"t":11,"n":"INTV - Unknown"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"t":3,"p":1,"n":"GREE - Greet Distance"},{"t":6,"s":1,"p":1,"n":"TIQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NAM0 - Start Scene Phase"},{"t":3,"p":1,"n":"INCC - Challenge"},{"t":3,"p":1,"n":"MODQ - Reset Global"},{"t":3,"p":1,"n":"INAM - Subtitle Priority"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"INNR - Instance Naming Rules","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"UNAM - Target"},{"t":8,"s":1,"p":1,"n":"Naming Rules","d":1,"c":[{"t":6,"p":1,"n":"Ruleset","c":[{"t":3,"p":1,"n":"VNAM - Count"},{"t":8,"p":1,"n":"Names","c":[{"t":6,"p":1,"n":"Name","c":[{"t":2,"p":1,"n":"WNAM - Text"},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"p":1,"n":"XNAM - Property","c":[{"t":5,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Op"}]},{"t":3,"p":1,"n":"YNAM - Index"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM3 - Footstep Explosion"},{"t":3,"p":1,"n":"NAM2 - Hazard"},{"t":5,"p":1,"n":"FNAM - Footstep Particle Max Dist"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KSSM - Sound Keyword Mapping","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Primary Descriptor"},{"t":3,"p":1,"n":"ENAM - Exterior Tail"},{"t":3,"p":1,"n":"VNAM - VATS Descriptor"},{"t":5,"p":1,"n":"TNAM - VATS Threshold"},{"t":8,"s":1,"p":1,"n":"Keywords","d":1,"c":[{"t":3,"p":1,"n":"KNAM - Keyword"}]},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"RNAM - Sound","c":[{"t":3,"p":1,"n":"Reverb Class"},{"t":3,"p":1,"n":"Descriptor"}]}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"NNAM - Display Name"}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"MPCD - Unknown"}]}]},{"t":1,"p":1,"n":"LAYR - Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent"}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"TNAM - Unknown"}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":5,"n":"ANAM - Unknown"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":10,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"WGDR - God Rays"}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":5,"p":1,"n":"Constant"},{"t":5,"p":1,"n":"Scalar"},{"t":5,"p":1,"n":"Exponent"},{"t":5,"p":1,"n":"God Rays - Near Clip"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":2,"p":1,"n":"NAM0 - Gobo"},{"t":3,"p":1,"n":"LNAM - Lens"},{"t":3,"p":1,"n":"WGDR - God Rays"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":3,"p":1,"n":"TNAM - Transform"},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"ZNAM - Zoom","c":[{"t":5,"p":1,"n":"Min"},{"t":5,"p":1,"n":"Max"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":3,"p":1,"n":"LVSG - Epic Loot Chance"},{"t":2,"p":1,"n":"ONAM - Override Name"}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Breakable FX"},{"t":11,"n":"MODT - Texture Files Hashes"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":2,"p":1,"n":"SNAM - SWF"},{"t":2,"p":1,"n":"NNAM - Short Title"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":11,"p":1,"n":"Magic Skill (unused)"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archetype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":7,"p":1,"n":"CVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":7,"p":1,"n":"CDIX - Component Display Indices","c":[{"t":3,"p":1,"n":"Display Index"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Walk - Left"},{"t":5,"p":1,"n":"Run - Left"},{"t":5,"p":1,"n":"Walk - Right"},{"t":5,"p":1,"n":"Run - Right"},{"t":5,"p":1,"n":"Walk - Forward"},{"t":5,"p":1,"n":"Run - Forward"},{"t":5,"p":1,"n":"Sprint - Forward"},{"t":5,"p":1,"n":"Walk - Back"},{"t":5,"p":1,"n":"Run - Back"},{"t":5,"p":1,"n":"Standing - Pitch"},{"t":5,"p":1,"n":"Walk - Pitch"},{"t":5,"p":1,"n":"Run - Pitch"},{"t":5,"p":1,"n":"Sprint - Pitch"},{"t":5,"p":1,"n":"Standing - Yaw"},{"t":5,"p":1,"n":"Walk - Yaw"},{"t":5,"p":1,"n":"Run - Yaw"},{"t":5,"p":1,"n":"Sprint - Yaw"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds (unused)","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]},{"t":5,"p":1,"n":"JNAM - Float Height"},{"t":5,"p":1,"n":"LNAM - Flight - Angle Gain"}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"DATA - On Local Map"},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MSWP - Material Swap","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FNAM - Tree Folder"},{"t":10,"p":1,"n":"Material Substitutions","d":1,"c":[{"t":6,"p":1,"n":"Substitution","c":[{"t":2,"p":1,"n":"BNAM - Original Material"},{"t":2,"p":1,"n":"SNAM - Replacement Material"},{"t":2,"p":1,"n":"FNAM - Tree Folder (obsolete)"},{"t":5,"p":1,"n":"CNAM - Color Remapping Index"}]}]}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track Filename"},{"t":2,"p":1,"n":"BNAM - Finale Filename"},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Data"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":11,"n":"NVSI - Unknown"}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"n":"Version"},{"t":11,"n":"Magic"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":11,"n":"Vertices and Triangles"}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"NNAM - Unknown"},{"t":11,"n":"MNAM - Unknown"}]},{"t":1,"n":"NOCM - Navigation Mesh Obstacle Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Index"},{"t":8,"n":"Unknown","c":[{"t":11,"n":"DATA - Unknown"}]},{"t":11,"n":"INTV - Unknown"},{"t":2,"n":"NAM1 - Model"}]}]}]},{"t":1,"p":1,"n":"NOTE - Note","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"DNAM - Type"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Terminal"},{"t":2,"p":1,"n":"PNAM - Program File"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"STCP - Unknown"},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"XP Value Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Disposition Base"},{"t":3,"p":1,"n":"Use Template Actors"},{"t":3,"p":1,"n":"Bleedout Override"},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Default Template"},{"t":3,"p":1,"n":"LTPT - Legendary Template"},{"t":3,"p":1,"n":"LTPC - Legendary Chance"},{"t":6,"s":1,"p":1,"n":"TPTA - Template Actors","c":[{"t":3,"p":1,"n":"Traits"},{"t":3,"p":1,"n":"Stats"},{"t":3,"p":1,"n":"Factions"},{"t":3,"p":1,"n":"Spell List"},{"t":3,"p":1,"n":"AI Data"},{"t":3,"p":1,"n":"AI Packages"},{"t":3,"p":1,"n":"Model\/Animation"},{"t":3,"p":1,"n":"Base Data"},{"t":3,"p":1,"n":"Inventory"},{"t":3,"p":1,"n":"Script"},{"t":3,"p":1,"n":"Def Pack List"},{"t":3,"p":1,"n":"Attack Data"},{"t":3,"p":1,"n":"Keywords"}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Action Points Mult"},{"t":3,"p":1,"n":"Stagger Offset"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"},{"t":3,"p":1,"n":"ATKW - Weapon Slot"},{"t":3,"p":1,"n":"ATKS - Required Slot"},{"t":2,"p":1,"n":"ATKT - Description"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator Override Package List"},{"t":3,"p":1,"n":"OCOR - Observe Dead Body Override Package List"},{"t":3,"p":1,"n":"GWOR - Guard Warn Override Package List"},{"t":3,"p":1,"n":"ECOR - Combat Override Package List"},{"t":3,"p":1,"n":"FCPL - Follower Command Package List"},{"t":3,"p":1,"n":"RCLR - Follower Elevator Package List"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Far Away Model Distance"},{"t":3,"p":1,"n":"Geared Up Weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}]},{"t":3,"p":1,"n":"HCLF - Hair Color"},{"t":3,"p":1,"n":"BCLF - Facial Hair Color"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height Min"},{"t":5,"n":"NAM7 - Unused"},{"t":5,"p":1,"n":"NAM4 - Height Max"},{"t":6,"s":1,"p":1,"n":"MWGT - Weight","c":[{"t":5,"p":1,"n":"Thin"},{"t":5,"p":1,"n":"Muscular"},{"t":5,"p":1,"n":"Fat"}]},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":6,"s":1,"p":1,"n":"Actor Sounds","c":[{"t":3,"p":1,"n":"CS2H - Count"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CS2K - Keyword"},{"t":3,"p":1,"n":"CS2D - Sound"}]}]},{"p":1,"n":"CS2E - End Marker"},{"t":11,"p":1,"n":"CS2F - Finalize"}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"PFRN - Power Armor Stand"},{"t":3,"p":1,"n":"DOFT - Default Outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping Outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime Faction"},{"t":3,"p":1,"n":"FTST - Head Texture"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]},{"t":7,"p":1,"n":"MSDK - Morph Keys","c":[{"t":3,"p":1,"n":"Key"}]},{"t":7,"p":1,"n":"MSDV - Morph Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":10,"p":1,"n":"Face Tinting Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"TETI - Index","c":[{"t":3,"p":1,"n":"Data Type"},{"t":3,"p":1,"n":"Index"}]},{"t":6,"p":1,"n":"TEND - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Template Color Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"MRSV - Body Morph Region Values","c":[{"t":5,"p":1,"n":"Head"},{"t":5,"p":1,"n":"Upper Torso"},{"t":5,"p":1,"n":"Arms"},{"t":5,"p":1,"n":"Lower Torso"},{"t":5,"p":1,"n":"Legs"}]},{"t":10,"p":1,"n":"Face Morphs","d":1,"c":[{"t":6,"p":1,"n":"Face Morph","c":[{"t":3,"p":1,"n":"FMRI - Index"},{"t":6,"p":1,"n":"FMRS - Values","c":[{"t":5,"p":1,"n":"Position - X"},{"t":5,"p":1,"n":"Position - Y"},{"t":5,"p":1,"n":"Position - Z"},{"t":5,"p":1,"n":"Rotation - X"},{"t":5,"p":1,"n":"Rotation - Y"},{"t":5,"p":1,"n":"Rotation - Z"},{"t":5,"p":1,"n":"Scale"},{"t":11,"n":"Unknown"}]}]}]},{"t":5,"p":1,"n":"FMIN - Facial Morph Intensity"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"}]},{"t":1,"p":1,"n":"OMOD - Object Modification","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Attach Point"},{"t":7,"p":1,"n":"Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":11,"p":1,"n":"Value 1"},{"t":11,"p":1,"n":"Value 2"}]}]},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Minimum Level"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]},{"t":7,"p":1,"n":"MNAM - Target OMOD Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"FNAM - Filter Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"LNAM - Loose Mod"},{"t":3,"p":1,"n":"NAM1 - Priority"},{"t":2,"p":1,"n":"FLTR - Filter"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items","c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"n":"OVIS - Object Visibility Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Object"},{"t":6,"n":"DATA - Object Bounds","c":[{"t":5,"n":"X1"},{"t":5,"n":"Y1"},{"t":5,"n":"Z1"},{"t":5,"n":"X2"},{"t":5,"n":"Y2"},{"t":5,"n":"Z2"}]}]}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags"}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags"},{"t":3,"p":1,"n":"Clear General Flags"},{"t":3,"p":1,"n":"Set Interrupt Flags"},{"t":3,"p":1,"n":"Clear Interrupt Flags"},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Image"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":2,"p":1,"n":"FNAM - SWF"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":3,"p":1,"n":"EPFB - Perk Entry ID (unique)"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PKIN - Pack-In","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"CNAM - Cell"},{"t":3,"p":1,"n":"VNAM - Version"}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"},{"t":3,"p":1,"n":"Tracer Frequency"},{"t":3,"p":1,"n":"VATS Projectile"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model Filename"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"fragmentCount"},{"t":2,"p":1,"n":"scriptName"},{"t":6,"p":1,"n":"Script Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":11,"n":"Unused"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":3,"p":1,"n":"LNAM - Location"},{"t":3,"p":1,"n":"XNAM - Quest Completion XP"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"p":1,"n":"Stages","d":1,"c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags"},{"t":3,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"NAM2 - Note"},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Keyword"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"s":1,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":3,"p":1,"n":"ALCC - Closest To Alias"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":7,"p":1,"n":"ALLA - Linked Aliases","c":[{"t":6,"p":1,"n":"Linked Alias","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"}]}]},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":3,"p":1,"n":"ALFV - Forced Voice"},{"t":3,"p":1,"n":"ALDI - Death Item"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":3,"p":1,"n":"GNAM - Quest Group"},{"t":2,"p":1,"n":"SNAM - SWF File"}]},{"t":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"STCP - Sound"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":7,"n":"PRPS - Properties","c":[{"t":6,"n":"Property","c":[{"t":3,"n":"Actor Value"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"APPR - Attach Parent Slots","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":6,"n":"Male Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":6,"n":"Female Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Acceleration Rate"},{"t":5,"n":"Deceleration Rate"},{"t":3,"n":"Size"},{"t":11,"n":"Unknown"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":3,"n":"Beard Biped Object"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2"},{"t":3,"n":"Pipboy Biped Object"},{"t":3,"n":"XP Value"},{"t":5,"n":"Severable - Debris Scale"},{"t":3,"n":"Severable - Debris Count"},{"t":3,"n":"Severable - Decal Count"},{"t":5,"n":"Explodable - Debris Scale"},{"t":3,"n":"Explodable - Debris Count"},{"t":3,"n":"Explodable - Decal Count"},{"t":3,"n":"Severable - Explosion"},{"t":3,"n":"Severable - Debris"},{"t":3,"n":"Severable - Impact DataSet"},{"t":3,"n":"Explodable - Explosion"},{"t":3,"n":"Explodable - Debris"},{"t":3,"n":"Explodable - Impact DataSet"},{"t":5,"n":"OnCripple - Debris Scale"},{"t":3,"n":"OnCripple - Debris Count"},{"t":3,"n":"OnCripple - Decal Count"},{"t":3,"n":"OnCripple - Explosion"},{"t":3,"n":"OnCripple - Debris"},{"t":3,"n":"OnCripple - Impact DataSet"},{"t":3,"n":"Explodable - Subsegment Explosion"},{"t":5,"n":"Orientation Limits - Pitch"},{"t":5,"n":"Orientation Limits - Roll"}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"n":"NAM2 - Marker NAM2 #1"},{"t":8,"n":"Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Voice"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Default Hair Color"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Action Points Mult"},{"t":3,"n":"Stagger Offset"}]},{"t":2,"n":"ATKE - Attack Event"},{"t":3,"n":"ATKW - Weapon Slot"},{"t":3,"n":"ATKS - Required Slot"},{"t":2,"n":"ATKT - Description"}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"n":"NAM4 - Impact Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Dismember Blood Art"},{"t":3,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"n":"NAM2 - Collar TextureSet"},{"t":3,"n":"ONAM - Sound - Open Corpse"},{"t":3,"n":"LNAM - Sound - Close Corpse"},{"t":8,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":7,"n":"RBPC - Biped Object Conditions","c":[{"t":3,"n":"Slot 30+"}]},{"t":10,"n":"Movement Data Overrides","c":[{"t":6,"n":"Override","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Walk - Left"},{"t":5,"n":"Run - Left"},{"t":5,"n":"Walk - Right"},{"t":5,"n":"Run - Right"},{"t":5,"n":"Walk - Forward"},{"t":5,"n":"Run - Forward"},{"t":5,"n":"Sprint - Forward"},{"t":5,"n":"Walk - Back"},{"t":5,"n":"Run - Back"},{"t":5,"n":"Standing - Pitch"},{"t":5,"n":"Walk - Pitch"},{"t":5,"n":"Run - Pitch"},{"t":5,"n":"Sprint - Pitch"},{"t":5,"n":"Standing - Yaw"},{"t":5,"n":"Walk - Yaw"},{"t":5,"n":"Run - Yaw"},{"t":5,"n":"Sprint - Yaw"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":8,"n":"Equip Slots","c":[{"t":6,"n":"Equip Slot","c":[{"t":3,"n":"QNAM - Equip Slot"},{"t":2,"n":"ZNAM - Node"}]}]},{"t":3,"n":"UNWP - Unarmed Weapon"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]}]},{"t":3,"n":"WKMV - Base Movement Defaults - Default"},{"t":3,"n":"SWMV - Base Movement Defaults - Swim"},{"t":3,"n":"FLMV - Base Movement Defaults - Fly"},{"t":3,"n":"SNMV - Base Movement Defaults - Sneak"},{"n":"NAM0 - Head Data Marker"},{"n":"MNAM - Male Data Marker"},{"t":6,"n":"NNAM - Male Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Male Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Male Race Presets","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Male Hair Colors","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Male Face Details","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Male Default Face Texture"},{"t":8,"n":"Male Tint Layers","c":[{"t":6,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"n":"Options","c":[{"t":6,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Male Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Male Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Male Wrinkle Map Path"},{"n":"FNAM - Female Data Marker"},{"t":6,"n":"NNAM - Female Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Female Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Female Race Presets","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Female Hair Colors","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Female Face Details","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Female Default Face Texture"},{"t":8,"n":"Female Tint Layers","c":[{"t":6,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"n":"Options","c":[{"t":6,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Female Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Female Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Female Wrinkle Map Path"},{"t":3,"n":"NAM8 - Morph Race"},{"t":3,"n":"RNAM - Armor Race"},{"t":3,"n":"SRAC - Subgraph Template Race"},{"t":3,"n":"SADD - Subgraph Additive Race"},{"t":8,"n":"Subgraph Data","c":[{"t":6,"n":"Data","c":[{"t":2,"n":"SGNM - Behaviour Graph"},{"t":8,"n":"Actor Keywords","c":[{"t":3,"n":"SAKD - Keyword"}]},{"t":8,"n":"Target Keywords","c":[{"t":3,"n":"STKD - Keyword"}]},{"t":8,"n":"Animation Paths","c":[{"t":2,"n":"SAPT - Path"}]},{"t":6,"n":"SRAF - Flags","c":[{"t":3,"n":"Role"},{"t":3,"n":"Perspective"}]}]}]},{"t":5,"n":"PTOP - Idle Chatter Time Min"},{"t":5,"n":"NTOP - Idle Chatter Time Max"},{"t":8,"n":"Morph Values","c":[{"t":6,"n":"Value","c":[{"t":3,"n":"MSID - Index"},{"t":2,"n":"MSM0 - Min Name"},{"t":2,"n":"MSM1 - Max Name"}]}]},{"t":11,"n":"MLSI - Unknown"},{"t":2,"n":"HNAM - Hair Color Lookup Texture"},{"t":2,"n":"HLTX - Hair Color Extended Lookup Texture"},{"t":3,"n":"QSTI - Dialogue Quest"},{"t":8,"n":"Bone Data","c":[{"t":6,"n":"Data","c":[{"t":3,"n":"BSMP - Gender"},{"t":8,"n":"Bones","c":[{"t":6,"n":"Bone","c":[{"t":2,"n":"BSMB - Name"},{"t":7,"n":"BSMS - Values","c":[{"t":5,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"s":1,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":8,"p":1,"n":"Linked Rooms","c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.0+\/-"},{"t":5,"p":1,"n":"End Distance Cap"},{"t":5,"p":1,"n":"Shadow Depth Bias"},{"t":5,"p":1,"n":"Near Clip"},{"t":5,"p":1,"n":"Volumetric Intensity"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Transition Interior"}]},{"t":3,"p":1,"n":"XTNM - Teleport Loc Name"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XASP - Acoustic Restriction"},{"p":1,"n":"XATP - Activation Point"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":6,"s":1,"p":1,"n":"XRDO - Radio","c":[{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Min Weak Distance"},{"t":5,"p":1,"n":"Max Weak Distance"},{"t":3,"p":1,"n":"Flags"}]},{"t":6,"s":1,"p":1,"n":"XBSD - Spline","c":[{"t":5,"p":1,"n":"Slack"},{"t":5,"p":1,"n":"Thickness"},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Wind - Detached End"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XPDD - Projected Decal","c":[{"t":5,"p":1,"n":"Width Scale"},{"t":5,"p":1,"n":"Height Scale"}]},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"Power Grid","c":[{"t":3,"p":1,"n":"XWPG - Count"},{"t":8,"p":1,"n":"Connections","c":[{"t":6,"p":1,"n":"XWPN - Connection","c":[{"t":3,"p":1,"n":"Node 1"},{"t":3,"p":1,"n":"Node 2"},{"t":3,"p":1,"n":"Line"}]}]}]},{"t":11,"n":"XCVR - Unknown"},{"t":11,"n":"XCVL - Unknown"},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":11,"n":"ANAM - Unknown"}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":5,"p":1,"n":"RLDM - LOD Display Distance Multiplier"},{"t":5,"p":1,"n":"ANAM - Occlusion Accuracy Dist"}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]},{"t":3,"p":1,"n":"ANAM - Reverb Class"}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"RFGP - Reference Group","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Name"},{"t":3,"p":1,"n":"RNAM - Reference"},{"t":11,"n":"PNAM - Unknown"}]},{"t":1,"p":1,"n":"SCCO - Scene Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Scenes","d":1,"c":[{"t":6,"p":1,"n":"Scene","c":[{"t":3,"p":1,"n":"SNAM - Scene"},{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":11,"n":"VNAM - Unknown"},{"t":8,"n":"Unknown","c":[{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Start Conditions"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Completion Conditions"},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Start"},{"t":3,"p":1,"n":"On Completion"}]},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"LNAM - Flags"},{"t":3,"p":1,"n":"DNAM - Behaviour Flags"}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer - Max Seconds"},{"t":3,"p":1,"n":"SCQS - Set Parent Quest Stage"},{"t":5,"p":1,"n":"TNAM - Timer - Min Seconds"},{"t":11,"n":"STSC - Unknown"},{"t":8,"p":1,"n":"Start Scenes","c":[{"t":6,"p":1,"n":"Start Scene","c":[{"t":3,"p":1,"n":"LCEP - Scene"},{"t":3,"p":1,"n":"INTT - Phase Index"},{"t":2,"p":1,"n":"SSPN - Start Phase for Scene"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"p":1,"n":"PTOP - Player Positive Response"},{"t":3,"p":1,"n":"NTOP - Player Negative Response"},{"t":3,"p":1,"n":"NETO - Player Neutral Response"},{"t":3,"p":1,"n":"QTOP - Player Question Response"},{"t":3,"p":1,"n":"VENC - Player Positive Dialogue Subtype"},{"t":3,"p":1,"n":"PLVD - Player Negative Dialogue Subtype"},{"t":3,"p":1,"n":"JOUT - Player Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"DALC - Player Question Dialogue Subtype"},{"t":7,"p":1,"n":"DTID - NPC Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"NPOT - NPC Positive Response"},{"t":3,"p":1,"n":"NNGT - NPC Negative Response"},{"t":3,"p":1,"n":"NNUT - NPC Neutral Response"},{"t":3,"p":1,"n":"NQUT - NPC Question Response"},{"t":3,"p":1,"n":"NPOS - NPC Positive Dialogue Subtype"},{"t":3,"p":1,"n":"NNGS - NPC Negative Dialogue Subtype"},{"t":3,"p":1,"n":"NNUS - NPC Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"NQUS - NPC Question Dialogue Subtype"},{"t":3,"p":1,"n":"DTGT - Dialogue Target Actor"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"p":1,"n":"End Scene Say Greeting"},{"t":3,"p":1,"n":"Play Sound"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":6,"p":1,"n":"CRIS - Camera","c":[{"t":5,"p":1,"n":"FOV On Player Camera"},{"t":5,"p":1,"n":"Rate Of Camera Change"}]},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":7,"p":1,"n":"HTID - Player Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"VENC - Dialogue Subtype"},{"t":3,"p":1,"n":"PNAM - AnimArchType"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":5,"p":1,"n":"CNAM - Camera Distance Override"},{"t":5,"p":1,"n":"ACTV - Dialogue Distance Override"},{"t":5,"p":1,"n":"CRIS - FOV Override"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Template Scene"},{"t":3,"p":1,"n":"XNAM - Index"}]},{"t":1,"p":1,"n":"SCOL - Static Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":10,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"ONAM - Static"},{"t":7,"p":1,"n":"DATA - Placements","c":[{"t":6,"p":1,"n":"Placement","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Scale"}]}]}]}]}]},{"t":1,"p":1,"n":"SCSN - Audio Category Snapshot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Priority"},{"t":8,"s":1,"p":1,"n":"Category Multipliers","d":1,"c":[{"t":6,"p":1,"n":"CNAM - Category Multiplier","c":[{"t":3,"p":1,"n":"Categoty"},{"t":5,"p":1,"n":"Multiplier"}]}]}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags"},{"t":3,"p":1,"n":"Quest Flags"}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":5,"p":1,"n":"HNAM - Hours until reset"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"PNAM - Parent Category"},{"t":3,"p":1,"n":"ONAM - Menu Slider Category"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"},{"t":5,"p":1,"n":"MNAM - Min Frequency Multiplier"},{"t":5,"p":1,"n":"CNAM - Sidechain Target Multiplier"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"CNAM - Descriptor Type"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Sidechain"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]},{"t":3,"p":1,"n":"Base Descriptor"},{"t":8,"s":1,"p":1,"n":"Descriptors","d":1,"c":[{"t":3,"p":1,"n":"DNAM - Descriptor"}]},{"t":3,"n":"ITMC - Count"},{"t":10,"p":1,"n":"Rates of Fire","d":1,"c":[{"t":6,"p":1,"n":"Sound","c":[{"p":1,"n":"ITMS - Marker Start"},{"t":3,"p":1,"n":"INTV - RoF (RPM)"},{"t":2,"p":1,"n":"FNAM - File"},{"p":1,"n":"ITME - Marker End"}]}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":3,"p":1,"n":"MNAM - Type"},{"t":3,"p":1,"n":"VNAM - Static Attenuation"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"FL"},{"t":3,"p":1,"n":"FR"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"SL"},{"t":3,"p":1,"n":"SR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ATTN - Attenuation Values","c":[{"t":5,"p":1,"n":"Fade In Distance - Start"},{"t":5,"p":1,"n":"Fade In Distance - End"},{"t":5,"p":1,"n":"Fade Out Distance - Start"},{"t":5,"p":1,"n":"Fade Out Distance - End"},{"t":6,"p":1,"n":"Fade In Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]},{"t":6,"p":1,"n":"Fade Out Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]}]},{"t":3,"p":1,"n":"ENAM - Effect Chain"}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"},{"t":6,"s":1,"p":1,"n":"REPT - Repeat","c":[{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Max Time"},{"t":3,"p":1,"n":"Stackable"}]}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Casting Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"MNAM - Particle Texture"}]},{"t":1,"p":1,"n":"STAG - Animation Sound Tag Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"TNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":2,"p":1,"n":"Action"}]}]}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"LOD","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TERM - Terminal","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"NAM0 - Header Text"},{"t":2,"p":1,"n":"WNAM - Welcome Text"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":11,"n":"WBDT - Workbench Data (unused)"},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"BSIZ - Count"},{"t":8,"s":1,"p":1,"n":"Body Text","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":2,"p":1,"n":"BTXT - Text"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"n":"ISIZ - Count"},{"t":8,"s":1,"p":1,"n":"Menu Items","d":1,"c":[{"t":6,"p":1,"n":"Menu Item","c":[{"t":2,"p":1,"n":"ITXT - Item Text"},{"t":2,"p":1,"n":"RNAM - Response Text"},{"t":3,"p":1,"n":"ANAM - Type"},{"t":3,"p":1,"n":"ITID - Item ID"},{"t":2,"p":1,"n":"UNAM - Display Text"},{"t":2,"p":1,"n":"VNAM - Show Image"},{"t":3,"p":1,"n":"TNAM - Submenu"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TRNS - Transform","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":5,"p":1,"n":"Scale"},{"t":5,"p":1,"n":"Zoom Min"},{"t":5,"p":1,"n":"Zoom Max"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX03 - Glow"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX02 - Wrinkles"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Smooth Spec"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Material"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"ANAM - Opacity (unused)"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Material (unused)"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Consume Spell"},{"t":3,"p":1,"n":"YNAM - Contact Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":6,"p":1,"n":"Fog Properties","c":[{"t":5,"p":1,"n":"Depth Amount"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Shallow Range"},{"t":5,"p":1,"n":"Color Deep Range"},{"t":5,"p":1,"n":"Shallow Alpha"},{"t":5,"p":1,"n":"Deep Alpha"},{"t":5,"p":1,"n":"Alpha Shallow Range"},{"t":5,"p":1,"n":"Alpha Deep Range"},{"t":6,"p":1,"n":"Underwater Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Underwater Fog Amount"},{"t":5,"p":1,"n":"Underwater Near Fog"},{"t":5,"p":1,"n":"Underwater Far Fog"}]},{"t":6,"p":1,"n":"Physical Properties","c":[{"t":5,"p":1,"n":"Normal Magnitude"},{"t":5,"p":1,"n":"Shallow Normal Falloff"},{"t":5,"p":1,"n":"Deep Normal Falloff"},{"t":5,"p":1,"n":"Reflectivity Amount"},{"t":5,"p":1,"n":"Fresnel Amount"},{"t":5,"p":1,"n":"Surface Effect Falloff"},{"t":6,"p":1,"n":"Displacement Simulator","c":[{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Velocity"},{"t":5,"p":1,"n":"Falloff"},{"t":5,"p":1,"n":"Dampener"},{"t":5,"p":1,"n":"Starting Size"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular Properties","c":[{"t":5,"p":1,"n":"Sun Specular Power"},{"t":5,"p":1,"n":"Sun Specular Magnitude"},{"t":5,"p":1,"n":"Sun Sparkle Power"},{"t":5,"p":1,"n":"Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Interior Specular Radius"},{"t":5,"p":1,"n":"Interior Specular Brightness"},{"t":5,"p":1,"n":"Interior Specular Power"}]},{"t":6,"p":1,"n":"Noise Properties","c":[{"t":5,"p":1,"n":"Layer 1 - Wind Direction"},{"t":5,"p":1,"n":"Layer 2 - Wind Direction"},{"t":5,"p":1,"n":"Layer 3 - Wind Direction"},{"t":5,"p":1,"n":"Layer 1 - Wind Speed"},{"t":5,"p":1,"n":"Layer 2 - Wind Speed"},{"t":5,"p":1,"n":"Layer 3 - Wind Speed"},{"t":5,"p":1,"n":"Layer 1 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 2 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 3 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 1 - UV Scale"},{"t":5,"p":1,"n":"Layer 2 - UV Scale"},{"t":5,"p":1,"n":"Layer 3 - UV Scale"},{"t":5,"p":1,"n":"Layer 1 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 2 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 3 - Noise Falloff"}]},{"t":6,"p":1,"n":"Silt Properties","c":[{"t":5,"p":1,"n":"Silt Amount"},{"t":6,"p":1,"n":"Light Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Dark Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"Screen Space Reflections"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Layer 1 Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Layer 2 Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Layer 3 Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"NNAM - Embedded Weapon Mod"},{"t":6,"s":1,"p":1,"n":"1st Person Model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Ammo"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reload Speed"},{"t":5,"p":1,"n":"Reach"},{"t":5,"p":1,"n":"Min Range"},{"t":5,"p":1,"n":"Max Range"},{"t":5,"p":1,"n":"Attack Delay"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Damage - OutOfRange Mult"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Capacity"},{"t":3,"p":1,"n":"Animation Type"},{"t":5,"p":1,"n":"Damage - Secondary"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Damage - Base"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Sound - Attack"},{"t":3,"p":1,"n":"Sound - Attack 2D"},{"t":3,"p":1,"n":"Sound - Attack Loop"},{"t":3,"p":1,"n":"Sound - Attack Fail"},{"t":3,"p":1,"n":"Sound - Idle"},{"t":3,"p":1,"n":"Sound - Equip Sound"},{"t":3,"p":1,"n":"Sound - UnEquip Sound"},{"t":3,"p":1,"n":"Sound - Fast Equip Sound"},{"t":3,"p":1,"n":"Accuracy Bonus"},{"t":5,"p":1,"n":"Animation Attack Seconds"},{"t":5,"p":1,"n":"Action Point Cost"},{"t":5,"p":1,"n":"Full Power Seconds"},{"t":5,"p":1,"n":"Min Power Per Shot"},{"t":3,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":5,"p":1,"n":"Animation Fire Seconds"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":5,"p":1,"n":"Animation Reload Seconds"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Sighted Transition Seconds"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Override Projectile"},{"t":3,"p":1,"n":"Pattern"},{"t":3,"p":1,"n":"Rumble - Peroid (ms)"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":5,"p":1,"n":"Crit Damage Mult"},{"t":5,"p":1,"n":"Crit Charge Bonus"},{"t":3,"p":1,"n":"Crit Effect"}]},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"LNAM - NPC Add Ammo List"},{"t":3,"p":1,"n":"WAMD - Aim Model"},{"t":3,"p":1,"n":"WZMD - Zoom"},{"t":3,"p":1,"n":"CNAM - Template"},{"t":7,"p":1,"n":"DAMA - Damage Types","c":[{"t":6,"p":1,"n":"Damage Type","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Amount"}]}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"MASE - Melee Speed"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"n":"Unused RNAM","c":[{"t":11,"n":"RNAM - Unknown"}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":6,"s":1,"p":1,"n":"World Default Level Data","c":[{"t":6,"p":1,"n":"WLEV - Dimension","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Size","c":[{"t":3,"p":1,"n":"Width"},{"t":3,"p":1,"n":"Height"}]}]},{"t":11,"p":1,"n":"WLEV - Data"}]},{"t":11,"n":"OFST - Offset Data"},{"t":11,"n":"CLSZ - Unknown"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"},{"t":5,"p":1,"n":"EarlySunrise"},{"t":5,"p":1,"n":"LateSunrise"},{"t":5,"p":1,"n":"EarlySunset"},{"t":5,"p":1,"n":"LateSunset"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"n":"NAM4 - Unknown","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"},{"t":5,"p":1,"n":"Day - Near Height Mid"},{"t":5,"p":1,"n":"Day - Near Height Range"},{"t":5,"p":1,"n":"Night - Near Height Mid"},{"t":5,"p":1,"n":"Night - Near Height Range"},{"t":5,"p":1,"n":"Day - High Density Scale"},{"t":5,"p":1,"n":"Night - High Density Scale"},{"t":5,"p":1,"n":"Day - Far Height Mid"},{"t":5,"p":1,"n":"Day - Far Height Range"},{"t":5,"p":1,"n":"Night - Far Height Mid"},{"t":5,"p":1,"n":"Night - Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"WGDR - God Rays","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"},{"t":6,"s":1,"p":1,"n":"UNAM - Magic","c":[{"t":3,"p":1,"n":"On Lightning Strike - Spell"},{"t":5,"p":1,"n":"On Lightning Strike - Threshold"},{"t":3,"p":1,"n":"On Weather Activate - Spell"},{"t":5,"p":1,"n":"On Weather Activate - Threshold"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"VNAM - Volatility Mult"},{"t":5,"p":1,"n":"WNAM - Visibility Mult"}]},{"t":1,"p":1,"n":"ZOOM - Zoom","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"GNAM - Data","c":[{"t":5,"p":1,"n":"FOV Mult"},{"t":3,"p":1,"n":"Overlay"},{"t":3,"p":1,"n":"Imagespace Modifier"},{"t":6,"p":1,"n":"Camera Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"}]}]},"name":"Smash.All","hash":"A4B4931B","color":128} \ No newline at end of file +{"records":"AACT,ACTI,ADDN,AECH,ALCH,AMDL,AMMO,ANIO,AORU,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BNDS,BOOK,BPTD,CAMS,CELL,CLAS,CLFM,CLMT,CMPO,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DFOB,DIAL,DLBR,DLVW,DMGT,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,FACT,FLOR,FLST,FSTP,FSTS,FURN,GDRY,GLOB,GMST,GRAS,HAZD,HDPT,IDLE,IDLM,IMAD,IMGS,INFO,INGR,INNR,IPCT,IPDS,KEYM,KSSM,KYWD,LAND,LAYR,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MSWP,MUSC,MUST,NOTE,NPC_,OMOD,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,PKIN,PMIS,PROJ,QUST,RACE,REFR,REGN,RELA,REVB,RFCT,RFGP,SCCO,SCEN,SCOL,SCSN,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAG,STAT,TACT,TERM,TREE,TRNS,TXST,VTYP,WATR,WEAP,WRLD,WTHR,ZOOM,ACHR","description":"Smashes all the things. Produced using autoset attributes on all record types found in Fallout4.esm and DLC.\r\n\r\nLast updated 01\/07\/2021.","tree":{"records":[{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"STCP - Sound"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"No Displacement"},{"t":4,"p":1,"n":"Ignored by Sandbox"}]},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":6,"s":1,"p":1,"n":"RADR - Radio Receiver","c":[{"t":3,"p":1,"n":"Sound Model"},{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Volume"},{"t":3,"p":1,"n":"Starts Active"},{"t":3,"p":1,"n":"No Signal Static"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"LNAM - Light"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"AECH - Audio Effect Chain","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"KNAM - Type"},{"t":6,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Enabled"},{"t":5,"p":1,"n":"Input Gain"},{"t":5,"p":1,"n":"Center Freq"},{"t":5,"p":1,"n":"Feedback %"},{"t":5,"p":1,"n":"Output Gain"},{"t":5,"p":1,"n":"Q Value"},{"t":5,"p":1,"n":"Wet Mix %"},{"t":5,"p":1,"n":"Upper Threshold"},{"t":3,"p":1,"n":"Filter Mode"},{"t":3,"p":1,"n":"Delay MS"},{"t":5,"p":1,"n":"Lower Threshold"},{"t":11,"n":"Unused"}]}]}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":"Food Item"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"p":1,"n":"Medicine"},{"t":4,"p":1,"n":"Poison"}]},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":2,"p":1,"n":"DNAM - Addiction Name"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMDL - Aim Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Cone of Fire - Min Angle"},{"t":5,"p":1,"n":"Cone of Fire - Max Angle"},{"t":5,"p":1,"n":"Cone of Fire - Increase Per Shot"},{"t":5,"p":1,"n":"Cone of Fire - Decrease Per Sec"},{"t":3,"p":1,"n":"Cone of Fire - Decrease Delay MS"},{"t":5,"p":1,"n":"Cone of Fire - Sneak Mult"},{"t":5,"p":1,"n":"Recoil - Diminish Spring Force"},{"t":5,"p":1,"n":"Recoil - Diminish Sights Mult"},{"t":5,"p":1,"n":"Recoil - Max Per Shot"},{"t":5,"p":1,"n":"Recoil - Min Per Shot"},{"t":5,"p":1,"n":"Recoil - Hip Mult"},{"t":3,"p":1,"n":"Runaway - Recoil Shots"},{"t":5,"p":1,"n":"Recoil - Arc"},{"t":5,"p":1,"n":"Recoil - Arc Rotate"},{"t":5,"p":1,"n":"Cone of Fire - Iron Sights Mult"},{"t":5,"p":1,"n":"Stability - Base Stability"}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Health"}]},{"t":2,"p":1,"n":"ONAM - Short Name"},{"t":2,"p":1,"n":"NAM1 - Casing Model"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"AORU - Attraction Rule","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"AOR2 - Data","c":[{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Delay"},{"t":5,"p":1,"n":"Max Delay"},{"t":3,"p":1,"n":"Requires Line of Sight"},{"t":3,"p":1,"n":"Combat Target"},{"t":11,"n":"Unused"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Enabled"}]},{"t":3,"p":1,"n":"Weight slider - Female","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Enabled"}]},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model FileName"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"},{"t":5,"p":1,"n":"MO2C - Color Remapping Index"},{"t":11,"n":"MO2F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model FileName"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO3S - Material Swap"},{"t":5,"p":1,"n":"MO3C - Color Remapping Index"},{"t":11,"n":"MO3F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model FileName"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model FileName"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO5S - Material Swap"},{"t":5,"p":1,"n":"MO5C - Color Remapping Index"},{"t":11,"n":"MO5F - Unknown"}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin Texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"s":1,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"},{"t":8,"s":1,"p":1,"n":"Bone Data","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"BSMP - Gender"},{"t":8,"p":1,"n":"Bones","c":[{"t":6,"p":1,"n":"Bone","c":[{"t":2,"p":1,"n":"BSMB - Name"},{"t":7,"p":1,"n":"BSMS - Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model FileName"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"}]},{"t":2,"p":1,"n":"ICON - Male Inventory Image"},{"t":2,"p":1,"n":"MICO - Male Message Icon"},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model FileName"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"}]},{"t":2,"p":1,"n":"ICO2 - Female Inventory Image"},{"t":2,"p":1,"n":"MIC2 - Female Message Icon"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":3,"p":1,"n":"INDX - Addon Index"},{"t":3,"p":1,"n":"MODL - Armor Addon"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Health"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":3,"p":1,"n":"Armor Rating"},{"t":3,"p":1,"n":"Base Addon Index"},{"t":3,"p":1,"n":"Stagger Rating"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMA - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"TNAM - Template Armor"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type"},{"t":3,"p":1,"n":"XTRI - Is Interior"},{"t":3,"p":1,"n":"WNAM - Weather Attenuation (dB)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Family Association"}]}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":5,"p":1,"n":"NAM0 - Default Value"},{"t":3,"p":1,"n":"AVFL - Flags"},{"t":3,"p":1,"n":"NAM1 - Type"}]},{"t":1,"p":1,"n":"BNDS - Bendable Spline","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Default Number of Tiles"},{"t":3,"p":1,"n":"Default Number of Slices"},{"t":3,"p":1,"n":"Default Number of Tiles - Relative to Length"},{"t":6,"p":1,"n":"Default Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Wind Settings - Sensibility"},{"t":5,"p":1,"n":"Wind Settings - Flexibility"}]},{"t":3,"p":1,"n":"TNAM - Texture"}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Perk"},{"t":6,"p":1,"n":"Text Offset","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":2,"p":1,"n":"CNAM - Description"},{"t":3,"p":1,"n":"INAM - Inventory Art"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":6,"p":1,"n":"BPND - BPND","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":5,"p":1,"n":"Cut - Min"},{"t":5,"p":1,"n":"Cut - Max"},{"t":5,"p":1,"n":"Cut - Radius"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate X"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate Y"},{"t":5,"p":1,"n":"Cut - Tesselation"},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":5,"p":1,"n":"Explodable - Limb Replacement Scale"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Severable"},{"t":4,"p":1,"n":"IK Data"},{"t":4,"p":1,"n":"IK Data - Biped Data"},{"t":4,"p":1,"n":"Explodable"},{"t":4,"p":1,"n":"IK Data - Is Head"},{"t":4,"p":1,"n":"IK Data - Headtracking"},{"t":4,"p":1,"n":"To Hit Chance - Absolute"}]},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Non-Lethal Dismemberment Chance"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":3,"p":1,"n":"Geometry Segment Index"},{"t":3,"p":1,"n":"On Cripple - Art Object"},{"t":3,"p":1,"n":"On Cripple - Debris"},{"t":3,"p":1,"n":"On Cripple - Explosion"},{"t":3,"p":1,"n":"On Cripple - Impact DataSet"},{"t":5,"p":1,"n":"On Cripple - Debris Scale"},{"t":3,"p":1,"n":"On Cripple - Debris Count"},{"t":3,"p":1,"n":"On Cripple - Decal Count"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"},{"t":2,"p":1,"n":"ENAM - Hit Reaction - Start"},{"t":2,"p":1,"n":"FNAM - Hit Reaction - End"},{"t":3,"p":1,"n":"BNAM - Gore Effects - Dismember Blood Art"},{"t":3,"p":1,"n":"INAM - Gore Effects - Blood Impact Material Type"},{"t":3,"p":1,"n":"JNAM - On Cripple - Blood Impact Material Type"},{"t":3,"p":1,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"p":1,"n":"NAM2 - Collar TextureSet"},{"t":2,"p":1,"n":"DNAM - Twist Variable Prefix"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Position Follows Location"},{"t":4,"p":1,"n":"Rotation Follows Target"},{"t":4,"p":1,"n":"Don't Follow Bone"},{"t":4,"p":1,"n":"First Person Camera"},{"t":4,"p":1,"n":"No Tracer"},{"t":4,"p":1,"n":"Start At Time Zero"}]},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"},{"t":5,"p":1,"n":"Location Spring"},{"t":5,"p":1,"n":"Target Spring"},{"t":6,"p":1,"n":"Rotation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Is Interior Cell"},{"t":4,"p":1,"n":"Has Water"},{"t":4,"p":1,"n":"Can't Travel From Here"},{"t":4,"p":1,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"p":1,"n":"Public Area"},{"t":4,"p":1,"n":"Hand Changed"},{"t":4,"p":1,"n":"Show Sky"},{"t":4,"p":1,"n":"Use Sky Lighting"}]},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land","c":[{"t":4,"p":1,"n":"Quad 1"},{"t":4,"p":1,"n":"Quad 2"},{"t":4,"p":1,"n":"Quad 3"},{"t":4,"p":1,"n":"Quad 4"}]}]},{"t":11,"n":"VISI - PreVis Files Timestamp"},{"t":3,"p":1,"n":"RVIS - In PreVis File Of"},{"t":11,"n":"PCMB - PreCombined Files Timestamp"},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits","c":[{"t":4,"p":1,"n":"Ambient Color"},{"t":4,"p":1,"n":"Directional Color"},{"t":4,"p":1,"n":"Fog Color"},{"t":4,"p":1,"n":"Fog Near"},{"t":4,"p":1,"n":"Fog Far"},{"t":4,"p":1,"n":"Directional Rotation"},{"t":4,"p":1,"n":"Directional Fade"},{"t":4,"p":1,"n":"Clip Distance"},{"t":4,"p":1,"n":"Fog Power"},{"t":4,"p":1,"n":"Fog Max"},{"t":4,"p":1,"n":"Light Fade Distances"}]},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":3,"p":1,"n":"CNAM - Precombined Object Level XY"},{"t":3,"p":1,"n":"ZNAM - Precombined Object Level Z"},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":6,"s":1,"p":1,"n":"XILW - Exterior LOD","c":[{"t":3,"p":1,"n":"Worldspace"},{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"}]},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"},{"t":3,"p":1,"n":"XGDR - God Rays"},{"t":7,"p":1,"n":"XPRI - Physics References","c":[{"t":3,"p":1,"n":"Reference"}]},{"t":6,"s":1,"p":1,"n":"XCRI - Combined References","c":[{"t":3,"p":1,"n":"Meshes Count"},{"t":3,"p":1,"n":"References Count"},{"t":7,"p":1,"n":"Meshes","c":[{"t":3,"p":1,"n":"Combined Mesh"}]},{"t":7,"p":1,"n":"References","c":[{"t":6,"p":1,"n":"Reference","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Combined Mesh"}]}]}]}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Bleedout Default"}]}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CNAM - Color\/Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"CMPO - Component","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":3,"p":1,"n":"DATA - Auto Calc Value"},{"t":3,"p":1,"n":"MNAM - Scrap Item"},{"t":3,"p":1,"n":"GNAM - Mod Scrap Scalar"}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":7,"p":1,"n":"FVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":11,"n":"NAM1 - Unused"},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":3,"p":1,"n":"ANAM - Menu Art Object"},{"t":7,"p":1,"n":"FNAM - Category","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"INTV - Data","c":[{"t":3,"p":1,"n":"Created Object Count"},{"t":3,"p":1,"n":"Priority"}]}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags","c":[{"t":4,"p":1,"n":"Trigger Volume"},{"t":4,"p":1,"n":"Sensor"},{"t":4,"p":1,"n":"Navmesh Obstacle"}]},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Allow Sounds When Animation"},{"t":4,"p":1,"n":"Respawns"},{"t":4,"p":1,"n":"Show Owner"}]},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"},{"t":3,"p":1,"n":"TNAM - Sound - Take All"},{"t":3,"p":1,"n":"ONAM - Filter List"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Previous Sibling"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom \/ Flags"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"},{"t":5,"p":1,"n":"Dodge Threat Chance"},{"t":5,"p":1,"n":"Evade Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"},{"t":5,"p":1,"n":"Block When Staggered Mult"},{"t":5,"p":1,"n":"Attack When Staggered Mult"}]},{"t":5,"p":1,"n":"CSRA - Ranged Accuracy Mult"},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Dueling - Circle Mult"},{"t":5,"p":1,"n":"Dueling - Fallback Mult"},{"t":5,"p":1,"n":"Flanking - Flank Distance"},{"t":5,"p":1,"n":"Flanking - Stalk Time"},{"t":5,"p":1,"n":"Charging - Charge Distance"},{"t":5,"p":1,"n":"Charging - Throw Probability"},{"t":5,"p":1,"n":"Charging - Sprint Fast Probability"},{"t":5,"p":1,"n":"Charging - Sideswipe Probability"},{"t":5,"p":1,"n":"Charging - Disengane Probability"},{"t":3,"p":1,"n":"Charging - Throw Max Targets"},{"t":5,"p":1,"n":"Flanking - Flank Variance"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"},{"t":5,"p":1,"n":"Adjust Range Mult"},{"t":5,"p":1,"n":"Crouch Mult"},{"t":5,"p":1,"n":"Wait Mult"},{"t":5,"p":1,"n":"Range Mult"}]},{"t":5,"p":1,"n":"CSCV - Cover Search Distance Mult"},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Dueling"},{"t":4,"p":1,"n":"Flanking"},{"t":4,"p":1,"n":"Allow Dual Wielding"}]}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model FileName"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Has Collision Data"}]}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DFOB - Default Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Object"}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags","c":[{"t":4,"p":1,"n":"Do All Before Repeating"}]},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Top-Level"},{"t":4,"p":1,"n":"Blocking"},{"t":4,"p":1,"n":"Exclusive"}]},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"p":1,"n":"DMGT - Damage Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"Damage Types","c":[{"t":3,"p":1,"n":"Actor Value Index"}]}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Automatic"},{"t":4,"p":1,"n":"Hidden"},{"t":4,"p":1,"n":"Minimal Use"},{"t":4,"p":1,"n":"Sliding"},{"t":4,"p":1,"n":"Do Not Open in Combat Search"}]},{"t":2,"p":1,"n":"ONAM - Alternate Text - Open"},{"t":2,"p":1,"n":"CNAM - Alternate Text - Close"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Never Resets"},{"t":4,"p":1,"n":"Match PC Below Minimum Level"},{"t":4,"p":1,"n":"Disable Combat Boundary"}]},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Holes Animation - Start Time"},{"t":5,"p":1,"n":"Holes Animation - End Time"},{"t":5,"p":1,"n":"Holes Animation - Start Value"},{"t":5,"p":1,"n":"Holes Animation - End Value"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"}]},{"t":6,"s":1,"p":1,"n":"Data (old format)","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Extend Duration On Recast"}]},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Parent"}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"ANAM - Condition Actor Value"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Inner Radius"},{"t":5,"p":1,"n":"Outer Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Always Uses World Orientation"},{"t":4,"p":1,"n":"Knock Down - Always"},{"t":4,"p":1,"n":"Knock Down - By Formula"},{"t":4,"p":1,"n":"Ignore LOS Check"},{"t":4,"p":1,"n":"Push Explosion Source Ref Only"},{"t":4,"p":1,"n":"Ignore Image Space Swap"},{"t":4,"p":1,"n":"Chain"},{"t":4,"p":1,"n":"No Controller Vibration"}]},{"t":3,"p":1,"n":"Sound Level"},{"t":5,"p":1,"n":"Placed Object AutoFade Delay"},{"t":3,"p":1,"n":"Stagger"},{"t":6,"p":1,"n":"Spawn","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"},{"t":5,"p":1,"n":"Spread Degrees"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"Relations","d":1,"c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Hidden From NPC"},{"t":4,"p":1,"n":"Special Combat"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Track Crime"},{"t":4,"p":1,"n":"Ignore Crimes: Murder"},{"t":4,"p":1,"n":"Ignore Crimes: Assault"},{"t":4,"p":1,"n":"Ignore Crimes: Stealing"},{"t":4,"p":1,"n":"Ignore Crimes: Trespass"},{"t":4,"p":1,"n":"Do Not Report Crimes Against Members"},{"t":4,"p":1,"n":"Crime Gold - Use Defaults"},{"t":4,"p":1,"n":"Ignore Crimes: Pickpocket"},{"t":4,"p":1,"n":"Vendor"},{"t":4,"p":1,"n":"Can Be Owner"},{"t":4,"p":1,"n":"Ignore Crimes: Werewolf"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf (unused)"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"p":1,"n":"INAM - Insignia (unused)"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Buys Stolen Items"},{"t":3,"p":1,"n":"Buy\/Sell Everything Not In List?"},{"t":3,"p":1,"n":"Buys NonStolen Items"},{"t":3,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"XCNT - Count","c":[{"t":3,"n":"Walking"},{"t":3,"n":"Running"},{"t":3,"n":"Sprinting"},{"t":3,"n":"Sneaking"},{"t":3,"n":"Swimming"}]},{"t":7,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"WNAM - Drinking Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Ignored By Sandbox"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags","c":[{"t":4,"p":1,"n":"Sit 0"},{"t":4,"p":1,"n":"Sit 1"},{"t":4,"p":1,"n":"Sit 2"},{"t":4,"p":1,"n":"Sit 3"},{"t":4,"p":1,"n":"Sit 4"},{"t":4,"p":1,"n":"Sit 5"},{"t":4,"p":1,"n":"Sit 6"},{"t":4,"p":1,"n":"Sit 7"},{"t":4,"p":1,"n":"Sit 8"},{"t":4,"p":1,"n":"Sit 9"},{"t":4,"p":1,"n":"Sit 10"},{"t":4,"p":1,"n":"Sit 11"},{"t":4,"p":1,"n":"Sit 12"},{"t":4,"p":1,"n":"Sit 13"},{"t":4,"p":1,"n":"Sit 14"},{"t":4,"p":1,"n":"Sit 15"},{"t":4,"p":1,"n":"Sit 16"},{"t":4,"p":1,"n":"Sit 17"},{"t":4,"p":1,"n":"Sit 18"},{"t":4,"p":1,"n":"Sit 19"},{"t":4,"p":1,"n":"Sit 20"},{"t":4,"p":1,"n":"Sit 21"},{"t":4,"p":1,"n":"Sit 22"},{"t":4,"p":1,"n":"Sit 23"},{"t":4,"n":"Unknown 25"},{"t":4,"p":1,"n":"Disables Activation"},{"t":4,"p":1,"n":"Is Perch"},{"t":4,"p":1,"n":"Must Exit to Talk"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Form"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points","c":[{"t":4,"p":1,"n":"Front"},{"t":4,"p":1,"n":"Behind"},{"t":4,"p":1,"n":"Right"},{"t":4,"p":1,"n":"Left"},{"t":4,"p":1,"n":"Up"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points","c":[{"t":4,"p":1,"n":"Front"},{"t":4,"p":1,"n":"Behind"},{"t":4,"p":1,"n":"Right"},{"t":4,"p":1,"n":"Left"},{"t":4,"p":1,"n":"Up"}]}]}]},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"GDRY - God Rays","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Back Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":6,"p":1,"n":"Fwd Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Intensity"},{"t":5,"p":1,"n":"Air Color - Scale"},{"t":5,"p":1,"n":"Back Color - Scale"},{"t":5,"p":1,"n":"Fwd Color - Scale"},{"t":5,"p":1,"n":"Back Phase"},{"t":6,"p":1,"n":"Air Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Fwd Phase"}]}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Vertex Lighting"},{"t":4,"p":1,"n":"Uniform Scaling"},{"t":4,"p":1,"n":"Fit to Slope"}]}]}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Effect"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"},{"t":6,"p":1,"n":"Taper Effectiveness","c":[{"t":5,"p":1,"n":"Full Effect Radius"},{"t":5,"p":1,"n":"Taper Weight"},{"t":5,"p":1,"n":"Taper Curse"}]}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Playable"},{"t":4,"p":1,"n":"Male"},{"t":4,"p":1,"n":"Female"},{"t":4,"p":1,"n":"Is Extra Part"},{"t":4,"p":1,"n":"Use Solid Tint"}]},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - FileName"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":10,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":3,"n":"Variable Name"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Behavior Graph"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Parent"},{"t":3,"n":"Previous Sibling"}]},{"t":6,"n":"DATA - DATA","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]},{"t":2,"n":"GNAM - Animation File"}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"IDLF - Flags","c":[{"t":4,"p":1,"n":"Run in Sequence"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Do Once"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Ignored by Sandbox"}]},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":3,"n":"QNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Animatable"}]},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags","c":[{"t":4,"n":"Use Target"}]},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags","c":[{"t":4,"n":"Use Target"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Mode - Front"},{"t":4,"n":"Mode - Back"},{"t":4,"n":"No Sky"},{"t":4,"n":"Blur Radius Bit 2"},{"t":4,"n":"Blur Radius Bit 1"},{"t":4,"n":"Blur Radius Bit 0"}]},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":6,"s":1,"p":1,"n":"Radial Blur","c":[{"t":7,"p":1,"n":"RNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SNAM - RampUp","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"UNAM - Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM1 - RampDown","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - DownStart","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":6,"s":1,"p":1,"n":"Depth of Field","c":[{"t":7,"p":1,"n":"WNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"XNAM - Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM5 - Vignette Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM6 - Vignette Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unused"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Tonemap E"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Auto Exposure Max"},{"t":5,"p":1,"n":"Auto Exposure Min"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Middle Gray"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"},{"t":5,"p":1,"n":"Vignette Radius"},{"t":5,"p":1,"n":"Vignette Strength"}]},{"t":2,"p":1,"n":"TX00 - LUT"}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"}]},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Goodbye"},{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Say once"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"p":1,"n":"Random end"},{"t":4,"p":1,"n":"Invisible continue"},{"t":4,"p":1,"n":"Walk Away"},{"t":4,"p":1,"n":"Walk Away Invisible in Menu"},{"t":4,"p":1,"n":"Force subtitle"},{"t":4,"p":1,"n":"Can move while greeting"},{"t":4,"p":1,"n":"No LIP File"},{"t":4,"p":1,"n":"Requires post-processing"},{"t":4,"p":1,"n":"Audio Output Override"},{"t":4,"p":1,"n":"Spends favor points"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"DNAM - Shared INFO"},{"t":3,"n":"GNAM - Unknown"},{"t":2,"p":1,"n":"IOVR - Override Filename"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDA - Response Data","c":[{"t":3,"p":1,"n":"Emotion"},{"t":3,"p":1,"n":"Response number"},{"t":11,"n":"Unused"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Percentage"},{"t":3,"p":1,"n":"Camera Target Alias"},{"t":3,"p":1,"n":"Camera Location Alias"}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":2,"p":1,"n":"NAM4 - Alternate LIP Text"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"},{"t":3,"p":1,"n":"TNAM - Interrupt Percentage"},{"t":11,"p":1,"n":"NAM9 - Text Hash"},{"t":3,"p":1,"n":"SRAF - Camera Path"},{"p":1,"n":"WZMD - Stop on Scene End"}]}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TSCE - Start Scene"},{"t":3,"p":1,"n":"ALFA - Forced Alias"},{"t":11,"n":"INTV - Unknown"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"t":3,"p":1,"n":"GREE - Greet Distance"},{"t":6,"s":1,"p":1,"n":"TIQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NAM0 - Start Scene Phase"},{"t":3,"p":1,"n":"INCC - Challenge"},{"t":3,"p":1,"n":"MODQ - Reset Global"},{"t":3,"p":1,"n":"INAM - Subtitle Priority"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No auto-calculation"},{"t":4,"p":1,"n":"Food item"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"References Persist"}]}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"INNR - Instance Naming Rules","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"UNAM - Target"},{"t":8,"s":1,"p":1,"n":"Naming Rules","d":1,"c":[{"t":6,"p":1,"n":"Ruleset","c":[{"t":3,"p":1,"n":"VNAM - Count"},{"t":8,"p":1,"n":"Names","c":[{"t":6,"p":1,"n":"Name","c":[{"t":2,"p":1,"n":"WNAM - Text"},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"p":1,"n":"XNAM - Property","c":[{"t":5,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Op"}]},{"t":3,"p":1,"n":"YNAM - Index"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Decal Data"}]},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Parallax"},{"t":4,"p":1,"n":"Alpha - Blending"},{"t":4,"p":1,"n":"Alpha - Testing"},{"t":4,"p":1,"n":"No Subtextures"}]},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM3 - Footstep Explosion"},{"t":3,"p":1,"n":"NAM2 - Hazard"},{"t":5,"p":1,"n":"FNAM - Footstep Particle Max Dist"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - PNAM","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KSSM - Sound Keyword Mapping","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Primary Descriptor"},{"t":3,"p":1,"n":"ENAM - Exterior Tail"},{"t":3,"p":1,"n":"VNAM - VATS Descriptor"},{"t":5,"p":1,"n":"TNAM - VATS Threshold"},{"t":8,"s":1,"p":1,"n":"Keywords","d":1,"c":[{"t":3,"p":1,"n":"KNAM - Keyword"}]},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"RNAM - Sound","c":[{"t":3,"p":1,"n":"Reverb Class"},{"t":3,"p":1,"n":"Descriptor"}]}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"NNAM - Display Name"}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"MPCD - Unknown"}]}]},{"t":1,"p":1,"n":"LAYR - Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent"}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"TNAM - Unknown"}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":5,"n":"ANAM - Unknown"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":10,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Rotates"},{"t":4,"p":1,"n":"Shrinks When Occluded"}]}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"WGDR - God Rays"}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Dynamic"},{"t":4,"p":1,"n":"Can be Carried"},{"t":4,"p":1,"n":"Negative"},{"t":4,"p":1,"n":"Flicker"},{"t":4,"n":"Unknown"},{"t":4,"p":1,"n":"Off By Default"},{"t":4,"p":1,"n":"Flicker Slow"},{"t":4,"p":1,"n":"Pulse"},{"t":4,"p":1,"n":"Pulse Slow"},{"t":4,"p":1,"n":"Spot Light"},{"t":4,"p":1,"n":"Shadow Spotlight"},{"t":4,"p":1,"n":"Shadow Hemisphere"},{"t":4,"p":1,"n":"Shadow Omnidirectional"},{"t":4,"p":1,"n":"Portal-strict"}]},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":5,"p":1,"n":"Constant"},{"t":5,"p":1,"n":"Scalar"},{"t":5,"p":1,"n":"Exponent"},{"t":5,"p":1,"n":"God Rays - Near Clip"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":2,"p":1,"n":"NAM0 - Gobo"},{"t":3,"p":1,"n":"LNAM - Lens"},{"t":3,"p":1,"n":"WGDR - God Rays"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":3,"p":1,"n":"TNAM - Transform"},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"ZNAM - Zoom","c":[{"t":5,"p":1,"n":"Min"},{"t":5,"p":1,"n":"Max"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags","c":[{"t":4,"p":1,"n":"Calculate from all levels <= player's level"},{"t":4,"p":1,"n":"Calculate for each item in count"},{"t":4,"p":1,"n":"Use All"},{"t":4,"p":1,"n":"Special Loot"}]},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":3,"p":1,"n":"LVSG - Epic Loot Chance"},{"t":2,"p":1,"n":"ONAM - Override Name"}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags","c":[{"t":4,"p":1,"n":"Calculate from all levels <= player's level"},{"t":4,"p":1,"n":"Calculate for each item in count"}]},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Single Pass"}]},{"t":11,"n":"Unused"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Stair Material"},{"t":4,"p":1,"n":"Arrows Stick"}]},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Breakable FX"},{"t":11,"n":"MODT - Texture Files Hashes"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Message Box"},{"t":4,"p":1,"n":"Auto Display"}]},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":2,"p":1,"n":"SNAM - SWF"},{"t":2,"p":1,"n":"NNAM - Short Title"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Hostile"},{"t":4,"p":1,"n":"Recover"},{"t":4,"p":1,"n":"Detrimental"},{"t":4,"p":1,"n":"Snap to Navmesh"},{"t":4,"p":1,"n":"No Hit Event"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Dispel with Keywords"},{"t":4,"p":1,"n":"No Duration"},{"t":4,"p":1,"n":"No Magnitude"},{"t":4,"p":1,"n":"No Area"},{"t":4,"p":1,"n":"FX Persist"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Gory Visuals"},{"t":4,"p":1,"n":"Hide in UI"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"No Recast"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"p":1,"n":"Power Affects Magnitude"},{"t":4,"p":1,"n":"Power Affects Duration"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"p":1,"n":"Painless"},{"t":4,"p":1,"n":"No Hit Effect"},{"t":4,"p":1,"n":"No Death Dispel"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":11,"p":1,"n":"Magic Skill (unused)"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archetype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"p":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":7,"p":1,"n":"CVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":7,"p":1,"n":"CDIX - Component Display Indices","c":[{"t":3,"p":1,"n":"Display Index"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Walk - Left"},{"t":5,"p":1,"n":"Run - Left"},{"t":5,"p":1,"n":"Walk - Right"},{"t":5,"p":1,"n":"Run - Right"},{"t":5,"p":1,"n":"Walk - Forward"},{"t":5,"p":1,"n":"Run - Forward"},{"t":5,"p":1,"n":"Sprint - Forward"},{"t":5,"p":1,"n":"Walk - Back"},{"t":5,"p":1,"n":"Run - Back"},{"t":5,"p":1,"n":"Standing - Pitch"},{"t":5,"p":1,"n":"Walk - Pitch"},{"t":5,"p":1,"n":"Run - Pitch"},{"t":5,"p":1,"n":"Sprint - Pitch"},{"t":5,"p":1,"n":"Standing - Yaw"},{"t":5,"p":1,"n":"Walk - Yaw"},{"t":5,"p":1,"n":"Run - Yaw"},{"t":5,"p":1,"n":"Sprint - Yaw"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds (unused)","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]},{"t":5,"p":1,"n":"JNAM - Float Height"},{"t":5,"p":1,"n":"LNAM - Flight - Angle Gain"}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"DATA - On Local Map"},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MSWP - Material Swap","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FNAM - Tree Folder"},{"t":10,"p":1,"n":"Material Substitutions","d":1,"c":[{"t":6,"p":1,"n":"Substitution","c":[{"t":2,"p":1,"n":"BNAM - Original Material"},{"t":2,"p":1,"n":"SNAM - Replacement Material"},{"t":2,"p":1,"n":"FNAM - Tree Folder (obsolete)"},{"t":5,"p":1,"n":"CNAM - Color Remapping Index"}]}]}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Plays One Selection"},{"t":4,"p":1,"n":"Abrupt Transition"},{"t":4,"p":1,"n":"Cycle Tracks"},{"t":4,"p":1,"n":"Maintain Track Order"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Ducks Current Track"},{"t":4,"p":1,"n":"Doesn't Queue"}]},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track FileName"},{"t":2,"p":1,"n":"BNAM - Finale FileName"},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Data"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":11,"n":"NVSI - Unknown"}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"n":"Version"},{"t":11,"n":"Magic"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":11,"n":"Vertices and Triangles"}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"NNAM - Unknown"},{"t":11,"n":"MNAM - Unknown"}]},{"t":1,"n":"NOCM - Navigation Mesh Obstacle Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Index"},{"t":8,"n":"Unknown","c":[{"t":11,"n":"DATA - Unknown"}]},{"t":11,"n":"INTV - Unknown"},{"t":2,"n":"NAM1 - Model"}]}]}]},{"t":1,"p":1,"n":"NOTE - Note","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"DNAM - Type"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Terminal"},{"t":2,"p":1,"n":"PNAM - Program File"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"STCP - Unknown"},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Female"},{"t":4,"p":1,"n":"Essential"},{"t":4,"p":1,"n":"Is CharGen Face Preset"},{"t":4,"p":1,"n":"Respawn"},{"t":4,"p":1,"n":"Auto-calc stats"},{"t":4,"p":1,"n":"Unique"},{"t":4,"p":1,"n":"Doesn't affect stealth meter"},{"t":4,"p":1,"n":"PC Level Mult"},{"t":4,"p":1,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"p":1,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Bleedout Override"},{"t":4,"p":1,"n":"Opposite Gender Anims"},{"t":4,"p":1,"n":"Simple Actor"},{"t":4,"p":1,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"looped audio?"},{"t":4,"p":1,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Invulnerable"}]},{"t":3,"p":1,"n":"XP Value Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Disposition Base"},{"t":3,"p":1,"n":"Use Template Actors"},{"t":3,"p":1,"n":"Bleedout Override"},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Default Template"},{"t":3,"p":1,"n":"LTPT - Legendary Template"},{"t":3,"p":1,"n":"LTPC - Legendary Chance"},{"t":6,"s":1,"p":1,"n":"TPTA - Template Actors","c":[{"t":3,"p":1,"n":"Traits"},{"t":3,"p":1,"n":"Stats"},{"t":3,"p":1,"n":"Factions"},{"t":3,"p":1,"n":"Spell List"},{"t":3,"p":1,"n":"AI Data"},{"t":3,"p":1,"n":"AI Packages"},{"t":3,"p":1,"n":"Model\/Animation"},{"t":3,"p":1,"n":"Base Data"},{"t":3,"p":1,"n":"Inventory"},{"t":3,"p":1,"n":"Script"},{"t":3,"p":1,"n":"Def Pack List"},{"t":3,"p":1,"n":"Attack Data"},{"t":3,"p":1,"n":"Keywords"}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags","c":[{"t":4,"p":1,"n":"Ignore Weapon"},{"t":4,"p":1,"n":"Bash Attack"},{"t":4,"p":1,"n":"Power Attack"},{"t":4,"p":1,"n":"Left Attack"},{"t":4,"p":1,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Override Data"}]},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Action Points Mult"},{"t":3,"p":1,"n":"Stagger Offset"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"},{"t":3,"p":1,"n":"ATKW - Weapon Slot"},{"t":3,"p":1,"n":"ATKS - Required Slot"},{"t":2,"p":1,"n":"ATKT - Description"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator Override Package List"},{"t":3,"p":1,"n":"OCOR - Observe Dead Body Override Package List"},{"t":3,"p":1,"n":"GWOR - Guard Warn Override Package List"},{"t":3,"p":1,"n":"ECOR - Combat Override Package List"},{"t":3,"p":1,"n":"FCPL - Follower Command Package List"},{"t":3,"p":1,"n":"RCLR - Follower Elevator Package List"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Far Away Model Distance"},{"t":3,"p":1,"n":"Geared Up Weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}]},{"t":3,"p":1,"n":"HCLF - Hair Color"},{"t":3,"p":1,"n":"BCLF - Facial Hair Color"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height Min"},{"t":5,"n":"NAM7 - Unused"},{"t":5,"p":1,"n":"NAM4 - Height Max"},{"t":6,"s":1,"p":1,"n":"MWGT - Weight","c":[{"t":5,"p":1,"n":"Thin"},{"t":5,"p":1,"n":"Muscular"},{"t":5,"p":1,"n":"Fat"}]},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":6,"s":1,"p":1,"n":"Actor Sounds","c":[{"t":3,"p":1,"n":"CS2H - Count"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CS2K - Keyword"},{"t":3,"p":1,"n":"CS2D - Sound"}]}]},{"p":1,"n":"CS2E - End Marker"},{"t":11,"p":1,"n":"CS2F - Finalize"}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"PFRN - Power Armor Stand"},{"t":3,"p":1,"n":"DOFT - Default Outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping Outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime Faction"},{"t":3,"p":1,"n":"FTST - Head Texture"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]},{"t":7,"p":1,"n":"MSDK - Morph Keys","c":[{"t":3,"p":1,"n":"Key"}]},{"t":7,"p":1,"n":"MSDV - Morph Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":10,"p":1,"n":"Face Tinting Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"TETI - Index","c":[{"t":3,"p":1,"n":"Data Type"},{"t":3,"p":1,"n":"Index"}]},{"t":6,"p":1,"n":"TEND - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Template Color Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"MRSV - Body Morph Region Values","c":[{"t":5,"p":1,"n":"Head"},{"t":5,"p":1,"n":"Upper Torso"},{"t":5,"p":1,"n":"Arms"},{"t":5,"p":1,"n":"Lower Torso"},{"t":5,"p":1,"n":"Legs"}]},{"t":10,"p":1,"n":"Face Morphs","d":1,"c":[{"t":6,"p":1,"n":"Face Morph","c":[{"t":3,"p":1,"n":"FMRI - Index"},{"t":6,"p":1,"n":"FMRS - Values","c":[{"t":5,"p":1,"n":"Position - X"},{"t":5,"p":1,"n":"Position - Y"},{"t":5,"p":1,"n":"Position - Z"},{"t":5,"p":1,"n":"Rotation - X"},{"t":5,"p":1,"n":"Rotation - Y"},{"t":5,"p":1,"n":"Rotation - Z"},{"t":5,"p":1,"n":"Scale"},{"t":11,"n":"Unknown"}]}]}]},{"t":5,"p":1,"n":"FMIN - Facial Morph Intensity"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"}]},{"t":1,"p":1,"n":"OMOD - Object Modification","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Attach Point"},{"t":7,"p":1,"n":"Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":11,"p":1,"n":"Value 1"},{"t":11,"p":1,"n":"Value 2"}]}]},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Minimum Level"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]},{"t":7,"p":1,"n":"MNAM - Target OMOD Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"FNAM - Filter Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"LNAM - Loose Mod"},{"t":3,"p":1,"n":"NAM1 - Priority"},{"t":2,"p":1,"n":"FLTR - Filter"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items","c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"n":"OVIS - Object Visibility Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Object"},{"t":6,"n":"DATA - Object Bounds","c":[{"t":5,"n":"X1"},{"t":5,"n":"Y1"},{"t":5,"n":"Z1"},{"t":5,"n":"X2"},{"t":5,"n":"Y2"},{"t":5,"n":"Z2"}]}]}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"},{"t":4,"p":1,"n":"OnChange"}]},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags","c":[{"t":4,"p":1,"n":"Run in Sequence"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Do Once"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Ignored by Sandbox"}]},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags","c":[{"t":4,"p":1,"n":"Public"}]}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Repeat when Complete"},{"t":4,"n":"Unknown 1"}]}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Success Completes Package"}]},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Clear General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Set Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Clear Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags","c":[{"t":4,"p":1,"n":"Public"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Image"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":2,"p":1,"n":"FNAM - SWF"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":3,"p":1,"n":"EPFB - Perk Entry ID (unique)"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags","c":[{"t":4,"p":1,"n":"Run Immediately"},{"t":4,"p":1,"n":"Replace Default"}]},{"t":3,"n":"Fragment Index"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PKIN - Pack-In","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"CNAM - Cell"},{"t":3,"p":1,"n":"VNAM - Version"}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"},{"t":3,"p":1,"n":"Tracer Frequency"},{"t":3,"p":1,"n":"VATS Projectile"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model FileName"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"FragmentCount"},{"t":2,"p":1,"n":"scriptName"},{"t":6,"p":1,"n":"Script Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":11,"n":"Unused"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Start Game Enabled"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Allow repeated stages"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Run Once"},{"t":4,"p":1,"n":"Exclude from dialogue export"},{"t":4,"p":1,"n":"Warn on alias fill failure"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"}]},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":3,"p":1,"n":"LNAM - Location"},{"t":3,"p":1,"n":"XNAM - Quest Completion XP"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"p":1,"n":"Stages","d":1,"c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Start Up Stage"},{"t":4,"p":1,"n":"Shut Down Stage"},{"t":4,"p":1,"n":"Keep Instance Data From Here On"}]},{"t":3,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags","c":[{"t":4,"p":1,"n":"Complete Quest"},{"t":4,"p":1,"n":"Fail Quest"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"NAM2 - Note"},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"ORed With Previous"}]},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Compass Marker Ignores Locks"}]},{"t":3,"p":1,"n":"Keyword"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":3,"n":"ANAM - Next Alias ID"},{"t":8,"s":1,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":3,"p":1,"n":"ALCC - Closest To Alias"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":7,"p":1,"n":"ALLA - Linked Aliases","c":[{"t":6,"p":1,"n":"Linked Alias","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"}]}]},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":3,"p":1,"n":"ALFV - Forced Voice"},{"t":3,"p":1,"n":"ALDI - Death Item"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":3,"p":1,"n":"GNAM - Quest Group"},{"t":2,"p":1,"n":"SNAM - SWF File"}]},{"t":1,"p":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"STCP - Sound"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":7,"n":"PRPS - Properties","c":[{"t":6,"n":"Property","c":[{"t":3,"n":"Actor Value"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"APPR - Attach Parent Slots","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":6,"n":"Male Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":6,"n":"Female Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Acceleration Rate"},{"t":5,"n":"Deceleration Rate"},{"t":3,"n":"Size"},{"t":11,"n":"Unknown"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":3,"n":"Beard Biped Object"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2","c":[{"t":4,"n":"Use Advanced Avoidance"},{"t":4,"n":"Non-Hostile"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Allow Mounted Combat"}]},{"t":3,"n":"Pipboy Biped Object"},{"t":3,"n":"XP Value"},{"t":5,"n":"Severable - Debris Scale"},{"t":3,"n":"Severable - Debris Count"},{"t":3,"n":"Severable - Decal Count"},{"t":5,"n":"Explodable - Debris Scale"},{"t":3,"n":"Explodable - Debris Count"},{"t":3,"n":"Explodable - Decal Count"},{"t":3,"n":"Severable - Explosion"},{"t":3,"n":"Severable - Debris"},{"t":3,"n":"Severable - Impact DataSet"},{"t":3,"n":"Explodable - Explosion"},{"t":3,"n":"Explodable - Debris"},{"t":3,"n":"Explodable - Impact DataSet"},{"t":5,"n":"OnCripple - Debris Scale"},{"t":3,"n":"OnCripple - Debris Count"},{"t":3,"n":"OnCripple - Decal Count"},{"t":3,"n":"OnCripple - Explosion"},{"t":3,"n":"OnCripple - Debris"},{"t":3,"n":"OnCripple - Impact DataSet"},{"t":3,"n":"Explodable - Subsegment Explosion"},{"t":5,"n":"Orientation Limits - Pitch"},{"t":5,"n":"Orientation Limits - Roll"}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"n":"NAM2 - Marker NAM2 #1"},{"t":8,"n":"MTNM - Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Male"},{"t":3,"n":"Female"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Male"},{"t":3,"n":"Female"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags","c":[{"t":4,"p":1,"n":"Ignore Weapon"},{"t":4,"p":1,"n":"Bash Attack"},{"t":4,"p":1,"n":"Power Attack"},{"t":4,"p":1,"n":"Left Attack"},{"t":4,"p":1,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Action Points Mult"},{"t":3,"n":"Stagger Offset"}]},{"t":2,"n":"ATKE - Attack Event"},{"t":3,"n":"ATKW - Weapon Slot"},{"t":3,"n":"ATKS - Required Slot"},{"t":2,"n":"ATKT - Description"}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"n":"NAM4 - Impact Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Dismember Blood Art"},{"t":3,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"n":"NAM2 - Collar TextureSet"},{"t":3,"n":"ONAM - Sound - Open Corpse"},{"t":3,"n":"LNAM - Sound - Close Corpse"},{"t":8,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":7,"n":"RBPC - Biped Object Conditions","c":[{"t":3,"n":"Slot 30+"}]},{"t":10,"n":"Movement Data Overrides","c":[{"t":6,"n":"Override","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Walk - Left"},{"t":5,"n":"Run - Left"},{"t":5,"n":"Walk - Right"},{"t":5,"n":"Run - Right"},{"t":5,"n":"Walk - Forward"},{"t":5,"n":"Run - Forward"},{"t":5,"n":"Sprint - Forward"},{"t":5,"n":"Walk - Back"},{"t":5,"n":"Run - Back"},{"t":5,"n":"Standing - Pitch"},{"t":5,"n":"Walk - Pitch"},{"t":5,"n":"Run - Pitch"},{"t":5,"n":"Sprint - Pitch"},{"t":5,"n":"Standing - Yaw"},{"t":5,"n":"Walk - Yaw"},{"t":5,"n":"Run - Yaw"},{"t":5,"n":"Sprint - Yaw"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags","c":[{"t":4,"n":"Hand To Hand Melee"},{"t":4,"n":"One Hand Sword"},{"t":4,"n":"One Hand Dagger"},{"t":4,"n":"One Hand Axe"},{"t":4,"n":"One Hand Mace"},{"t":4,"n":"Two Hand Sword"},{"t":4,"n":"Two Hand Axe"},{"t":4,"n":"Bow"},{"t":4,"n":"Staff"},{"t":4,"n":"Spell"},{"t":4,"n":"Shield"},{"t":4,"n":"Torch"},{"t":4,"n":"Crossbow"}]},{"t":8,"n":"Equip Slots","c":[{"t":6,"n":"Equip Slot","c":[{"t":3,"n":"QNAM - Equip Slot"},{"t":2,"n":"ZNAM - Node"}]}]},{"t":3,"n":"UNWP - Unarmed Weapon"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]}]},{"t":3,"n":"WKMV - Base Movement Defaults - Default"},{"t":3,"n":"SWMV - Base Movement Defaults - Swim"},{"t":3,"n":"FLMV - Base Movement Defaults - Fly"},{"t":3,"n":"SNMV - Base Movement Defaults - Sneak"},{"n":"NAM0 - Head Data Marker"},{"n":"MNAM - Male Data Marker"},{"t":6,"n":"NNAM - Male Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Male Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Male Race Presets","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Male Hair Colors","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Male Face Details","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Male Default Face Texture"},{"t":8,"p":1,"n":"Male Tint Layers","c":[{"t":6,"p":1,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"p":1,"n":"Options","c":[{"t":6,"p":1,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":3,"n":"Variable Name"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Male Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Male Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Male Wrinkle Map Path"},{"n":"FNAM - Female Data Marker"},{"t":6,"n":"NNAM - Female Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Female Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Female Race Presets","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Female Hair Colors","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Female Face Details","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Female Default Face Texture"},{"t":8,"p":1,"n":"Female Tint Layers","c":[{"t":6,"p":1,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"p":1,"n":"Options","c":[{"t":6,"p":1,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":3,"n":"Variable Name"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Female Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Female Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Female Wrinkle Map Path"},{"t":3,"n":"NAM8 - Morph Race"},{"t":3,"n":"RNAM - Armor Race"},{"t":3,"n":"SRAC - Subgraph Template Race"},{"t":3,"n":"SADD - Subgraph Additive Race"},{"t":8,"n":"Subgraph Data","c":[{"t":6,"n":"Data","c":[{"t":2,"n":"SGNM - Behaviour Graph"},{"t":8,"n":"Actor Keywords","c":[{"t":3,"n":"SAKD - Keyword"}]},{"t":8,"n":"Target Keywords","c":[{"t":3,"n":"STKD - Keyword"}]},{"t":8,"n":"Animation Paths","c":[{"t":2,"n":"SAPT - Path"}]},{"t":6,"n":"SRAF - Flags","c":[{"t":3,"n":"Role"},{"t":3,"n":"Perspective"}]}]}]},{"t":5,"n":"PTOP - Idle Chatter Time Min"},{"t":5,"n":"NTOP - Idle Chatter Time Max"},{"t":8,"n":"Morph Values","c":[{"t":6,"n":"Value","c":[{"t":3,"n":"MSID - Index"},{"t":2,"n":"MSM0 - Min Name"},{"t":2,"n":"MSM1 - Max Name"}]}]},{"t":11,"n":"MLSI - Unknown"},{"t":2,"n":"HNAM - Hair Color Lookup Texture"},{"t":2,"n":"HLTX - Hair Color Extended Lookup Texture"},{"t":3,"n":"QSTI - Dialogue Quest"},{"t":8,"n":"Bone Data","c":[{"t":6,"n":"Data","c":[{"t":3,"n":"BSMP - Gender"},{"t":8,"n":"Bones","c":[{"t":6,"n":"Bone","c":[{"t":2,"n":"BSMB - Name"},{"t":7,"n":"BSMS - Values","c":[{"t":5,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"s":1,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Has Image Space"},{"t":4,"p":1,"n":"Has Lighting Template"}]},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":8,"p":1,"n":"Linked Rooms","c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.0+\/-"},{"t":5,"p":1,"n":"End Distance Cap"},{"t":5,"p":1,"n":"Shadow Depth Bias"},{"t":5,"p":1,"n":"Near Clip"},{"t":5,"p":1,"n":"Volumetric Intensity"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Alarm"}]},{"t":3,"p":1,"n":"Transition Interior"}]},{"t":3,"p":1,"n":"XTNM - Teleport Loc Name"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XASP - Acoustic Restriction"},{"p":1,"n":"XATP - Activation Point"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":6,"s":1,"p":1,"n":"XRDO - Radio","c":[{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Min Weak Distance"},{"t":5,"p":1,"n":"Max Weak Distance"},{"t":3,"p":1,"n":"Flags"}]},{"t":6,"s":1,"p":1,"n":"XBSD - Spline","c":[{"t":5,"p":1,"n":"Slack"},{"t":5,"p":1,"n":"Thickness"},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Wind - Detached End"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XPDD - Projected Decal","c":[{"t":5,"p":1,"n":"Width Scale"},{"t":5,"p":1,"n":"Height Scale"}]},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Leveled Lock"}]},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag","c":[{"t":4,"p":1,"n":"Use Default"},{"t":4,"p":1,"n":"Activate"},{"t":4,"p":1,"n":"Open"},{"t":4,"p":1,"n":"Open by Default"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags","c":[{"t":4,"p":1,"n":"Visible"},{"t":4,"p":1,"n":"Can Travel To"},{"t":4,"p":1,"n":"\"Show All\" Hidden"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - TNAM","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"Power Grid","c":[{"t":3,"p":1,"n":"XWPG - Count"},{"t":8,"p":1,"n":"Connections","c":[{"t":6,"p":1,"n":"XWPN - Connection","c":[{"t":3,"p":1,"n":"Node 1"},{"t":3,"p":1,"n":"Node 2"},{"t":3,"p":1,"n":"Line"}]}]}]},{"t":11,"n":"XCVR - Unknown"},{"t":11,"n":"XCVL - Unknown"},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":11,"n":"ANAM - Unknown"}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Override"}]},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":5,"p":1,"n":"RLDM - LOD Display Distance Multiplier"},{"t":5,"p":1,"n":"ANAM - Occlusion Accuracy Dist"}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"p":1,"n":"Secret"}]},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]},{"t":3,"p":1,"n":"ANAM - Reverb Class"}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Rotate to Face Target"},{"t":4,"p":1,"n":"Attach to Camera"},{"t":4,"p":1,"n":"Inherit Rotation"}]}]}]},{"t":1,"p":1,"n":"RFGP - Reference Group","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Name"},{"t":3,"p":1,"n":"RNAM - Reference"},{"t":11,"n":"PNAM - Unknown"}]},{"t":1,"p":1,"n":"SCCO - Scene Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Scenes","d":1,"c":[{"t":6,"p":1,"n":"Scene","c":[{"t":3,"p":1,"n":"SNAM - Scene"},{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":11,"n":"VNAM - Unknown"},{"t":8,"n":"Unknown","c":[{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"}]},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Begin on Quest Start"},{"t":4,"p":1,"n":"Stop on Quest End"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Repeat Conditions While True"},{"t":4,"p":1,"n":"Interruptible"}]},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Start Conditions"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Completion Conditions"},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Start"},{"t":3,"p":1,"n":"On Completion"}]},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"LNAM - Flags","c":[{"t":4,"p":1,"n":"No Player Activation"},{"t":4,"p":1,"n":"Optional"}]},{"t":3,"p":1,"n":"DNAM - Behaviour Flags","c":[{"t":4,"p":1,"n":"Death Pause (unsused)"},{"t":4,"p":1,"n":"Death End"},{"t":4,"p":1,"n":"Combat Pause"},{"t":4,"p":1,"n":"Combat End"},{"t":4,"p":1,"n":"Dialogue Pause"},{"t":4,"p":1,"n":"Dialogue End"},{"t":4,"p":1,"n":"OBS_COM Pause"},{"t":4,"p":1,"n":"OBS_COM End"}]}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Face Target"},{"t":4,"p":1,"n":"Looping"},{"t":4,"p":1,"n":"Headtrack Player"}]},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer - Max Seconds"},{"t":3,"p":1,"n":"SCQS - Set Parent Quest Stage"},{"t":5,"p":1,"n":"TNAM - Timer - Min Seconds"},{"t":11,"n":"STSC - Unknown"},{"t":8,"p":1,"n":"Start Scenes","c":[{"t":6,"p":1,"n":"Start Scene","c":[{"t":3,"p":1,"n":"LCEP - Scene"},{"t":3,"p":1,"n":"INTT - Phase Index"},{"t":2,"p":1,"n":"SSPN - Start Phase for Scene"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"p":1,"n":"PTOP - Player Positive Response"},{"t":3,"p":1,"n":"NTOP - Player Negative Response"},{"t":3,"p":1,"n":"NETO - Player Neutral Response"},{"t":3,"p":1,"n":"QTOP - Player Question Response"},{"t":3,"p":1,"n":"VENC - Player Positive Dialogue Subtype"},{"t":3,"p":1,"n":"PLVD - Player Negative Dialogue Subtype"},{"t":3,"p":1,"n":"JOUT - Player Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"DALC - Player Question Dialogue Subtype"},{"t":7,"p":1,"n":"DTID - NPC Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"NPOT - NPC Positive Response"},{"t":3,"p":1,"n":"NNGT - NPC Negative Response"},{"t":3,"p":1,"n":"NNUT - NPC Neutral Response"},{"t":3,"p":1,"n":"NQUT - NPC Question Response"},{"t":3,"p":1,"n":"NPOS - NPC Positive Dialogue Subtype"},{"t":3,"p":1,"n":"NNGS - NPC Negative Dialogue Subtype"},{"t":3,"p":1,"n":"NNUS - NPC Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"NQUS - NPC Question Dialogue Subtype"},{"t":3,"p":1,"n":"DTGT - Dialogue Target Actor"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"p":1,"n":"End Scene Say Greeting"},{"t":3,"p":1,"n":"Play Sound"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":6,"p":1,"n":"CRIS - Camera","c":[{"t":5,"p":1,"n":"FOV On Player Camera"},{"t":5,"p":1,"n":"Rate Of Camera Change"}]},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":7,"p":1,"n":"HTID - Player Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"VENC - Dialogue Subtype"},{"t":3,"p":1,"n":"PNAM - AnimArchType"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":5,"p":1,"n":"CNAM - Camera Distance Override"},{"t":5,"p":1,"n":"ACTV - Dialogue Distance Override"},{"t":5,"p":1,"n":"CRIS - FOV Override"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Template Scene"},{"t":3,"p":1,"n":"XNAM - Index"}]},{"t":1,"p":1,"n":"SCOL - Static Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":10,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"ONAM - Static"},{"t":7,"p":1,"n":"DATA - Placements","c":[{"t":6,"p":1,"n":"Placement","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Scale"}]}]}]}]}]},{"t":1,"p":1,"n":"SCSN - Audio Category Snapshot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Priority"},{"t":8,"s":1,"p":1,"n":"Category Multipliers","d":1,"c":[{"t":6,"p":1,"n":"CNAM - Category Multiplier","c":[{"t":3,"p":1,"n":"Categoty"},{"t":5,"p":1,"n":"Multiplier"}]}]}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":3,"p":1,"n":"Quest Flags","c":[{"t":4,"p":1,"n":"Do all before repeating"},{"t":4,"p":1,"n":"Shares event"},{"t":4,"p":1,"n":"Num quests to run"}]}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":5,"p":1,"n":"HNAM - Hours until reset"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Mute When Submerged"},{"t":4,"p":1,"n":"Should Appear on Menu"}]},{"t":3,"p":1,"n":"PNAM - Parent Category"},{"t":3,"p":1,"n":"ONAM - Menu Slider Category"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"},{"t":5,"p":1,"n":"MNAM - Min Frequency Multiplier"},{"t":5,"p":1,"n":"CNAM - Sidechain Target Multiplier"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"CNAM - Descriptor Type"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Sidechain"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]},{"t":3,"p":1,"n":"Base Descriptor"},{"t":8,"s":1,"p":1,"n":"Descriptors","d":1,"c":[{"t":3,"p":1,"n":"DNAM - Descriptor"}]},{"t":3,"n":"ITMC - Count"},{"t":10,"p":1,"n":"Rates of Fire","d":1,"c":[{"t":6,"p":1,"n":"Sound","c":[{"p":1,"n":"ITMS - Marker Start"},{"t":3,"p":1,"n":"INTV - RoF (RPM)"},{"t":2,"p":1,"n":"FNAM - File"},{"p":1,"n":"ITME - Marker End"}]}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Attenuates With Distance"},{"t":4,"p":1,"n":"Allows Rumble"}]},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":3,"p":1,"n":"MNAM - Type"},{"t":3,"p":1,"n":"VNAM - Static Attenuation"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"Channel 0","c":[{"t":3,"p":1,"n":"FL"},{"t":3,"p":1,"n":"FR"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"SL"},{"t":3,"p":1,"n":"SR"}]},{"t":6,"p":1,"n":"Channel 1","c":[{"t":3,"p":1,"n":"FL"},{"t":3,"p":1,"n":"FR"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"SL"},{"t":3,"p":1,"n":"SR"}]},{"t":6,"p":1,"n":"Channel 2? (unused)","c":[{"t":3,"p":1,"n":"FL"},{"t":3,"p":1,"n":"FR"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"SL"},{"t":3,"p":1,"n":"SR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ATTN - Attenuation Values","c":[{"t":5,"p":1,"n":"Fade In Distance - Start"},{"t":5,"p":1,"n":"Fade In Distance - End"},{"t":5,"p":1,"n":"Fade Out Distance - Start"},{"t":5,"p":1,"n":"Fade Out Distance - End"},{"t":6,"p":1,"n":"Fade In Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]},{"t":6,"p":1,"n":"Fade Out Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]}]},{"t":3,"p":1,"n":"ENAM - Effect Chain"}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"},{"t":6,"s":1,"p":1,"n":"REPT - Repeat","c":[{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Max Time"},{"t":3,"p":1,"n":"Stackable"}]}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Manual Cost Calc"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"PC Start Spell"},{"t":4,"n":"Unknown 19"},{"t":4,"p":1,"n":"Area Effect Ignores LOS"},{"t":4,"p":1,"n":"Ignore Resistance"},{"t":4,"p":1,"n":"No Absorb\/Reflect"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"No Dual Cast Modification"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Casting Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation Range"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"MNAM - Particle Texture"}]},{"t":1,"p":1,"n":"STAG - Animation Sound Tag Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"TNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":2,"p":1,"n":"Action"}]}]}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"Level 0","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 1","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 2","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 3","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TERM - Terminal","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"NAM0 - Header Text"},{"t":2,"p":1,"n":"WNAM - Welcome Text"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags","c":[{"t":4,"p":1,"n":"Sit 0"},{"t":4,"p":1,"n":"Sit 1"},{"t":4,"p":1,"n":"Sit 2"},{"t":4,"p":1,"n":"Sit 3"},{"t":4,"p":1,"n":"Sit 4"},{"t":4,"p":1,"n":"Sit 5"},{"t":4,"p":1,"n":"Sit 6"},{"t":4,"p":1,"n":"Sit 7"},{"t":4,"p":1,"n":"Sit 8"},{"t":4,"p":1,"n":"Sit 9"},{"t":4,"p":1,"n":"Sit 10"},{"t":4,"p":1,"n":"Sit 11"},{"t":4,"p":1,"n":"Sit 12"},{"t":4,"p":1,"n":"Sit 13"},{"t":4,"p":1,"n":"Sit 14"},{"t":4,"p":1,"n":"Sit 15"},{"t":4,"p":1,"n":"Sit 16"},{"t":4,"p":1,"n":"Sit 17"},{"t":4,"p":1,"n":"Sit 18"},{"t":4,"p":1,"n":"Sit 19"},{"t":4,"p":1,"n":"Sit 20"},{"t":4,"p":1,"n":"Sit 21"},{"t":4,"p":1,"n":"Sit 22"},{"t":4,"p":1,"n":"Sit 23"},{"t":4,"n":"Unknown 25"},{"t":4,"p":1,"n":"Disables Activation"},{"t":4,"p":1,"n":"Is Perch"},{"t":4,"p":1,"n":"Must Exit to Talk"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":11,"n":"WBDT - Workbench Data (unused)"},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"BSIZ - Count"},{"t":8,"s":1,"p":1,"n":"Body Text","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":2,"p":1,"n":"BTXT - Text"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"n":"ISIZ - Count"},{"t":8,"s":1,"p":1,"n":"Menu Items","d":1,"c":[{"t":6,"p":1,"n":"Menu Item","c":[{"t":2,"p":1,"n":"ITXT - Item Text"},{"t":2,"p":1,"n":"RNAM - Response Text"},{"t":3,"p":1,"n":"ANAM - Type"},{"t":3,"p":1,"n":"ITID - Item ID"},{"t":2,"p":1,"n":"UNAM - Display Text"},{"t":2,"p":1,"n":"VNAM - Show Image"},{"t":3,"p":1,"n":"TNAM - Submenu"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TRNS - Transform","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":5,"p":1,"n":"Scale"},{"t":5,"p":1,"n":"Zoom Min"},{"t":5,"p":1,"n":"Zoom Max"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX03 - Glow"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX02 - Wrinkles"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Smooth Spec"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Parallax"},{"t":4,"p":1,"n":"Alpha - Blending"},{"t":4,"p":1,"n":"Alpha - Testing"},{"t":4,"p":1,"n":"No Subtextures"}]},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"No Specular Map"},{"t":4,"p":1,"n":"Facegen Textures"},{"t":4,"p":1,"n":"Has Model Space Normal Map"}]},{"t":2,"p":1,"n":"MNAM - Material"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Allow Default Dialog"},{"t":4,"p":1,"n":"Female"}]}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"ANAM - Opacity (unused)"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Causes Damage"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Enable Flowmap"},{"t":4,"p":1,"n":"Blend Normals"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"}]},{"t":3,"p":1,"n":"TNAM - Material (unused)"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Consume Spell"},{"t":3,"p":1,"n":"YNAM - Contact Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":6,"p":1,"n":"Fog Properties","c":[{"t":5,"p":1,"n":"Depth Amount"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Shallow Range"},{"t":5,"p":1,"n":"Color Deep Range"},{"t":5,"p":1,"n":"Shallow Alpha"},{"t":5,"p":1,"n":"Deep Alpha"},{"t":5,"p":1,"n":"Alpha Shallow Range"},{"t":5,"p":1,"n":"Alpha Deep Range"},{"t":6,"p":1,"n":"Underwater Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Underwater Fog Amount"},{"t":5,"p":1,"n":"Underwater Near Fog"},{"t":5,"p":1,"n":"Underwater Far Fog"}]},{"t":6,"p":1,"n":"Physical Properties","c":[{"t":5,"p":1,"n":"Normal Magnitude"},{"t":5,"p":1,"n":"Shallow Normal Falloff"},{"t":5,"p":1,"n":"Deep Normal Falloff"},{"t":5,"p":1,"n":"Reflectivity Amount"},{"t":5,"p":1,"n":"Fresnel Amount"},{"t":5,"p":1,"n":"Surface Effect Falloff"},{"t":6,"p":1,"n":"Displacement Simulator","c":[{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Velocity"},{"t":5,"p":1,"n":"Falloff"},{"t":5,"p":1,"n":"Dampener"},{"t":5,"p":1,"n":"Starting Size"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular Properties","c":[{"t":5,"p":1,"n":"Sun Specular Power"},{"t":5,"p":1,"n":"Sun Specular Magnitude"},{"t":5,"p":1,"n":"Sun Sparkle Power"},{"t":5,"p":1,"n":"Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Interior Specular Radius"},{"t":5,"p":1,"n":"Interior Specular Brightness"},{"t":5,"p":1,"n":"Interior Specular Power"}]},{"t":6,"p":1,"n":"Noise Properties","c":[{"t":5,"p":1,"n":"Layer 1 - Wind Direction"},{"t":5,"p":1,"n":"Layer 2 - Wind Direction"},{"t":5,"p":1,"n":"Layer 3 - Wind Direction"},{"t":5,"p":1,"n":"Layer 1 - Wind Speed"},{"t":5,"p":1,"n":"Layer 2 - Wind Speed"},{"t":5,"p":1,"n":"Layer 3 - Wind Speed"},{"t":5,"p":1,"n":"Layer 1 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 2 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 3 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 1 - UV Scale"},{"t":5,"p":1,"n":"Layer 2 - UV Scale"},{"t":5,"p":1,"n":"Layer 3 - UV Scale"},{"t":5,"p":1,"n":"Layer 1 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 2 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 3 - Noise Falloff"}]},{"t":6,"p":1,"n":"Silt Properties","c":[{"t":5,"p":1,"n":"Silt Amount"},{"t":6,"p":1,"n":"Light Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Dark Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"Screen Space Reflections"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Layer 1 Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Layer 2 Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Layer 3 Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"NNAM - Embedded Weapon Mod"},{"t":6,"s":1,"p":1,"n":"1st Person Model","c":[{"t":2,"p":1,"n":"MOD4 - Model FileName"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Ammo"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reload Speed"},{"t":5,"p":1,"n":"Reach"},{"t":5,"p":1,"n":"Min Range"},{"t":5,"p":1,"n":"Max Range"},{"t":5,"p":1,"n":"Attack Delay"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Damage - OutOfRange Mult"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Ignores Normal Weapon Resistance"},{"t":4,"p":1,"n":"Automatic (unused)"},{"t":4,"p":1,"n":"Has Scope (unused)"},{"t":4,"p":1,"n":"Can't Drop"},{"t":4,"p":1,"n":"Hide Backpack (unused)"},{"t":4,"p":1,"n":"Embedded Weapon (unused)"},{"t":4,"p":1,"n":"Don't Use 1st Person IS Anim (unused)"},{"t":4,"p":1,"n":"Non-playable"}]},{"t":3,"p":1,"n":"Capacity"},{"t":3,"p":1,"n":"Animation Type"},{"t":5,"p":1,"n":"Damage - Secondary"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Damage - Base"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Sound - Attack"},{"t":3,"p":1,"n":"Sound - Attack 2D"},{"t":3,"p":1,"n":"Sound - Attack Loop"},{"t":3,"p":1,"n":"Sound - Attack Fail"},{"t":3,"p":1,"n":"Sound - Idle"},{"t":3,"p":1,"n":"Sound - Equip Sound"},{"t":3,"p":1,"n":"Sound - UnEquip Sound"},{"t":3,"p":1,"n":"Sound - Fast Equip Sound"},{"t":3,"p":1,"n":"Accuracy Bonus"},{"t":5,"p":1,"n":"Animation Attack Seconds"},{"t":5,"p":1,"n":"Action Point Cost"},{"t":5,"p":1,"n":"Full Power Seconds"},{"t":5,"p":1,"n":"Min Power Per Shot"},{"t":3,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":5,"p":1,"n":"Animation Fire Seconds"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":5,"p":1,"n":"Animation Reload Seconds"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Sighted Transition Seconds"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Override Projectile"},{"t":3,"p":1,"n":"Pattern"},{"t":3,"p":1,"n":"Rumble - Peroid (ms)"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":5,"p":1,"n":"Crit Damage Mult"},{"t":5,"p":1,"n":"Crit Charge Bonus"},{"t":3,"p":1,"n":"Crit Effect"}]},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"LNAM - NPC Add Ammo List"},{"t":3,"p":1,"n":"WAMD - Aim Model"},{"t":3,"p":1,"n":"WZMD - Zoom"},{"t":3,"p":1,"n":"CNAM - Template"},{"t":7,"p":1,"n":"DAMA - Damage Types","c":[{"t":6,"p":1,"n":"Damage Type","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Amount"}]}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"MASE - Melee Speed"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"n":"Large References","c":[{"t":11,"n":"RNAM - Unknown"}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - PNAM","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Use Land Data"},{"t":4,"p":1,"n":"Use LOD Data"},{"t":4,"p":1,"n":"Use Map Data"},{"t":4,"p":1,"n":"Use Water Data"},{"t":4,"p":1,"n":"Use Climate Data"},{"t":4,"p":1,"n":"Use Image Space Data (unused)"},{"t":4,"p":1,"n":"Use Sky Cell"}]},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Small World"},{"t":4,"p":1,"n":"Can't Fast Travel"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"No LOD Water"},{"t":4,"p":1,"n":"No Landscape"},{"t":4,"p":1,"n":"No Sky"},{"t":4,"p":1,"n":"Fixed Dimensions"},{"t":4,"p":1,"n":"No Grass"}]},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":6,"s":1,"p":1,"n":"World Default Level Data","c":[{"t":6,"p":1,"n":"WLEV - Dimension","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Size","c":[{"t":3,"p":1,"n":"Width"},{"t":3,"p":1,"n":"Height"}]}]},{"t":11,"p":1,"n":"WLEV - Data"}]},{"t":11,"n":"OFST - Offset Data"},{"t":11,"n":"CLSZ - Unknown"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"},{"t":5,"p":1,"n":"EarlySunrise"},{"t":5,"p":1,"n":"LateSunrise"},{"t":5,"p":1,"n":"EarlySunset"},{"t":5,"p":1,"n":"LateSunset"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"n":"NAM4 - Unknown","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"},{"t":5,"p":1,"n":"Day - Near Height Mid"},{"t":5,"p":1,"n":"Day - Near Height Range"},{"t":5,"p":1,"n":"Night - Near Height Mid"},{"t":5,"p":1,"n":"Night - Near Height Range"},{"t":5,"p":1,"n":"Day - High Density Scale"},{"t":5,"p":1,"n":"Night - High Density Scale"},{"t":5,"p":1,"n":"Day - Far Height Mid"},{"t":5,"p":1,"n":"Day - Far Height Range"},{"t":5,"p":1,"n":"Night - Far Height Mid"},{"t":5,"p":1,"n":"Night - Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Weather - Pleasant"},{"t":4,"p":1,"n":"Weather - Cloudy"},{"t":4,"p":1,"n":"Weather - Rainy"},{"t":4,"p":1,"n":"Weather - Snow"},{"t":4,"p":1,"n":"Sky Statics - Always Visible"},{"t":4,"p":1,"n":"Sky Statics - Follows Sun Position"}]},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers","c":[{"t":4,"p":1,"n":"0"},{"t":4,"p":1,"n":"1"},{"t":4,"p":1,"n":"2"},{"t":4,"p":1,"n":"3"},{"t":4,"p":1,"n":"4"},{"t":4,"p":1,"n":"5"},{"t":4,"p":1,"n":"6"},{"t":4,"p":1,"n":"7"},{"t":4,"p":1,"n":"8"},{"t":4,"p":1,"n":"9"},{"t":4,"p":1,"n":"10"},{"t":4,"p":1,"n":"11"},{"t":4,"p":1,"n":"12"},{"t":4,"p":1,"n":"13"},{"t":4,"p":1,"n":"14"},{"t":4,"p":1,"n":"15"},{"t":4,"p":1,"n":"16"},{"t":4,"p":1,"n":"17"},{"t":4,"p":1,"n":"18"},{"t":4,"p":1,"n":"19"},{"t":4,"p":1,"n":"20"},{"t":4,"p":1,"n":"21"},{"t":4,"p":1,"n":"22"},{"t":4,"p":1,"n":"23"},{"t":4,"p":1,"n":"24"},{"t":4,"p":1,"n":"25"},{"t":4,"p":1,"n":"26"},{"t":4,"p":1,"n":"27"},{"t":4,"p":1,"n":"28"},{"t":4,"p":1,"n":"29"},{"t":4,"p":1,"n":"30"},{"t":4,"p":1,"n":"31"}]},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"WGDR - God Rays","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"},{"t":6,"s":1,"p":1,"n":"UNAM - Magic","c":[{"t":3,"p":1,"n":"On Lightning Strike - Spell"},{"t":5,"p":1,"n":"On Lightning Strike - Threshold"},{"t":3,"p":1,"n":"On Weather Activate - Spell"},{"t":5,"p":1,"n":"On Weather Activate - Threshold"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"VNAM - Volatility Mult"},{"t":5,"p":1,"n":"WNAM - Visibility Mult"}]},{"t":1,"p":1,"n":"ZOOM - Zoom","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"GNAM - Data","c":[{"t":5,"p":1,"n":"FOV Mult"},{"t":3,"p":1,"n":"Overlay"},{"t":3,"p":1,"n":"Imagespace Modifier"},{"t":6,"p":1,"n":"Camera Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]}]},"name":"Smash.All","hash":"99238B45","color":128} \ No newline at end of file diff --git a/frontend/settings/Fallout4/Smash.All.old.json b/frontend/settings/Fallout4/Smash.All.old.json new file mode 100644 index 0000000..1e40a14 --- /dev/null +++ b/frontend/settings/Fallout4/Smash.All.old.json @@ -0,0 +1 @@ +{"records":"ACHR,ACTI,ADDN,AECH,ALCH,AMDL,AMMO,ANIO,AORU,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BNDS,BOOK,BPTD,CAMS,CELL,CLAS,CLFM,CLMT,CMPO,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DFOB,DIAL,DLBR,DLVW,DMGT,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,FACT,FLOR,FLST,FSTP,FSTS,FURN,GDRY,GLOB,GMST,GRAS,HAZD,HDPT,IDLM,IMAD,IMGS,INFO,INGR,INNR,IPCT,IPDS,KEYM,KSSM,KYWD,LAND,LAYR,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MSWP,MUSC,MUST,NOTE,NPC_,OMOD,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,PKIN,PMIS,PROJ,QUST,REFR,REGN,RELA,REVB,RFCT,RFGP,SCCO,SCEN,SCOL,SCSN,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAG,STAT,TACT,TERM,TREE,TRNS,TXST,VTYP,WATR,WEAP,WRLD,WTHR,ZOOM,AACT","description":"Smashes all the things. Produced using autoset attributes on all record types found in Fallout4.esm.\r\n\r\nLast updated 05\/01\/2018.","tree":{"records":[{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"STCP - Sound"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":6,"s":1,"p":1,"n":"RADR - Radio Receiver","c":[{"t":3,"p":1,"n":"Sound Model"},{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Volume"},{"t":3,"p":1,"n":"Starts Active"},{"t":3,"p":1,"n":"No Signal Static"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"LNAM - Light"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"AECH - Audio Effect Chain","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"KNAM - Type"},{"t":6,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Enabled"},{"t":5,"p":1,"n":"Input Gain"},{"t":5,"p":1,"n":"Center Freq"},{"t":5,"p":1,"n":"Feedback %"},{"t":5,"p":1,"n":"Output Gain"},{"t":5,"p":1,"n":"Q Value"},{"t":5,"p":1,"n":"Wet Mix %"},{"t":5,"p":1,"n":"Upper Threshold"},{"t":3,"p":1,"n":"Filter Mode"},{"t":3,"p":1,"n":"Delay MS"},{"t":5,"p":1,"n":"Lower Threshold"},{"t":11,"n":"Unused"}]}]}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":2,"p":1,"n":"DNAM - Addiction Name"},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMDL - Aim Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Cone of Fire - Min Angle"},{"t":5,"p":1,"n":"Cone of Fire - Max Angle"},{"t":5,"p":1,"n":"Cone of Fire - Increase Per Shot"},{"t":5,"p":1,"n":"Cone of Fire - Decrease Per Sec"},{"t":3,"p":1,"n":"Cone of Fire - Decrease Delay MS"},{"t":5,"p":1,"n":"Cone of Fire - Sneak Mult"},{"t":5,"p":1,"n":"Recoil - Diminish Spring Force"},{"t":5,"p":1,"n":"Recoil - Diminish Sights Mult"},{"t":5,"p":1,"n":"Recoil - Max Per Shot"},{"t":5,"p":1,"n":"Recoil - Min Per Shot"},{"t":5,"p":1,"n":"Recoil - Hip Mult"},{"t":3,"p":1,"n":"Runaway - Recoil Shots"},{"t":5,"p":1,"n":"Recoil - Arc"},{"t":5,"p":1,"n":"Recoil - Arc Rotate"},{"t":5,"p":1,"n":"Cone of Fire - Iron Sights Mult"},{"t":5,"p":1,"n":"Stability - Base Stability"}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Health"}]},{"t":2,"p":1,"n":"ONAM - Short Name"},{"t":2,"p":1,"n":"NAM1 - Casing Model"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"AORU - Attraction Rule","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"AOR2 - Data","c":[{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Delay"},{"t":5,"p":1,"n":"Max Delay"},{"t":3,"p":1,"n":"Requires Line of Sight"},{"t":3,"p":1,"n":"Combat Target"},{"t":11,"n":"Unused"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male"},{"t":3,"p":1,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"},{"t":5,"p":1,"n":"MO2C - Color Remapping Index"},{"t":11,"n":"MO2F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO3S - Material Swap"},{"t":5,"p":1,"n":"MO3C - Color Remapping Index"},{"t":11,"n":"MO3F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO5S - Material Swap"},{"t":5,"p":1,"n":"MO5C - Color Remapping Index"},{"t":11,"n":"MO5F - Unknown"}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin Texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"s":1,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"},{"t":8,"s":1,"p":1,"n":"Bone Data","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"BSMP - Gender"},{"t":8,"p":1,"n":"Bones","c":[{"t":6,"p":1,"n":"Bone","c":[{"t":2,"p":1,"n":"BSMB - Name"},{"t":7,"p":1,"n":"BSMS - Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO2S - Material Swap"}]},{"t":2,"p":1,"n":"ICON - Male Inventory Image"},{"t":2,"p":1,"n":"MICO - Male Message Icon"},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"}]},{"t":2,"p":1,"n":"ICO2 - Female Inventory Image"},{"t":2,"p":1,"n":"MIC2 - Female Message Icon"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":3,"p":1,"n":"INDX - Addon Index"},{"t":3,"p":1,"n":"MODL - Armor Addon"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Health"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":3,"p":1,"n":"Armor Rating"},{"t":3,"p":1,"n":"Base Addon Index"},{"t":3,"p":1,"n":"Stagger Rating"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMA - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"TNAM - Template Armor"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type"},{"t":3,"p":1,"n":"XTRI - Is Interior"},{"t":3,"p":1,"n":"WNAM - Weather Attenuation (dB)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":5,"p":1,"n":"NAM0 - Default Value"},{"t":3,"p":1,"n":"AVFL - Flags"},{"t":3,"p":1,"n":"NAM1 - Type"}]},{"t":1,"p":1,"n":"BNDS - Bendable Spline","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":5,"p":1,"n":"Default Number of Tiles"},{"t":3,"p":1,"n":"Default Number of Slices"},{"t":3,"p":1,"n":"Default Number of Tiles - Relative to Length"},{"t":6,"p":1,"n":"Default Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Wind Settings - Sensibility"},{"t":5,"p":1,"n":"Wind Settings - Flexibility"}]},{"t":3,"p":1,"n":"TNAM - Texture"}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Perk"},{"t":6,"p":1,"n":"Text Offset","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":2,"p":1,"n":"CNAM - Description"},{"t":3,"p":1,"n":"INAM - Inventory Art"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":6,"p":1,"n":"BPND - ","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":5,"p":1,"n":"Cut - Min"},{"t":5,"p":1,"n":"Cut - Max"},{"t":5,"p":1,"n":"Cut - Radius"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate X"},{"t":5,"p":1,"n":"Gore Effects - Local Rotate Y"},{"t":5,"p":1,"n":"Cut - Tesselation"},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":5,"p":1,"n":"Explodable - Limb Replacement Scale"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Non-Lethal Dismemberment Chance"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":3,"p":1,"n":"Geometry Segment Index"},{"t":3,"p":1,"n":"On Cripple - Art Object"},{"t":3,"p":1,"n":"On Cripple - Debris"},{"t":3,"p":1,"n":"On Cripple - Explosion"},{"t":3,"p":1,"n":"On Cripple - Impact DataSet"},{"t":5,"p":1,"n":"On Cripple - Debris Scale"},{"t":3,"p":1,"n":"On Cripple - Debris Count"},{"t":3,"p":1,"n":"On Cripple - Decal Count"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"},{"t":2,"p":1,"n":"ENAM - Hit Reaction - Start"},{"t":2,"p":1,"n":"FNAM - Hit Reaction - End"},{"t":3,"p":1,"n":"BNAM - Gore Effects - Dismember Blood Art"},{"t":3,"p":1,"n":"INAM - Gore Effects - Blood Impact Material Type"},{"t":3,"p":1,"n":"JNAM - On Cripple - Blood Impact Material Type"},{"t":3,"p":1,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"p":1,"n":"NAM2 - Collar TextureSet"},{"t":2,"p":1,"n":"DNAM - Twist Variable Prefix"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"},{"t":5,"p":1,"n":"Location Spring"},{"t":5,"p":1,"n":"Target Spring"},{"t":6,"p":1,"n":"Rotation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land"}]},{"t":11,"n":"VISI - PreVis Files Timestamp"},{"t":3,"p":1,"n":"RVIS - In PreVis File Of"},{"t":11,"n":"PCMB - PreCombined Files Timestamp"},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits"},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":3,"p":1,"n":"CNAM - Precombined Object Level XY"},{"t":3,"p":1,"n":"ZNAM - Precombined Object Level Z"},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":6,"s":1,"p":1,"n":"XILW - Exterior LOD","c":[{"t":3,"p":1,"n":"Worldspace"},{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"}]},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"},{"t":3,"p":1,"n":"XGDR - God Rays"},{"t":7,"p":1,"n":"XPRI - Physics References","c":[{"t":3,"p":1,"n":"Reference"}]},{"t":6,"s":1,"p":1,"n":"XCRI - Combined References","c":[{"t":3,"p":1,"n":"Meshes Count"},{"t":3,"p":1,"n":"References Count"},{"t":7,"p":1,"n":"Meshes","c":[{"t":3,"p":1,"n":"Combined Mesh"}]},{"t":7,"p":1,"n":"References","c":[{"t":6,"p":1,"n":"Reference","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Combined Mesh"}]}]}]}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Bleedout Default"}]}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CNAM - Color\/Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"CMPO - Component","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"CUSD - Sound - Crafting"},{"t":3,"p":1,"n":"DATA - Auto Calc Value"},{"t":3,"p":1,"n":"MNAM - Scrap Item"},{"t":3,"p":1,"n":"GNAM - Mod Scrap Scalar"}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":7,"p":1,"n":"FVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":11,"n":"NAM1 - Unused"},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":3,"p":1,"n":"ANAM - Menu Art Object"},{"t":7,"p":1,"n":"FNAM - Category","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"INTV - Data","c":[{"t":3,"p":1,"n":"Created Object Count"},{"t":3,"p":1,"n":"Priority"}]}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"},{"t":3,"p":1,"n":"TNAM - Sound - Take All"},{"t":3,"p":1,"n":"ONAM - Filter List"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Related Camera Path"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom \/ Flags"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"},{"t":5,"p":1,"n":"Dodge Threat Chance"},{"t":5,"p":1,"n":"Evade Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"},{"t":5,"p":1,"n":"Block When Staggered Mult"},{"t":5,"p":1,"n":"Attack When Staggered Mult"}]},{"t":5,"p":1,"n":"CSRA - Ranged Accuracy Mult"},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Dueling - Circle Mult"},{"t":5,"p":1,"n":"Dueling - Fallback Mult"},{"t":5,"p":1,"n":"Flanking - Flank Distance"},{"t":5,"p":1,"n":"Flanking - Stalk Time"},{"t":5,"p":1,"n":"Charging - Charge Distance"},{"t":5,"p":1,"n":"Charging - Throw Probability"},{"t":5,"p":1,"n":"Charging - Sprint Fast Probability"},{"t":5,"p":1,"n":"Charging - Sideswipe Probability"},{"t":5,"p":1,"n":"Charging - Disengane Probability"},{"t":3,"p":1,"n":"Charging - Throw Max Targets"},{"t":5,"p":1,"n":"Flanking - Flank Variance"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"},{"t":5,"p":1,"n":"Adjust Range Mult"},{"t":5,"p":1,"n":"Crouch Mult"},{"t":5,"p":1,"n":"Wait Mult"},{"t":5,"p":1,"n":"Range Mult"}]},{"t":5,"p":1,"n":"CSCV - Cover Search Distance Mult"},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DFOB - Default Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Object"}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags"},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"p":1,"n":"DMGT - Damage Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"Damage Types","c":[{"t":3,"p":1,"n":"Actor Value Index"}]}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"ONAM - Alternate Text - Open"},{"t":2,"p":1,"n":"CNAM - Alternate Text - Close"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"Data","c":[{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Holes Animation - Start Time"},{"t":5,"p":1,"n":"Holes Animation - End Time"},{"t":5,"p":1,"n":"Holes Animation - Start Value"},{"t":5,"p":1,"n":"Holes Animation - End Value"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"}]},{"t":6,"s":1,"p":1,"n":"Data (old format)","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Parent"}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"ANAM - Condition Actor Value"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Inner Radius"},{"t":5,"p":1,"n":"Outer Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Sound Level"},{"t":5,"p":1,"n":"Placed Object AutoFade Delay"},{"t":3,"p":1,"n":"Stagger"},{"t":6,"p":1,"n":"Spawn","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"},{"t":5,"p":1,"n":"Spread Degrees"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"Relations","d":1,"c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf (unused)"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"p":1,"n":"INAM - Insignia (unused)"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Buys Stolen Items"},{"t":3,"p":1,"n":"Buy\/Sell Everything Not In List?"},{"t":3,"p":1,"n":"Buys NonStolen Items"},{"t":3,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"n":"XCNT - Count","c":[{"t":3,"n":"Walking"},{"t":3,"n":"Running"},{"t":3,"n":"Sprinting"},{"t":3,"n":"Sneaking"},{"t":3,"n":"Swimming"}]},{"t":7,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"WNAM - Drinking Water Type"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Form"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points"}]}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points"}]}]},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]}]},{"t":1,"p":1,"n":"GDRY - God Rays","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Back Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":6,"p":1,"n":"Fwd Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Intensity"},{"t":5,"p":1,"n":"Air Color - Scale"},{"t":5,"p":1,"n":"Back Color - Scale"},{"t":5,"p":1,"n":"Fwd Color - Scale"},{"t":5,"p":1,"n":"Back Phase"},{"t":6,"p":1,"n":"Air Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Fwd Phase"}]}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Effect"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"},{"t":6,"p":1,"n":"Taper Effectiveness","c":[{"t":5,"p":1,"n":"Full Effect Radius"},{"t":5,"p":1,"n":"Taper Weight"},{"t":5,"p":1,"n":"Taper Curse"}]}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - Filename"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","d":1,"c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Behavior Graph"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Related Idle Animation"}]},{"t":6,"n":"DATA - ","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]},{"t":2,"n":"GNAM - Animation File"}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":3,"n":"QNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags"},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags"},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":6,"s":1,"p":1,"n":"Radial Blur","c":[{"t":7,"p":1,"n":"RNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SNAM - RampUp","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"UNAM - Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM1 - RampDown","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - DownStart","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":6,"s":1,"p":1,"n":"Depth of Field","c":[{"t":7,"p":1,"n":"WNAM - Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"XNAM - Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM5 - Vignette Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM6 - Vignette Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unused"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Tonemap E"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Auto Exposure Max"},{"t":5,"p":1,"n":"Auto Exposure Min"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Middle Gray"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"},{"t":5,"p":1,"n":"Vignette Radius"},{"t":5,"p":1,"n":"Vignette Strength"}]},{"t":2,"p":1,"n":"TX00 - LUT"}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"DNAM - Shared INFO"},{"t":3,"n":"GNAM - Unknown"},{"t":2,"p":1,"n":"IOVR - Override Filename"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDA - Response Data","c":[{"t":3,"p":1,"n":"Emotion"},{"t":3,"p":1,"n":"Response number"},{"t":11,"n":"Unused"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Percentage"},{"t":3,"p":1,"n":"Camera Target Alias"},{"t":3,"p":1,"n":"Camera Location Alias"}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":2,"p":1,"n":"NAM4 - Alternate LIP Text"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"},{"t":3,"p":1,"n":"TNAM - Interrupt Percentage"},{"t":11,"p":1,"n":"NAM9 - Text Hash"},{"t":3,"p":1,"n":"SRAF - Camera Path"},{"p":1,"n":"WZMD - Stop on Scene End"}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TSCE - Start Scene"},{"t":3,"p":1,"n":"ALFA - Forced Alias"},{"t":11,"n":"INTV - Unknown"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"t":3,"p":1,"n":"GREE - Greet Distance"},{"t":6,"s":1,"p":1,"n":"TIQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NAM0 - Start Scene Phase"},{"t":3,"p":1,"n":"INCC - Challenge"},{"t":3,"p":1,"n":"MODQ - Reset Global"},{"t":3,"p":1,"n":"INAM - Subtitle Priority"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"INNR - Instance Naming Rules","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"UNAM - Target"},{"t":8,"s":1,"p":1,"n":"Naming Rules","d":1,"c":[{"t":6,"p":1,"n":"Ruleset","c":[{"t":3,"p":1,"n":"VNAM - Count"},{"t":8,"p":1,"n":"Names","c":[{"t":6,"p":1,"n":"Name","c":[{"t":2,"p":1,"n":"WNAM - Text"},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"p":1,"n":"XNAM - Property","c":[{"t":5,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Op"}]},{"t":3,"p":1,"n":"YNAM - Index"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM3 - Footstep Explosion"},{"t":3,"p":1,"n":"NAM2 - Hazard"},{"t":5,"p":1,"n":"FNAM - Footstep Particle Max Dist"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KSSM - Sound Keyword Mapping","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Primary Descriptor"},{"t":3,"p":1,"n":"ENAM - Exterior Tail"},{"t":3,"p":1,"n":"VNAM - VATS Descriptor"},{"t":5,"p":1,"n":"TNAM - VATS Threshold"},{"t":8,"s":1,"p":1,"n":"Keywords","d":1,"c":[{"t":3,"p":1,"n":"KNAM - Keyword"}]},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"RNAM - Sound","c":[{"t":3,"p":1,"n":"Reverb Class"},{"t":3,"p":1,"n":"Descriptor"}]}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"NNAM - Display Name"}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"MPCD - Unknown"}]}]},{"t":1,"p":1,"n":"LAYR - Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent"}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"TNAM - Unknown"}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":5,"n":"ANAM - Unknown"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":10,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":5,"p":1,"n":"Near Height Mid"},{"t":5,"p":1,"n":"Near Height Range"},{"t":6,"p":1,"n":"Fog Color High Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color High Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"High Density Scale"},{"t":5,"p":1,"n":"Fog Near Scale"},{"t":5,"p":1,"n":"Fog Far Scale"},{"t":5,"p":1,"n":"Fog High Near Scale"},{"t":5,"p":1,"n":"Fog High Far Scale"},{"t":5,"p":1,"n":"Far Height Mid"},{"t":5,"p":1,"n":"Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"WGDR - God Rays"}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":5,"p":1,"n":"Constant"},{"t":5,"p":1,"n":"Scalar"},{"t":5,"p":1,"n":"Exponent"},{"t":5,"p":1,"n":"God Rays - Near Clip"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":2,"p":1,"n":"NAM0 - Gobo"},{"t":3,"p":1,"n":"LNAM - Lens"},{"t":3,"p":1,"n":"WGDR - God Rays"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":3,"p":1,"n":"TNAM - Transform"},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"ZNAM - Zoom","c":[{"t":5,"p":1,"n":"Min"},{"t":5,"p":1,"n":"Max"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":3,"p":1,"n":"LVSG - Epic Loot Chance"},{"t":2,"p":1,"n":"ONAM - Override Name"}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLM - Max Count"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Use Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"},{"t":3,"p":1,"n":"Chance None"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":7,"p":1,"n":"LLKC - Filter Keyword Chances","c":[{"t":6,"p":1,"n":"Filter","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Chance"}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Breakable FX"},{"t":11,"n":"MODT - Texture Files Hashes"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":2,"p":1,"n":"SNAM - SWF"},{"t":2,"p":1,"n":"NNAM - Short Title"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":11,"p":1,"n":"Magic Skill (unused)"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archetype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"FIMD - Featured Item Message"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":7,"p":1,"n":"CVPA - Components","c":[{"t":6,"p":1,"n":"Component","c":[{"t":3,"p":1,"n":"Component"},{"t":3,"p":1,"n":"Count"}]}]},{"t":7,"p":1,"n":"CDIX - Component Display Indices","c":[{"t":3,"p":1,"n":"Display Index"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Walk - Left"},{"t":5,"p":1,"n":"Run - Left"},{"t":5,"p":1,"n":"Walk - Right"},{"t":5,"p":1,"n":"Run - Right"},{"t":5,"p":1,"n":"Walk - Forward"},{"t":5,"p":1,"n":"Run - Forward"},{"t":5,"p":1,"n":"Sprint - Forward"},{"t":5,"p":1,"n":"Walk - Back"},{"t":5,"p":1,"n":"Run - Back"},{"t":5,"p":1,"n":"Standing - Pitch"},{"t":5,"p":1,"n":"Walk - Pitch"},{"t":5,"p":1,"n":"Run - Pitch"},{"t":5,"p":1,"n":"Sprint - Pitch"},{"t":5,"p":1,"n":"Standing - Yaw"},{"t":5,"p":1,"n":"Walk - Yaw"},{"t":5,"p":1,"n":"Run - Yaw"},{"t":5,"p":1,"n":"Sprint - Yaw"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds (unused)","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]},{"t":5,"p":1,"n":"JNAM - Float Height"},{"t":5,"p":1,"n":"LNAM - Flight - Angle Gain"}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"DATA - On Local Map"},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MSWP - Material Swap","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FNAM - Tree Folder"},{"t":10,"p":1,"n":"Material Substitutions","d":1,"c":[{"t":6,"p":1,"n":"Substitution","c":[{"t":2,"p":1,"n":"BNAM - Original Material"},{"t":2,"p":1,"n":"SNAM - Replacement Material"},{"t":2,"p":1,"n":"FNAM - Tree Folder (obsolete)"},{"t":5,"p":1,"n":"CNAM - Color Remapping Index"}]}]}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track Filename"},{"t":2,"p":1,"n":"BNAM - Finale Filename"},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Data"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":11,"n":"NVSI - Unknown"}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"n":"Version"},{"t":11,"n":"Magic"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":11,"n":"Vertices and Triangles"}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"NNAM - Unknown"},{"t":11,"n":"MNAM - Unknown"}]},{"t":1,"n":"NOCM - Navigation Mesh Obstacle Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Index"},{"t":8,"n":"Unknown","c":[{"t":11,"n":"DATA - Unknown"}]},{"t":11,"n":"INTV - Unknown"},{"t":2,"n":"NAM1 - Model"}]}]}]},{"t":1,"p":1,"n":"NOTE - Note","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"DNAM - Type"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Terminal"},{"t":2,"p":1,"n":"PNAM - Program File"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"n":"STCP - Unknown"},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"XP Value Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Disposition Base"},{"t":3,"p":1,"n":"Use Template Actors"},{"t":3,"p":1,"n":"Bleedout Override"},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Default Template"},{"t":3,"p":1,"n":"LTPT - Legendary Template"},{"t":3,"p":1,"n":"LTPC - Legendary Chance"},{"t":6,"s":1,"p":1,"n":"TPTA - Template Actors","c":[{"t":3,"p":1,"n":"Traits"},{"t":3,"p":1,"n":"Stats"},{"t":3,"p":1,"n":"Factions"},{"t":3,"p":1,"n":"Spell List"},{"t":3,"p":1,"n":"AI Data"},{"t":3,"p":1,"n":"AI Packages"},{"t":3,"p":1,"n":"Model\/Animation"},{"t":3,"p":1,"n":"Base Data"},{"t":3,"p":1,"n":"Inventory"},{"t":3,"p":1,"n":"Script"},{"t":3,"p":1,"n":"Def Pack List"},{"t":3,"p":1,"n":"Attack Data"},{"t":3,"p":1,"n":"Keywords"}]},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Action Points Mult"},{"t":3,"p":1,"n":"Stagger Offset"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"},{"t":3,"p":1,"n":"ATKW - Weapon Slot"},{"t":3,"p":1,"n":"ATKS - Required Slot"},{"t":2,"p":1,"n":"ATKT - Description"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator Override Package List"},{"t":3,"p":1,"n":"OCOR - Observe Dead Body Override Package List"},{"t":3,"p":1,"n":"GWOR - Guard Warn Override Package List"},{"t":3,"p":1,"n":"ECOR - Combat Override Package List"},{"t":3,"p":1,"n":"FCPL - Follower Command Package List"},{"t":3,"p":1,"n":"RCLR - Follower Elevator Package List"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"}]}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":3,"p":1,"n":"NTRM - Native Terminal"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - ","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Far Away Model Distance"},{"t":3,"p":1,"n":"Geared Up Weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}]},{"t":3,"p":1,"n":"HCLF - Hair Color"},{"t":3,"p":1,"n":"BCLF - Facial Hair Color"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height Min"},{"t":5,"n":"NAM7 - Unused"},{"t":5,"p":1,"n":"NAM4 - Height Max"},{"t":6,"s":1,"p":1,"n":"MWGT - Weight","c":[{"t":5,"p":1,"n":"Thin"},{"t":5,"p":1,"n":"Muscular"},{"t":5,"p":1,"n":"Fat"}]},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":6,"s":1,"p":1,"n":"Actor Sounds","c":[{"t":3,"p":1,"n":"CS2H - Count"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CS2K - Keyword"},{"t":3,"p":1,"n":"CS2D - Sound"}]}]},{"p":1,"n":"CS2E - End Marker"},{"t":11,"p":1,"n":"CS2F - Finalize"}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"PFRN - Power Armor Stand"},{"t":3,"p":1,"n":"DOFT - Default Outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping Outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime Faction"},{"t":3,"p":1,"n":"FTST - Head Texture"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]},{"t":7,"p":1,"n":"MSDK - Morph Keys","c":[{"t":3,"p":1,"n":"Key"}]},{"t":7,"p":1,"n":"MSDV - Morph Values","c":[{"t":5,"p":1,"n":"Value"}]},{"t":10,"p":1,"n":"Face Tinting Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"TETI - Index","c":[{"t":3,"p":1,"n":"Data Type"},{"t":3,"p":1,"n":"Index"}]},{"t":6,"p":1,"n":"TEND - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Template Color Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"MRSV - Body Morph Region Values","c":[{"t":5,"p":1,"n":"Head"},{"t":5,"p":1,"n":"Upper Torso"},{"t":5,"p":1,"n":"Arms"},{"t":5,"p":1,"n":"Lower Torso"},{"t":5,"p":1,"n":"Legs"}]},{"t":10,"p":1,"n":"Face Morphs","d":1,"c":[{"t":6,"p":1,"n":"Face Morph","c":[{"t":3,"p":1,"n":"FMRI - Index"},{"t":6,"p":1,"n":"FMRS - Values","c":[{"t":5,"p":1,"n":"Position - X"},{"t":5,"p":1,"n":"Position - Y"},{"t":5,"p":1,"n":"Position - Z"},{"t":5,"p":1,"n":"Rotation - X"},{"t":5,"p":1,"n":"Rotation - Y"},{"t":5,"p":1,"n":"Rotation - Z"},{"t":5,"p":1,"n":"Scale"},{"t":11,"n":"Unknown"}]}]}]},{"t":5,"p":1,"n":"FMIN - Facial Morph Intensity"},{"t":2,"p":1,"n":"ATTX - Activate Text Override"}]},{"t":1,"p":1,"n":"OMOD - Object Modification","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Attach Point"},{"t":7,"p":1,"n":"Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":11,"p":1,"n":"Value 1"},{"t":11,"p":1,"n":"Value 2"}]}]},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Minimum Level"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]},{"t":7,"p":1,"n":"MNAM - Target OMOD Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"FNAM - Filter Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"LNAM - Loose Mod"},{"t":3,"p":1,"n":"NAM1 - Priority"},{"t":2,"p":1,"n":"FLTR - Filter"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items","c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"n":"OVIS - Object Visibility Manager","d":1,"c":[{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":3,"n":"INDX - Object"},{"t":6,"n":"DATA - Object Bounds","c":[{"t":5,"n":"X1"},{"t":5,"n":"Y1"},{"t":5,"n":"Z1"},{"t":5,"n":"X2"},{"t":5,"n":"Y2"},{"t":5,"n":"Z2"}]}]}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags"}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Ref Alias"},{"t":3,"p":1,"n":"Loc Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":3,"p":1,"n":"Packdata Target"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Ref Collection Alias"},{"t":3,"p":1,"n":"Radius"},{"t":3,"p":1,"n":"Collection Index"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Interrupt Data"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags"},{"t":3,"p":1,"n":"Clear General Flags"},{"t":3,"p":1,"n":"Set Interrupt Flags"},{"t":3,"p":1,"n":"Clear Interrupt Flags"},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ICON - Image"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":2,"p":1,"n":"FNAM - SWF"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":3,"p":1,"n":"EPFB - Perk Entry ID (unique)"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PKIN - Pack-In","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"CNAM - Cell"},{"t":3,"p":1,"n":"VNAM - Version"}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"n":"XASP - Unknown"},{"t":11,"n":"XATP - Unknown"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":11,"n":"XCVR - Unknown"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"},{"t":3,"p":1,"n":"Tracer Frequency"},{"t":3,"p":1,"n":"VATS Projectile"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model Filename"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"fragmentCount"},{"t":2,"p":1,"n":"scriptName"},{"t":6,"p":1,"n":"Script Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":11,"n":"Unused"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":3,"p":1,"n":"LNAM - Location"},{"t":3,"p":1,"n":"XNAM - Quest Completion XP"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"p":1,"n":"Stages","d":1,"c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags"},{"t":3,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"NAM2 - Note"},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Keyword"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"s":1,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":3,"p":1,"n":"ALCC - Closest To Alias"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":7,"p":1,"n":"ALLA - Linked Aliases","c":[{"t":6,"p":1,"n":"Linked Alias","c":[{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Alias"}]}]},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":3,"p":1,"n":"ALFV - Forced Voice"},{"t":3,"p":1,"n":"ALDI - Death Item"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":3,"p":1,"n":"GNAM - Quest Group"},{"t":2,"p":1,"n":"SNAM - SWF File"}]},{"t":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"STCP - Sound"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":7,"n":"PRPS - Properties","c":[{"t":6,"n":"Property","c":[{"t":3,"n":"Actor Value"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"APPR - Attach Parent Slots","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":6,"n":"Male Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":6,"n":"Female Default Weight","c":[{"t":5,"n":"Thin"},{"t":5,"n":"Muscular"},{"t":5,"n":"Fat"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Acceleration Rate"},{"t":5,"n":"Deceleration Rate"},{"t":3,"n":"Size"},{"t":11,"n":"Unknown"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":3,"n":"Beard Biped Object"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2"},{"t":3,"n":"Pipboy Biped Object"},{"t":3,"n":"XP Value"},{"t":5,"n":"Severable - Debris Scale"},{"t":3,"n":"Severable - Debris Count"},{"t":3,"n":"Severable - Decal Count"},{"t":5,"n":"Explodable - Debris Scale"},{"t":3,"n":"Explodable - Debris Count"},{"t":3,"n":"Explodable - Decal Count"},{"t":3,"n":"Severable - Explosion"},{"t":3,"n":"Severable - Debris"},{"t":3,"n":"Severable - Impact DataSet"},{"t":3,"n":"Explodable - Explosion"},{"t":3,"n":"Explodable - Debris"},{"t":3,"n":"Explodable - Impact DataSet"},{"t":5,"n":"OnCripple - Debris Scale"},{"t":3,"n":"OnCripple - Debris Count"},{"t":3,"n":"OnCripple - Decal Count"},{"t":3,"n":"OnCripple - Explosion"},{"t":3,"n":"OnCripple - Debris"},{"t":3,"n":"OnCripple - Impact DataSet"},{"t":3,"n":"Explodable - Subsegment Explosion"},{"t":5,"n":"Orientation Limits - Pitch"},{"t":5,"n":"Orientation Limits - Roll"}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"n":"NAM2 - Marker NAM2 #1"},{"t":8,"n":"Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Voice"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Default Hair Color"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Action Points Mult"},{"t":3,"n":"Stagger Offset"}]},{"t":2,"n":"ATKE - Attack Event"},{"t":3,"n":"ATKW - Weapon Slot"},{"t":3,"n":"ATKS - Required Slot"},{"t":2,"n":"ATKT - Description"}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]}]}]}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":3,"n":"MODS - Material Swap"},{"t":5,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"n":"NAM4 - Impact Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Dismember Blood Art"},{"t":3,"n":"CNAM - Meat Cap TextureSet"},{"t":3,"n":"NAM2 - Collar TextureSet"},{"t":3,"n":"ONAM - Sound - Open Corpse"},{"t":3,"n":"LNAM - Sound - Close Corpse"},{"t":8,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":7,"n":"RBPC - Biped Object Conditions","c":[{"t":3,"n":"Slot 30+"}]},{"t":10,"n":"Movement Data Overrides","c":[{"t":6,"n":"Override","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Movement Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Walk - Left"},{"t":5,"n":"Run - Left"},{"t":5,"n":"Walk - Right"},{"t":5,"n":"Run - Right"},{"t":5,"n":"Walk - Forward"},{"t":5,"n":"Run - Forward"},{"t":5,"n":"Sprint - Forward"},{"t":5,"n":"Walk - Back"},{"t":5,"n":"Run - Back"},{"t":5,"n":"Standing - Pitch"},{"t":5,"n":"Walk - Pitch"},{"t":5,"n":"Run - Pitch"},{"t":5,"n":"Sprint - Pitch"},{"t":5,"n":"Standing - Yaw"},{"t":5,"n":"Walk - Yaw"},{"t":5,"n":"Run - Yaw"},{"t":5,"n":"Sprint - Yaw"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":8,"n":"Equip Slots","c":[{"t":6,"n":"Equip Slot","c":[{"t":3,"n":"QNAM - Equip Slot"},{"t":2,"n":"ZNAM - Node"}]}]},{"t":3,"n":"UNWP - Unarmed Weapon"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"},{"t":11,"n":"Unknown"}]}]}]},{"t":3,"n":"WKMV - Base Movement Defaults - Default"},{"t":3,"n":"SWMV - Base Movement Defaults - Swim"},{"t":3,"n":"FLMV - Base Movement Defaults - Fly"},{"t":3,"n":"SNMV - Base Movement Defaults - Sneak"},{"n":"NAM0 - Head Data Marker"},{"n":"MNAM - Male Data Marker"},{"t":6,"n":"NNAM - Male Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Male Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Male Race Presets","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Male Hair Colors","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Male Face Details","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Male Default Face Texture"},{"t":8,"n":"Male Tint Layers","c":[{"t":6,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"n":"Options","c":[{"t":6,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Male Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Male Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Male Wrinkle Map Path"},{"n":"FNAM - Female Data Marker"},{"t":6,"n":"NNAM - Female Neck Fat Adjustments Scale","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":10,"n":"Female Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":8,"n":"Female Race Presets","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Female Hair Colors","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Female Face Details","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Female Default Face Texture"},{"t":8,"n":"Female Tint Layers","c":[{"t":6,"n":"Group","c":[{"t":2,"n":"TTGP - Group Name"},{"t":8,"n":"Options","c":[{"t":6,"n":"Option","c":[{"t":6,"n":"TETI - Index","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Index"}]},{"t":2,"n":"TTGP - Name"},{"t":11,"n":"TTEF - Unknown"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Actor"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Player Action"},{"t":3,"n":"Alias"},{"t":3,"n":"Alignment"},{"t":3,"n":"Association Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Faction"},{"t":3,"n":"Form List"},{"t":3,"n":"Form Type"},{"t":3,"n":"Furniture"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Global"},{"t":3,"n":"Idle"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Keyword"},{"t":3,"n":"Location"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Owner"},{"t":3,"n":"Package"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Perk"},{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Race"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Region"},{"t":3,"n":"Scene"},{"t":3,"n":"Sex"},{"t":3,"n":"Shout"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (unused)"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Ward State"},{"t":3,"n":"Weather"},{"t":3,"n":"Worldspace"},{"t":3,"n":"Damage Type"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Textures","c":[{"t":2,"n":"TTET - Texture"}]},{"t":11,"n":"TTEB - Unknown"},{"t":7,"n":"TTEC - Template Colors","c":[{"t":6,"n":"Template Color","c":[{"t":3,"n":"Color"},{"t":5,"n":"Alpha"},{"t":3,"n":"Template Index"},{"t":11,"n":"Unknown"}]}]},{"t":5,"n":"TTED - Unknown"}]}]},{"t":11,"n":"TTGE - Group End"}]}]},{"t":8,"n":"Female Morph Groups","c":[{"t":6,"n":"Morph Group","c":[{"t":2,"n":"MPGN - Name"},{"t":3,"n":"MPPC - Count"},{"t":8,"n":"Morph Presets","c":[{"t":6,"n":"Morph Preset","c":[{"t":3,"n":"MPPI - Index"},{"t":2,"n":"MPPN - Name"},{"t":2,"n":"MPPM - Unknown"},{"t":3,"n":"MPPT - Texture"},{"t":11,"n":"MPPF - Unknown"}]}]},{"t":11,"n":"MPPK - Unknown"},{"t":11,"n":"MPGS - Unknown"}]}]},{"t":8,"n":"Female Face Morphs","c":[{"t":6,"n":"Face Morph","c":[{"t":3,"n":"FMRI - Index"},{"t":2,"n":"FMRN - Name"}]}]},{"t":2,"n":"WMAP - Female Wrinkle Map Path"},{"t":3,"n":"NAM8 - Morph Race"},{"t":3,"n":"RNAM - Armor Race"},{"t":3,"n":"SRAC - Subgraph Template Race"},{"t":3,"n":"SADD - Subgraph Additive Race"},{"t":8,"n":"Subgraph Data","c":[{"t":6,"n":"Data","c":[{"t":2,"n":"SGNM - Behaviour Graph"},{"t":8,"n":"Actor Keywords","c":[{"t":3,"n":"SAKD - Keyword"}]},{"t":8,"n":"Target Keywords","c":[{"t":3,"n":"STKD - Keyword"}]},{"t":8,"n":"Animation Paths","c":[{"t":2,"n":"SAPT - Path"}]},{"t":6,"n":"SRAF - Flags","c":[{"t":3,"n":"Role"},{"t":3,"n":"Perspective"}]}]}]},{"t":5,"n":"PTOP - Idle Chatter Time Min"},{"t":5,"n":"NTOP - Idle Chatter Time Max"},{"t":8,"n":"Morph Values","c":[{"t":6,"n":"Value","c":[{"t":3,"n":"MSID - Index"},{"t":2,"n":"MSM0 - Min Name"},{"t":2,"n":"MSM1 - Max Name"}]}]},{"t":11,"n":"MLSI - Unknown"},{"t":2,"n":"HNAM - Hair Color Lookup Texture"},{"t":2,"n":"HLTX - Hair Color Extended Lookup Texture"},{"t":3,"n":"QSTI - Dialogue Quest"},{"t":8,"n":"Bone Data","c":[{"t":6,"n":"Data","c":[{"t":3,"n":"BSMP - Gender"},{"t":8,"n":"Bones","c":[{"t":6,"n":"Bone","c":[{"t":2,"n":"BSMB - Name"},{"t":7,"n":"BSMS - Values","c":[{"t":5,"n":"Value"}]},{"t":11,"n":"BMMP - Unknown"}]}]}]}]}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"s":1,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":8,"p":1,"n":"Linked Rooms","c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.0+\/-"},{"t":5,"p":1,"n":"End Distance Cap"},{"t":5,"p":1,"n":"Shadow Depth Bias"},{"t":5,"p":1,"n":"Near Clip"},{"t":5,"p":1,"n":"Volumetric Intensity"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Transition Interior"}]},{"t":3,"p":1,"n":"XTNM - Teleport Loc Name"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XASP - Acoustic Restriction"},{"p":1,"n":"XATP - Activation Point"},{"t":3,"p":1,"n":"XAMC - Ammo Count"},{"p":1,"n":"XLKT - Linked Ref Transient"},{"t":3,"p":1,"n":"XLYR - Layer"},{"t":3,"p":1,"n":"XMSP - Material Swap"},{"t":3,"p":1,"n":"XRFG - Reference Group"},{"t":6,"s":1,"p":1,"n":"XRDO - Radio","c":[{"t":5,"p":1,"n":"Frequency"},{"t":5,"p":1,"n":"Min Weak Distance"},{"t":5,"p":1,"n":"Max Weak Distance"},{"t":3,"p":1,"n":"Flags"}]},{"t":6,"s":1,"p":1,"n":"XBSD - Spline","c":[{"t":5,"p":1,"n":"Slack"},{"t":5,"p":1,"n":"Thickness"},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Wind - Detached End"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"XPDD - Projected Decal","c":[{"t":5,"p":1,"n":"Width Scale"},{"t":5,"p":1,"n":"Height Scale"}]},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"XOWN - Owner","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XRNK - Owner Faction Rank"},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":3,"p":1,"n":"XHLT - Health %"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":8,"s":1,"p":1,"n":"Spline Connection","d":1,"c":[{"t":6,"p":1,"n":"XPLK - Link","c":[{"t":3,"p":1,"n":"Ref"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"Power Grid","c":[{"t":3,"p":1,"n":"XWPG - Count"},{"t":8,"p":1,"n":"Connections","c":[{"t":6,"p":1,"n":"XWPN - Connection","c":[{"t":3,"p":1,"n":"Node 1"},{"t":3,"p":1,"n":"Node 2"},{"t":3,"p":1,"n":"Line"}]}]}]},{"t":11,"n":"XCVR - Unknown"},{"t":11,"n":"XCVL - Unknown"},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":2,"p":1,"n":"MNAM - Comments"}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":11,"n":"ANAM - Unknown"}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":5,"p":1,"n":"RLDM - LOD Display Distance Multiplier"},{"t":5,"p":1,"n":"ANAM - Occlusion Accuracy Dist"}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]},{"t":3,"p":1,"n":"ANAM - Reverb Class"}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"RFGP - Reference Group","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Name"},{"t":3,"p":1,"n":"RNAM - Reference"},{"t":11,"n":"PNAM - Unknown"}]},{"t":1,"p":1,"n":"SCCO - Scene Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Scenes","d":1,"c":[{"t":6,"p":1,"n":"Scene","c":[{"t":3,"p":1,"n":"SNAM - Scene"},{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":11,"n":"VNAM - Unknown"},{"t":8,"n":"Unknown","c":[{"t":6,"n":"XNAM - Unknown","c":[{"t":3,"n":"Unknown"}]}]}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Start Conditions"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker Completion Conditions"},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Start"},{"t":3,"p":1,"n":"On Completion"}]},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"LNAM - Flags"},{"t":3,"p":1,"n":"DNAM - Behaviour Flags"}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Alias ID"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer - Max Seconds"},{"t":3,"p":1,"n":"SCQS - Set Parent Quest Stage"},{"t":5,"p":1,"n":"TNAM - Timer - Min Seconds"},{"t":11,"n":"STSC - Unknown"},{"t":8,"p":1,"n":"Start Scenes","c":[{"t":6,"p":1,"n":"Start Scene","c":[{"t":3,"p":1,"n":"LCEP - Scene"},{"t":3,"p":1,"n":"INTT - Phase Index"},{"t":2,"p":1,"n":"SSPN - Start Phase for Scene"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"p":1,"n":"PTOP - Player Positive Response"},{"t":3,"p":1,"n":"NTOP - Player Negative Response"},{"t":3,"p":1,"n":"NETO - Player Neutral Response"},{"t":3,"p":1,"n":"QTOP - Player Question Response"},{"t":3,"p":1,"n":"VENC - Player Positive Dialogue Subtype"},{"t":3,"p":1,"n":"PLVD - Player Negative Dialogue Subtype"},{"t":3,"p":1,"n":"JOUT - Player Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"DALC - Player Question Dialogue Subtype"},{"t":7,"p":1,"n":"DTID - NPC Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"NPOT - NPC Positive Response"},{"t":3,"p":1,"n":"NNGT - NPC Negative Response"},{"t":3,"p":1,"n":"NNUT - NPC Neutral Response"},{"t":3,"p":1,"n":"NQUT - NPC Question Response"},{"t":3,"p":1,"n":"NPOS - NPC Positive Dialogue Subtype"},{"t":3,"p":1,"n":"NNGS - NPC Negative Dialogue Subtype"},{"t":3,"p":1,"n":"NNUS - NPC Neutral Dialogue Subtype"},{"t":3,"p":1,"n":"NQUS - NPC Question Dialogue Subtype"},{"t":3,"p":1,"n":"DTGT - Dialogue Target Actor"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"p":1,"n":"End Scene Say Greeting"},{"t":3,"p":1,"n":"Play Sound"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":6,"p":1,"n":"CRIS - Camera","c":[{"t":5,"p":1,"n":"FOV On Player Camera"},{"t":5,"p":1,"n":"Rate Of Camera Change"}]},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":7,"p":1,"n":"HTID - Player Headtracking","c":[{"t":3,"p":1,"n":"Actor ID"}]},{"t":3,"p":1,"n":"VENC - Dialogue Subtype"},{"t":3,"p":1,"n":"PNAM - AnimArchType"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":5,"p":1,"n":"CNAM - Camera Distance Override"},{"t":5,"p":1,"n":"ACTV - Dialogue Distance Override"},{"t":5,"p":1,"n":"CRIS - FOV Override"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"SCQS - Set Parent Quest Stage","c":[{"t":3,"p":1,"n":"On Begin"},{"t":3,"p":1,"n":"On End"}]},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Template Scene"},{"t":3,"p":1,"n":"XNAM - Index"}]},{"t":1,"p":1,"n":"SCOL - Static Collection","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":10,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"ONAM - Static"},{"t":7,"p":1,"n":"DATA - Placements","c":[{"t":6,"p":1,"n":"Placement","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Scale"}]}]}]}]}]},{"t":1,"p":1,"n":"SCSN - Audio Category Snapshot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Priority"},{"t":8,"s":1,"p":1,"n":"Category Multipliers","d":1,"c":[{"t":6,"p":1,"n":"CNAM - Category Multiplier","c":[{"t":3,"p":1,"n":"Categoty"},{"t":5,"p":1,"n":"Multiplier"}]}]}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags"},{"t":3,"p":1,"n":"Quest Flags"}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":5,"p":1,"n":"HNAM - Hours until reset"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"PNAM - Parent Category"},{"t":3,"p":1,"n":"ONAM - Menu Slider Category"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"},{"t":5,"p":1,"n":"MNAM - Min Frequency Multiplier"},{"t":5,"p":1,"n":"CNAM - Sidechain Target Multiplier"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"NNAM - Notes"},{"t":3,"p":1,"n":"CNAM - Descriptor Type"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Sidechain"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]},{"t":3,"p":1,"n":"Base Descriptor"},{"t":8,"s":1,"p":1,"n":"Descriptors","d":1,"c":[{"t":3,"p":1,"n":"DNAM - Descriptor"}]},{"t":3,"n":"ITMC - Count"},{"t":10,"p":1,"n":"Rates of Fire","d":1,"c":[{"t":6,"p":1,"n":"Sound","c":[{"p":1,"n":"ITMS - Marker Start"},{"t":3,"p":1,"n":"INTV - RoF (RPM)"},{"t":2,"p":1,"n":"FNAM - File"},{"p":1,"n":"ITME - Marker End"}]}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":3,"p":1,"n":"MNAM - Type"},{"t":3,"p":1,"n":"VNAM - Static Attenuation"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"FL"},{"t":3,"p":1,"n":"FR"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"SL"},{"t":3,"p":1,"n":"SR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ATTN - Attenuation Values","c":[{"t":5,"p":1,"n":"Fade In Distance - Start"},{"t":5,"p":1,"n":"Fade In Distance - End"},{"t":5,"p":1,"n":"Fade Out Distance - Start"},{"t":5,"p":1,"n":"Fade Out Distance - End"},{"t":6,"p":1,"n":"Fade In Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]},{"t":6,"p":1,"n":"Fade Out Curve","c":[{"t":3,"p":1,"n":"Value 1"},{"t":3,"p":1,"n":"Value 2"},{"t":3,"p":1,"n":"Value 3"},{"t":3,"p":1,"n":"Value 4"}]}]},{"t":3,"p":1,"n":"ENAM - Effect Chain"}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"},{"t":6,"s":1,"p":1,"n":"REPT - Repeat","c":[{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Max Time"},{"t":3,"p":1,"n":"Stackable"}]}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Casting Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"MNAM - Particle Texture"}]},{"t":1,"p":1,"n":"STAG - Animation Sound Tag Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"TNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":2,"p":1,"n":"Action"}]}]}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":3,"p":1,"n":"FTYP - Forced Loc Ref Type"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]},{"t":6,"s":1,"p":1,"n":"NVNM - Navmesh Geometry","c":[{"t":3,"p":1,"n":"Version"},{"t":11,"p":1,"n":"Magic"},{"t":3,"p":1,"n":"Parent Worldspace"},{"t":6,"p":1,"n":"Coordinates","c":[{"t":3,"p":1,"n":"Grid Y"},{"t":3,"p":1,"n":"Grid X"}]},{"t":3,"p":1,"n":"Parent Cell"},{"t":11,"p":1,"n":"Vertices and Triangles"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"LOD","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TERM - Terminal","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"NAM0 - Header Text"},{"t":2,"p":1,"n":"WNAM - Welcome Text"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":7,"p":1,"n":"PRPS - Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Value"}]}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":11,"n":"WBDT - Workbench Data (unused)"},{"t":2,"p":1,"n":"XMRK - Marker Model"},{"t":7,"p":1,"n":"SNAM - Marker Paramaters","c":[{"t":6,"p":1,"n":"Marker","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Offset Z"},{"t":5,"p":1,"n":"Rotation Z"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Entry Types"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"BSIZ - Count"},{"t":8,"s":1,"p":1,"n":"Body Text","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":2,"p":1,"n":"BTXT - Text"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":3,"n":"ISIZ - Count"},{"t":8,"s":1,"p":1,"n":"Menu Items","d":1,"c":[{"t":6,"p":1,"n":"Menu Item","c":[{"t":2,"p":1,"n":"ITXT - Item Text"},{"t":2,"p":1,"n":"RNAM - Response Text"},{"t":3,"p":1,"n":"ANAM - Type"},{"t":3,"p":1,"n":"ITID - Item ID"},{"t":2,"p":1,"n":"UNAM - Display Text"},{"t":2,"p":1,"n":"VNAM - Show Image"},{"t":3,"p":1,"n":"TNAM - Submenu"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Shout"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (unused)"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TRNS - Transform","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":5,"p":1,"n":"Scale"},{"t":5,"p":1,"n":"Zoom Min"},{"t":5,"p":1,"n":"Zoom Max"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX03 - Glow"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX02 - Wrinkles"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Smooth Spec"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Alpha Threshold?"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Material"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"ANAM - Opacity (unused)"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Material (unused)"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Consume Spell"},{"t":3,"p":1,"n":"YNAM - Contact Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":11,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":6,"p":1,"n":"Fog Properties","c":[{"t":5,"p":1,"n":"Depth Amount"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Shallow Range"},{"t":5,"p":1,"n":"Color Deep Range"},{"t":5,"p":1,"n":"Shallow Alpha"},{"t":5,"p":1,"n":"Deep Alpha"},{"t":5,"p":1,"n":"Alpha Shallow Range"},{"t":5,"p":1,"n":"Alpha Deep Range"},{"t":6,"p":1,"n":"Underwater Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Underwater Fog Amount"},{"t":5,"p":1,"n":"Underwater Near Fog"},{"t":5,"p":1,"n":"Underwater Far Fog"}]},{"t":6,"p":1,"n":"Physical Properties","c":[{"t":5,"p":1,"n":"Normal Magnitude"},{"t":5,"p":1,"n":"Shallow Normal Falloff"},{"t":5,"p":1,"n":"Deep Normal Falloff"},{"t":5,"p":1,"n":"Reflectivity Amount"},{"t":5,"p":1,"n":"Fresnel Amount"},{"t":5,"p":1,"n":"Surface Effect Falloff"},{"t":6,"p":1,"n":"Displacement Simulator","c":[{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Velocity"},{"t":5,"p":1,"n":"Falloff"},{"t":5,"p":1,"n":"Dampener"},{"t":5,"p":1,"n":"Starting Size"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular Properties","c":[{"t":5,"p":1,"n":"Sun Specular Power"},{"t":5,"p":1,"n":"Sun Specular Magnitude"},{"t":5,"p":1,"n":"Sun Sparkle Power"},{"t":5,"p":1,"n":"Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Interior Specular Radius"},{"t":5,"p":1,"n":"Interior Specular Brightness"},{"t":5,"p":1,"n":"Interior Specular Power"}]},{"t":6,"p":1,"n":"Noise Properties","c":[{"t":5,"p":1,"n":"Layer 1 - Wind Direction"},{"t":5,"p":1,"n":"Layer 2 - Wind Direction"},{"t":5,"p":1,"n":"Layer 3 - Wind Direction"},{"t":5,"p":1,"n":"Layer 1 - Wind Speed"},{"t":5,"p":1,"n":"Layer 2 - Wind Speed"},{"t":5,"p":1,"n":"Layer 3 - Wind Speed"},{"t":5,"p":1,"n":"Layer 1 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 2 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 3 - Amplitude Scale"},{"t":5,"p":1,"n":"Layer 1 - UV Scale"},{"t":5,"p":1,"n":"Layer 2 - UV Scale"},{"t":5,"p":1,"n":"Layer 3 - UV Scale"},{"t":5,"p":1,"n":"Layer 1 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 2 - Noise Falloff"},{"t":5,"p":1,"n":"Layer 3 - Noise Falloff"}]},{"t":6,"p":1,"n":"Silt Properties","c":[{"t":5,"p":1,"n":"Silt Amount"},{"t":6,"p":1,"n":"Light Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Dark Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"Screen Space Reflections"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Layer 1 Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Layer 2 Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Layer 3 Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Struct","c":[{"t":7,"p":1,"n":"Struct","c":[{"t":6,"p":1,"n":"Member","c":[{"t":2,"p":1,"n":"memberName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"PTRN - Preview Transform"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]},{"t":2,"p":1,"n":"ICON - Inventory Image"},{"t":2,"p":1,"n":"MICO - Message Icon"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":7,"p":1,"n":"DAMC - Resistances","c":[{"t":6,"p":1,"n":"Resistance","c":[{"t":3,"p":1,"n":"Damage Type"},{"t":3,"p":1,"n":"Value"}]}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":2,"p":1,"n":"DSTA - Sequence Name"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":5,"p":1,"n":"DMDC - Color Remapping Index"},{"t":3,"p":1,"n":"DMDS - Material Swap"}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"INRD - Instance Naming"},{"t":7,"p":1,"n":"APPR - Attach Parent Slots","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Object Template","c":[{"t":3,"p":1,"n":"OBTE - Count"},{"t":8,"p":1,"n":"Combinations","c":[{"t":6,"p":1,"n":"Combination","c":[{"p":1,"n":"OBTF - Editor Only"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"OBTS - Object Mod Template Item","c":[{"t":3,"p":1,"n":"Include Count"},{"t":3,"p":1,"n":"Property Count"},{"t":3,"p":1,"n":"Level Min"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Level Max"},{"t":3,"p":1,"n":"ID"},{"t":3,"p":1,"n":"Default"},{"t":7,"p":1,"n":"Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"Min Level For Ranks"},{"t":3,"p":1,"n":"Alt Levels Per Tier"},{"t":7,"p":1,"n":"Includes","c":[{"t":6,"p":1,"n":"Include","c":[{"t":3,"p":1,"n":"Mod"},{"t":3,"p":1,"n":"Attach Point Index"},{"t":3,"p":1,"n":"Optional"},{"t":3,"p":1,"n":"Don't Use All"}]}]},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":3,"p":1,"n":"Value Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Function Type"},{"t":3,"p":1,"n":"Property"},{"t":11,"n":"Value 1 - Unknown"},{"t":3,"p":1,"n":"Value 1 - Int"},{"t":5,"p":1,"n":"Value 1 - Float"},{"t":3,"p":1,"n":"Value 1 - Bool"},{"t":3,"p":1,"n":"Value 1 - FormID"},{"t":3,"p":1,"n":"Value 1 - Enum"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Stagger Value"},{"t":3,"p":1,"n":"Hit Behaviour"},{"t":3,"p":1,"n":"Value 2 - Int"},{"t":5,"p":1,"n":"Value 2 - Float"},{"t":3,"p":1,"n":"Value 2 - Bool"},{"t":5,"p":1,"n":"Step"}]}]}]}]}]},{"p":1,"n":"STOP - Marker"}]},{"t":3,"p":1,"n":"NNAM - Embedded Weapon Mod"},{"t":6,"s":1,"p":1,"n":"1st Person Model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":3,"p":1,"n":"MO4S - Material Swap"},{"t":5,"p":1,"n":"MO4C - Color Remapping Index"},{"t":11,"n":"MO4F - Unknown"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Ammo"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reload Speed"},{"t":5,"p":1,"n":"Reach"},{"t":5,"p":1,"n":"Min Range"},{"t":5,"p":1,"n":"Max Range"},{"t":5,"p":1,"n":"Attack Delay"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Damage - OutOfRange Mult"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Capacity"},{"t":3,"p":1,"n":"Animation Type"},{"t":5,"p":1,"n":"Damage - Secondary"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Damage - Base"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Sound - Attack"},{"t":3,"p":1,"n":"Sound - Attack 2D"},{"t":3,"p":1,"n":"Sound - Attack Loop"},{"t":3,"p":1,"n":"Sound - Attack Fail"},{"t":3,"p":1,"n":"Sound - Idle"},{"t":3,"p":1,"n":"Sound - Equip Sound"},{"t":3,"p":1,"n":"Sound - UnEquip Sound"},{"t":3,"p":1,"n":"Sound - Fast Equip Sound"},{"t":3,"p":1,"n":"Accuracy Bonus"},{"t":5,"p":1,"n":"Animation Attack Seconds"},{"t":5,"p":1,"n":"Action Point Cost"},{"t":5,"p":1,"n":"Full Power Seconds"},{"t":5,"p":1,"n":"Min Power Per Shot"},{"t":3,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"FNAM - ","c":[{"t":5,"p":1,"n":"Animation Fire Seconds"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":5,"p":1,"n":"Animation Reload Seconds"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Sighted Transition Seconds"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Override Projectile"},{"t":3,"p":1,"n":"Pattern"},{"t":3,"p":1,"n":"Rumble - Peroid (ms)"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":5,"p":1,"n":"Crit Damage Mult"},{"t":5,"p":1,"n":"Crit Charge Bonus"},{"t":3,"p":1,"n":"Crit Effect"}]},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"LNAM - NPC Add Ammo List"},{"t":3,"p":1,"n":"WAMD - Aim Model"},{"t":3,"p":1,"n":"WZMD - Zoom"},{"t":3,"p":1,"n":"CNAM - Template"},{"t":7,"p":1,"n":"DAMA - Damage Types","c":[{"t":6,"p":1,"n":"Damage Type","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Amount"}]}]},{"t":2,"p":1,"n":"FLTR - Filter"},{"t":3,"p":1,"n":"MASE - Melee Speed"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"n":"Unused RNAM","c":[{"t":11,"n":"RNAM - Unknown"}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":6,"s":1,"p":1,"n":"World Default Level Data","c":[{"t":6,"p":1,"n":"WLEV - Dimension","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Size","c":[{"t":3,"p":1,"n":"Width"},{"t":3,"p":1,"n":"Height"}]}]},{"t":11,"p":1,"n":"WLEV - Data"}]},{"t":11,"n":"OFST - Offset Data"},{"t":11,"n":"CLSZ - Unknown"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"},{"t":5,"p":1,"n":"EarlySunrise"},{"t":5,"p":1,"n":"LateSunrise"},{"t":5,"p":1,"n":"EarlySunset"},{"t":5,"p":1,"n":"LateSunset"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"EarlySunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"LateSunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far High","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"EarlySunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"LateSunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"n":"NAM4 - Unknown","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"},{"t":5,"p":1,"n":"Day - Near Height Mid"},{"t":5,"p":1,"n":"Day - Near Height Range"},{"t":5,"p":1,"n":"Night - Near Height Mid"},{"t":5,"p":1,"n":"Night - Near Height Range"},{"t":5,"p":1,"n":"Day - High Density Scale"},{"t":5,"p":1,"n":"Night - High Density Scale"},{"t":5,"p":1,"n":"Day - Far Height Mid"},{"t":5,"p":1,"n":"Day - Far Height Range"},{"t":5,"p":1,"n":"Night - Far Height Mid"},{"t":5,"p":1,"n":"Night - Far Height Range"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"WGDR - God Rays","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"},{"t":3,"p":1,"n":"EarlySunrise"},{"t":3,"p":1,"n":"LateSunrise"},{"t":3,"p":1,"n":"EarlySunset"},{"t":3,"p":1,"n":"LateSunset"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - EarlySunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - LateSunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":3,"p":1,"n":"MODS - Material Swap"},{"t":5,"p":1,"n":"MODC - Color Remapping Index"},{"t":11,"n":"MODF - Unknown"}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"},{"t":6,"s":1,"p":1,"n":"UNAM - Magic","c":[{"t":3,"p":1,"n":"On Lightning Strike - Spell"},{"t":5,"p":1,"n":"On Lightning Strike - Threshold"},{"t":3,"p":1,"n":"On Weather Activate - Spell"},{"t":5,"p":1,"n":"On Weather Activate - Threshold"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"VNAM - Volatility Mult"},{"t":5,"p":1,"n":"WNAM - Visibility Mult"}]},{"t":1,"p":1,"n":"ZOOM - Zoom","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"GNAM - Data","c":[{"t":5,"p":1,"n":"FOV Mult"},{"t":3,"p":1,"n":"Overlay"},{"t":3,"p":1,"n":"Imagespace Modifier"},{"t":6,"p":1,"n":"Camera Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":2,"p":1,"n":"DNAM - Notes"},{"t":3,"p":1,"n":"TNAM - Type"},{"t":3,"p":1,"n":"DATA - Attraction Rule"},{"t":2,"p":1,"n":"FULL - Name"}]}]},"name":"Smash.All.old","hash":"A4B4931B","color":128} diff --git a/frontend/settings/Skyrim/Bash.Actors.ACBS.json b/frontend/settings/Skyrim/Bash.Actors.ACBS.json old mode 100644 new mode 100755 index dcc0b30..25f3fb5 --- a/frontend/settings/Skyrim/Bash.Actors.ACBS.json +++ b/frontend/settings/Skyrim/Bash.Actors.ACBS.json @@ -1 +1 @@ -{"records":"NPC_","description":"Actors.ACBS tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC ACBS configuration.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Magicka Offset"},{"t":3,"p":1,"n":"Stamina Offset"},{"t":12,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Speed Multiplier"},{"t":3,"p":1,"n":"Disposition Base (unused)"},{"t":3,"p":1,"n":"Template Flags"},{"t":3,"p":1,"n":"Health Offset"},{"t":3,"p":1,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]}]},"name":"Bash.Actors.ACBS","hash":"$75515CF0","color":255} \ No newline at end of file +{"records":"NPC_","description":"Actors.ACBS tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC ACBS configuration.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"ScriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Female"},{"t":4,"p":1,"n":"Essential"},{"t":4,"p":1,"n":"Is CharGen Face Preset"},{"t":4,"p":1,"n":"Respawn"},{"t":4,"p":1,"n":"Auto-calc stats"},{"t":4,"p":1,"n":"Unique"},{"t":4,"p":1,"n":"Doesn't affect stealth meter"},{"t":4,"p":1,"n":"PC Level Mult"},{"t":4,"p":1,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"p":1,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Bleedout Override"},{"t":4,"p":1,"n":"Opposite Gender Anims"},{"t":4,"p":1,"n":"Simple Actor"},{"t":4,"p":1,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"looped audio?"},{"t":4,"p":1,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Invulnerable"}]},{"t":3,"p":1,"n":"Magicka Offset"},{"t":3,"p":1,"n":"Stamina Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Speed Multiplier"},{"t":3,"p":1,"n":"Disposition Base (unused)"},{"t":3,"p":1,"n":"Template Flags","c":[{"t":4,"p":1,"n":"Use Traits"},{"t":4,"p":1,"n":"Use Stats"},{"t":4,"p":1,"n":"Use Factions"},{"t":4,"p":1,"n":"Use Spell List"},{"t":4,"p":1,"n":"Use AI Data"},{"t":4,"p":1,"n":"Use AI Packages"},{"t":4,"p":1,"n":"Use Model\/Animation?"},{"t":4,"p":1,"n":"Use Base Data"},{"t":4,"p":1,"n":"Use Inventory"},{"t":4,"p":1,"n":"Use Script"},{"t":4,"p":1,"n":"Use Def Pack List"},{"t":4,"p":1,"n":"Use Attack Data"},{"t":4,"p":1,"n":"Use Keywords"}]},{"t":3,"p":1,"n":"Health Offset"},{"t":3,"p":1,"n":"Bleedout Override"}]},{"t":8,"n":"SNAM - Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"SPLO - Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"ATKD - Attacks","c":[{"t":6,"n":"ATKD - Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"PRKR - Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"CNTO - Items","c":[{"t":6,"n":"CNTO - Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"PKID - Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"PNAM - Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"CSDT - Sound Types","c":[{"t":6,"n":"CSDT - Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"CSDI - Sounds","c":[{"t":6,"n":"CSDI - Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"TINI - Tint Layers","c":[{"t":6,"n":"TINI - Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Actors.ACBS","hash":"0A9F1581","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Actors.AIData.json b/frontend/settings/Skyrim/Bash.Actors.AIData.json old mode 100644 new mode 100755 index a64b53a..5f13c29 --- a/frontend/settings/Skyrim/Bash.Actors.AIData.json +++ b/frontend/settings/Skyrim/Bash.Actors.AIData.json @@ -1 +1 @@ -{"records":"NPC_","description":"Actors.AIData tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC AI data.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"p":1,"n":"Unknown"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]}]},"name":"Bash.Actors.AIData","hash":"$E4A27332","color":255} \ No newline at end of file +{"records":"NPC_","description":"Actors.AIData tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC AI data.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"ScriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"SNAM - Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"SPLO - Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"ATKD - Attacks","c":[{"t":6,"n":"ATKD - Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"PRKR - Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"CNTO - Items","c":[{"t":6,"n":"CNTO - Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]}]},{"t":8,"n":"PKID - Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"PNAM - Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"CSDT - Sound Types","c":[{"t":6,"n":"CSDT - Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"CSDI - Sounds","c":[{"t":6,"n":"CSDI - Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"TINI - Tint Layers","c":[{"t":6,"n":"TINI - Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Actors.AIData","hash":"308F0F34","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Actors.AIPackages.json b/frontend/settings/Skyrim/Bash.Actors.AIPackages.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.AIPackagesMerge.json b/frontend/settings/Skyrim/Bash.Actors.AIPackagesMerge.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.CombatStyle.json b/frontend/settings/Skyrim/Bash.Actors.CombatStyle.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.DeathItem.json b/frontend/settings/Skyrim/Bash.Actors.DeathItem.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.Spells.json b/frontend/settings/Skyrim/Bash.Actors.Spells.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.SpellsMerge.json b/frontend/settings/Skyrim/Bash.Actors.SpellsMerge.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Actors.Stats.json b/frontend/settings/Skyrim/Bash.Actors.Stats.json old mode 100644 new mode 100755 index c04d088..b00361e --- a/frontend/settings/Skyrim/Bash.Actors.Stats.json +++ b/frontend/settings/Skyrim/Bash.Actors.Stats.json @@ -1 +1 @@ -{"records":"NPC_","description":"Actors.Stats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC stats.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - Player Skills","c":[{"t":7,"p":1,"n":"Skill Values","c":[{"t":3,"p":1,"n":"Skill #0 (OneHanded)"},{"t":3,"p":1,"n":"Skill #1 (TwoHanded)"},{"t":3,"p":1,"n":"Skill #2 (Marksman)"},{"t":3,"p":1,"n":"Skill #3 (Block)"},{"t":3,"p":1,"n":"Skill #4 (Smithing)"},{"t":3,"p":1,"n":"Skill #5 (HeavyArmor)"},{"t":3,"p":1,"n":"Skill #6 (LightArmor)"},{"t":3,"p":1,"n":"Skill #7 (Pickpocket)"},{"t":3,"p":1,"n":"Skill #8 (Lockpicking)"},{"t":3,"p":1,"n":"Skill #9 (Sneak)"},{"t":3,"p":1,"n":"Skill #10 (Alchemy)"},{"t":3,"p":1,"n":"Skill #11 (Speechcraft)"},{"t":3,"p":1,"n":"Skill #12 (Alteration)"},{"t":3,"p":1,"n":"Skill #13 (Conjuration)"},{"t":3,"p":1,"n":"Skill #14 (Destruction)"},{"t":3,"p":1,"n":"Skill #15 (Illusion)"},{"t":3,"p":1,"n":"Skill #16 (Restoration)"},{"t":3,"p":1,"n":"Skill #17 (Enchanting)"}]},{"t":7,"p":1,"n":"Skill Offsets","c":[{"t":3,"p":1,"n":"Skill #0 (OneHanded)"},{"t":3,"p":1,"n":"Skill #1 (TwoHanded)"},{"t":3,"p":1,"n":"Skill #2 (Marksman)"},{"t":3,"p":1,"n":"Skill #3 (Block)"},{"t":3,"p":1,"n":"Skill #4 (Smithing)"},{"t":3,"p":1,"n":"Skill #5 (HeavyArmor)"},{"t":3,"p":1,"n":"Skill #6 (LightArmor)"},{"t":3,"p":1,"n":"Skill #7 (Pickpocket)"},{"t":3,"p":1,"n":"Skill #8 (Lockpicking)"},{"t":3,"p":1,"n":"Skill #9 (Sneak)"},{"t":3,"p":1,"n":"Skill #10 (Alchemy)"},{"t":3,"p":1,"n":"Skill #11 (Speechcraft)"},{"t":3,"p":1,"n":"Skill #12 (Alteration)"},{"t":3,"p":1,"n":"Skill #13 (Conjuration)"},{"t":3,"p":1,"n":"Skill #14 (Destruction)"},{"t":3,"p":1,"n":"Skill #15 (Illusion)"},{"t":3,"p":1,"n":"Skill #16 (Restoration)"},{"t":3,"p":1,"n":"Skill #17 (Enchanting)"}]},{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Far away model distance"},{"t":3,"p":1,"n":"Geared up weapons"},{"t":11,"p":1,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]}]},"name":"Bash.Actors.Stats","hash":"$5853D7A6","color":255} \ No newline at end of file +{"records":"NPC_","description":"Actors.Stats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies NPC stats.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"SNAM - Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"SPLO - Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"ATKD - Attacks","c":[{"t":6,"n":"ATKD - Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"PRKR - Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"CNTO - Items","c":[{"t":6,"n":"CNTO - Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"PKID - Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - Player Skills","c":[{"t":7,"p":1,"n":"Skill Values","c":[{"t":3,"p":1,"n":"OneHanded"},{"t":3,"p":1,"n":"TwoHanded"},{"t":3,"p":1,"n":"Marksman"},{"t":3,"p":1,"n":"Block"},{"t":3,"p":1,"n":"Smithing"},{"t":3,"p":1,"n":"HeavyArmor"},{"t":3,"p":1,"n":"LightArmor"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"p":1,"n":"Lockpicking"},{"t":3,"p":1,"n":"Sneak"},{"t":3,"p":1,"n":"Alchemy"},{"t":3,"p":1,"n":"Speechcraft"},{"t":3,"p":1,"n":"Alteration"},{"t":3,"p":1,"n":"Conjuration"},{"t":3,"p":1,"n":"Destruction"},{"t":3,"p":1,"n":"Illusion"},{"t":3,"p":1,"n":"Restoration"},{"t":3,"p":1,"n":"Enchanting"}]},{"t":7,"p":1,"n":"Skill Offsets","c":[{"t":3,"p":1,"n":"OneHanded"},{"t":3,"p":1,"n":"TwoHanded"},{"t":3,"p":1,"n":"Marksman"},{"t":3,"p":1,"n":"Block"},{"t":3,"p":1,"n":"Smithing"},{"t":3,"p":1,"n":"HeavyArmor"},{"t":3,"p":1,"n":"LightArmor"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"p":1,"n":"Lockpicking"},{"t":3,"p":1,"n":"Sneak"},{"t":3,"p":1,"n":"Alchemy"},{"t":3,"p":1,"n":"Speechcraft"},{"t":3,"p":1,"n":"Alteration"},{"t":3,"p":1,"n":"Conjuration"},{"t":3,"p":1,"n":"Destruction"},{"t":3,"p":1,"n":"Illusion"},{"t":3,"p":1,"n":"Restoration"},{"t":3,"p":1,"n":"Enchanting"}]},{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"PNAM - Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"CSDT - Sound Types","c":[{"t":6,"n":"CSDT - Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"CSDI - Sounds","c":[{"t":6,"n":"CSDI - Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"TINI - Tint Layers","c":[{"t":6,"n":"TINI - Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Actors.Stats","hash":"3E8B2129","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.All.json b/frontend/settings/Skyrim/Bash.All.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Body-F.json b/frontend/settings/Skyrim/Bash.Body-F.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Body-M.json b/frontend/settings/Skyrim/Bash.Body-M.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Body-Size-F.json b/frontend/settings/Skyrim/Bash.Body-Size-F.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Body-Size-M.json b/frontend/settings/Skyrim/Bash.Body-Size-M.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.Acoustic.json b/frontend/settings/Skyrim/Bash.C.Acoustic.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.Climate.json b/frontend/settings/Skyrim/Bash.C.Climate.json old mode 100644 new mode 100755 index 30ce65e..5f1e704 --- a/frontend/settings/Skyrim/Bash.C.Climate.json +++ b/frontend/settings/Skyrim/Bash.C.Climate.json @@ -1 +1 @@ -{"records":"CELL","description":"C.Climate tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell climates.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Climate","hash":"$595B86E0","color":255} \ No newline at end of file +{"records":"CELL","description":"C.Climate tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell climates.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"},{"t":4,"n":"Has Water"},{"t":4,"n":"Can't Travel From Here"},{"t":4,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Public Area"},{"t":4,"n":"Hand Changed"},{"t":4,"p":1,"n":"Show Sky"},{"t":4,"n":"Use Sky Lighting"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land","c":[{"t":4,"n":"Quad 1"},{"t":4,"n":"Quad 2"},{"t":4,"n":"Quad 3"},{"t":4,"n":"Quad 4"}]}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits","c":[{"t":4,"n":"Ambient Color"},{"t":4,"n":"Directional Color"},{"t":4,"n":"Fog Color"},{"t":4,"n":"Fog Near"},{"t":4,"n":"Fog Far"},{"t":4,"n":"Directional Rotation"},{"t":4,"n":"Directional Fade"},{"t":4,"n":"Clip Distance"},{"t":4,"n":"Fog Power"},{"t":4,"n":"Fog Max"},{"t":4,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions"},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"XOWN - Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Climate","hash":"500FBC09","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.Encounter.json b/frontend/settings/Skyrim/Bash.C.Encounter.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.ForceHideLand.json b/frontend/settings/Skyrim/Bash.C.ForceHideLand.json new file mode 100755 index 0000000..ea1c23a --- /dev/null +++ b/frontend/settings/Skyrim/Bash.C.ForceHideLand.json @@ -0,0 +1 @@ +{"records":"CELL","description":"","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"p":1,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.ForceHideLand","hash":"94C8152F","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.ImageSpace.json b/frontend/settings/Skyrim/Bash.C.ImageSpace.json old mode 100644 new mode 100755 index a229328..f49b2d8 --- a/frontend/settings/Skyrim/Bash.C.ImageSpace.json +++ b/frontend/settings/Skyrim/Bash.C.ImageSpace.json @@ -1 +1 @@ -{"records":"CELL","description":"","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","d":1,"c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.ImageSpace","hash":"$B06BA239","color":255} \ No newline at end of file +{"records":"CELL","description":"","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.ImageSpace","hash":"625A0C61","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.Light.json b/frontend/settings/Skyrim/Bash.C.Light.json old mode 100644 new mode 100755 index 1233825..5c96bfe --- a/frontend/settings/Skyrim/Bash.C.Light.json +++ b/frontend/settings/Skyrim/Bash.C.Light.json @@ -1 +1 @@ -{"records":"CELL","description":"C.Light tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell lighting or fog.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"s":1,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"s":1,"p":1,"n":"Ambient Colors","c":[{"t":8,"p":1,"n":"Colors","c":[{"t":6,"p":1,"n":"Color #0 (X+)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color #1 (X-)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color #2 (Y+)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color #3 (Y-)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color #4 (Z+)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color #5 (Z-)","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Fresnel Power"}]}]},{"t":6,"s":1,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Light","hash":"$4E94E72C","color":255} \ No newline at end of file +{"records":"CELL","description":"C.Light tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell lighting or fog.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"},{"t":4,"n":"Has Water"},{"t":4,"n":"Can't Travel From Here"},{"t":4,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Public Area"},{"t":4,"n":"Hand Changed"},{"t":4,"n":"Show Sky"},{"t":4,"n":"Use Sky Lighting"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land","c":[{"t":4,"n":"Quad 1"},{"t":4,"n":"Quad 2"},{"t":4,"n":"Quad 3"},{"t":4,"n":"Quad 4"}]}]},{"t":6,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"s":1,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"s":1,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"s":1,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits","c":[{"t":4,"p":1,"n":"Ambient Color"},{"t":4,"p":1,"n":"Directional Color"},{"t":4,"p":1,"n":"Fog Color"},{"t":4,"p":1,"n":"Fog Near"},{"t":4,"p":1,"n":"Fog Far"},{"t":4,"p":1,"n":"Directional Rotation"},{"t":4,"p":1,"n":"Directional Fade"},{"t":4,"p":1,"n":"Clip Distance"},{"t":4,"p":1,"n":"Fog Power"},{"t":4,"p":1,"n":"Fog Max"},{"t":4,"p":1,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions"},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"XOWN - Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Light","hash":"94154BF2","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.Location.json b/frontend/settings/Skyrim/Bash.C.Location.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.LockList.json b/frontend/settings/Skyrim/Bash.C.LockList.json new file mode 100755 index 0000000..6b2e724 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.C.LockList.json @@ -0,0 +1 @@ +{"records":"CELL","description":"Modifies cell lock list.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.LockList","hash":"1BC13B82","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.Music.json b/frontend/settings/Skyrim/Bash.C.Music.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.Name.json b/frontend/settings/Skyrim/Bash.C.Name.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.Owner.json b/frontend/settings/Skyrim/Bash.C.Owner.json old mode 100644 new mode 100755 index a49d50d..a89c251 --- a/frontend/settings/Skyrim/Bash.C.Owner.json +++ b/frontend/settings/Skyrim/Bash.C.Owner.json @@ -1 +1 @@ -{"records":"CELL","description":"C.Owner tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell ownership.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Owner","hash":"$C13A1CEE","color":255} \ No newline at end of file +{"records":"CELL","description":"C.Owner tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell ownership.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"},{"t":4,"n":"Has Water"},{"t":4,"n":"Can't Travel From Here"},{"t":4,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"p":1,"n":"Public Area"},{"t":4,"n":"Hand Changed"},{"t":4,"n":"Show Sky"},{"t":4,"n":"Use Sky Lighting"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land","c":[{"t":4,"n":"Quad 1"},{"t":4,"n":"Quad 2"},{"t":4,"n":"Quad 3"},{"t":4,"n":"Quad 4"}]}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits","c":[{"t":4,"n":"Ambient Color"},{"t":4,"n":"Directional Color"},{"t":4,"n":"Fog Color"},{"t":4,"n":"Fog Near"},{"t":4,"n":"Fog Far"},{"t":4,"n":"Directional Rotation"},{"t":4,"n":"Directional Fade"},{"t":4,"n":"Clip Distance"},{"t":4,"n":"Fog Power"},{"t":4,"n":"Fog Max"},{"t":4,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions"},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"p":1,"n":"XOWN - Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Owner","hash":"6E20980F","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.RecordFlags.json b/frontend/settings/Skyrim/Bash.C.RecordFlags.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.Regions.json b/frontend/settings/Skyrim/Bash.C.Regions.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.C.SkyLighting.json b/frontend/settings/Skyrim/Bash.C.SkyLighting.json new file mode 100755 index 0000000..e1ce9ee --- /dev/null +++ b/frontend/settings/Skyrim/Bash.C.SkyLighting.json @@ -0,0 +1 @@ +{"records":"CELL","description":"Modifies Use Sky Lighting cell flag.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"},{"t":4,"n":"Has Water"},{"t":4,"n":"Can't Travel From Here"},{"t":4,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Public Area"},{"t":4,"n":"Hand Changed"},{"t":4,"n":"Show Sky"},{"t":4,"p":1,"n":"Use Sky Lighting"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land","c":[{"t":4,"n":"Quad 1"},{"t":4,"n":"Quad 2"},{"t":4,"n":"Quad 3"},{"t":4,"n":"Quad 4"}]}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits","c":[{"t":4,"n":"Ambient Color"},{"t":4,"n":"Directional Color"},{"t":4,"n":"Fog Color"},{"t":4,"n":"Fog Near"},{"t":4,"n":"Fog Far"},{"t":4,"n":"Directional Rotation"},{"t":4,"n":"Directional Fade"},{"t":4,"n":"Clip Distance"},{"t":4,"n":"Fog Power"},{"t":4,"n":"Fog Max"},{"t":4,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions"},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"XOWN - Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.SkyLighting","hash":"3CB3D09F","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.C.Water.json b/frontend/settings/Skyrim/Bash.C.Water.json old mode 100644 new mode 100755 index 6ff1581..6a62eb7 --- a/frontend/settings/Skyrim/Bash.C.Water.json +++ b/frontend/settings/Skyrim/Bash.C.Water.json @@ -1 +1 @@ -{"records":"CELL","description":"C.Water tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell water type or level.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":8,"n":"Colors","c":[{"t":6,"n":"Color #0 (X+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #1 (X-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #2 (Y+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #3 (Y-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #4 (Z+)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Color #5 (Z-)","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Specular","c":[{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fresnel Power"}]}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Unknown"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":9,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Water","hash":"$1C99179F","color":255} \ No newline at end of file +{"records":"CELL","description":"C.Water tag from Wrye Bash.\r\n\r\nUsed when the mod modifies cell water type or level.","tree":{"records":[{"t":1,"p":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"n":"Is Interior Cell"},{"t":4,"p":1,"n":"Has Water"},{"t":4,"n":"Can't Travel From Here"},{"t":4,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Public Area"},{"t":4,"n":"Hand Changed"},{"t":4,"n":"Show Sky"},{"t":4,"n":"Use Sky Lighting"}]},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land","c":[{"t":4,"n":"Quad 1"},{"t":4,"n":"Quad 2"},{"t":4,"n":"Quad 3"},{"t":4,"n":"Quad 4"}]}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits","c":[{"t":4,"n":"Ambient Color"},{"t":4,"n":"Directional Color"},{"t":4,"n":"Fog Color"},{"t":4,"n":"Fog Near"},{"t":4,"n":"Fog Far"},{"t":4,"n":"Directional Rotation"},{"t":4,"n":"Directional Fade"},{"t":4,"n":"Clip Distance"},{"t":4,"n":"Fog Power"},{"t":4,"n":"Fog Max"},{"t":4,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions"},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"n":"XOWN - Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]}]},"name":"Bash.C.Water","hash":"09EC9E77","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Delev.json b/frontend/settings/Skyrim/Bash.Delev.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Destructable.json b/frontend/settings/Skyrim/Bash.Destructable.json new file mode 100755 index 0000000..076f483 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Destructable.json @@ -0,0 +1 @@ +{"records":"ACTI,ALCH,AMMO,APPA,ARMO,BOOK,CONT,DOOR,FLOR,FURN,KEYM,LIGH,MISC,MSTT,NPC_,PROJ,SCRL,SLGM,TACT,WEAP","description":"Modifies destructible records.","tree":{"records":[{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"},{"t":2,"n":"MIC2 - Small Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"},{"t":6,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Disabled Points"}]},{"t":3,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"TACT - Talking Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":3,"n":"Skill"},{"t":3,"n":"Resist"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]}]},"name":"Bash.Destructable","hash":"AD4652D3","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.EffectStats.json b/frontend/settings/Skyrim/Bash.EffectStats.json new file mode 100755 index 0000000..71d3c73 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.EffectStats.json @@ -0,0 +1 @@ +{"records":"MGEF","description":"Modifies (MGEF) Magic Effect \/ Base Effect stats.","tree":{"records":[{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Hostile"},{"t":4,"p":1,"n":"Recover"},{"t":4,"p":1,"n":"Detrimental"},{"t":4,"p":1,"n":"Snap to Navmesh"},{"t":4,"p":1,"n":"No Hit Event"},{"t":4,"p":1,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unknown 7"},{"t":4,"p":1,"n":"Unknown 8"},{"t":4,"p":1,"n":"Dispel with Keywords"},{"t":4,"p":1,"n":"No Duration"},{"t":4,"p":1,"n":"No Magnitude"},{"t":4,"p":1,"n":"No Area"},{"t":4,"p":1,"n":"FX Persist"},{"t":4,"p":1,"n":"Unknown 14"},{"t":4,"p":1,"n":"Gory Visuals"},{"t":4,"p":1,"n":"Hide in UI"},{"t":4,"p":1,"n":"Unknown 17"},{"t":4,"p":1,"n":"No Recast"},{"t":4,"p":1,"n":"Unknown 19"},{"t":4,"p":1,"n":"Unknown 20"},{"t":4,"p":1,"n":"Unknown 21"},{"t":4,"p":1,"n":"Power Affects Magnitude"},{"t":4,"p":1,"n":"Power Affects Duration"},{"t":4,"p":1,"n":"Unknown 24"},{"t":4,"p":1,"n":"Unknown 25"},{"t":4,"p":1,"n":"Unknown 26"},{"t":4,"p":1,"n":"Painless"},{"t":4,"p":1,"n":"No Hit Effect"},{"t":4,"p":1,"n":"No Death Dispel"},{"t":4,"p":1,"n":"Unknown 30"},{"t":4,"p":1,"n":"Unknown 31"},{"t":4,"p":1,"n":"Unknown 32"}]},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":3,"p":1,"n":"Magic Skill"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":3,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archtype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"n":"SNDD - Sounds"},{"t":2,"n":"DNAM - Magic Item Description"},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]},"name":"Bash.EffectStats","hash":"6A6CEB1A","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.EnchantmentStats.json b/frontend/settings/Skyrim/Bash.EnchantmentStats.json new file mode 100755 index 0000000..7e4ed51 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.EnchantmentStats.json @@ -0,0 +1 @@ +{"records":"ENCH","description":"Modifies (ENCH) Enchantment \/ Object Effect stats.","tree":{"records":[{"t":1,"p":1,"n":"ENCH - Object Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Extend Duration On Recast"}]},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - EFIT","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},"name":"Bash.EnchantmentStats","hash":"BBA72A3B","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Eyes.json b/frontend/settings/Skyrim/Bash.Eyes.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Factions.json b/frontend/settings/Skyrim/Bash.Factions.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Graphics.json b/frontend/settings/Skyrim/Bash.Graphics.json old mode 100644 new mode 100755 index 4680c90..eada6d2 --- a/frontend/settings/Skyrim/Bash.Graphics.json +++ b/frontend/settings/Skyrim/Bash.Graphics.json @@ -1 +1 @@ -{"records":"ACTI,AMMO,APPA,ARMA,ARMO,ARTO,BOOK,DEBR,DOOR,EFSH,EXPL,FLOR,FURN,GRAS,INGR,LIGH,LSCR,MGEF,MISC,MSTT,PROJ,SCRL,SLGM,STAT,TREE,WEAP,ALCH","description":"Graphics tag from Wrye Bash.\r\n\r\nUsed when the mod is a graphics replacer.\r\n\r\nNote: I tried my best to get all appropriate records and subrecords for Skyrim in the spirit of this Bash Tag, but I may have missed things. Please let me know if I did. -Mator","tree":{"records":[{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"RNAM - Race"},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Male Priority"},{"t":3,"n":"Female Priority"},{"t":3,"n":"Weight slider - Male"},{"t":3,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"n":"Detection Sound Value"},{"t":11,"n":"Unknown"},{"t":5,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"}]},{"t":3,"n":"NAM0 - Male Skin Texture"},{"t":3,"n":"NAM1 - Female Skin texture"},{"t":3,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"n":"NAM3 - Female Skin Texture Swap List"},{"t":9,"n":"Additional Races","c":[{"t":3,"n":"MODL - Race"}]},{"t":3,"n":"SNDD - Footstep Sound"},{"t":3,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":7,"p":1,"n":"Armature","c":[{"t":3,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"p":1,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"DEBR - Debris","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":8,"p":1,"n":"Models","c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture","lt":"ICO2 - Particle Shader Texture","lf":"DATA - "},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture","lt":"NAM7 - Holes Texture","lf":"ICON - Fill Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture","lt":"NAM8 - Membrane Palette Texture","lf":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture","lt":"NAM9 - Particle Palette Texture","lf":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture","lt":"DATA - ","lf":"NAM8 - Membrane Palette Texture"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"p":1,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}],"lt":"ICON - Fill Texture","lf":"NAM9 - Particle Palette Texture"}]},{"t":1,"p":1,"n":"EXPL - Explosion","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"GRAS - Grass","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Density"},{"t":3,"n":"Min Slope"},{"t":3,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water Type"},{"t":5,"n":"Position Range"},{"t":5,"n":"Height Range"},{"t":5,"n":"Color Range"},{"t":5,"n":"Wave Period"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unknown"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":3,"n":"NNAM - Loading Screen NIF"},{"t":5,"n":"SNAM - Initial Scale"},{"t":6,"n":"RNAM - Initial Rotation","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Z"}]},{"t":6,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":6,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Magic Effect Data","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":12,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":11,"n":"Unused"},{"t":3,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":9,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":8,"n":"SNDD - Sounds","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"STAT - Static","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DNAM - Direction Material","c":[{"t":5,"n":"Max Angle (30-120)"},{"t":3,"n":"Material"}]},{"t":8,"n":"MNAM - Distant LOD","c":[{"t":6,"n":"LOD #0 (Level 0)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #1 (Level 1)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #2 (Level 2)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #3 (Level 3)","c":[{"t":2,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Unknown"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":11,"n":"Unknown"},{"t":3,"n":"Skill"},{"t":11,"n":"Unknown"},{"t":3,"n":"Resist"},{"t":11,"n":"Unknown"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]}]},"name":"Bash.Graphics","hash":"8A68A29F","color":255} \ No newline at end of file +{"records":"ALCH,AMMO,APPA,ARMA,ARMO,ARTO,BOOK,CLAS,CONT,DEBR,DOOR,EFSH,EXPL,FLOR,FURN,GRAS,INGR,KEYM,LIGH,LSCR,MGEF,SCRL,SLGM,SPEL,STAT,TREE,WEAP,WTHR,ACTI","description":"Graphics tag from Wrye Bash.\r\n\r\nUsed when the mod is a graphics replacer.\r\n\r\nNote: I tried my best to get all appropriate records and subrecords for Skyrim in the spirit of this Bash Tag, but I may have missed things. Please let me know if I did. -Mator","tree":{"records":[{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"RNAM - Race"},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Male Priority"},{"t":3,"n":"Female Priority"},{"t":3,"n":"Weight slider - Male"},{"t":3,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"n":"Detection Sound Value"},{"t":11,"n":"Unknown"},{"t":5,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"}]},{"t":3,"n":"NAM0 - Male Skin Texture"},{"t":3,"n":"NAM1 - Female Skin texture"},{"t":3,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"n":"NAM3 - Female Skin Texture Swap List"},{"t":9,"n":"Additional Races","c":[{"t":3,"n":"MODL - Race"}]},{"t":3,"n":"SNDD - Footstep Sound"},{"t":3,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon 2 (female)","c":[{"t":2,"p":1,"n":"ICO2 - Large Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":7,"p":1,"n":"Armature","c":[{"t":3,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"p":1,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"CLAS - Class","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Teaches"},{"t":3,"n":"Maximum training level"},{"t":7,"n":"Skill Weights","c":[{"t":3,"n":"Weight"}]},{"t":5,"n":"Bleedout Default"},{"t":3,"n":"Voice Points"},{"t":7,"n":"Attribute Weights","c":[{"t":3,"n":"Weight"}]}]}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"DEBR - Debris","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":8,"p":1,"n":"Models","c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture","lt":"ICO2 - Particle Shader Texture","lf":"DATA - "},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture","lt":"NAM7 - Holes Texture","lf":"ICON - Fill Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture","lt":"NAM8 - Membrane Palette Texture","lf":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture","lt":"NAM9 - Particle Palette Texture","lf":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture","lt":"DATA - ","lf":"NAM8 - Membrane Palette Texture"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"p":1,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}],"lt":"ICON - Fill Texture","lf":"NAM9 - Particle Palette Texture"}]},{"t":1,"p":1,"n":"EXPL - Explosion","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"GRAS - Grass","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Density"},{"t":3,"n":"Min Slope"},{"t":3,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water Type"},{"t":5,"n":"Position Range"},{"t":5,"n":"Height Range"},{"t":5,"n":"Color Range"},{"t":5,"n":"Wave Period"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unknown"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":3,"n":"NNAM - Loading Screen NIF"},{"t":5,"n":"SNAM - Initial Scale"},{"t":6,"n":"RNAM - Initial Rotation","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Z"}]},{"t":6,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":6,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":12,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":9,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":8,"n":"SNDD - Sounds","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"STAT - Static","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"DNAM - Direction Material","c":[{"t":5,"n":"Max Angle (30-120)"},{"t":3,"n":"Material"}]},{"t":8,"n":"MNAM - Distant LOD","c":[{"t":6,"n":"LOD #0 (Level 0)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #1 (Level 1)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #2 (Level 2)","c":[{"t":2,"n":"Mesh"}]},{"t":6,"n":"LOD #3 (Level 3)","c":[{"t":2,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"p":1,"n":"Has Scope","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Unknown"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":11,"n":"Unknown"},{"t":3,"n":"Skill"},{"t":11,"n":"Unknown"},{"t":3,"n":"Resist"},{"t":11,"n":"Unknown"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WTHR - Weather","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"DNAM - Unused"},{"t":11,"n":"CNAM - Unused"},{"t":11,"n":"ANAM - Unused"},{"t":11,"n":"BNAM - Unused"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"n":"MNAM - Precipitation Type"},{"t":3,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"n":"Cloud Speed","c":[{"t":7,"n":"RNAM - Y Speed","c":[{"t":3,"n":"Layer"}]},{"t":7,"n":"QNAM - X Speed","c":[{"t":3,"n":"Layer"}]}]},{"t":7,"n":"PNAM - Cloud Colors","c":[{"t":6,"n":"Layer","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"n":"JNAM - Cloud Alphas","c":[{"t":6,"n":"Layer","c":[{"t":5,"n":"Sunrise"},{"t":5,"n":"Day"},{"t":5,"n":"Sunset"},{"t":5,"n":"Night"}]}]},{"t":6,"n":"NAM0 - Weather Colors","c":[{"t":6,"n":"Sky-Upper","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Fog Near","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Ambient","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sunlight","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sun","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Stars","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sky-Lower","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Horizon","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Effect Lighting","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Cloud LOD Diffuse","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Cloud LOD Ambient","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Fog Far","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sky Statics","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Water Multiplier","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sun Glare","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Moon Glare","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":6,"n":"FNAM - Fog Distance","c":[{"t":5,"n":"Day - Near"},{"t":5,"n":"Day - Far"},{"t":5,"n":"Night - Near"},{"t":5,"n":"Night - Far"},{"t":5,"n":"Day - Power"},{"t":5,"n":"Night - Power"},{"t":5,"n":"Day - Max"},{"t":5,"n":"Night - Max"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"n":"Trans Delta"},{"t":3,"n":"Sun Glare"},{"t":3,"n":"Sun Damage"},{"t":3,"n":"Precipitation - Begin Fade In"},{"t":3,"n":"Precipitation - End Fade Out"},{"t":3,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"n":"Thunder\/Lightning - Frequency"},{"t":3,"n":"Flags"},{"t":6,"n":"Lightning Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"}]},{"t":3,"n":"Visual Effect - Begin"},{"t":3,"n":"Visual Effect - End"},{"t":3,"n":"Wind Direction"},{"t":3,"n":"Wind Direction Range"}]},{"t":3,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"n":"Sounds","c":[{"t":6,"n":"SNAM - Sound","c":[{"t":3,"n":"Sound"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Sky Statics","c":[{"t":3,"n":"TNAM - Static"}]},{"t":6,"n":"IMSP - Image Spaces","c":[{"t":3,"n":"Sunrise"},{"t":3,"n":"Day"},{"t":3,"n":"Sunset"},{"t":3,"n":"Night"}]},{"t":6,"n":"HNAM - Volumetric Lighting","c":[{"t":3,"n":"Sunrise"},{"t":3,"n":"Day"},{"t":3,"n":"Sunset"},{"t":3,"n":"Night"}]},{"t":6,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"p":1,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":6,"n":"Aurora","c":[{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":3,"n":"GNAM - Sun Glare Lens Flare"}]},{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]}]},"name":"Bash.Graphics","hash":"F407AD9E","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Hairs.json b/frontend/settings/Skyrim/Bash.Hairs.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Invent.Add.json b/frontend/settings/Skyrim/Bash.Invent.Add.json new file mode 100755 index 0000000..cda05c8 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Invent.Add.json @@ -0,0 +1 @@ +{"records":"CONT,NPC_","description":"Adds items to inventories.","tree":{"records":[{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"s":1,"p":1,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - DATA","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Allow Sounds When Animation"},{"t":4,"n":"Respawns"},{"t":4,"n":"Show Owner"}]},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"s":1,"p":1,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Invent.Add","hash":"9EAB411D","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Invent.Change.json b/frontend/settings/Skyrim/Bash.Invent.Change.json new file mode 100755 index 0000000..0277d83 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Invent.Change.json @@ -0,0 +1 @@ +{"records":"CONT,NPC_","description":"Changes other properties (like count and owner) of items in inventories.","tree":{"records":[{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"o":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - DATA","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Allow Sounds When Animation"},{"t":4,"n":"Respawns"},{"t":4,"n":"Show Owner"}]},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"o":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Invent.Change","hash":"E7029CE0","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Invent.Remove.json b/frontend/settings/Skyrim/Bash.Invent.Remove.json new file mode 100755 index 0000000..d6519de --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Invent.Remove.json @@ -0,0 +1 @@ +{"records":"CONT,NPC_","description":"Removes items from inventories.","tree":{"records":[{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - DATA","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Allow Sounds When Animation"},{"t":4,"n":"Respawns"},{"t":4,"n":"Show Owner"}]},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.Invent.Remove","hash":"DFB55892","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Invent.json b/frontend/settings/Skyrim/Bash.Invent.json old mode 100644 new mode 100755 index e26b0c2..58c9eff --- a/frontend/settings/Skyrim/Bash.Invent.json +++ b/frontend/settings/Skyrim/Bash.Invent.json @@ -1 +1 @@ -{"records":"NPC_,CONT","description":"Invent tag from Wrye Bash.\r\n\r\nUsed when the mod changes inventories.","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]}]},"name":"Bash.Invent","hash":"$7F0C9C4C","color":255} \ No newline at end of file +{"records":"CONT,NPC_","description":"Invent tag from Wrye Bash.\r\n\r\nUsed when the mod changes inventories.","tree":{"records":[{"t":1,"p":1,"n":"CONT - Container","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"o":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"o":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]}]},"name":"Bash.Invent","hash":"3E1680F0","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Keywords.json b/frontend/settings/Skyrim/Bash.Keywords.json new file mode 100755 index 0000000..7173b1c --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Keywords.json @@ -0,0 +1 @@ +{"records":"ALCH,AMMO,ARMO,BOOK,FLOR,FURN,INGR,KEYM,LCTN,MGEF,MISC,NPC_,SCRL,SLGM,SPEL,TACT,WEAP,ACTI","description":"Modifies the lists of keywords attached to things.","tree":{"records":[{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"DESC - Description"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"},{"t":2,"n":"MIC2 - Small Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"},{"t":6,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Disabled Points"}]},{"t":3,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"Magic Effect Data","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":3,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":8,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"n":"SNDD - Sounds","c":[{"t":6,"n":"","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":3,"n":"Skill"},{"t":3,"n":"Resist"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count","lf":"KWDA - Keywords"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}],"lt":"KSIZ - Keyword Count"},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]}]},"name":"Bash.Keywords","hash":"0D4F54E6","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Lev.json b/frontend/settings/Skyrim/Bash.Lev.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.NPC.AIPackageOverrides.json b/frontend/settings/Skyrim/Bash.NPC.AIPackageOverrides.json new file mode 100755 index 0000000..53bd3b2 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.NPC.AIPackageOverrides.json @@ -0,0 +1 @@ +{"records":"NPC_","description":"","tree":{"records":[{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Female"},{"t":4,"n":"Essential"},{"t":4,"n":"Is CharGen Face Preset"},{"t":4,"n":"Respawn"},{"t":4,"n":"Auto-calc stats"},{"t":4,"n":"Unique"},{"t":4,"n":"Doesn't affect stealth meter"},{"t":4,"n":"PC Level Mult"},{"t":4,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Bleedout Override"},{"t":4,"n":"Opposite Gender Anims"},{"t":4,"n":"Simple Actor"},{"t":4,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"looped audio?"},{"t":4,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Invulnerable"}]},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags","c":[{"t":4,"n":"Use Traits"},{"t":4,"n":"Use Stats"},{"t":4,"n":"Use Factions"},{"t":4,"n":"Use Spell List"},{"t":4,"n":"Use AI Data"},{"t":4,"n":"Use AI Packages"},{"t":4,"n":"Use Model\/Animation?"},{"t":4,"n":"Use Base Data"},{"t":4,"n":"Use Inventory"},{"t":4,"n":"Use Script"},{"t":4,"n":"Use Def Pack List"},{"t":4,"n":"Use Attack Data"},{"t":4,"n":"Use Keywords"}]},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"OneHanded"},{"t":3,"n":"TwoHanded"},{"t":3,"n":"Marksman"},{"t":3,"n":"Block"},{"t":3,"n":"Smithing"},{"t":3,"n":"HeavyArmor"},{"t":3,"n":"LightArmor"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Lockpicking"},{"t":3,"n":"Sneak"},{"t":3,"n":"Alchemy"},{"t":3,"n":"Speechcraft"},{"t":3,"n":"Alteration"},{"t":3,"n":"Conjuration"},{"t":3,"n":"Destruction"},{"t":3,"n":"Illusion"},{"t":3,"n":"Restoration"},{"t":3,"n":"Enchanting"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]}]},"name":"Bash.NPC.AIPackageOverrides","hash":"F3D39EF3","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.NPC.Class.json b/frontend/settings/Skyrim/Bash.NPC.Class.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.NPC.Race.json b/frontend/settings/Skyrim/Bash.NPC.Race.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Names.json b/frontend/settings/Skyrim/Bash.Names.json old mode 100644 new mode 100755 index 0cb8e66..f5fe887 --- a/frontend/settings/Skyrim/Bash.Names.json +++ b/frontend/settings/Skyrim/Bash.Names.json @@ -1 +1 @@ -{"records":"ACTI,AMMO,ARMO,AVIF,BOOK,CLAS,CONT,DIAL,DOOR,ENCH,EXPL,FACT,FLOR,FURN,HAZD,HDPT,INGR,KEYM,LCTN,LIGH,MESG,MGEF,MISC,MSTT,NPC_,PERK,PROJ,QUST,RACE,REFR,SCRL,SHOU,SLGM,SNCT,SPEL,TREE,WATR,WEAP,WRLD,ALCH","description":"Names tag from Wrye Bash.\r\n\r\nUsed when the mod changes the names of things.","tree":{"records":[{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":7,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":2,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"n":"AVSK - Skill","c":[{"t":5,"n":"Skill Use Mult"},{"t":5,"n":"Skill Offset Mult"},{"t":5,"n":"Skill Improve Mult"},{"t":5,"n":"Skill Improve Offset"}]},{"t":8,"n":"Perk Tree","c":[{"t":6,"n":"Node","c":[{"t":3,"n":"PNAM - Perk"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Teaches"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"CLAS - Class","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Teaches"},{"t":3,"n":"Maximum training level"},{"t":7,"n":"Skill Weights","c":[{"t":3,"n":"Weight #0 (One Handed)"},{"t":3,"n":"Weight #1 (Two Handed)"},{"t":3,"n":"Weight #2 (Archery)"},{"t":3,"n":"Weight #3 (Block)"},{"t":3,"n":"Weight #4 (Smithing)"},{"t":3,"n":"Weight #5 (Heavy Armor)"},{"t":3,"n":"Weight #6 (Light Armor)"},{"t":3,"n":"Weight #7 (Pickpocket)"},{"t":3,"n":"Weight #8 (Lockpicking)"},{"t":3,"n":"Weight #9 (Sneak)"},{"t":3,"n":"Weight #10 (Alchemy)"},{"t":3,"n":"Weight #11 (Speech)"},{"t":3,"n":"Weight #12 (Alteration)"},{"t":3,"n":"Weight #13 (Conjuration)"},{"t":3,"n":"Weight #14 (Destruction)"},{"t":3,"n":"Weight #15 (Illusion)"},{"t":3,"n":"Weight #16 (Restoration)"},{"t":3,"n":"Weight #17 (Enchanting)"}]},{"t":5,"n":"Bleedout Default"},{"t":3,"n":"Voice Points"},{"t":7,"n":"Attribute Weights","c":[{"t":3,"n":"Weight #0 (Health)"},{"t":3,"n":"Weight #1 (Magicka)"},{"t":3,"n":"Weight #2 (Stamina)"},{"t":3,"n":"Weight #3 (Unknown)"}]}]}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"n":"PNAM - Priority"},{"t":3,"n":"BNAM - Branch"},{"t":3,"n":"QNAM - Quest"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Topic Flags"},{"t":3,"n":"Category"},{"t":3,"n":"Subtype"}]},{"t":2,"n":"SNAM - Subtype Name"},{"t":3,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"ENCH - Object Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Enchantment Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Enchantment Amount"},{"t":3,"n":"Target Type"},{"t":3,"n":"Enchant Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Base Enchantment"},{"t":3,"n":"Worn Restrictions"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"EXPL - Explosion","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"FACT - Faction","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":10,"n":"Relations","c":[{"t":6,"n":"XNAM - Relation","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Modifier"},{"t":3,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags"}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":12,"n":"Location Value"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"HAZD - Hazard","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Limit"},{"t":5,"n":"Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Image Space Radius"},{"t":5,"n":"Target Interval"},{"t":3,"n":"Flags"},{"t":3,"n":"Spell"},{"t":3,"n":"Light"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Sound"}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"PNAM - Type"},{"t":9,"n":"Extra Parts","c":[{"t":3,"n":"HNAM - Part"}]},{"t":8,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"NAM0 - Part Type"},{"t":2,"n":"NAM1 - Filename"}]}]},{"t":3,"n":"TNAM - Texture Set"},{"t":3,"n":"CNAM - Color"},{"t":3,"n":"RNAM - Valid Races"}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LCTN - Location","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":8,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor #0"}]},{"t":8,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unknown"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"MESG - Message","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"INAM - Icon (unused)"},{"t":3,"n":"QNAM - Owner Quest"},{"t":3,"n":"DNAM - Flags","c":[{"t":4,"n":"Message Box"}]},{"t":3,"n":"TNAM - Display Time"},{"t":8,"n":"Menu Buttons","c":[{"t":6,"n":"Menu Button","c":[{"t":2,"n":"ITXT - Button Text"}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Magic Effect Data","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":12,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":11,"n":"Unused"},{"t":3,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":9,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":8,"n":"SNDD - Sounds","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]},{"t":1,"p":1,"n":"PERK - Perk","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":6,"n":"Perk VMAD","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]},{"t":6,"n":"Script Fragments Perk","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"fileName"},{"t":9,"n":"Perk Fragments","c":[{"t":6,"n":"Perk Fragment","c":[{"t":3,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Trait"},{"t":3,"n":"Level"},{"t":3,"n":"Num Ranks"},{"t":3,"n":"Playable"},{"t":3,"n":"Hidden"}]},{"t":3,"n":"NNAM - Next Perk"},{"t":10,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":6,"n":"PRKE - Header","c":[{"t":3,"n":"Type"},{"t":3,"n":"Rank"},{"t":3,"n":"Priority"}]},{"t":12,"n":"DATA - Effect Data","c":[{"t":6,"n":"Quest + Stage","c":[{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":11,"n":"Unused"}]}]},{"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"QUST - Quest","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":6,"n":"Quest VMAD","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]},{"t":6,"n":"Script Fragments Quest","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"fragmentCount"},{"t":2,"n":"fileName"},{"t":9,"n":"Quest Fragments","c":[{"t":6,"n":"Quest Fragment","c":[{"t":3,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"n":"Quest Stage Index"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]},{"t":9,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":12,"n":"Object Union","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":9,"n":"Alias Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"DNAM - General","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Priority"},{"t":3,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":2,"n":"ENAM - Event"},{"t":7,"n":"Text Display Globals","c":[{"t":3,"n":"QTGL - Global"}]},{"t":2,"n":"FLTR - Object Window Filter"},{"t":6,"n":"Quest Dialogue Conditions","c":[{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"n":"NEXT - Marker"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":10,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"INDX - Stage Index","c":[{"t":3,"n":"Stage Index"},{"t":3,"n":"Flags"},{"t":3,"n":"Unknown"}]}]}]},{"t":8,"n":"Objectives","c":[{"t":6,"n":"Objective","c":[{"t":3,"n":"QOBJ - Objective Index"},{"t":2,"n":"NNAM - Display Text"}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":3,"n":"ALST - Reference Alias ID"},{"n":"ALED - Alias End"}]}]},{"t":2,"n":"NNAM - Description"},{"t":8,"n":"Targets","c":[{"t":6,"n":"Target","c":[{"t":6,"n":"QSTA - Target","c":[{"t":3,"n":"Target"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]}]}]},{"t":1,"p":1,"n":"RACE - Race","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":10,"n":"Skill Boosts","c":[{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":5,"n":"Male Weight"},{"t":5,"n":"Female Weight"},{"t":3,"n":"Flags"},{"t":5,"n":"Starting Health"},{"t":5,"n":"Starting Magicka"},{"t":5,"n":"Starting Stamina"},{"t":5,"n":"Base Carry Weight"},{"t":5,"n":"Base Mass"},{"t":5,"n":"Acceleration rate"},{"t":5,"n":"Deceleration rate"},{"t":3,"n":"Size"},{"t":3,"n":"Head Biped Object"},{"t":3,"n":"Hair Biped Object"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":5,"n":"Health Regen"},{"t":5,"n":"Magicka Regen"},{"t":5,"n":"Stamina Regen"},{"t":5,"n":"Unarmed Damage"},{"t":5,"n":"Unarmed Reach"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2"},{"t":6,"n":"Mount Data","c":[{"t":5,"n":"Offset X"},{"t":5,"n":"Offset Y"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"}]}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"NAM2 - Marker NAM2 #1"},{"t":9,"n":"Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Voice #0 (Male)"},{"t":3,"n":"Voice #1 (Female)"}]},{"t":7,"n":"DNAM - Decapitate Armors","c":[{"t":3,"n":"Decapitate Armor #0 (Male)"},{"t":3,"n":"Decapitate Armor #1 (Female)"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Default Hair Color #0 (Male)"},{"t":3,"n":"Default Hair Color #1 (Female)"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"}]}]}]}]},{"t":9,"n":"HNAM - Hairs","c":[{"t":3,"n":"Hair"}]},{"t":9,"n":"ENAM - Eyes","c":[{"t":3,"n":"Eye"}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"}]},{"t":3,"n":"NAM4 - Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Decapitation FX"},{"t":3,"n":"ONAM - Open Loot Sound"},{"t":3,"n":"LNAM - Close Loot Sound"},{"t":7,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":9,"n":"Equip Slots","c":[{"t":3,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":7,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"n":"Male Head Data","c":[{"n":"MNAM - Male Data Marker"}]},{"t":6,"n":"Female Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"n":"FNAM - Female Data Marker"}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"p":1,"n":"REFR - Placed Object","c":[{"t":3,"n":"Cell"},{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Persistent"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":3,"n":"NAME - Base"},{"t":6,"n":"XMBO - Bound Half Extents","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"XPRM - Primitive","c":[{"t":6,"n":"Bounds","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":8,"n":"XPOD - Portal Data","c":[{"t":6,"n":"References #0","c":[{"t":3,"n":"Origin"},{"t":3,"n":"Destination"}]}]},{"t":6,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":6,"n":"Bound Data","c":[{"t":6,"n":"XRMR - Header","c":[{"t":3,"n":"Linked Rooms Count"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"n":"XRDS - Radius"},{"t":10,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":9,"n":"Lit Water","c":[{"t":3,"n":"XLTW - Water"}]},{"t":3,"n":"XEMI - Emittance"},{"t":6,"n":"XLIG - Light Data","c":[{"t":5,"n":"FOV 90+\/-"},{"t":5,"n":"Fade 1.35+\/-"},{"t":11,"n":"Unknown"},{"t":5,"n":"Shadow Depth Bias"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"XALP - Alpha","c":[{"t":3,"n":"Cutoff"},{"t":3,"n":"Base"}]},{"t":6,"n":"XTEL - Teleport Destination","c":[{"t":3,"n":"Door"},{"t":6,"n":"Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]},{"t":3,"n":"Flags"}]},{"t":3,"n":"XTNM - Teleport Message Box"},{"t":3,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"n":"XSCL - Scale"},{"t":3,"n":"XSPC - Spawn Container"},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"}]},{"t":3,"n":"XLIB - Leveled Item Base Object"},{"t":3,"n":"XLCM - Level Modifier"},{"t":3,"n":"XLCN - Persistent Location"},{"t":3,"n":"XTRI - Collision Layer"},{"t":6,"n":"XLOC - Lock Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"n":"Key"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"XNDP - Navigation Door Link","c":[{"t":3,"n":"Navigation Mesh"},{"t":3,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref #0"}]},{"n":"XIS2 - Ignored by Sandbox"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XCNT - Item Count"},{"t":5,"n":"XCHG - Charge"},{"t":3,"n":"XLRL - Location Reference"},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":8,"n":"Patrol","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"XPRD - Idle Time"},{"n":"XPPA - Patrol Script Marker"},{"t":3,"n":"INAM - Idle"}]}]},{"t":3,"n":"XACT - Action Flag"},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"n":"ONAM - Open by Default"},{"t":6,"p":1,"n":"Map Marker","c":[{"n":"XMRK - Map Marker Data"},{"t":3,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"TNAM - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"XATR - Attach Ref"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown #0"},{"t":5,"n":"Unknown #1"},{"t":5,"n":"Unknown #2"}]},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Words of Power","c":[{"t":6,"n":"SNAM - ","c":[{"t":3,"n":"Word"},{"t":3,"n":"Spell"},{"t":5,"n":"Recovery Time"}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SNCT - Sound Category","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"PNAM - Parent"},{"t":3,"n":"VNAM - Static Volume Multiplier"},{"t":3,"n":"UNAM - Default Menu Value"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"WATR - Water","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":7,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"n":"ANAM - Opacity"},{"t":3,"n":"FNAM - Flags"},{"t":11,"n":"MNAM - Unused"},{"t":3,"n":"TNAM - Material"},{"t":3,"n":"SNAM - Open Sound"},{"t":3,"n":"XNAM - Spell"},{"t":3,"n":"INAM - Image Space"},{"t":3,"n":"DATA - Damage Per Second"},{"t":6,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Specular Properties - Sun Specular Power"},{"t":5,"n":"Water Properties - Reflectivity Amount"},{"t":5,"n":"Water Properties - Fresnel Amount"},{"t":11,"n":"Unknown"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"n":"Shallow Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Deep Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Reflection Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Displacement Simulator - Starting Size"},{"t":5,"n":"Displacement Simulator - Force"},{"t":5,"n":"Displacement Simulator - Velocity"},{"t":5,"n":"Displacement Simulator - Falloff"},{"t":5,"n":"Displacement Simulator - Dampner"},{"t":5,"n":"Unknown"},{"t":5,"n":"Noise Properties - Noise Falloff"},{"t":5,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"n":"Unknown"},{"t":5,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"n":"Water Properties - Refraction Magnitude"},{"t":5,"n":"Specular Properties - Specular Power"},{"t":5,"n":"Unknown"},{"t":5,"n":"Specular Properties - Specular Radius"},{"t":5,"n":"Specular Properties - Specular Brightness"},{"t":5,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"n":"Water Properties - Reflection Magnitude"},{"t":5,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"n":"Depth Properties - Reflections"},{"t":5,"n":"Depth Properties - Refraction"},{"t":5,"n":"Depth Properties - Normals"},{"t":5,"n":"Depth Properties - Specular Lighting"},{"t":5,"n":"Specular Properties - Sun Sparkle Power"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"n":"NAM0 - Linear Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"NAM1 - Angular Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"NAM2 - Noise Texture"},{"t":2,"n":"NAM3 - Unused"},{"t":2,"n":"NAM4 - Unused"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Unknown"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":11,"n":"Unknown"},{"t":3,"n":"Skill"},{"t":11,"n":"Unknown"},{"t":3,"n":"Resist"},{"t":11,"n":"Unknown"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"Unused RNAM","c":[{"t":11,"n":"RNAM - Unknown"}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":3,"n":"LTMP - Interior Lighting"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XLCN - Location"},{"t":6,"n":"Parent","c":[{"t":3,"n":"WNAM - Worldspace"},{"t":6,"n":"PNAM - ","c":[{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"CNAM - Climate"},{"t":3,"n":"NAM2 - Water"},{"t":3,"n":"NAM3 - LOD Water Type"},{"t":5,"n":"NAM4 - LOD Water Height"},{"t":6,"n":"DNAM - Land Data","c":[{"t":5,"n":"Default Land Height"},{"t":5,"n":"Default Water Height"}]},{"t":2,"n":"ICON - Map Image"},{"t":6,"n":"Cloud Model","c":[{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]}]},{"t":6,"n":"MNAM - Map Data","c":[{"t":6,"n":"Usable Dimensions","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"Cell Coordinates","c":[{"t":6,"n":"NW Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"SE Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]}]},{"t":6,"n":"Camera Data","c":[{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Initial Pitch"}]}]},{"t":6,"n":"ONAM - World Map Offset Data","c":[{"t":5,"n":"World Map Scale"},{"t":5,"n":"Cell X Offset"},{"t":5,"n":"Cell Y Offset"},{"t":5,"n":"Cell Z Offset"}]},{"t":5,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"n":"DATA - Flags"},{"t":6,"n":"Object Bounds","c":[{"t":6,"n":"NAM0 - Min","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":6,"n":"NAM9 - Max","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]}]},{"t":3,"n":"ZNAM - Music"},{"t":2,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":2,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]}]},"name":"Bash.Names","hash":"$BB2ECCA2","color":255} \ No newline at end of file +{"records":"ALCH,AMMO,APPA,ARMO,AVIF,BOOK,CLAS,CLFM,CONT,DIAL,DOOR,ENCH,EXPL,EYES,FACT,FLOR,FURN,HAZD,HDPT,INGR,KEYM,LCTN,LIGH,MESG,MGEF,MISC,MSTT,NPC_,PERK,PROJ,QUST,RACE,REFR,SCRL,SHOU,SLGM,SNCT,SPEL,TREE,WATR,WEAP,WRLD,ACTI","description":"Names tag from Wrye Bash.\r\n\r\nUsed when the mod changes the names of things.","tree":{"records":[{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":7,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":2,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"n":"AVSK - Skill","c":[{"t":5,"n":"Skill Use Mult"},{"t":5,"n":"Skill Offset Mult"},{"t":5,"n":"Skill Improve Mult"},{"t":5,"n":"Skill Improve Offset"}]},{"t":8,"n":"Perk Tree","c":[{"t":6,"n":"Node","c":[{"t":3,"n":"PNAM - Perk"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Teaches"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"CLAS - Class","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Teaches"},{"t":3,"n":"Maximum training level"},{"t":7,"n":"Skill Weights","c":[{"t":3,"n":"Weight #0 (One Handed)"},{"t":3,"n":"Weight #1 (Two Handed)"},{"t":3,"n":"Weight #2 (Archery)"},{"t":3,"n":"Weight #3 (Block)"},{"t":3,"n":"Weight #4 (Smithing)"},{"t":3,"n":"Weight #5 (Heavy Armor)"},{"t":3,"n":"Weight #6 (Light Armor)"},{"t":3,"n":"Weight #7 (Pickpocket)"},{"t":3,"n":"Weight #8 (Lockpicking)"},{"t":3,"n":"Weight #9 (Sneak)"},{"t":3,"n":"Weight #10 (Alchemy)"},{"t":3,"n":"Weight #11 (Speech)"},{"t":3,"n":"Weight #12 (Alteration)"},{"t":3,"n":"Weight #13 (Conjuration)"},{"t":3,"n":"Weight #14 (Destruction)"},{"t":3,"n":"Weight #15 (Illusion)"},{"t":3,"n":"Weight #16 (Restoration)"},{"t":3,"n":"Weight #17 (Enchanting)"}]},{"t":5,"n":"Bleedout Default"},{"t":3,"n":"Voice Points"},{"t":7,"n":"Attribute Weights","c":[{"t":3,"n":"Weight #0 (Health)"},{"t":3,"n":"Weight #1 (Magicka)"},{"t":3,"n":"Weight #2 (Stamina)"},{"t":3,"n":"Weight #3 (Unknown)"}]}]}]},{"t":1,"p":1,"n":"CLFM - Color","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"FNAM - Playable"}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"n":"PNAM - Priority"},{"t":3,"n":"BNAM - Branch"},{"t":3,"n":"QNAM - Quest"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Topic Flags"},{"t":3,"n":"Category"},{"t":3,"n":"Subtype"}]},{"t":2,"n":"SNAM - Subtype Name"},{"t":3,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"ENCH - Object Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Enchantment Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Enchantment Amount"},{"t":3,"n":"Target Type"},{"t":3,"n":"Enchant Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Base Enchantment"},{"t":3,"n":"Worn Restrictions"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"EXPL - Explosion","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"EYES - Eyes","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"ICON - Texture"},{"t":3,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"FACT - Faction","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":10,"n":"Relations","c":[{"t":6,"n":"XNAM - Relation","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Modifier"},{"t":3,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags"}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":12,"n":"Location Value"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"HAZD - Hazard","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Limit"},{"t":5,"n":"Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Image Space Radius"},{"t":5,"n":"Target Interval"},{"t":3,"n":"Flags"},{"t":3,"n":"Spell"},{"t":3,"n":"Light"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Sound"}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"PNAM - Type"},{"t":9,"n":"Extra Parts","c":[{"t":3,"n":"HNAM - Part"}]},{"t":8,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"NAM0 - Part Type"},{"t":2,"n":"NAM1 - Filename"}]}]},{"t":3,"n":"TNAM - Texture Set"},{"t":3,"n":"CNAM - Color"},{"t":3,"n":"RNAM - Valid Races"}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LCTN - Location","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":8,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor #0"}]},{"t":8,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":8,"n":"Coordinates","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref #0"}]},{"t":8,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":8,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unknown"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"MESG - Message","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"INAM - Icon (unused)"},{"t":3,"n":"QNAM - Owner Quest"},{"t":3,"n":"DNAM - Flags","c":[{"t":4,"n":"Message Box"}]},{"t":3,"n":"TNAM - Display Time"},{"t":8,"n":"Menu Buttons","c":[{"t":6,"n":"Menu Button","c":[{"t":2,"n":"ITXT - Button Text"}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Magic Effect Data","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":12,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":11,"n":"Unused"},{"t":3,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":9,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":8,"n":"SNDD - Sounds","c":[{"t":6,"n":" #0","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":12,"n":"Level"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":10,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":10,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":7,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill #0 (OneHanded)"},{"t":3,"n":"Skill #1 (TwoHanded)"},{"t":3,"n":"Skill #2 (Marksman)"},{"t":3,"n":"Skill #3 (Block)"},{"t":3,"n":"Skill #4 (Smithing)"},{"t":3,"n":"Skill #5 (HeavyArmor)"},{"t":3,"n":"Skill #6 (LightArmor)"},{"t":3,"n":"Skill #7 (Pickpocket)"},{"t":3,"n":"Skill #8 (Lockpicking)"},{"t":3,"n":"Skill #9 (Sneak)"},{"t":3,"n":"Skill #10 (Alchemy)"},{"t":3,"n":"Skill #11 (Speechcraft)"},{"t":3,"n":"Skill #12 (Alteration)"},{"t":3,"n":"Skill #13 (Conjuration)"},{"t":3,"n":"Skill #14 (Destruction)"},{"t":3,"n":"Skill #15 (Illusion)"},{"t":3,"n":"Skill #16 (Restoration)"},{"t":3,"n":"Skill #17 (Enchanting)"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"},{"t":11,"n":"Unused"}]},{"t":9,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"}]}]}]},{"t":1,"p":1,"n":"PERK - Perk","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":6,"n":"Perk VMAD","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]},{"t":6,"n":"Script Fragments Perk","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"fileName"},{"t":9,"n":"Perk Fragments","c":[{"t":6,"n":"Perk Fragment","c":[{"t":3,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Trait"},{"t":3,"n":"Level"},{"t":3,"n":"Num Ranks"},{"t":3,"n":"Playable"},{"t":3,"n":"Hidden"}]},{"t":3,"n":"NNAM - Next Perk"},{"t":10,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":6,"n":"PRKE - Header","c":[{"t":3,"n":"Type"},{"t":3,"n":"Rank"},{"t":3,"n":"Priority"}]},{"t":12,"n":"DATA - Effect Data","c":[{"t":6,"n":"Quest + Stage","c":[{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":11,"n":"Unused"}]}]},{"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"QUST - Quest","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":6,"n":"Quest VMAD","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]},{"t":6,"n":"Script Fragments Quest","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"fragmentCount"},{"t":2,"n":"fileName"},{"t":9,"n":"Quest Fragments","c":[{"t":6,"n":"Quest Fragment","c":[{"t":3,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"n":"Quest Stage Index"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]},{"t":9,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":12,"n":"Object Union","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":9,"n":"Alias Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"DNAM - General","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Priority"},{"t":3,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":2,"n":"ENAM - Event"},{"t":7,"n":"Text Display Globals","c":[{"t":3,"n":"QTGL - Global"}]},{"t":2,"n":"FLTR - Object Window Filter"},{"t":6,"n":"Quest Dialogue Conditions","c":[{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]}]},{"n":"NEXT - Marker"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":12,"n":"Comparison Value"},{"t":3,"n":"Function"},{"t":11,"n":"Unused"},{"t":12,"n":"Parameter #1"},{"t":12,"n":"Parameter #2"},{"t":3,"n":"Run On"},{"t":12,"n":"Reference"},{"t":3,"n":"Parameter #3"}]}]}]},{"t":10,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"INDX - Stage Index","c":[{"t":3,"n":"Stage Index"},{"t":3,"n":"Flags"},{"t":3,"n":"Unknown"}]}]}]},{"t":8,"n":"Objectives","c":[{"t":6,"n":"Objective","c":[{"t":3,"n":"QOBJ - Objective Index"},{"t":2,"n":"NNAM - Display Text"}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":3,"n":"ALST - Reference Alias ID"},{"n":"ALED - Alias End"}]}]},{"t":2,"n":"NNAM - Description"},{"t":8,"n":"Targets","c":[{"t":6,"n":"Target","c":[{"t":6,"n":"QSTA - Target","c":[{"t":3,"n":"Target"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]}]}]},{"t":1,"p":1,"n":"RACE - Race","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":9,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":10,"n":"Skill Boosts","c":[{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]},{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":5,"n":"Male Weight"},{"t":5,"n":"Female Weight"},{"t":3,"n":"Flags"},{"t":5,"n":"Starting Health"},{"t":5,"n":"Starting Magicka"},{"t":5,"n":"Starting Stamina"},{"t":5,"n":"Base Carry Weight"},{"t":5,"n":"Base Mass"},{"t":5,"n":"Acceleration rate"},{"t":5,"n":"Deceleration rate"},{"t":3,"n":"Size"},{"t":3,"n":"Head Biped Object"},{"t":3,"n":"Hair Biped Object"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":5,"n":"Health Regen"},{"t":5,"n":"Magicka Regen"},{"t":5,"n":"Stamina Regen"},{"t":5,"n":"Unarmed Damage"},{"t":5,"n":"Unarmed Reach"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2"},{"t":6,"n":"Mount Data","c":[{"t":5,"n":"Offset X"},{"t":5,"n":"Offset Y"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"}]}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"NAM2 - Marker NAM2 #1"},{"t":9,"n":"Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Voice #0 (Male)"},{"t":3,"n":"Voice #1 (Female)"}]},{"t":7,"n":"DNAM - Decapitate Armors","c":[{"t":3,"n":"Decapitate Armor #0 (Male)"},{"t":3,"n":"Decapitate Armor #1 (Female)"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Default Hair Color #0 (Male)"},{"t":3,"n":"Default Hair Color #1 (Female)"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"}]}]}]}]},{"t":9,"n":"HNAM - Hairs","c":[{"t":3,"n":"Hair"}]},{"t":9,"n":"ENAM - Eyes","c":[{"t":3,"n":"Eye"}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"}]},{"t":3,"n":"NAM4 - Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Decapitation FX"},{"t":3,"n":"ONAM - Open Loot Sound"},{"t":3,"n":"LNAM - Close Loot Sound"},{"t":7,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":9,"n":"Equip Slots","c":[{"t":3,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":7,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"n":"Male Head Data","c":[{"n":"MNAM - Male Data Marker"}]},{"t":6,"n":"Female Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"n":"FNAM - Female Data Marker"}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"p":1,"n":"REFR - Placed Object","c":[{"t":3,"n":"Cell"},{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Persistent"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":3,"n":"NAME - Base"},{"t":6,"n":"XMBO - Bound Half Extents","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"XPRM - Primitive","c":[{"t":6,"n":"Bounds","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":8,"n":"XPOD - Portal Data","c":[{"t":6,"n":"References #0","c":[{"t":3,"n":"Origin"},{"t":3,"n":"Destination"}]}]},{"t":6,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":6,"n":"Bound Data","c":[{"t":6,"n":"XRMR - Header","c":[{"t":3,"n":"Linked Rooms Count"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"n":"XRDS - Radius"},{"t":10,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":9,"n":"Lit Water","c":[{"t":3,"n":"XLTW - Water"}]},{"t":3,"n":"XEMI - Emittance"},{"t":6,"n":"XLIG - Light Data","c":[{"t":5,"n":"FOV 90+\/-"},{"t":5,"n":"Fade 1.35+\/-"},{"t":11,"n":"Unknown"},{"t":5,"n":"Shadow Depth Bias"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"XALP - Alpha","c":[{"t":3,"n":"Cutoff"},{"t":3,"n":"Base"}]},{"t":6,"n":"XTEL - Teleport Destination","c":[{"t":3,"n":"Door"},{"t":6,"n":"Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]},{"t":3,"n":"Flags"}]},{"t":3,"n":"XTNM - Teleport Message Box"},{"t":3,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"n":"XSCL - Scale"},{"t":3,"n":"XSPC - Spawn Container"},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"}]},{"t":3,"n":"XLIB - Leveled Item Base Object"},{"t":3,"n":"XLCM - Level Modifier"},{"t":3,"n":"XLCN - Persistent Location"},{"t":3,"n":"XTRI - Collision Layer"},{"t":6,"n":"XLOC - Lock Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"n":"Key"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"XNDP - Navigation Door Link","c":[{"t":3,"n":"Navigation Mesh"},{"t":3,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref #0"}]},{"n":"XIS2 - Ignored by Sandbox"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"}]},{"t":3,"n":"XCNT - Item Count"},{"t":5,"n":"XCHG - Charge"},{"t":3,"n":"XLRL - Location Reference"},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":8,"n":"Patrol","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"XPRD - Idle Time"},{"n":"XPPA - Patrol Script Marker"},{"t":3,"n":"INAM - Idle"}]}]},{"t":3,"n":"XACT - Action Flag"},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"n":"ONAM - Open by Default"},{"t":6,"p":1,"n":"Map Marker","c":[{"n":"XMRK - Map Marker Data"},{"t":3,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"TNAM - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"XATR - Attach Ref"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown #0"},{"t":5,"n":"Unknown #1"},{"t":5,"n":"Unknown #2"}]},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Words of Power","c":[{"t":6,"n":"SNAM - ","c":[{"t":3,"n":"Word"},{"t":3,"n":"Spell"},{"t":5,"n":"Recovery Time"}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SNCT - Sound Category","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"PNAM - Parent"},{"t":3,"n":"VNAM - Static Volume Multiplier"},{"t":3,"n":"UNAM - Default Menu Value"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"TREE - Tree","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"WATR - Water","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":7,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"n":"ANAM - Opacity"},{"t":3,"n":"FNAM - Flags"},{"t":11,"n":"MNAM - Unused"},{"t":3,"n":"TNAM - Material"},{"t":3,"n":"SNAM - Open Sound"},{"t":3,"n":"XNAM - Spell"},{"t":3,"n":"INAM - Image Space"},{"t":3,"n":"DATA - Damage Per Second"},{"t":6,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Specular Properties - Sun Specular Power"},{"t":5,"n":"Water Properties - Reflectivity Amount"},{"t":5,"n":"Water Properties - Fresnel Amount"},{"t":11,"n":"Unknown"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"n":"Shallow Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Deep Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Reflection Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Displacement Simulator - Starting Size"},{"t":5,"n":"Displacement Simulator - Force"},{"t":5,"n":"Displacement Simulator - Velocity"},{"t":5,"n":"Displacement Simulator - Falloff"},{"t":5,"n":"Displacement Simulator - Dampner"},{"t":5,"n":"Unknown"},{"t":5,"n":"Noise Properties - Noise Falloff"},{"t":5,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"n":"Unknown"},{"t":5,"n":"Unknown"},{"t":5,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"n":"Unknown"},{"t":5,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"n":"Water Properties - Refraction Magnitude"},{"t":5,"n":"Specular Properties - Specular Power"},{"t":5,"n":"Unknown"},{"t":5,"n":"Specular Properties - Specular Radius"},{"t":5,"n":"Specular Properties - Specular Brightness"},{"t":5,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"n":"Water Properties - Reflection Magnitude"},{"t":5,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"n":"Depth Properties - Reflections"},{"t":5,"n":"Depth Properties - Refraction"},{"t":5,"n":"Depth Properties - Normals"},{"t":5,"n":"Depth Properties - Specular Lighting"},{"t":5,"n":"Specular Properties - Sun Sparkle Power"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"n":"NAM0 - Linear Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"NAM1 - Angular Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"NAM2 - Noise Texture"},{"t":2,"n":"NAM3 - Unused"},{"t":2,"n":"NAM4 - Unused"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Unknown"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":11,"n":"Unknown"},{"t":3,"n":"Skill"},{"t":11,"n":"Unknown"},{"t":3,"n":"Resist"},{"t":11,"n":"Unknown"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"Unused RNAM","c":[{"t":11,"n":"RNAM - Unknown"}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":3,"n":"LTMP - Interior Lighting"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XLCN - Location"},{"t":6,"n":"Parent","c":[{"t":3,"n":"WNAM - Worldspace"},{"t":6,"n":"PNAM - ","c":[{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"CNAM - Climate"},{"t":3,"n":"NAM2 - Water"},{"t":3,"n":"NAM3 - LOD Water Type"},{"t":5,"n":"NAM4 - LOD Water Height"},{"t":6,"n":"DNAM - Land Data","c":[{"t":5,"n":"Default Land Height"},{"t":5,"n":"Default Water Height"}]},{"t":2,"n":"ICON - Map Image"},{"t":6,"n":"Cloud Model","c":[{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]}]},{"t":6,"n":"MNAM - Map Data","c":[{"t":6,"n":"Usable Dimensions","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"Cell Coordinates","c":[{"t":6,"n":"NW Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"SE Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]}]},{"t":6,"n":"Camera Data","c":[{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Initial Pitch"}]}]},{"t":6,"n":"ONAM - World Map Offset Data","c":[{"t":5,"n":"World Map Scale"},{"t":5,"n":"Cell X Offset"},{"t":5,"n":"Cell Y Offset"},{"t":5,"n":"Cell Z Offset"}]},{"t":5,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"n":"DATA - Flags"},{"t":6,"n":"Object Bounds","c":[{"t":6,"n":"NAM0 - Min","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":6,"n":"NAM9 - Max","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]}]},{"t":3,"n":"ZNAM - Music"},{"t":2,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":2,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]}]},"name":"Bash.Names","hash":"8886AE4C","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.NpcFaces.json b/frontend/settings/Skyrim/Bash.NpcFaces.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.NpcFacesForceFullImport.json b/frontend/settings/Skyrim/Bash.NpcFacesForceFullImport.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.ObjectBounds.json b/frontend/settings/Skyrim/Bash.ObjectBounds.json new file mode 100755 index 0000000..94a79f0 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.ObjectBounds.json @@ -0,0 +1 @@ +{"records":"ACTI,ADDN,ALCH,AMMO,APPA,ARMO,ARTO,ASPC,BOOK,CONT,DOOR,DUAL,ENCH,EXPL,FLOR,FURN,GRAS,HAZD,IDLM,INGR,KEYM,LIGH,LVLI,LVLN,LVSP,MISC,MSTT,NPC_,PROJ,SCRL,SLGM,SOUN,SPEL,STAT,TACT,TREE,TXST,WEAP","description":"Changes the object bounds of things.","tree":{"records":[{"t":1,"p":1,"n":"ACTI - Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"ADDN - Addon Node","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"DATA - Node Index"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Master Particle System Cap"},{"t":3,"n":"Flags"}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"},{"t":2,"n":"MIC2 - Small Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":8,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"SNAM - Ambient Sound"},{"t":3,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"n":"BNAM - Environment Type (reverb)"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"DOOR - Door","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Effect Shader"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Inherit Scale"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Enchantment Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Enchantment Amount"},{"t":3,"n":"Target Type"},{"t":3,"n":"Enchant Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Base Enchantment"},{"t":3,"n":"Worn Restrictions"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EXPL - Explosion","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"FLOR - Flora","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"},{"t":6,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Disabled Points"}]},{"t":3,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"GRAS - Grass","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Density"},{"t":3,"n":"Min Slope"},{"t":3,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water"},{"t":3,"n":"Units From Water Type"},{"t":5,"n":"Position Range"},{"t":5,"n":"Height Range"},{"t":5,"n":"Color Range"},{"t":5,"n":"Wave Period"},{"t":3,"n":"Flags"}]}]},{"t":1,"p":1,"n":"HAZD - Hazard","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Limit"},{"t":5,"n":"Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Image Space Radius"},{"t":5,"n":"Target Interval"},{"t":3,"n":"Flags"},{"t":3,"n":"Spell"},{"t":3,"n":"Light"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Sound"}]}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"IDLF - Flags"},{"t":3,"n":"IDLC - Animation Count"},{"t":5,"n":"IDLT - Idle Timer Setting"},{"t":7,"n":"IDLA - Animations","c":[{"t":3,"n":"Animation"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":11,"n":"FNAM - Unknown"},{"t":11,"n":"SNDD - Unknown"},{"t":3,"n":"SDSC - Sound Descriptor"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"STAT - Static","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DNAM - Direction Material","c":[{"t":5,"n":"Max Angle (30-120)"},{"t":3,"n":"Material"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":7,"n":"MNAM - Distant LOD","c":[{"t":6,"n":"LOD","c":[{"t":2,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TREE - Tree","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"n":"Textures (RGB\/A)","c":[{"t":2,"n":"TX00 - Difuse"},{"t":2,"n":"TX01 - Normal\/Gloss"},{"t":2,"n":"TX02 - Environment Mask\/Subsurface Tint"},{"t":2,"n":"TX03 - Glow\/Detail Map"},{"t":2,"n":"TX04 - Height"},{"t":2,"n":"TX05 - Environment"},{"t":2,"n":"TX06 - Multilayer"},{"t":2,"n":"TX07 - Backlight Mask\/Specular"}]},{"t":6,"n":"DODT - Decal Data","c":[{"t":5,"n":"Min Width"},{"t":5,"n":"Max Width"},{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Depth"},{"t":5,"n":"Shininess"},{"t":6,"n":"Parallax","c":[{"t":5,"n":"Scale"},{"t":3,"n":"Passes"}]},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":3,"n":"Skill"},{"t":3,"n":"Resist"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]}]},"name":"Bash.ObjectBounds","hash":"BB958321","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Outfits.Add.json b/frontend/settings/Skyrim/Bash.Outfits.Add.json new file mode 100755 index 0000000..a4167d9 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Outfits.Add.json @@ -0,0 +1 @@ +{"records":"OTFT","description":"Adds items to outfits.","tree":{"records":[{"t":1,"p":1,"n":"OTFT - Outfit","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items"}]}]},"name":"Bash.Outfits.Add","hash":"0731D103","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Outfits.Remove.json b/frontend/settings/Skyrim/Bash.Outfits.Remove.json new file mode 100755 index 0000000..1be5c3e --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Outfits.Remove.json @@ -0,0 +1 @@ +{"records":"OTFT","description":"Adds items to outfits.","tree":{"records":[{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items"}]}]},"name":"Bash.Outfits.Remove","hash":"2A83645B","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.R.AddSpells.json b/frontend/settings/Skyrim/Bash.R.AddSpells.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.R.ChangeSpells.json b/frontend/settings/Skyrim/Bash.R.ChangeSpells.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.R.Description.json b/frontend/settings/Skyrim/Bash.R.Description.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.R.Head.json b/frontend/settings/Skyrim/Bash.R.Head.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.R.Skills.json b/frontend/settings/Skyrim/Bash.R.Skills.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Relations.Add.json b/frontend/settings/Skyrim/Bash.Relations.Add.json new file mode 100755 index 0000000..cf26c88 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Relations.Add.json @@ -0,0 +1 @@ +{"records":"FACT","description":"Adds faction relationships.","tree":{"records":[{"t":1,"p":1,"n":"FACT - Faction","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":8,"p":1,"n":"Relations","c":[{"t":6,"s":1,"p":1,"n":"XNAM - Relation","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Modifier"},{"t":3,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Hidden From NPC"},{"t":4,"n":"Special Combat"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Track Crime"},{"t":4,"n":"Ignore Crimes: Murder"},{"t":4,"n":"Ignore Crimes: Assault"},{"t":4,"n":"Ignore Crimes: Stealing"},{"t":4,"n":"Ignore Crimes: Trespass"},{"t":4,"n":"Do Not Report Crimes Against Members"},{"t":4,"n":"Crime Gold - Use Defaults"},{"t":4,"n":"Ignore Crimes: Pickpocket"},{"t":4,"n":"Vendor"},{"t":4,"n":"Can Be Owner"},{"t":4,"n":"Ignore Crimes: Werewolf"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"},{"t":2,"n":"MNAM - Male Title"},{"t":2,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Cell"},{"t":11,"n":"Near Package Start Location"},{"t":11,"n":"Near Editor Location"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]},"name":"Bash.Relations.Add","hash":"E940522E","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Relations.Change.json b/frontend/settings/Skyrim/Bash.Relations.Change.json new file mode 100755 index 0000000..5f5d8f8 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Relations.Change.json @@ -0,0 +1 @@ +{"records":"FACT","description":"Changes faction relationships.","tree":{"records":[{"t":1,"p":1,"n":"FACT - Faction","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":8,"p":1,"o":1,"n":"Relations","c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Hidden From NPC"},{"t":4,"n":"Special Combat"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Track Crime"},{"t":4,"n":"Ignore Crimes: Murder"},{"t":4,"n":"Ignore Crimes: Assault"},{"t":4,"n":"Ignore Crimes: Stealing"},{"t":4,"n":"Ignore Crimes: Trespass"},{"t":4,"n":"Do Not Report Crimes Against Members"},{"t":4,"n":"Crime Gold - Use Defaults"},{"t":4,"n":"Ignore Crimes: Pickpocket"},{"t":4,"n":"Vendor"},{"t":4,"n":"Can Be Owner"},{"t":4,"n":"Ignore Crimes: Werewolf"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"},{"t":2,"n":"MNAM - Male Title"},{"t":2,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Cell"},{"t":11,"n":"Near Package Start Location"},{"t":11,"n":"Near Editor Location"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]},"name":"Bash.Relations.Change","hash":"B1BB42FB","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Relations.Remove.json b/frontend/settings/Skyrim/Bash.Relations.Remove.json new file mode 100755 index 0000000..5bad449 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Relations.Remove.json @@ -0,0 +1 @@ +{"records":"FACT","description":"Removes faction relationships.","tree":{"records":[{"t":1,"p":1,"n":"FACT - Faction","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":8,"p":1,"n":"Relations","d":1,"c":[{"t":6,"s":1,"p":1,"n":"XNAM - Relation","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Modifier"},{"t":3,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Hidden From NPC"},{"t":4,"n":"Special Combat"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Track Crime"},{"t":4,"n":"Ignore Crimes: Murder"},{"t":4,"n":"Ignore Crimes: Assault"},{"t":4,"n":"Ignore Crimes: Stealing"},{"t":4,"n":"Ignore Crimes: Trespass"},{"t":4,"n":"Do Not Report Crimes Against Members"},{"t":4,"n":"Crime Gold - Use Defaults"},{"t":4,"n":"Ignore Crimes: Pickpocket"},{"t":4,"n":"Vendor"},{"t":4,"n":"Can Be Owner"},{"t":4,"n":"Ignore Crimes: Werewolf"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"},{"t":2,"n":"MNAM - Male Title"},{"t":2,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Cell"},{"t":11,"n":"Near Package Start Location"},{"t":11,"n":"Near Editor Location"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]},"name":"Bash.Relations.Remove","hash":"4E293056","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Relations.json b/frontend/settings/Skyrim/Bash.Relations.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Relev.json b/frontend/settings/Skyrim/Bash.Relev.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Scripts.json b/frontend/settings/Skyrim/Bash.Scripts.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Sound.json b/frontend/settings/Skyrim/Bash.Sound.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.SpellStats.json b/frontend/settings/Skyrim/Bash.SpellStats.json old mode 100644 new mode 100755 index 9fdc7ea..aac13c6 --- a/frontend/settings/Skyrim/Bash.SpellStats.json +++ b/frontend/settings/Skyrim/Bash.SpellStats.json @@ -1 +1 @@ -{"records":"SPEL","description":"SpellStats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies spell stats.","tree":{"records":[{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]}]},"name":"Bash.SpellStats","hash":"$33DCE408","color":255} \ No newline at end of file +{"records":"SPEL","description":"SpellStats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies spell stats.","tree":{"records":[{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Manual Cost Calc"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"PC Start Spell"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Area Effect Ignores LOS"},{"t":4,"n":"Ignore Resistance"},{"t":4,"n":"No Absorb\/Reflect"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"No Dual Cast Modification"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"n":"EFID - Effects","c":[{"t":6,"n":"EFID - Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - EFIT","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":10,"n":"CTDA - Conditions","c":[{"t":6,"n":"CTDA - Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},"name":"Bash.SpellStats","hash":"A34FB204","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Stats.json b/frontend/settings/Skyrim/Bash.Stats.json old mode 100644 new mode 100755 index 7c15f87..f3af033 --- a/frontend/settings/Skyrim/Bash.Stats.json +++ b/frontend/settings/Skyrim/Bash.Stats.json @@ -1 +1 @@ -{"records":"AMMO,APPA,ARMO,BOOK,INGR,KEYM,MISC,PROJ,WEAP,ALCH","description":"Stats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies item stats.","tree":{"records":[{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":7,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating","p":1},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":12,"p":1,"n":"Teaches"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"p":1,"n":"Gravity","lt":"Range","lf":"Speed"},{"t":5,"p":1,"n":"Speed","lt":"Gravity","lf":"Range"},{"t":5,"p":1,"n":"Range","lt":"Speed","lf":"Gravity"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":12,"n":"Data","c":[{"t":9,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":9,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":12,"n":"Value"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"s":1,"p":1,"n":"DATA - Game Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Damage"}]},{"t":6,"p":1,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Speed","lt":"Reach","lf":"Stagger"},{"t":5,"p":1,"n":"Reach","lt":"Resist","lf":"Speed"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Unknown"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":11,"n":"Unknown"},{"t":3,"n":"Skill"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Resist","lt":"Stagger","lf":"Reach"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Stagger","lt":"Speed","lf":"Resist"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":3,"p":1,"n":"Damage"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"% Mult"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags"},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":9,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Drop"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]}]}]}]}]},"name":"Bash.Stats","hash":"9BB78E19","color":255} \ No newline at end of file +{"records":"ALCH,APPA,ARMO,BOOK,INGR,KEYM,LIGH,MISC,SLGM,WEAP,AMMO","description":"Stats tag from Wrye Bash.\r\n\r\nUsed when the mod modifies item stats.","tree":{"records":[{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":"Food Item"},{"t":4,"p":1,"n":"Unknown 3"},{"t":4,"p":1,"n":"Unknown 4"},{"t":4,"p":1,"n":"Unknown 5"},{"t":4,"p":1,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unknown 7"},{"t":4,"p":1,"n":"Unknown 8"},{"t":4,"p":1,"n":"Unknown 9"},{"t":4,"p":1,"n":"Unknown 10"},{"t":4,"p":1,"n":"Unknown 11"},{"t":4,"p":1,"n":"Unknown 12"},{"t":4,"p":1,"n":"Unknown 13"},{"t":4,"p":1,"n":"Unknown 14"},{"t":4,"p":1,"n":"Unknown 15"},{"t":4,"p":1,"n":"Unknown 16"},{"t":4,"p":1,"n":"Medicine"},{"t":4,"p":1,"n":"Poison"}]},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":8,"n":"EFID - Effects","c":[{"t":6,"n":"EFID - Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - EFIT","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":10,"n":"CTDA - Conditions","c":[{"t":6,"n":"CTDA - Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"QUAL - Quality"},{"t":2,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"MOD2 - Male world model","c":[{"t":2,"n":"MOD2 - Model FileName"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"MOD4 - Female world model","c":[{"t":2,"n":"MOD4 - Model FileName"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures"}]},{"t":6,"n":"ICO2 - Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon FileName"},{"t":2,"n":"MIC2 - Small Icon FileName"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags","c":[{"t":4,"n":"30 - Head"},{"t":4,"n":"31 - Hair"},{"t":4,"n":"32 - Body"},{"t":4,"n":"33 - Hands"},{"t":4,"n":"34 - Forearms"},{"t":4,"n":"35 - Amulet"},{"t":4,"n":"36 - Ring"},{"t":4,"n":"37 - Feet"},{"t":4,"n":"38 - Calves"},{"t":4,"n":"39 - Shield"},{"t":4,"n":"40 - Tail"},{"t":4,"n":"41 - LongHair"},{"t":4,"n":"42 - Circlet"},{"t":4,"n":"43 - Ears"},{"t":4,"n":"44 - Unnamed"},{"t":4,"n":"45 - Unnamed"},{"t":4,"n":"46 - Unnamed"},{"t":4,"n":"47 - Unnamed"},{"t":4,"n":"48 - Unnamed"},{"t":4,"n":"49 - Unnamed"},{"t":4,"n":"50 - DecapitateHead"},{"t":4,"n":"51 - Decapitate"},{"t":4,"n":"52 - Unnamed"},{"t":4,"n":"53 - Unnamed"},{"t":4,"n":"54 - Unnamed"},{"t":4,"n":"55 - Unnamed"},{"t":4,"n":"56 - Unnamed"},{"t":4,"n":"57 - Unnamed"},{"t":4,"n":"58 - Unnamed"},{"t":4,"n":"59 - Unnamed"},{"t":4,"n":"60 - Unnamed"},{"t":4,"n":"61 - FX01"}]},{"t":3,"n":"General Flags","c":[{"t":4,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags","c":[{"t":4,"n":"30 - Head"},{"t":4,"n":"31 - Hair"},{"t":4,"n":"32 - Body"},{"t":4,"n":"33 - Hands"},{"t":4,"n":"34 - Forearms"},{"t":4,"n":"35 - Amulet"},{"t":4,"n":"36 - Ring"},{"t":4,"n":"37 - Feet"},{"t":4,"n":"38 - Calves"},{"t":4,"n":"39 - Shield"},{"t":4,"n":"40 - Tail"},{"t":4,"n":"41 - LongHair"},{"t":4,"n":"42 - Circlet"},{"t":4,"n":"43 - Ears"},{"t":4,"n":"44 - Unnamed"},{"t":4,"n":"45 - Unnamed"},{"t":4,"n":"46 - Unnamed"},{"t":4,"n":"47 - Unnamed"},{"t":4,"n":"48 - Unnamed"},{"t":4,"n":"49 - Unnamed"},{"t":4,"n":"50 - DecapitateHead"},{"t":4,"n":"51 - Decapitate"},{"t":4,"n":"52 - Unnamed"},{"t":4,"n":"53 - Unnamed"},{"t":4,"n":"54 - Unnamed"},{"t":4,"n":"55 - Unnamed"},{"t":4,"n":"56 - Unnamed"},{"t":4,"n":"57 - Unnamed"},{"t":4,"n":"58 - Unnamed"},{"t":4,"n":"59 - Unnamed"},{"t":4,"n":"60 - Unnamed"},{"t":4,"n":"61 - FX01"}]},{"t":3,"n":"General Flags","c":[{"t":4,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":2,"n":"DESC - Description"},{"t":8,"n":"MODL - Armature","c":[{"t":3,"n":"MODL - Model FileName"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":2,"n":"DESC - Book Text"},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Teaches Skill"},{"t":4,"n":"Can't be Taken"},{"t":4,"n":"Teaches Spell"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"INGR - Ingredient","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags","c":[{"t":4,"n":"No auto-calculation"},{"t":4,"n":"Food item"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"References Persist"}]}]},{"t":8,"n":"EFID - Effects","c":[{"t":6,"n":"EFID - Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - EFIT","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":10,"n":"CTDA - Conditions","c":[{"t":6,"n":"CTDA - Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"LIGH - Light","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Flags","c":[{"t":4,"n":"Dynamic"},{"t":4,"n":"Can be Carried"},{"t":4,"n":"Negative"},{"t":4,"n":"Flicker"},{"t":4,"n":"Unknown"},{"t":4,"n":"Off By Default"},{"t":4,"n":"Flicker Slow"},{"t":4,"n":"Pulse"},{"t":4,"n":"Pulse Slow"},{"t":4,"n":"Spot Light"},{"t":4,"n":"Shadow Spotlight"},{"t":4,"n":"Shadow Hemisphere"},{"t":4,"n":"Shadow Omnidirectional"},{"t":4,"n":"Portal-strict"}]},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"MISC - Misc. Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts"}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"MOD3 - Has Scope","c":[{"t":2,"n":"MOD3 - Model FileName"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures"}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"s":1,"p":1,"n":"DATA - Game Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Damage"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reach"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Ignores Normal Weapon Resistance"},{"t":4,"n":"Automatic (unused)"},{"t":4,"n":"Has Scope (unused)"},{"t":4,"n":"Can't Drop"},{"t":4,"n":"Hide Backpack (unused)"},{"t":4,"n":"Embedded Weapon (unused)"},{"t":4,"n":"Don't Use 1st Person IS Anim (unused)"},{"t":4,"n":"Non-playable"}]},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2","c":[{"t":4,"n":"Player Only"},{"t":4,"n":"NPCs Use Ammo"},{"t":4,"n":"No Jam After Reload (unused)"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Minor Crime"},{"t":4,"n":"Range Fixed"},{"t":4,"n":"Not Used in Normal Combat"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Don't Use 3rd Person IS Anim (unused)"},{"t":4,"n":"Burst Shot"},{"t":4,"n":"Rumble - Alternate"},{"t":4,"n":"Long Bursts"},{"t":4,"n":"Non-hostile"},{"t":4,"n":"Bound Weapon"}]},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":3,"n":"Skill"},{"t":3,"n":"Resist"},{"t":5,"p":1,"n":"Stagger"}]},{"t":6,"p":1,"n":"CRDT - Critical Data","c":[{"t":3,"p":1,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"% Mult"},{"t":3,"n":"Flags","c":[{"t":4,"n":"On Death"}]},{"t":3,"p":1,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"MODL - Model","c":[{"t":2,"n":"MODL - Model FileName"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures"}]},{"t":6,"n":"ICON - Icon","c":[{"t":2,"n":"ICON - Large Icon FileName"},{"t":2,"n":"MICO - Small Icon FileName"}]},{"t":6,"n":"DEST - Destructible","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"DSTD - Stages","c":[{"t":6,"n":"DSTD - Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Cap Damage"},{"t":4,"n":"Disable"},{"t":4,"n":"Destroy"},{"t":4,"n":"Ignore External Dmg"}]},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"DMDL - Model","c":[{"t":2,"n":"DMDL - Model FileName"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures"}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags","c":[{"t":4,"n":"Ignores Normal Weapon Resistance"},{"t":4,"n":"Non-Playable"},{"t":4,"n":"Non-Bolt"}]},{"t":5,"p":1,"n":"Damage"},{"t":3,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":2,"n":"ONAM - Short Name"}]}]},"name":"Bash.Stats","hash":"BB16C7CA","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Text.json b/frontend/settings/Skyrim/Bash.Text.json new file mode 100755 index 0000000..3577f23 --- /dev/null +++ b/frontend/settings/Skyrim/Bash.Text.json @@ -0,0 +1 @@ +{"records":"ALCH,AMMO,APPA,ARMO,AVIF,BOOK,CLAS,LSCR,MESG,MGEF,SCRL,SHOU,SPEL,WEAP","description":"Modifies long-form text (e.g. the text in a book, or descriptions of armor, spells, weapons, etc.) of things.","tree":{"records":[{"t":1,"n":"AACT - Action","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"ACTI - Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"PNAM - Marker Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"SNAM - Sound - Looping"},{"t":3,"n":"VNAM - Sound - Activation"},{"t":3,"n":"WNAM - Water Type"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"}]},{"t":1,"n":"ADDN - Addon Node","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"DATA - Node Index"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Master Particle System Cap"},{"t":3,"n":"Flags"}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"ETYP - Equipment Type"},{"t":5,"n":"DATA - Weight"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Value"},{"t":3,"n":"Flags"},{"t":3,"n":"Addiction"},{"t":5,"n":"Addiction Chance"},{"t":3,"n":"Sound - Consume"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Flags"},{"t":5,"n":"Damage"},{"t":3,"n":"Value"}]},{"t":2,"n":"ONAM - Short Name"}]},{"t":1,"n":"ANIO - Animated Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":2,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"QUAL - Quality"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"n":"ARMA - Armor Addon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"RNAM - Race"},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Male Priority"},{"t":3,"n":"Female Priority"},{"t":3,"n":"Weight slider - Male"},{"t":3,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"n":"Detection Sound Value"},{"t":5,"n":"Weapon Adjust"}]},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD3 - Model Filename"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Male 1st Person","c":[{"t":2,"n":"MOD4 - Model Filename"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Female 1st Person","c":[{"t":2,"n":"MOD5 - Model Filename"},{"t":11,"n":"MO5T - Texture Files Hashes"},{"t":7,"n":"MO5S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"NAM0 - Male Skin Texture"},{"t":3,"n":"NAM1 - Female Skin texture"},{"t":3,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"n":"Additional Races","c":[{"t":3,"n":"MODL - Race"}]},{"t":3,"n":"SNDD - Footstep Sound"},{"t":3,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Male world model","c":[{"t":2,"n":"MOD2 - Model Filename"},{"t":11,"n":"MO2T - Texture Files Hashes"},{"t":7,"n":"MO2S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Female world model","c":[{"t":2,"n":"MOD4 - Model Filename"},{"t":11,"n":"MO4T - Texture Files Hashes"},{"t":7,"n":"MO4S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon 2 (female)","c":[{"t":2,"n":"ICO2 - Large Icon filename"},{"t":2,"n":"MIC2 - Small Icon filename"}]},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":2,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"n":"Armature","c":[{"t":3,"n":"MODL - Model Filename"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"DNAM - Armor Rating"},{"t":3,"n":"TNAM - Template Armor"}]},{"t":1,"n":"ARTO - Art Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"DNAM - Art Type"}]},{"t":1,"n":"ASPC - Acoustic Space","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":3,"n":"SNAM - Ambient Sound"},{"t":3,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"n":"BNAM - Environment Type (reverb)"}]},{"t":1,"n":"ASTP - Association Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"MPRT - Male Parent Title"},{"t":2,"n":"FPRT - Female Parent Title"},{"t":2,"n":"MCHT - Male Child Title"},{"t":2,"n":"FCHT - Female Child Title"},{"t":3,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"n":"AVSK - Skill","c":[{"t":5,"n":"Skill Use Mult"},{"t":5,"n":"Skill Offset Mult"},{"t":5,"n":"Skill Improve Mult"},{"t":5,"n":"Skill Improve Offset"}]},{"t":8,"n":"Perk Tree","c":[{"t":6,"n":"Node","c":[{"t":3,"n":"PNAM - Perk"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"XNAM - Perk-Grid X"},{"t":3,"n":"YNAM - Perk-Grid Y"},{"t":5,"n":"HNAM - Horizontal Position"},{"t":5,"n":"VNAM - Vertical Position"},{"t":3,"n":"SNAM - Associated Skill"},{"t":8,"n":"Connections","c":[{"t":3,"n":"CNAM - Line to Index"}]},{"t":3,"n":"INAM - Index"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Book Text"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"n":"Skill"},{"t":3,"n":"Spell"},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"INAM - Inventory Art"},{"t":2,"p":1,"n":"CNAM - Description"}]},{"t":1,"n":"BPTD - Body Part Data","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":10,"n":"Body Parts","c":[{"t":6,"n":"Body Part","c":[{"t":2,"n":"BPTN - Part Name"},{"t":2,"n":"PNAM - Pose Matching"},{"t":2,"n":"BPNN - Part Node"},{"t":2,"n":"BPNT - VATS Target"},{"t":2,"n":"BPNI - IK Data - Start Node"},{"t":6,"n":"BPND - ","c":[{"t":5,"n":"Damage Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Part Type"},{"t":3,"n":"Health Percent"},{"t":3,"n":"Actor Value"},{"t":3,"n":"To Hit Chance"},{"t":3,"n":"Explodable - Explosion Chance %"},{"t":3,"n":"Explodable - Debris Count"},{"t":3,"n":"Explodable - Debris"},{"t":3,"n":"Explodable - Explosion"},{"t":5,"n":"Tracking Max Angle"},{"t":5,"n":"Explodable - Debris Scale"},{"t":3,"n":"Severable - Debris Count"},{"t":3,"n":"Severable - Debris"},{"t":3,"n":"Severable - Explosion"},{"t":5,"n":"Severable - Debris Scale"},{"t":6,"n":"Gore Effects Positioning","c":[{"t":6,"n":"Translate","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]},{"t":3,"n":"Severable - Impact DataSet"},{"t":3,"n":"Explodable - Impact DataSet"},{"t":3,"n":"Severable - Decal Count"},{"t":3,"n":"Explodable - Decal Count"},{"t":11,"n":"Unknown"},{"t":5,"n":"Limb Replacement Scale"}]},{"t":2,"n":"NAM1 - Limb Replacement Model"},{"t":2,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"n":"NAM5 - Texture Files Hashes"}]}]}]},{"t":1,"n":"CAMS - Camera Shot","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Action"},{"t":3,"n":"Location"},{"t":3,"n":"Target"},{"t":3,"n":"Flags"},{"t":6,"n":"Time Multipliers","c":[{"t":5,"n":"Player"},{"t":5,"n":"Target"},{"t":5,"n":"Global"}]},{"t":5,"n":"Max Time"},{"t":5,"n":"Min Time"},{"t":5,"n":"Target % Between Actors"},{"t":5,"n":"Near Target Distance"}]},{"t":3,"n":"MNAM - Image Space Modifier"}]},{"t":1,"n":"CELL - Cell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"DATA - Flags"},{"t":6,"n":"XCLC - Grid","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Force Hide Land"}]},{"t":6,"n":"XCLL - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Distance"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":5,"n":"Light Fade Begin"},{"t":5,"n":"Light Fade End"},{"t":3,"n":"Inherits"}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"n":"XCLW - Water Height"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":7,"n":"XCLR - Regions","c":[{"t":3,"n":"Region"}]},{"t":3,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":3,"n":"XCWT - Water"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XILL - Lock List"},{"t":2,"n":"XWEM - Water Environment Map"},{"t":3,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"n":"XCAS - Acoustic Space"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XCMO - Music Type"},{"t":3,"n":"XCIM - Image Space"}]},{"t":1,"p":1,"n":"CLAS - Class","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Teaches"},{"t":3,"n":"Maximum training level"},{"t":7,"n":"Skill Weights","c":[{"t":3,"n":"Weight"}]},{"t":5,"n":"Bleedout Default"},{"t":3,"n":"Voice Points"},{"t":7,"n":"Attribute Weights","c":[{"t":3,"n":"Weight"}]}]}]},{"t":1,"n":"CLDC","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"n":"CLFM - Color","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"FNAM - Playable"}]},{"t":1,"n":"CLMT - Climate","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"WLST - Weather Types","c":[{"t":6,"n":"Weather Type","c":[{"t":3,"n":"Weather"},{"t":3,"n":"Chance"},{"t":3,"n":"Global"}]}]},{"t":2,"n":"FNAM - Sun Texture"},{"t":2,"n":"GNAM - Sun Glare Texture"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"TNAM - Timing","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Begin"},{"t":3,"n":"End"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Begin"},{"t":3,"n":"End"}]},{"t":3,"n":"Volatility"},{"t":3,"n":"Moons \/ Phase Length"}]}]},{"t":1,"n":"COBJ - Constructible Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"CNAM - Created Object"},{"t":3,"n":"BNAM - Workbench Keyword"},{"t":3,"n":"NAM1 - Created Object Count"}]},{"t":1,"n":"COLL - Collision Layer","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"BNAM - Index"},{"t":6,"n":"FNAM - Debug Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"n":"GNAM - Flags"},{"t":2,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"n":"CNAM - Collides With","c":[{"t":3,"n":"Forms"}]}]},{"t":1,"n":"CONT - Container","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"QNAM - Sound - Close"}]},{"t":1,"n":"CPTH - Camera Path","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"n":"ANAM - Related Camera Paths","c":[{"t":3,"n":"Related Camera Path"}]},{"t":3,"n":"DATA - Camera Zoom"},{"t":8,"n":"Camera Shots","c":[{"t":3,"n":"SNAM - Camera Shot"}]}]},{"t":1,"n":"CSTY - Combat Style","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"CSGD - General","c":[{"t":5,"n":"Offensive Mult"},{"t":5,"n":"Defensive Mult"},{"t":5,"n":"Group Offensive Mult"},{"t":5,"n":"Equipment Score Mult - Melee"},{"t":5,"n":"Equipment Score Mult - Magic"},{"t":5,"n":"Equipment Score Mult - Ranged"},{"t":5,"n":"Equipment Score Mult - Shout"},{"t":5,"n":"Equipment Score Mult - Unarmed"},{"t":5,"n":"Equipment Score Mult - Staff"},{"t":5,"n":"Avoid Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"n":"CSME - Melee","c":[{"t":5,"n":"Attack Staggered Mult"},{"t":5,"n":"Power Attack Staggered Mult"},{"t":5,"n":"Power Attack Blocking Mult"},{"t":5,"n":"Bash Mult"},{"t":5,"n":"Bash Recoil Mult"},{"t":5,"n":"Bash Attack Mult"},{"t":5,"n":"Bash Power Attack Mult"},{"t":5,"n":"Special Attack Mult"}]},{"t":6,"n":"CSCR - Close Range","c":[{"t":5,"n":"Circle Mult"},{"t":5,"n":"Fallback Mult"},{"t":5,"n":"Flank Distance"},{"t":5,"n":"Stalk Time"}]},{"t":6,"n":"CSLR - Long Range","c":[{"t":5,"n":"Strafe Mult"}]},{"t":6,"n":"CSFL - Flight","c":[{"t":5,"n":"Hover Chance"},{"t":5,"n":"Dive Bomb Chance"},{"t":5,"n":"Ground Attack Chance"},{"t":5,"n":"Hover Time"},{"t":5,"n":"Ground Attack Time"},{"t":5,"n":"Perch Attack Chance"},{"t":5,"n":"Perch Attack Time"},{"t":5,"n":"Flying Attack Chance"}]},{"t":3,"n":"DATA - Flags"}]},{"t":1,"n":"DEBR - Debris","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Models","c":[{"t":6,"n":"Model","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Percentage"},{"t":2,"n":"Model Filename"},{"t":3,"n":"Flags"}]},{"t":11,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"n":"DIAL - Dialog Topic","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":5,"n":"PNAM - Priority"},{"t":3,"n":"BNAM - Branch"},{"t":3,"n":"QNAM - Quest"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Topic Flags"},{"t":3,"n":"Category"},{"t":3,"n":"Subtype"}]},{"t":2,"n":"SNAM - Subtype Name"},{"t":3,"n":"TIFC - Info Count"}]},{"t":1,"n":"DLBR - Dialog Branch","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"n":"DNAM - Flags"},{"t":3,"n":"SNAM - Starting Topic"}]},{"t":1,"n":"DLVW - Dialog View","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"QNAM - Quest"},{"t":8,"n":"Branches","c":[{"t":3,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"n":"DOOR - Door","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"SNAM - Sound - Open"},{"t":3,"n":"ANAM - Sound - Close"},{"t":3,"n":"BNAM - Sound - Loop"},{"t":3,"n":"FNAM - Flags"}]},{"t":1,"n":"DUAL - Dual Cast Data","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Effect Shader"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Inherit Scale"}]}]},{"t":1,"n":"ECZN - Encounter Zone","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Owner"},{"t":3,"n":"Location"},{"t":3,"n":"Rank"},{"t":3,"n":"Min Level"},{"t":3,"n":"Flags"},{"t":3,"n":"Max Level"}]}]},{"t":1,"n":"EFSH - Effect Shader","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"ICON - Fill Texture"},{"t":2,"n":"ICO2 - Particle Shader Texture"},{"t":2,"n":"NAM7 - Holes Texture"},{"t":2,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"n":"NAM9 - Particle Palette Texture"},{"t":6,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"n":"Membrane Shader - Blend Operation"},{"t":3,"n":"Membrane Shader - Z Test Function"},{"t":6,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"n":"Edge Effect - Fall Off"},{"t":6,"n":"Edge Effect - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"n":"Edge Effect - Full Alpha Time"},{"t":5,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"n":"Particle Shader - Source Blend Mode"},{"t":3,"n":"Particle Shader - Blend Operation"},{"t":3,"n":"Particle Shader - Z Test Function"},{"t":3,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"n":"Particle Shader - Particle Lifetime"},{"t":5,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"n":"Particle Shader - Acceleration #1"},{"t":5,"n":"Particle Shader - Acceleration #2"},{"t":5,"n":"Particle Shader - Acceleration #3"},{"t":5,"n":"Particle Shader - Scale Key 1"},{"t":5,"n":"Particle Shader - Scale Key 2"},{"t":5,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"n":"Color Key 1 - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Color Key 2 - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Color Key 3 - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Color Key 1 - Color Alpha"},{"t":5,"n":"Color Key 2 - Color Alpha"},{"t":5,"n":"Color Key 3 - Color Alpha"},{"t":5,"n":"Color Key 1 - Color Key Time"},{"t":5,"n":"Color Key 2 - Color Key Time"},{"t":5,"n":"Color Key 3 - Color Key Time"},{"t":5,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"n":"Addon Models"},{"t":5,"n":"Holes - Start Time"},{"t":5,"n":"Holes - End Time"},{"t":5,"n":"Holes - Start Val"},{"t":5,"n":"Holes - End Val"},{"t":5,"n":"Edge Width (alpha units)"},{"t":6,"n":"Edge Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Explosion Wind Speed"},{"t":3,"n":"Texture Count U"},{"t":3,"n":"Texture Count V"},{"t":5,"n":"Addon Models - Fade In Time"},{"t":5,"n":"Addon Models - Fade Out Time"},{"t":5,"n":"Addon Models - Scale Start"},{"t":5,"n":"Addon Models - Scale End"},{"t":5,"n":"Addon Models - Scale In Time"},{"t":5,"n":"Addon Models - Scale Out Time"},{"t":3,"n":"Ambient Sound"},{"t":6,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"n":"Color Key 1 - Scale"},{"t":5,"n":"Color Key 2 - Scale"},{"t":5,"n":"Color Key 3 - Scale"},{"t":5,"n":"Color Key 1 - Time"},{"t":5,"n":"Color Key 2 - Time"},{"t":5,"n":"Color Key 3 - Time"}]},{"t":5,"n":"Color Scale"},{"t":5,"n":"Birth Position Offset"},{"t":5,"n":"Birth Position Offset Range +\/-"},{"t":6,"n":"Particle Shader Animated","c":[{"t":3,"n":"Start Frame"},{"t":3,"n":"Start Frame Variation"},{"t":3,"n":"End Frame"},{"t":3,"n":"Loop Start Frame"},{"t":3,"n":"Loop Start Variation"},{"t":3,"n":"Frame Count"},{"t":3,"n":"Frame Count Variation"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"n":"Scene Graph Emit Depth Limit (unused)"}]}]},{"t":1,"n":"ENCH - Object Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Enchantment Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Enchantment Amount"},{"t":3,"n":"Target Type"},{"t":3,"n":"Enchant Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Base Enchantment"},{"t":3,"n":"Worn Restrictions"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"n":"EQUP - Equip Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"PNAM - Slot Parents","c":[{"t":3,"n":"Can Be Equipped"}]},{"t":3,"n":"DATA - Use All Parents"}]},{"t":1,"n":"EXPL - Explosion","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Light"},{"t":3,"n":"Sound 1"},{"t":3,"n":"Sound 2"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Placed Object"},{"t":3,"n":"Spawn Projectile"},{"t":5,"n":"Force"},{"t":5,"n":"Damage"},{"t":5,"n":"Radius"},{"t":5,"n":"IS Radius"},{"t":5,"n":"Vertical Offset Mult"},{"t":3,"n":"Flags"},{"t":3,"n":"Sound Level"}]}]},{"t":1,"n":"EYES - Eyes","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"ICON - Texture"},{"t":3,"n":"DATA - Flags"}]},{"t":1,"n":"FACT - Faction","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":8,"n":"Relations","c":[{"t":6,"n":"XNAM - Relation","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Modifier"},{"t":3,"n":"Group Combat Reaction"}]}]},{"t":6,"n":"DATA - Flags","c":[{"t":3,"n":"Flags"}]},{"t":3,"n":"JAIL - Exterior Jail Marker"},{"t":3,"n":"WAIT - Follower Wait Marker"},{"t":3,"n":"STOL - Stolen Goods Container"},{"t":3,"n":"PLCN - Player Inventory Container"},{"t":3,"n":"CRGR - Shared Crime Faction List"},{"t":3,"n":"JOUT - Jail Outfit"},{"t":6,"n":"CRVA - Crime Values","c":[{"t":3,"n":"Arrest"},{"t":3,"n":"Attack On Sight"},{"t":3,"n":"Murder"},{"t":3,"n":"Assault"},{"t":3,"n":"Trespass"},{"t":3,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"n":"Steal Multiplier"},{"t":3,"n":"Escape"},{"t":3,"n":"Werewolf"}]},{"t":10,"n":"Ranks","c":[{"t":6,"n":"Rank","c":[{"t":3,"n":"RNAM - Rank#"},{"t":2,"n":"MNAM - Male Title"},{"t":2,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"n":"VENC - Merchant Container"},{"t":6,"n":"VENV - Vendor Values","c":[{"t":3,"n":"Start Hour"},{"t":3,"n":"End Hour"},{"t":3,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"n":"Only Buys Stolen Items"},{"t":3,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"n":"PLVD - Location","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Cell"},{"t":11,"n":"Near Package Start Location"},{"t":11,"n":"Near Editor Location"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"n":"FLOR - Flora","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Sound"},{"t":6,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer "},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]}]},{"t":1,"n":"FLST - FormID List","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"FormIDs","c":[{"t":3,"n":"LNAM - FormID"}]}]},{"t":1,"n":"FSTP - Footstep","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"DATA - Impact Data Set"},{"t":2,"n":"ANAM - Tag"}]},{"t":1,"n":"FSTS - Footstep Set","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"XCNT - Count","c":[{"t":3,"n":"Walk Forward Sets"},{"t":3,"n":"Run Forward Sets"},{"t":3,"n":"Walk Forward Alternate Sets"},{"t":3,"n":"Run Forward Alternate Sets"},{"t":3,"n":"Walk Forward Alternate 2 Sets"}]},{"t":7,"n":"DATA - Footstep Sets","c":[{"t":3,"n":"Footstep"}]}]},{"t":1,"n":"FURN - Furniture","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"KNAM - Interaction Keyword"},{"t":3,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"n":"WBDT - Workbench Data","c":[{"t":3,"n":"Bench Type"},{"t":3,"n":"Uses Skill"}]},{"t":3,"n":"NAM1 - Associated Spell"},{"t":8,"n":"Markers","c":[{"t":6,"n":"Marker","c":[{"t":3,"n":"ENAM - Marker Index"},{"t":6,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Disabled Points"}]},{"t":3,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"n":"Marker Entry Points","c":[{"t":6,"n":"FNPR - Marker","c":[{"t":3,"n":"Type"},{"t":3,"n":"Entry Points"}]}]},{"t":2,"n":"XMRK - Model Filename"}]},{"t":1,"n":"GLOB - Global","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"FNAM - Type"},{"t":5,"n":"FLTV - Value"}]},{"t":1,"n":"GMST - Game Setting","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"Name"},{"t":3,"n":"Int"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"}]},{"t":1,"n":"GRAS - Grass","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Density"},{"t":3,"n":"Min Slope"},{"t":3,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"n":"Units From Water"},{"t":3,"n":"Units From Water Type"},{"t":5,"n":"Position Range"},{"t":5,"n":"Height Range"},{"t":5,"n":"Color Range"},{"t":5,"n":"Wave Period"},{"t":3,"n":"Flags"}]}]},{"t":1,"n":"HAIR","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"n":"HAZD - Hazard","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"MNAM - Image Space Modifier"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Limit"},{"t":5,"n":"Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Image Space Radius"},{"t":5,"n":"Target Interval"},{"t":3,"n":"Flags"},{"t":3,"n":"Spell"},{"t":3,"n":"Light"},{"t":3,"n":"Impact Data Set"},{"t":3,"n":"Sound"}]}]},{"t":1,"n":"HDPT - Head Part","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"PNAM - Type"},{"t":8,"n":"Extra Parts","c":[{"t":3,"n":"HNAM - Part"}]},{"t":8,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"NAM0 - Part Type"},{"t":2,"n":"NAM1 - Filename"}]}]},{"t":3,"n":"TNAM - Texture Set"},{"t":3,"n":"CNAM - Color"},{"t":3,"n":"RNAM - Valid Races"}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Filename"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Related Idle Animation"}]},{"t":6,"n":"DATA - Data (unused)","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]}]},{"t":1,"n":"IDLM - Idle Marker","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":3,"n":"IDLF - Flags"},{"t":3,"n":"IDLC - Animation Count"},{"t":5,"n":"IDLT - Idle Timer Setting"},{"t":7,"n":"IDLA - Animations","c":[{"t":3,"n":"Animation"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":1,"n":"IMAD - Image Space Adapter","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags"},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags"},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"}]},{"t":7,"n":"BNAM - Blur Radius","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"VNAM - Double Vision Strength","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"TNAM - Tint Color","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"},{"t":5,"n":"Alpha"}]}]},{"t":7,"n":"NAM3 - Fade Color","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"},{"t":5,"n":"Alpha"}]}]},{"t":7,"n":"RNAM - Radial Blur Strength","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"SNAM - Radial Blur Ramp Up","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"UNAM - Radial Blur Start","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"NAM1 - Radial Blur Ramp Down","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"NAM2 - Radial Blur Down Start","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"WNAM - DoF Strength","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"XNAM - DoF Distance","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"YNAM - DoF Range","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":6,"n":"HDR","c":[{"t":7,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"GIAD - Sky Scale Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"n":"Cinematic","c":[{"t":7,"n":"rIAD - Saturation Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"QIAD - Saturation Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"sIAD - Brightness Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"RIAD - Brightness Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"tIAD - Contrast Mult","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]},{"t":7,"n":"SIAD - Contrast Add","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"Time"},{"t":5,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"n":"IMGS - Image Space","c":[{"t":2,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unknown"},{"t":6,"n":"HNAM - HDR","c":[{"t":5,"n":"Eye Adapt Speed"},{"t":5,"n":"Bloom Blur Radius"},{"t":5,"n":"Bloom Threshold"},{"t":5,"n":"Bloom Scale"},{"t":5,"n":"Receive Bloom Threshold"},{"t":5,"n":"White"},{"t":5,"n":"Sunlight Scale"},{"t":5,"n":"Sky Scale"},{"t":5,"n":"Eye Adapt Strength"}]},{"t":6,"n":"CNAM - Cinematic","c":[{"t":5,"n":"Saturation"},{"t":5,"n":"Brightness"},{"t":5,"n":"Contrast"}]},{"t":6,"n":"TNAM - Tint","c":[{"t":5,"n":"Amount"},{"t":6,"n":"Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]}]},{"t":6,"n":"DNAM - Depth of Field","c":[{"t":5,"n":"Strength"},{"t":5,"n":"Distance"},{"t":5,"n":"Range"},{"t":11,"n":"Unknown"},{"t":3,"n":"Sky \/ Blur Radius"}]}]},{"t":1,"n":"INFO - Dialog response","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]},{"t":6,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"Flags"},{"t":2,"n":"fileName"},{"t":7,"n":"Fragments","c":[{"t":6,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]},{"t":11,"n":"DATA - Unknown"},{"t":6,"n":"ENAM - Response flags","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Reset Hours"}]},{"t":3,"n":"TPIC - Topic"},{"t":3,"n":"PNAM - Previous INFO"},{"t":3,"n":"CNAM - Favor Level"},{"t":8,"n":"Link To","c":[{"t":3,"n":"TCLT - Response"}]},{"t":3,"n":"DNAM - Response Data"},{"t":8,"n":"Responses","c":[{"t":6,"n":"Response","c":[{"t":6,"n":"TRDT - Response Data","c":[{"t":3,"n":"Emotion Type"},{"t":3,"n":"Emotion Value"},{"t":11,"n":"Unused"},{"t":3,"n":"Response number"},{"t":3,"n":"Sound"},{"t":3,"n":"Flags"}]},{"t":2,"n":"NAM1 - Response Text"},{"t":2,"n":"NAM2 - Script Notes"},{"t":2,"n":"NAM3 - Edits"},{"t":3,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"n":"LNAM - Idle Animations: Listener"}]}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"SCHR - Unknown"},{"t":3,"n":"QNAM - Unknown"},{"n":"NEXT - Marker"}]}]},{"t":2,"n":"RNAM - Prompt"},{"t":3,"n":"ANAM - Speaker"},{"t":3,"n":"TWAT - Walk Away Topic"},{"t":3,"n":"ONAM - Audio Output Override"}]},{"t":1,"n":"INGR - Ingredient","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"ENIT - Effect Data","c":[{"t":3,"n":"Ingredient Value"},{"t":3,"n":"Flags"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"n":"IPCT - Impact","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DATA - ","c":[{"t":5,"n":"Effect - Duration"},{"t":3,"n":"Effect - Orientation"},{"t":5,"n":"Angle Threshold"},{"t":5,"n":"Placement Radius"},{"t":3,"n":"Sound Level"},{"t":3,"n":"Flags"},{"t":3,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"DODT - Decal Data","c":[{"t":5,"n":"Min Width"},{"t":5,"n":"Max Width"},{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Depth"},{"t":5,"n":"Shininess"},{"t":6,"n":"Parallax","c":[{"t":5,"n":"Scale"},{"t":3,"n":"Passes"}]},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"DNAM - Texture Set"},{"t":3,"n":"ENAM - Secondary Texture Set"},{"t":3,"n":"SNAM - Sound 1"},{"t":3,"n":"NAM1 - Sound 2"},{"t":3,"n":"NAM2 - Hazard"}]},{"t":1,"n":"IPDS - Impact Data Set","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Data","c":[{"t":6,"n":"PNAM - ","c":[{"t":3,"n":"Material"},{"t":3,"n":"Impact"}]}]}]},{"t":1,"n":"KEYM - Key","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"n":"KYWD - Keyword","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LAND - Landscape","c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"n":"Layers","c":[{"t":6,"n":"Base Layer","c":[{"t":6,"n":"BTXT - Base Layer Header","c":[{"t":3,"n":"Texture"},{"t":3,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"n":"Layer"}]}]},{"t":6,"n":"Alpha Layer","c":[{"t":6,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"n":"Texture"},{"t":3,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"n":"Layer"}]},{"t":11,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"n":"VTEX - Textures","c":[{"t":3,"n":"Texture"}]}]},{"t":1,"n":"LCRT - Location Reference Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LENS - Lens Flare","c":[{"t":2,"n":"EDID - Editor ID"},{"t":5,"n":"CNAM - Color Influence"},{"t":5,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":8,"n":"Lens Flare Sprites","c":[{"t":6,"n":"Flare","c":[{"t":2,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"n":"FNAM - Texture"},{"t":6,"n":"LFSD - Lens Flare Data","c":[{"t":6,"n":"Tint","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":5,"n":"Width"},{"t":5,"n":"Height"},{"t":5,"n":"Position"},{"t":5,"n":"Angular Fade"},{"t":5,"n":"Opacity"},{"t":3,"n":"Flags"}]}]}]}]},{"t":1,"n":"LGTM - Lighting Template","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DATA - Lighting","c":[{"t":6,"n":"Ambient Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Directional Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Fog Color Near","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Near"},{"t":5,"n":"Fog Far"},{"t":3,"n":"Directional Rotation XY"},{"t":3,"n":"Directional Rotation Z"},{"t":5,"n":"Directional Fade"},{"t":5,"n":"Fog Clip Dist"},{"t":5,"n":"Fog Power"},{"t":6,"n":"Ambient Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"Fog Color Far","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Fog Max"},{"t":6,"n":"Light Fade Distances","c":[{"t":5,"n":"Start"},{"t":5,"n":"End"}]},{"t":11,"n":"Unknown"}]},{"t":6,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]}]},{"t":1,"n":"LIGH - Light","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Time"},{"t":3,"n":"Radius"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Flags"},{"t":5,"n":"Falloff Exponent"},{"t":5,"n":"FOV"},{"t":5,"n":"Near Clip"},{"t":6,"n":"Flicker Effect","c":[{"t":5,"n":"Period"},{"t":5,"n":"Intensity Amplitude"},{"t":5,"n":"Movement Amplitude"}]},{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":5,"n":"FNAM - Fade value"},{"t":3,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"NNAM - Loading Screen NIF"},{"t":5,"n":"SNAM - Initial Scale"},{"t":6,"n":"RNAM - Initial Rotation","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Z"}]},{"t":6,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":6,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"MOD2 - Camera Path"}]},{"t":1,"n":"LTEX - Landscape Texture","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"TNAM - Texture Set"},{"t":3,"n":"MNAM - Material Type"},{"t":6,"n":"HNAM - Havok Data","c":[{"t":3,"n":"Friction"},{"t":3,"n":"Restitution"}]},{"t":3,"n":"SNAM - Texture Specular Exponent"},{"t":8,"n":"Grasses","c":[{"t":3,"n":"GNAM - Grass"}]},{"t":3,"n":"INAM - Flags"}]},{"t":1,"n":"LVLI - Leveled Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]}]},{"t":1,"n":"LVLN - Leveled NPC","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":1,"n":"LVSP - Leveled Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":3,"n":"LVLD - Chance None"},{"t":3,"n":"LVLF - Flags"},{"t":3,"n":"LLCT - Count"},{"t":10,"n":"Leveled List Entries","c":[{"t":6,"n":"Leveled List Entry","c":[{"t":6,"n":"LVLO - Base Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reference"},{"t":3,"n":"Count"}]}]}]}]},{"t":1,"n":"MATO - Material Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":8,"n":"Property Data","c":[{"t":11,"n":"DNAM - Data"}]},{"t":6,"n":"DATA - Directional Material Data","c":[{"t":5,"n":"Falloff Scale"},{"t":5,"n":"Falloff Bias"},{"t":5,"n":"Noise UV Scale"},{"t":5,"n":"Material UV Scale"},{"t":6,"n":"Projection Vector","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":5,"n":"Normal Dampener"},{"t":6,"n":"Single Pass Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]}]},{"t":1,"n":"MATT - Material Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"PNAM - Material Parent"},{"t":2,"n":"MNAM - Material Name"},{"t":6,"n":"CNAM - Havok Display Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":5,"n":"BNAM - Buoyancy"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"HNAM - Havok Impact Data Set"}]},{"t":1,"p":1,"n":"MESG - Message","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"INAM - Icon (unused)"},{"t":3,"n":"QNAM - Owner Quest"},{"t":3,"n":"DNAM - Flags"},{"t":3,"n":"TNAM - Display Time"},{"t":8,"n":"Menu Buttons","c":[{"t":6,"n":"Menu Button","c":[{"t":2,"n":"ITXT - Button Text"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"Magic Effect Data","c":[{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"n":"Assoc. Item"},{"t":3,"n":"Magic Skill"},{"t":3,"n":"Resist Value"},{"t":3,"n":"Counter Effect count"},{"t":3,"n":"Casting Light"},{"t":5,"n":"Taper Weight"},{"t":3,"n":"Hit Shader"},{"t":3,"n":"Enchant Shader"},{"t":3,"n":"Minimum Skill Level"},{"t":6,"n":"Spellmaking","c":[{"t":3,"n":"Area"},{"t":5,"n":"Casting Time"}]},{"t":5,"n":"Taper Curve"},{"t":5,"n":"Taper Duration"},{"t":5,"n":"Second AV Weight"},{"t":3,"n":"Archtype"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Projectile"},{"t":3,"n":"Explosion"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Delivery"},{"t":3,"n":"Second Actor Value"},{"t":3,"n":"Casting Art"},{"t":3,"n":"Hit Effect Art"},{"t":3,"n":"Impact Data"},{"t":5,"n":"Skill Usage Multiplier"},{"t":6,"n":"Dual Casting","c":[{"t":3,"n":"Art"},{"t":5,"n":"Scale"}]},{"t":3,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"n":"Equip Ability"},{"t":3,"n":"Image Space Modifier"},{"t":3,"n":"Perk to Apply"},{"t":3,"n":"Casting Sound Level"},{"t":6,"n":"Script Effect AI","c":[{"t":5,"n":"Score"},{"t":5,"n":"Delay Time"}]}]}]},{"t":8,"n":"Counter Effects","c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"n":"SNDD - Sounds","c":[{"t":6,"n":"","c":[{"t":3,"n":"Type"},{"t":3,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"n":"MISC - Misc. Item","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]}]},{"t":1,"n":"MOVT - Movement Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"MNAM - Name"},{"t":6,"n":"SPED - Default Data","c":[{"t":5,"n":"Left Walk"},{"t":5,"n":"Left Run"},{"t":5,"n":"Right Walk"},{"t":5,"n":"Right Run"},{"t":5,"n":"Forward Walk"},{"t":5,"n":"Forward Run"},{"t":5,"n":"Back Walk"},{"t":5,"n":"Back Run"},{"t":5,"n":"Rotate in Place Walk"},{"t":5,"n":"Rotate in Place Run"},{"t":5,"n":"Rotate while Moving Run"}]},{"t":6,"n":"INAM - Anim Change Thresholds","c":[{"t":5,"n":"Directional"},{"t":5,"n":"Movement Speed"},{"t":5,"n":"Rotation Speed"}]}]},{"t":1,"n":"MSTT - Moveable Static","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"DATA - Flags"},{"t":3,"n":"SNAM - Looping Sound"}]},{"t":1,"n":"MUSC - Music Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"FNAM - Flags"},{"t":6,"n":"PNAM - Data","c":[{"t":3,"n":"Priority"},{"t":3,"n":"Ducking (dB)"}]},{"t":5,"n":"WNAM - Fade Duration"},{"t":7,"n":"TNAM - Music Tracks","c":[{"t":3,"n":"Track"}]}]},{"t":1,"n":"MUST - Music Track","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"CNAM - Track Type"},{"t":5,"n":"FLTV - Duration"},{"t":5,"n":"DNAM - Fade-Out"},{"t":2,"n":"ANAM - Track Filename"},{"t":2,"n":"BNAM - Finale Filename"},{"t":7,"n":"FNAM - Cue Points","c":[{"t":5,"n":"Point"}]},{"t":6,"n":"LNAM - Loop Data","c":[{"t":5,"n":"Loop Begins"},{"t":5,"n":"Loop Ends"},{"t":3,"n":"Loop Count"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"n":"SNAM - Tracks","c":[{"t":3,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"},{"t":3,"n":"Preferred Merges Flag"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":7,"n":"NVSI - Unknown","c":[{"t":3,"n":"Navigation Mesh"}]}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Geometry","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"External Connections","c":[{"t":6,"n":"Connection","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Mesh"},{"t":3,"n":"Triangle"}]}]},{"t":7,"n":"Door Triangles","c":[{"t":6,"n":"Door Triangle","c":[{"t":3,"n":"Triangle before door"},{"t":11,"n":"Unknown"},{"t":3,"n":"Door"}]}]}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"PNAM - Unknown"},{"t":11,"n":"NNAM - Unknown"}]},{"t":1,"n":"NPC_ - Non-Player Character (Actor)","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"ACBS - Configuration","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Magicka Offset"},{"t":3,"n":"Stamina Offset"},{"t":3,"n":"Level"},{"t":3,"n":"Level Mult"},{"t":3,"n":"Calc min level"},{"t":3,"n":"Calc max level"},{"t":3,"n":"Speed Multiplier"},{"t":3,"n":"Disposition Base (unused)"},{"t":3,"n":"Template Flags"},{"t":3,"n":"Health Offset"},{"t":3,"n":"Bleedout Override"}]},{"t":8,"n":"Factions","c":[{"t":6,"n":"SNAM - Faction","c":[{"t":3,"n":"Faction"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"INAM - Death item"},{"t":3,"n":"VTCK - Voice"},{"t":3,"n":"TPLT - Template"},{"t":3,"n":"RNAM - Race"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"WNAM - Worn Armor"},{"t":3,"n":"ANAM - Far away model"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"n":"Perks","c":[{"t":6,"n":"PRKR - Perk","c":[{"t":3,"n":"Perk"},{"t":3,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":6,"n":"AIDT - AI Data","c":[{"t":3,"n":"Aggression"},{"t":3,"n":"Confidence"},{"t":3,"n":"Energy Level"},{"t":3,"n":"Responsibility"},{"t":3,"n":"Mood"},{"t":3,"n":"Assistance"},{"t":6,"n":"Aggro","c":[{"t":3,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"n":"Warn"},{"t":3,"n":"Warn\/Attack"},{"t":3,"n":"Attack"}]}]},{"t":8,"n":"Packages","c":[{"t":3,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"CNAM - Class"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"n":"DNAM - Player Skills","c":[{"t":7,"n":"Skill Values","c":[{"t":3,"n":"Skill"}]},{"t":7,"n":"Skill Offsets","c":[{"t":3,"n":"Skill"}]},{"t":3,"n":"Health"},{"t":3,"n":"Magicka"},{"t":3,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"n":"Far away model distance"},{"t":3,"n":"Geared up weapons"}]},{"t":8,"n":"Head Parts","c":[{"t":3,"n":"PNAM - Head Part"}]},{"t":3,"n":"HCLF - Hair Color"},{"t":3,"n":"ZNAM - Combat Style"},{"t":3,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"n":"NAM6 - Height"},{"t":5,"n":"NAM7 - Weight"},{"t":3,"n":"NAM8 - Sound Level"},{"t":10,"n":"Sound Types","c":[{"t":6,"n":"Sound Type","c":[{"t":3,"n":"CSDT - Type"},{"t":10,"n":"Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"CSDI - Sound"},{"t":3,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"n":"CSCR - Inherits Sounds From"},{"t":3,"n":"DOFT - Default outfit"},{"t":3,"n":"SOFT - Sleeping outfit"},{"t":3,"n":"DPLT - Default Package List"},{"t":3,"n":"CRIF - Crime faction"},{"t":3,"n":"FTST - Head texture"},{"t":6,"n":"QNAM - Texture lighting","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":6,"n":"NAM9 - Face morph","c":[{"t":5,"n":"Nose Long\/Short"},{"t":5,"n":"Nose Up\/Down"},{"t":5,"n":"Jaw Up\/Down"},{"t":5,"n":"Jaw Narrow\/Wide"},{"t":5,"n":"Jaw Farward\/Back"},{"t":5,"n":"Cheeks Up\/Down"},{"t":5,"n":"Cheeks Farward\/Back"},{"t":5,"n":"Eyes Up\/Down"},{"t":5,"n":"Eyes In\/Out"},{"t":5,"n":"Brows Up\/Down"},{"t":5,"n":"Brows In\/Out"},{"t":5,"n":"Brows Farward\/Back"},{"t":5,"n":"Lips Up\/Down"},{"t":5,"n":"Lips In\/Out"},{"t":5,"n":"Chin Narrow\/Wide"},{"t":5,"n":"Chin Up\/Down"},{"t":5,"n":"Chin Underbite\/Overbite"},{"t":5,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}]},{"t":6,"n":"NAMA - Face parts","c":[{"t":3,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"n":"Eyes"},{"t":3,"n":"Mouth"}]},{"t":10,"n":"Tint Layers","c":[{"t":6,"n":"Layer","c":[{"t":3,"n":"TINI - Tint Index"},{"t":6,"n":"TINC - Tint Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":3,"n":"Alpha"}]},{"t":3,"n":"TINV - Interpolation Value"},{"t":3,"n":"TIAS - Preset"}]}]}]},{"t":1,"n":"OTFT - Outfit","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"INAM - Items","c":[{"t":3,"n":"Item"}]}]},{"t":1,"n":"PACK - Package","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]},{"t":6,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"Flags"},{"t":2,"n":"fileName"},{"t":7,"n":"Fragments","c":[{"t":6,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]},{"t":6,"n":"PKDT - Pack Data","c":[{"t":3,"n":"General Flags"},{"t":3,"n":"Type"},{"t":3,"n":"Interrupt Override"},{"t":3,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"n":"Interrupt Flags"}]},{"t":6,"n":"PSDT - Schedule","c":[{"t":3,"n":"Month"},{"t":3,"n":"Day of week"},{"t":3,"n":"Date"},{"t":3,"n":"Hour"},{"t":3,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"n":"Duration (minutes)"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"n":"Idle Animations","c":[{"t":3,"n":"IDLF - Flags"},{"t":6,"n":"IDLC - ","c":[{"t":3,"n":"Animation Count"},{"t":11,"n":"Unknown"}]},{"t":5,"n":"IDLT - Idle Timer Setting"},{"t":7,"n":"IDLA - Animations","c":[{"t":3,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"n":"CNAM - Combat Style"},{"t":3,"n":"QNAM - Owner Quest"},{"t":6,"n":"PKCU - Counter","c":[{"t":3,"n":"Data Input Count"},{"t":3,"n":"Package Template"},{"t":3,"n":"Version Counter (autoincremented)"}]},{"t":6,"n":"Package Data","c":[{"t":8,"n":"Data Input Values","c":[{"t":6,"n":"Value","c":[{"t":2,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"n":"Bool"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]},{"t":6,"n":"PLDT - Location","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Cell"},{"t":11,"n":"Near Package Start Location"},{"t":11,"n":"Near Editor Location"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Radius"}]},{"t":6,"n":"PTDA - Target","c":[{"t":6,"n":"Target Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Reference"},{"t":3,"n":"Object ID"},{"t":3,"n":"Object Type"},{"t":3,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"n":"Data Inputs","c":[{"t":6,"n":"Data Input","c":[{"t":3,"n":"UNAM - Index"},{"t":2,"n":"BNAM - Name"},{"t":3,"n":"PNAM - Flags"}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"n":"Procedure Tree","c":[{"t":8,"n":"Branches","c":[{"t":6,"n":"Branch","c":[{"t":2,"n":"ANAM - Branch Type"},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"n":"PRCB - Root","c":[{"t":3,"n":"Branch Count"},{"t":3,"n":"Flags"}]},{"t":2,"n":"PNAM - Procedure Type"},{"t":3,"n":"FNAM - Flags"},{"t":8,"n":"Data Input Indexes","c":[{"t":3,"n":"PKC2 - Index"}]},{"t":8,"n":"Flags Override","c":[{"t":6,"n":"PFO2 - Data","c":[{"t":3,"n":"Set General Flags"},{"t":3,"n":"Clear General Flags"},{"t":3,"n":"Set Interrupt Flags"},{"t":3,"n":"Clear Interrupt Flags"},{"t":3,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"n":"Data Inputs","c":[{"t":6,"n":"Data Input","c":[{"t":3,"n":"UNAM - Index"},{"t":2,"n":"BNAM - Name"},{"t":3,"n":"PNAM - Flags"}]}]},{"t":6,"n":"OnBegin","c":[{"n":"POBA - OnBegin Marker"},{"t":3,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]}]},{"t":6,"n":"OnEnd","c":[{"n":"POEA - OnEnd Marker"},{"t":3,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]}]},{"t":6,"n":"OnChange","c":[{"n":"POCA - OnChange Marker"},{"t":3,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCDA - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]}]}]},{"t":1,"n":"PARW - Placed Arrow","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PBAR - Placed Barrier","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PBEA - Placed Beam","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PCON - Placed Cone\/Voice","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PERK - Perk","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]},{"t":6,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"fileName"},{"t":7,"n":"Fragments","c":[{"t":6,"n":"Fragment","c":[{"t":3,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Trait"},{"t":3,"n":"Level"},{"t":3,"n":"Num Ranks"},{"t":3,"n":"Playable"},{"t":3,"n":"Hidden"}]},{"t":3,"n":"NNAM - Next Perk"},{"t":10,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":6,"n":"PRKE - Header","c":[{"t":3,"n":"Type"},{"t":3,"n":"Rank"},{"t":3,"n":"Priority"}]},{"t":6,"n":"Quest + Stage","c":[{"t":3,"n":"Quest"},{"t":3,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"n":"Ability"},{"t":6,"n":"Entry Point","c":[{"t":3,"n":"Entry Point"},{"t":3,"n":"Function"},{"t":3,"n":"Perk Condition Tab Count"}]},{"t":10,"n":"Perk Conditions","c":[{"t":6,"n":"Perk Condition","c":[{"t":3,"n":"PRKC - Run On (Tab Index)"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"n":"Function Parameters","c":[{"t":3,"n":"EPFT - Type"},{"t":2,"n":"EPF2 - Button Label"},{"t":6,"n":"EPF3 - Script Flags","c":[{"t":3,"n":"Script Flags"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Float"},{"t":6,"n":"Float, Float","c":[{"t":5,"n":"Float 1"},{"t":5,"n":"Float 2"}]},{"t":3,"n":"Leveled Item"},{"t":3,"n":"Spell"},{"t":2,"n":"Text"},{"t":6,"n":"Actor Value, Float","c":[{"t":3,"n":"Actor Value"},{"t":5,"n":"Float"}]}]},{"n":"PRKF - End Marker"}]}]}]},{"t":1,"n":"PFLA - Placed Flame","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PGRE - Placed Projectile","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PHZD - Placed Hazard","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PMIS - Placed Missile","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Projectile"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"PROJ - Projectile","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Gravity"},{"t":5,"n":"Speed"},{"t":5,"n":"Range"},{"t":3,"n":"Light"},{"t":3,"n":"Muzzle Flash - Light"},{"t":5,"n":"Tracer Chance"},{"t":5,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"n":"Explosion"},{"t":3,"n":"Sound"},{"t":5,"n":"Muzzle Flash - Duration"},{"t":5,"n":"Fade Duration"},{"t":5,"n":"Impact Force"},{"t":3,"n":"Sound - Countdown"},{"t":3,"n":"Sound - Disable"},{"t":3,"n":"Default Weapon Source"},{"t":5,"n":"Cone Spread"},{"t":5,"n":"Collision Radius"},{"t":5,"n":"Lifetime"},{"t":5,"n":"Relaunch Interval"},{"t":3,"n":"Decal Data"},{"t":3,"n":"Collision Layer"}]},{"t":6,"n":"Muzzle Flash Model","c":[{"t":2,"n":"NAM1 - Model Filename"},{"t":11,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"n":"VNAM - Sound Level"}]},{"t":1,"n":"PWAT","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"n":"QUST - Quest","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]},{"t":6,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"fragmentCount"},{"t":2,"n":"fileName"},{"t":7,"n":"Fragments","c":[{"t":6,"n":"Fragment","c":[{"t":3,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"n":"Quest Stage Index"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]},{"t":7,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Alias Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]}]}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"DNAM - General","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Priority"},{"t":3,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":2,"n":"ENAM - Event"},{"t":8,"n":"Text Display Globals","c":[{"t":3,"n":"QTGL - Global"}]},{"t":2,"n":"FLTR - Object Window Filter"},{"t":6,"n":"Quest Dialogue Conditions","c":[{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"n":"NEXT - Marker"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"INDX - Stage Index","c":[{"t":3,"n":"Stage Index"},{"t":3,"n":"Flags"},{"t":3,"n":"Unknown"}]},{"t":8,"n":"Log Entries","c":[{"t":6,"n":"Log Entry","c":[{"t":3,"n":"QSDT - Stage Flags"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"CNAM - Log Entry"},{"t":3,"n":"NAM0 - Next Quest"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"}]}]}]}]},{"t":8,"n":"Objectives","c":[{"t":6,"n":"Objective","c":[{"t":3,"n":"QOBJ - Objective Index"},{"t":3,"n":"FNAM - Flags"},{"t":2,"n":"NNAM - Display Text"},{"t":8,"n":"Targets","c":[{"t":6,"n":"Target","c":[{"t":6,"n":"QSTA - Target","c":[{"t":3,"n":"Alias"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"n":"Aliases","c":[{"t":6,"n":"Alias","c":[{"t":3,"n":"ALST - Reference Alias ID"},{"t":2,"n":"ALID - Alias Name"},{"t":6,"n":"FNAM - Alias Flags","c":[{"t":3,"n":"Flags"},{"t":3,"n":"Additional Flags"}]},{"t":3,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"n":"ALFL - Specific Location"},{"t":3,"n":"ALFR - Forced Reference"},{"t":3,"n":"ALUA - Unique Actor"},{"t":6,"n":"Location Alias Reference","c":[{"t":3,"n":"ALFA - Alias"},{"t":3,"n":"KNAM - Keyword"},{"t":3,"n":"ALRT - Ref Type"}]},{"t":6,"n":"External Alias Reference","c":[{"t":3,"n":"ALEQ - Quest"},{"t":3,"n":"ALEA - Alias"}]},{"t":6,"n":"Create Reference to Object","c":[{"t":3,"n":"ALCO - Object"},{"t":6,"n":"ALCA - Alias","c":[{"t":3,"n":"Alias"},{"t":3,"n":"Create"}]},{"t":3,"n":"ALCL - Level"}]},{"t":6,"n":"Find Matching Reference Near Alias","c":[{"t":3,"n":"ALNA - Alias"},{"t":3,"n":"ALNT - Type"}]},{"t":6,"n":"Find Matching Reference From Event","c":[{"t":2,"n":"ALFE - From Event"},{"t":11,"n":"ALFD - Event Data"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"ALDN - Display Name"},{"t":8,"n":"Alias Spells","c":[{"t":3,"n":"ALSP - Spell"}]},{"t":8,"n":"Alias Factions","c":[{"t":3,"n":"ALFC - Faction"}]},{"t":8,"n":"Alias Package Data","c":[{"t":3,"n":"ALPC - Package"}]},{"t":3,"n":"VTCK - Voice Types"},{"n":"ALED - Alias End"}]}]},{"t":2,"n":"NNAM - Description"},{"t":8,"n":"Targets","c":[{"t":6,"n":"Target","c":[{"t":6,"n":"QSTA - Target","c":[{"t":3,"n":"Target"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"n":"Actor Effects","c":[{"t":3,"n":"SPLO - Actor Effect"}]},{"t":3,"n":"WNAM - Skin"},{"t":6,"n":"BOD2 - Biped Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":6,"n":"BODT - Body Template","c":[{"t":3,"n":"First Person Flags"},{"t":3,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":7,"n":"Skill Boosts","c":[{"t":6,"n":"Skill Boost","c":[{"t":3,"n":"Skill"},{"t":3,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"n":"Male Height"},{"t":5,"n":"Female Height"},{"t":5,"n":"Male Weight"},{"t":5,"n":"Female Weight"},{"t":3,"n":"Flags"},{"t":5,"n":"Starting Health"},{"t":5,"n":"Starting Magicka"},{"t":5,"n":"Starting Stamina"},{"t":5,"n":"Base Carry Weight"},{"t":5,"n":"Base Mass"},{"t":5,"n":"Acceleration rate"},{"t":5,"n":"Deceleration rate"},{"t":3,"n":"Size"},{"t":3,"n":"Head Biped Object"},{"t":3,"n":"Hair Biped Object"},{"t":5,"n":"Injured Health Pct"},{"t":3,"n":"Shield Biped Object"},{"t":5,"n":"Health Regen"},{"t":5,"n":"Magicka Regen"},{"t":5,"n":"Stamina Regen"},{"t":5,"n":"Unarmed Damage"},{"t":5,"n":"Unarmed Reach"},{"t":3,"n":"Body Biped Object"},{"t":5,"n":"Aim Angle Tolerance"},{"t":5,"n":"Flight Radius"},{"t":5,"n":"Angular Acceleration Rate"},{"t":5,"n":"Angular Tolerance"},{"t":3,"n":"Flags 2"},{"t":6,"n":"Mount Data","c":[{"t":5,"n":"Offset X"},{"t":5,"n":"Offset Y"},{"t":5,"n":"Unknown"}]}]},{"n":"MNAM - Male Marker"},{"t":2,"n":"ANAM - Male Skeletal Model"},{"t":11,"n":"MODT - Texture Files Hashes"},{"n":"FNAM - Female Marker"},{"t":2,"n":"ANAM - Female Skeletal Model"},{"n":"NAM2 - Marker NAM2 #1"},{"t":8,"n":"Movement Type Names","c":[{"t":2,"n":"MTNM - Name"}]},{"t":7,"n":"VTCK - Voices","c":[{"t":3,"n":"Voice"}]},{"t":7,"n":"DNAM - Decapitate Armors","c":[{"t":3,"n":"Decapitate Armor"}]},{"t":7,"n":"HCLF - Default Hair Colors","c":[{"t":3,"n":"Default Hair Color"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"n":"ATKR - Attack Race"},{"t":10,"n":"Attacks","c":[{"t":6,"n":"Attack","c":[{"t":6,"n":"ATKD - Attack Data","c":[{"t":5,"n":"Damage Mult"},{"t":5,"n":"Attack Chance"},{"t":3,"n":"Attack Spell"},{"t":3,"n":"Attack Flags"},{"t":5,"n":"Attack Angle"},{"t":5,"n":"Strike Angle"},{"t":5,"n":"Stagger"},{"t":3,"n":"Attack Type"},{"t":5,"n":"Knockdown"},{"t":5,"n":"Recovery Time"},{"t":5,"n":"Stamina Mult"}]},{"t":2,"n":"ATKE - Attack Event"}]}]},{"t":6,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]}]}]},{"t":6,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Parts","c":[{"t":6,"n":"Part","c":[{"t":3,"n":"INDX - Index"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]}]}]}]},{"t":7,"n":"HNAM - Hairs","c":[{"t":3,"n":"Hair"}]},{"t":7,"n":"ENAM - Eyes","c":[{"t":3,"n":"Eye"}]},{"t":3,"n":"GNAM - Body Part Data"},{"n":"NAM2 - Marker NAM2 #2"},{"n":"NAM3 - Marker NAM3 #3"},{"t":6,"n":"Male Behavior Graph","c":[{"n":"MNAM - Male Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":6,"n":"Female Behavior Graph","c":[{"n":"FNAM - Female Data Marker"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":3,"n":"NAM4 - Material Type"},{"t":3,"n":"NAM5 - Impact Data Set"},{"t":3,"n":"NAM7 - Decapitation FX"},{"t":3,"n":"ONAM - Open Loot Sound"},{"t":3,"n":"LNAM - Close Loot Sound"},{"t":8,"n":"Biped Object Names","c":[{"t":2,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Override Values","c":[{"t":5,"n":"Left - Walk"},{"t":5,"n":"Left - Run"},{"t":5,"n":"Right - Walk"},{"t":5,"n":"Right - Run"},{"t":5,"n":"Forward - Walk"},{"t":5,"n":"Forward - Run"},{"t":5,"n":"Back - Walk"},{"t":5,"n":"Back - Run"},{"t":5,"n":"Rotate - Walk"},{"t":5,"n":"Unknown"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":8,"n":"Equip Slots","c":[{"t":3,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"n":"Male Head Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"n":"Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Male","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Male","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Male","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Default Face Texture Male"},{"t":8,"n":"Tint Masks","c":[{"t":6,"n":"Tint Assets","c":[{"t":8,"n":"Tint Layer","c":[{"t":6,"n":"Texture","c":[{"t":3,"n":"TINI - Index"},{"t":2,"n":"TINT - File Name"},{"t":3,"n":"TINP - Mask Type"},{"t":3,"n":"TIND - Preset Default"}]}]},{"t":8,"n":"Presets","c":[{"t":6,"n":"Preset","c":[{"t":3,"n":"TINC - Color"},{"t":5,"n":"TINV - Default Value"},{"t":3,"n":"TIRS - Index"}]}]}]}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":6,"n":"Female Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"n":"FNAM - Female Data Marker"},{"t":10,"n":"Head Parts","c":[{"t":6,"n":"Head Part","c":[{"t":3,"n":"INDX - Head Part Number"},{"t":3,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Female","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Female","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Female","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Default Face Texture Female"},{"t":8,"n":"Tint Masks","c":[{"t":6,"n":"Tint Assets","c":[{"t":8,"n":"Tint Layer","c":[{"t":6,"n":"Texture","c":[{"t":3,"n":"TINI - Index"},{"t":2,"n":"TINT - File Name"},{"t":3,"n":"TINP - Mask Type"},{"t":3,"n":"TIND - Preset Default"}]}]},{"t":8,"n":"Presets","c":[{"t":6,"n":"Preset","c":[{"t":3,"n":"TINC - Color"},{"t":5,"n":"TINV - Default Value"},{"t":3,"n":"TIRS - Index"}]}]}]}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"n":"REFR - Placed Object","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Base"},{"t":6,"n":"XMBO - Bound Half Extents","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"XPRM - Primitive","c":[{"t":6,"n":"Bounds","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Color","c":[{"t":5,"n":"Red"},{"t":5,"n":"Green"},{"t":5,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":7,"n":"XPOD - Portal Data","c":[{"t":6,"n":"References","c":[{"t":3,"n":"Origin"},{"t":3,"n":"Destination"}]}]},{"t":6,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"n":"Size","c":[{"t":5,"n":"Width"},{"t":5,"n":"Height"}]},{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation (Quaternion?)","c":[{"t":5,"n":"q1"},{"t":5,"n":"q2"},{"t":5,"n":"q3"},{"t":5,"n":"q4"}]}]},{"t":6,"n":"Bound Data","c":[{"t":6,"n":"XRMR - Header","c":[{"t":3,"n":"Linked Rooms Count"},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"LNAM - Lighting Template"},{"t":3,"n":"INAM - Image Space"},{"t":8,"n":"Linked Rooms","c":[{"t":3,"n":"XLRM - Linked Room"}]}]},{"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"n":"XRDS - Radius"},{"t":8,"n":"Reflected\/Refracted By","c":[{"t":6,"n":"XPWR - Water","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Lit Water","c":[{"t":3,"n":"XLTW - Water"}]},{"t":3,"n":"XEMI - Emittance"},{"t":6,"n":"XLIG - Light Data","c":[{"t":5,"n":"FOV 90+\/-"},{"t":5,"n":"Fade 1.35+\/-"},{"t":11,"n":"Unknown"},{"t":5,"n":"Shadow Depth Bias"}]},{"t":6,"n":"XALP - Alpha","c":[{"t":3,"n":"Cutoff"},{"t":3,"n":"Base"}]},{"t":6,"n":"XTEL - Teleport Destination","c":[{"t":3,"n":"Door"},{"t":6,"n":"Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]},{"t":3,"n":"Flags"}]},{"t":3,"n":"XTNM - Teleport Message Box"},{"t":3,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"n":"XWCU - Water Velocity","c":[{"t":5,"n":"X Offset"},{"t":5,"n":"Y Offset"},{"t":5,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"},{"t":5,"n":"Y Angle"},{"t":5,"n":"Z Angle"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"n":"XSCL - Scale"},{"t":3,"n":"XSPC - Spawn Container"},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":3,"n":"XLIB - Leveled Item Base Object"},{"t":3,"n":"XLCM - Level Modifier"},{"t":3,"n":"XLCN - Persistent Location"},{"t":3,"n":"XTRI - Collision Layer"},{"t":6,"n":"XLOC - Lock Data","c":[{"t":3,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"n":"Key"},{"t":3,"n":"Flags"}]},{"t":3,"n":"XEZN - Encounter Zone"},{"t":6,"n":"XNDP - Navigation Door Link","c":[{"t":3,"n":"Navigation Mesh"},{"t":3,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"n":"XIS2 - Ignored by Sandbox"},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XCNT - Item Count"},{"t":5,"n":"XCHG - Charge"},{"t":3,"n":"XLRL - Location Reference"},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":8,"n":"Patrol","c":[{"t":6,"n":"Data","c":[{"t":5,"n":"XPRD - Idle Time"},{"n":"XPPA - Patrol Script Marker"},{"t":3,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]}]}]},{"t":3,"n":"XACT - Action Flag"},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"n":"ONAM - Open by Default"},{"t":6,"n":"Map Marker","c":[{"n":"XMRK - Map Marker Data"},{"t":3,"n":"FNAM - Map Flags"},{"t":2,"n":"FULL - Name"},{"t":6,"n":"TNAM - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"XATR - Attach Ref"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]},{"t":1,"n":"REGN - Region","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"RCLR - Map Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"n":"WNAM - Worldspace"},{"t":8,"n":"Region Areas","c":[{"t":6,"n":"Region Area","c":[{"t":3,"n":"RPLI - Edge Fall-off"},{"t":7,"n":"RPLD - Region Point List Data","c":[{"t":6,"n":"Point","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]}]}]}]},{"t":10,"n":"Region Data Entries","c":[{"t":6,"n":"Region Data Entry","c":[{"t":6,"n":"RDAT - Data Header","c":[{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":3,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"RDMO - Music"},{"t":7,"n":"RDSA - Sounds","c":[{"t":6,"n":"Sound","c":[{"t":3,"n":"Sound"},{"t":3,"n":"Flags"},{"t":5,"n":"Chance"}]}]},{"t":2,"n":"RDMP - Map Name"},{"t":7,"n":"RDOT - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Object"},{"t":3,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"n":"Density"},{"t":3,"n":"Clustering"},{"t":3,"n":"Min Slope"},{"t":3,"n":"Max Slope"},{"t":3,"n":"Flags"},{"t":3,"n":"Radius wrt Parent"},{"t":3,"n":"Radius"},{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Sink"},{"t":5,"n":"Sink Variance"},{"t":5,"n":"Size Variance"},{"t":6,"n":"Angle Variance","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"},{"t":3,"n":"Z"}]}]}]},{"t":7,"n":"RDGS - Grasses","c":[{"t":6,"n":"Grass","c":[{"t":3,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"n":"RDWT - Weather Types","c":[{"t":6,"n":"Weather Type","c":[{"t":3,"n":"Weather"},{"t":3,"n":"Chance"},{"t":3,"n":"Global"}]}]}]}]}]},{"t":1,"n":"RELA - Relationship","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Parent"},{"t":3,"n":"Child"},{"t":3,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"n":"Flags"},{"t":3,"n":"Association Type"}]}]},{"t":1,"n":"REVB - Reverb Parameters","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Decay Time (ms)"},{"t":3,"n":"HF Reference (Hz)"},{"t":3,"n":"Room Filter"},{"t":3,"n":"Room HF Filter"},{"t":3,"n":"Reflections"},{"t":3,"n":"Reverb Amp"},{"t":3,"n":"Decay HF Ratio"},{"t":3,"n":"Reflect Delay (ms), scaled"},{"t":3,"n":"Reverb Delay (ms)"},{"t":3,"n":"Diffusion %"},{"t":3,"n":"Density %"},{"t":3,"n":"Unknown"}]}]},{"t":1,"n":"RFCT - Visual Effect","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"DATA - Effect Data","c":[{"t":3,"n":"Effect Art"},{"t":3,"n":"Shader"},{"t":3,"n":"Flags"}]}]},{"t":1,"n":"RGDL","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"n":"SCEN - Scene","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]},{"t":6,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"n":"Flags"},{"t":2,"n":"fileName"},{"t":7,"n":"Fragments","c":[{"t":6,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]},{"t":7,"n":"Phase Fragments","c":[{"t":6,"n":"Phase Fragment","c":[{"t":3,"n":"Phase Flag"},{"t":3,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"n":"scriptName"},{"t":2,"n":"fragmentName"}]}]}]}]},{"t":3,"n":"FNAM - Flags"},{"t":8,"n":"Phases","c":[{"t":6,"n":"Phase","c":[{"n":"HNAM - Marker Phase Start"},{"t":2,"n":"NAM0 - Name"},{"t":6,"n":"Start Conditions","c":[{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"n":"NEXT - Marker"},{"t":6,"n":"Completion Conditions","c":[{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":3,"n":"WNAM - Editor Width"},{"n":"HNAM - Marker Phase End"}]}]},{"t":8,"n":"Actors","c":[{"t":6,"n":"Actor","c":[{"t":3,"n":"ALID - Actor ID"},{"t":3,"n":"LNAM - Flags"},{"t":3,"n":"DNAM - Behaviour Flags"}]}]},{"t":8,"n":"Actions","c":[{"t":6,"n":"Action","c":[{"t":3,"n":"ANAM - Type"},{"t":2,"n":"NAM0 - Name"},{"t":3,"n":"ALID - Actor ID"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"n":"INAM - Index"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"SNAM - Start Phase"},{"t":3,"n":"ENAM - End Phase"},{"t":5,"n":"SNAM - Timer Seconds"},{"t":8,"n":"Packages","c":[{"t":3,"n":"PNAM - Package"}]},{"t":3,"n":"DATA - Topic"},{"t":3,"n":"HTID - Headtrack Actor ID"},{"t":5,"n":"DMAX - Looping - Max"},{"t":5,"n":"DMIN - Looping - Min"},{"t":3,"n":"DEMO - Emotion Type"},{"t":3,"n":"DEVA - Emotion Value"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"n":"ANAM - End Marker"}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"n":"NEXT - Marker"},{"t":3,"n":"PNAM - Quest"},{"t":3,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"n":"SCOL","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"n":"SCPT","c":[{"t":2,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCRL - Scroll","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":6,"n":"DATA - Item","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"MDOB - Menu Display Object"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"n":"Words of Power","c":[{"t":6,"n":"SNAM - ","c":[{"t":3,"n":"Word"},{"t":3,"n":"Spell"},{"t":5,"n":"Recovery Time"}]}]}]},{"t":1,"n":"SLGM - Soul Gem","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":6,"n":"DATA - ","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"}]},{"t":3,"n":"SOUL - Contained Soul"},{"t":3,"n":"SLCP - Maximum Capacity"},{"t":3,"n":"NAM0 - Linked To"}]},{"t":1,"n":"SMBN - Story Manager Branch Node","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"PNAM - Parent "},{"t":3,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"n":"SMEN - Story Manager Event Node","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"PNAM - Parent "},{"t":3,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"},{"t":2,"n":"ENAM - Type"}]},{"t":1,"n":"SMQN - Story Manager Quest Node","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"PNAM - Parent "},{"t":3,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"n":"DNAM - Flags","c":[{"t":3,"n":"Node Flags"},{"t":3,"n":"Quest Flags"}]},{"t":3,"n":"XNAM - Max concurrent quests"},{"t":3,"n":"MNAM - Num quests to run"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"n":"Quests","c":[{"t":6,"n":"Quest","c":[{"t":3,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"n":"SNCT - Sound Category","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":3,"n":"FNAM - Flags"},{"t":3,"n":"PNAM - Parent"},{"t":3,"n":"VNAM - Static Volume Multiplier"},{"t":3,"n":"UNAM - Default Menu Value"}]},{"t":1,"n":"SNDR - Sound Descriptor","c":[{"t":2,"n":"EDID - Editor ID"},{"t":11,"n":"CNAM - Unknown"},{"t":3,"n":"GNAM - Category"},{"t":3,"n":"SNAM - Alternate Sound For"},{"t":8,"n":"Sounds","c":[{"t":6,"n":"Sound Files","c":[{"t":2,"n":"ANAM - File Name"}]}]},{"t":3,"n":"ONAM - Output Model"},{"t":2,"n":"FNAM - String"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Looping"},{"t":3,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"n":"BNAM - Values","c":[{"t":3,"n":"% Frequency Shift"},{"t":3,"n":"% Frequency Variance"},{"t":3,"n":"Priority"},{"t":3,"n":"db Variance"},{"t":3,"n":"Static Attenuation (db)"}]}]},{"t":1,"n":"SOPM - Sound Output Model","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NAM1 - Data","c":[{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":3,"n":"Reverb Send %"}]},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"MNAM - Type"},{"t":11,"n":"CNAM - Unknown"},{"t":11,"n":"SNAM - Unknown"},{"t":6,"n":"ONAM - Output Values","c":[{"t":7,"n":"Channels","c":[{"t":6,"n":"","c":[{"t":3,"n":"L"},{"t":3,"n":"R"},{"t":3,"n":"C"},{"t":3,"n":"LFE"},{"t":3,"n":"RL"},{"t":3,"n":"RR"},{"t":3,"n":"BL"},{"t":3,"n":"BR"}]}]}]},{"t":6,"n":"ANAM - Attenuation Values","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"Min Distance"},{"t":5,"n":"Max Distance"},{"t":7,"n":"Curve","c":[{"t":3,"n":"Value"}]}]}]},{"t":1,"n":"SOUN - Sound Marker","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":11,"n":"FNAM - Unknown"},{"t":11,"n":"SNDD - Unknown"},{"t":3,"n":"SDSC - Sound Descriptor"}]},{"t":1,"p":1,"n":"SPEL - Spell","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"MDOB - Menu Display Object"},{"t":3,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"SPIT - Data","c":[{"t":3,"n":"Base Cost"},{"t":3,"n":"Flags"},{"t":3,"n":"Type"},{"t":5,"n":"Charge Time"},{"t":3,"n":"Cast Type"},{"t":3,"n":"Target Type"},{"t":5,"n":"Cast Duration"},{"t":5,"n":"Range"},{"t":3,"n":"Half-cost Perk"}]},{"t":8,"n":"Effects","c":[{"t":6,"n":"Effect","c":[{"t":3,"n":"EFID - Base Effect"},{"t":6,"n":"EFIT - ","c":[{"t":5,"n":"Magnitude"},{"t":3,"n":"Area"},{"t":3,"n":"Duration"}]},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"n":"SPGD - Shader Particle Geometry","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"Data","c":[{"t":5,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"n":"Rotation Velocity"},{"t":5,"n":"Particle Size X"},{"t":5,"n":"Center Offset Min"},{"t":5,"n":"Particle Size Y"},{"t":5,"n":"Center Offset Max"},{"t":5,"n":"Initial Rotation"},{"t":3,"n":"# of Subtextures X"},{"t":3,"n":"# of Subtextures Y"},{"t":3,"n":"Type"},{"t":3,"n":"Box Size"},{"t":5,"n":"Particle Density"}]},{"t":2,"n":"ICON - Particle Texture"}]},{"t":1,"n":"STAT - Static","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"DNAM - Direction Material","c":[{"t":5,"n":"Max Angle (30-120)"},{"t":3,"n":"Material"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":7,"n":"MNAM - Distant LOD","c":[{"t":6,"n":"LOD","c":[{"t":2,"n":"Mesh"}]}]}]},{"t":1,"n":"TACT - Talking Activator","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"n":"VNAM - Voice Type"}]},{"t":1,"n":"TES4 - Main File Header","c":[{"t":6,"n":"HEDR - Header","c":[{"t":5,"n":"Version"},{"t":3,"n":"Number of Records"},{"t":3,"n":"Next Object ID"}]},{"t":11,"n":"OFST - Unknown"},{"t":11,"n":"DELE - Unknown"},{"t":2,"n":"CNAM - Author"},{"t":2,"n":"SNAM - Description"},{"t":8,"n":"Master Files","c":[{"t":6,"n":"Master File","c":[{"t":2,"n":"MAST - Filename"},{"t":11,"n":"DATA - Unknown"}]}]},{"t":7,"n":"ONAM - Overridden Forms","c":[{"t":3,"n":"Form"}]},{"t":11,"n":"SCRN - Screenshot"},{"t":11,"n":"INTV - Unknown"},{"t":11,"n":"INCC - Unknown"}]},{"t":1,"n":"TREE - Tree","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":3,"n":"PFIG - Ingredient"},{"t":3,"n":"SNAM - Harvest Sound"},{"t":6,"n":"PFPC - Ingredient Production","c":[{"t":3,"n":"Spring"},{"t":3,"n":"Summer"},{"t":3,"n":"Fall"},{"t":3,"n":"Winter"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"CNAM - Tree Data","c":[{"t":5,"n":"Trunk Flexibility"},{"t":5,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"n":"Leaf Amplitude"},{"t":5,"n":"Leaf Frequency"}]}]},{"t":1,"n":"TXST - Texture Set","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":6,"n":"Textures (RGB\/A)","c":[{"t":2,"n":"TX00 - Difuse"},{"t":2,"n":"TX01 - Normal\/Gloss"},{"t":2,"n":"TX02 - Environment Mask\/Subsurface Tint"},{"t":2,"n":"TX03 - Glow\/Detail Map"},{"t":2,"n":"TX04 - Height"},{"t":2,"n":"TX05 - Environment"},{"t":2,"n":"TX06 - Multilayer"},{"t":2,"n":"TX07 - Backlight Mask\/Specular"}]},{"t":6,"n":"DODT - Decal Data","c":[{"t":5,"n":"Min Width"},{"t":5,"n":"Max Width"},{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Depth"},{"t":5,"n":"Shininess"},{"t":6,"n":"Parallax","c":[{"t":5,"n":"Scale"},{"t":3,"n":"Passes"}]},{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"n":"Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"DNAM - Flags"}]},{"t":1,"n":"VOLI - Volumetric Lighting","c":[{"t":2,"n":"EDID - Editor ID"},{"t":5,"n":"CNAM - Intensity"},{"t":5,"n":"DNAM - Custom Color - Contribution"},{"t":5,"n":"ENAM - Red"},{"t":5,"n":"FNAM - Green"},{"t":5,"n":"GNAM - Blue"},{"t":5,"n":"HNAM - Density - Contribution"},{"t":5,"n":"INAM - Density - Size"},{"t":5,"n":"JNAM - Density - Wind Speed"},{"t":5,"n":"KNAM - Density - Falling Speed"},{"t":5,"n":"LNAM - Phase Function - Contribution"},{"t":5,"n":"MNAM - Phase Function - Scattering"},{"t":5,"n":"NNAM - Sampling Repartition - Range Factor"}]},{"t":1,"n":"VTYP - Voice Type","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"DNAM - Flags"}]},{"t":1,"n":"WATR - Water","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":8,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"n":"ANAM - Opacity"},{"t":3,"n":"FNAM - Flags"},{"t":11,"n":"MNAM - Unused"},{"t":3,"n":"TNAM - Material"},{"t":3,"n":"SNAM - Open Sound"},{"t":3,"n":"XNAM - Spell"},{"t":3,"n":"INAM - Image Space"},{"t":3,"n":"DATA - Damage Per Second"},{"t":6,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"n":"Specular Properties - Sun Specular Power"},{"t":5,"n":"Water Properties - Reflectivity Amount"},{"t":5,"n":"Water Properties - Fresnel Amount"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"n":"Shallow Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Deep Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Reflection Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Displacement Simulator - Starting Size"},{"t":5,"n":"Displacement Simulator - Force"},{"t":5,"n":"Displacement Simulator - Velocity"},{"t":5,"n":"Displacement Simulator - Falloff"},{"t":5,"n":"Displacement Simulator - Dampner"},{"t":5,"n":"Noise Properties - Noise Falloff"},{"t":5,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"n":"Water Properties - Refraction Magnitude"},{"t":5,"n":"Specular Properties - Specular Power"},{"t":5,"n":"Specular Properties - Specular Radius"},{"t":5,"n":"Specular Properties - Specular Brightness"},{"t":5,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"n":"Water Properties - Reflection Magnitude"},{"t":5,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"n":"Depth Properties - Reflections"},{"t":5,"n":"Depth Properties - Refraction"},{"t":5,"n":"Depth Properties - Normals"},{"t":5,"n":"Depth Properties - Specular Lighting"},{"t":5,"n":"Specular Properties - Sun Sparkle Power"},{"t":5,"n":"Noise Properties - Flowmap Scale"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"n":"NAM0 - Linear Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"NAM1 - Angular Velocity","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":2,"n":"NAM2 - Noise Layer One - Noise Texture"},{"t":2,"n":"NAM3 - Noise Layer Two - Noise Texture"},{"t":2,"n":"NAM4 - Noise Layer Three - Noise Texture"},{"t":2,"n":"NAM5 - Flow Normals - Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":6,"n":"OBND - Object Bounds","c":[{"t":3,"n":"X1"},{"t":3,"n":"Y1"},{"t":3,"n":"Z1"},{"t":3,"n":"X2"},{"t":3,"n":"Y2"},{"t":3,"n":"Z2"}]},{"t":2,"n":"FULL - Name"},{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":6,"n":"Icon","c":[{"t":2,"n":"ICON - Large Icon filename"},{"t":2,"n":"MICO - Small Icon filename"}]},{"t":3,"n":"EITM - Object Effect"},{"t":3,"n":"EAMT - Enchantment Amount"},{"t":6,"n":"Destructable","c":[{"t":6,"n":"DEST - Header","c":[{"t":3,"n":"Health"},{"t":3,"n":"DEST Count"},{"t":3,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"n":"Stages","c":[{"t":6,"n":"Stage","c":[{"t":6,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"n":"Health %"},{"t":3,"n":"Index"},{"t":3,"n":"Model Damage Stage"},{"t":3,"n":"Flags"},{"t":3,"n":"Self Damage per Second"},{"t":3,"n":"Explosion"},{"t":3,"n":"Debris"},{"t":3,"n":"Debris Count"}]},{"t":6,"n":"Model","c":[{"t":2,"n":"DMDL - Model Filename"},{"t":11,"n":"DMDT - Texture Files Hashes"},{"t":7,"n":"DMDS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"ETYP - Equipment Type"},{"t":3,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"n":"BAMT - Alternate Block Material"},{"t":3,"n":"YNAM - Sound - Pick Up"},{"t":3,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"n":"Has Scope","c":[{"t":2,"n":"MOD3 - Model Filename"},{"t":11,"n":"MO3T - Texture Files Hashes"},{"t":7,"n":"MO3S - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"n":"INAM - Impact Data Set"},{"t":3,"n":"WNAM - 1st Person Model Object"},{"t":3,"n":"SNAM - Attack Sound"},{"t":3,"n":"XNAM - Attack Sound 2D"},{"t":3,"n":"NAM7 - Attack Loop Sound"},{"t":3,"n":"TNAM - Attack Fail Sound"},{"t":3,"n":"UNAM - Idle Sound"},{"t":3,"n":"NAM9 - Equip Sound"},{"t":3,"n":"NAM8 - Unequip Sound"},{"t":6,"n":"DATA - Game Data","c":[{"t":3,"n":"Value"},{"t":5,"n":"Weight"},{"t":3,"n":"Damage"}]},{"t":6,"n":"DNAM - Data","c":[{"t":3,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Speed"},{"t":5,"n":"Reach"},{"t":3,"n":"Flags"},{"t":5,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"n":"Base VATS To-Hit Chance"},{"t":3,"n":"Attack Animation"},{"t":3,"n":"# Projectiles"},{"t":3,"n":"Embedded Weapon AV (unused)"},{"t":5,"n":"Range Min"},{"t":5,"n":"Range Max"},{"t":3,"n":"On Hit"},{"t":3,"n":"Flags2"},{"t":5,"n":"Animation Attack Mult"},{"t":5,"n":"Rumble - Left Motor Strength"},{"t":5,"n":"Rumble - Right Motor Strength"},{"t":5,"n":"Rumble - Duration"},{"t":3,"n":"Skill"},{"t":3,"n":"Resist"},{"t":5,"n":"Stagger"}]},{"t":6,"n":"CRDT - Critical Data","c":[{"t":3,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"n":"% Mult"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"n":"Effect"}]},{"t":3,"n":"VNAM - Detection Sound Level"},{"t":3,"n":"CNAM - Template"}]},{"t":1,"n":"WOOP - Word of Power","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"FULL - Name"},{"t":2,"n":"TNAM - Translation"}]},{"t":1,"n":"WRLD - Worldspace","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Large References","c":[{"t":6,"n":"RNAM - Grid","c":[{"t":3,"n":"Y"},{"t":3,"n":"X"},{"t":7,"n":"References","c":[{"t":6,"n":"Reference","c":[{"t":3,"n":"Ref"},{"t":3,"n":"Y"},{"t":3,"n":"X"}]}]}]}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"n":"FULL - Name"},{"t":6,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":3,"n":"LTMP - Interior Lighting"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":3,"n":"XLCN - Location"},{"t":6,"n":"Parent","c":[{"t":3,"n":"WNAM - Worldspace"},{"t":6,"n":"PNAM - ","c":[{"t":3,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"n":"CNAM - Climate"},{"t":3,"n":"NAM2 - Water"},{"t":3,"n":"NAM3 - LOD Water Type"},{"t":5,"n":"NAM4 - LOD Water Height"},{"t":6,"n":"DNAM - Land Data","c":[{"t":5,"n":"Default Land Height"},{"t":5,"n":"Default Water Height"}]},{"t":2,"n":"ICON - Map Image"},{"t":6,"n":"Cloud Model","c":[{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":6,"n":"MNAM - Map Data","c":[{"t":6,"n":"Usable Dimensions","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"Cell Coordinates","c":[{"t":6,"n":"NW Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]},{"t":6,"n":"SE Cell","c":[{"t":3,"n":"X"},{"t":3,"n":"Y"}]}]},{"t":6,"n":"Camera Data","c":[{"t":5,"n":"Min Height"},{"t":5,"n":"Max Height"},{"t":5,"n":"Initial Pitch"}]}]},{"t":6,"n":"ONAM - World Map Offset Data","c":[{"t":5,"n":"World Map Scale"},{"t":5,"n":"Cell X Offset"},{"t":5,"n":"Cell Y Offset"},{"t":5,"n":"Cell Z Offset"}]},{"t":5,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"n":"DATA - Flags"},{"t":6,"n":"Object Bounds","c":[{"t":6,"n":"NAM0 - Min","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]},{"t":6,"n":"NAM9 - Max","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"}]}]},{"t":3,"n":"ZNAM - Music"},{"t":2,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"n":"XNAM - Water Noise Texture"},{"t":2,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"n":"WTHR - Weather","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"DNAM - Unused"},{"t":11,"n":"CNAM - Unused"},{"t":11,"n":"ANAM - Unused"},{"t":11,"n":"BNAM - Unused"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"n":"MNAM - Precipitation Type"},{"t":3,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"n":"Cloud Speed","c":[{"t":7,"n":"RNAM - Y Speed","c":[{"t":3,"n":"Layer"}]},{"t":7,"n":"QNAM - X Speed","c":[{"t":3,"n":"Layer"}]}]},{"t":7,"n":"PNAM - Cloud Colors","c":[{"t":6,"n":"Layer","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"n":"JNAM - Cloud Alphas","c":[{"t":6,"n":"Layer","c":[{"t":5,"n":"Sunrise"},{"t":5,"n":"Day"},{"t":5,"n":"Sunset"},{"t":5,"n":"Night"}]}]},{"t":6,"n":"NAM0 - Weather Colors","c":[{"t":6,"n":"Sky-Upper","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Fog Near","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Ambient","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sunlight","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sun","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Stars","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sky-Lower","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Horizon","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Effect Lighting","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Cloud LOD Diffuse","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Cloud LOD Ambient","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Fog Far","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sky Statics","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Water Multiplier","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Sun Glare","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Moon Glare","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":6,"n":"FNAM - Fog Distance","c":[{"t":5,"n":"Day - Near"},{"t":5,"n":"Day - Far"},{"t":5,"n":"Night - Near"},{"t":5,"n":"Night - Far"},{"t":5,"n":"Day - Power"},{"t":5,"n":"Night - Power"},{"t":5,"n":"Day - Max"},{"t":5,"n":"Night - Max"}]},{"t":6,"n":"DATA - Data","c":[{"t":3,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"n":"Trans Delta"},{"t":3,"n":"Sun Glare"},{"t":3,"n":"Sun Damage"},{"t":3,"n":"Precipitation - Begin Fade In"},{"t":3,"n":"Precipitation - End Fade Out"},{"t":3,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"n":"Thunder\/Lightning - Frequency"},{"t":3,"n":"Flags"},{"t":6,"n":"Lightning Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"}]},{"t":3,"n":"Visual Effect - Begin"},{"t":3,"n":"Visual Effect - End"},{"t":3,"n":"Wind Direction"},{"t":3,"n":"Wind Direction Range"}]},{"t":3,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"n":"Sounds","c":[{"t":6,"n":"SNAM - Sound","c":[{"t":3,"n":"Sound"},{"t":3,"n":"Type"}]}]},{"t":8,"n":"Sky Statics","c":[{"t":3,"n":"TNAM - Static"}]},{"t":6,"n":"IMSP - Image Spaces","c":[{"t":3,"n":"Sunrise"},{"t":3,"n":"Day"},{"t":3,"n":"Sunset"},{"t":3,"n":"Night"}]},{"t":6,"n":"HNAM - Volumetric Lighting","c":[{"t":3,"n":"Sunrise"},{"t":3,"n":"Day"},{"t":3,"n":"Sunset"},{"t":3,"n":"Night"}]},{"t":6,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"n":"DALC - Sunrise","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"DALC - Day","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"DALC - Sunset","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]},{"t":6,"n":"DALC - Night","c":[{"t":6,"n":"Directional","c":[{"t":6,"n":"X+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"X-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Y-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z+","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Z-","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Specular","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"n":"Scale"}]}]},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":6,"n":"Aurora","c":[{"t":6,"n":"Model","c":[{"t":2,"n":"MODL - Model Filename"},{"t":11,"n":"MODT - Texture Files Hashes"},{"t":7,"n":"MODS - Alternate Textures","c":[{"t":6,"n":"Alternate Texture","c":[{"t":2,"n":"3D Name"},{"t":3,"n":"New Texture"},{"t":3,"n":"3D Index"}]}]}]}]},{"t":3,"n":"GNAM - Sun Glare Lens Flare"}]},{"t":1,"n":"ACHR - Placed NPC","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"n":"Version"},{"t":3,"n":"Object Format"},{"t":7,"n":"Scripts","c":[{"t":6,"n":"Script","c":[{"t":2,"n":"scriptName"},{"t":3,"n":"Flags"},{"t":7,"n":"Properties","c":[{"t":6,"n":"Property","c":[{"t":2,"n":"propertyName"},{"t":3,"n":"Type"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"n":"String"},{"t":3,"n":"Int32"},{"t":5,"n":"Float"},{"t":3,"n":"Bool"},{"t":7,"n":"Array of Object","c":[{"t":6,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"n":"Alias"},{"t":3,"n":"FormID"}]},{"t":6,"n":"Object v1","c":[{"t":3,"n":"FormID"},{"t":3,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"n":"Array of String","c":[{"t":2,"n":"Element"}]},{"t":7,"n":"Array of Int32","c":[{"t":3,"n":"Element"}]},{"t":7,"n":"Array of Float","c":[{"t":5,"n":"Element"}]},{"t":7,"n":"Array of Bool","c":[{"t":3,"n":"Element"}]}]}]}]}]}]},{"t":3,"n":"NAME - Base"},{"t":3,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"n":"Patrol Data","c":[{"t":5,"n":"XPRD - Idle Time"},{"n":"XPPA - Patrol Script Marker"},{"t":3,"n":"INAM - Idle"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":8,"n":"Topic","c":[{"t":6,"n":"PDTO - Topic Data","c":[{"t":3,"n":"Type"},{"t":3,"n":"Topic"},{"t":2,"n":"Subtype"}]}]},{"t":3,"n":"TNAM - Topic"}]},{"t":3,"n":"XLCM - Level Modifier"},{"t":3,"n":"XMRC - Merchant Container"},{"t":3,"n":"XCNT - Count"},{"t":5,"n":"XRDS - Radius"},{"t":5,"n":"XHLP - Health"},{"t":8,"n":"Linked References","c":[{"t":6,"n":"XLKR - Linked Reference","c":[{"t":3,"n":"Keyword\/Ref"},{"t":3,"n":"Ref"}]}]},{"t":6,"n":"Activate Parents","c":[{"t":3,"n":"XAPD - Flags"},{"t":8,"n":"Activate Parent Refs","c":[{"t":6,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"n":"Reference"},{"t":5,"n":"Delay"}]}]}]},{"t":6,"n":"XCLP - Linked Reference Color","c":[{"t":6,"n":"Link Start Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Link End Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"XLCN - Persistent Location"},{"t":3,"n":"XLRL - Location Reference"},{"n":"XIS2 - Ignored by Sandbox"},{"t":7,"n":"XLRT - Location Ref Type","c":[{"t":3,"n":"Ref"}]},{"t":3,"n":"XHOR - Horse"},{"t":5,"n":"XHTW - Head-Tracking Weight"},{"t":5,"n":"XFVC - Favor Cost"},{"t":6,"n":"XESP - Enable Parent","c":[{"t":3,"n":"Reference"},{"t":3,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Ownership","c":[{"t":3,"n":"XOWN - Owner"},{"t":3,"n":"XRNK - Faction rank"}]},{"t":3,"n":"XEMI - Emittance"},{"t":3,"n":"XMBR - MultiBound Reference"},{"n":"XIBS - Ignored By Sandbox"},{"t":5,"n":"XSCL - Scale"},{"t":6,"n":"DATA - Position\/Rotation","c":[{"t":6,"n":"Position","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]},{"t":6,"n":"Rotation","c":[{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"}]}]}]}]},"name":"Bash.Text","hash":"45E8ACFA","color":255} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Bash.Voice-F.json b/frontend/settings/Skyrim/Bash.Voice-F.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Bash.Voice-M.json b/frontend/settings/Skyrim/Bash.Voice-M.json old mode 100644 new mode 100755 diff --git a/frontend/settings/Skyrim/Smash.All.json b/frontend/settings/Skyrim/Smash.All.json old mode 100644 new mode 100755 index bc8092a..052547a --- a/frontend/settings/Skyrim/Smash.All.json +++ b/frontend/settings/Skyrim/Smash.All.json @@ -1 +1 @@ -{"records":"AACT,ACTI,ADDN,ALCH,AMMO,ANIO,APPA,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BOOK,BPTD,CAMS,CELL,CLAS,CLDC,CLFM,CLMT,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DIAL,DLBR,DLVW,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,EYES,FACT,FLOR,FLST,FSTP,FSTS,FURN,GLOB,GMST,GRAS,HAIR,HAZD,HDPT,IDLM,IMAD,IMGS,INFO,INGR,IPCT,IPDS,KEYM,KYWD,LAND,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MUSC,MUST,NPC_,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,PMIS,PROJ,PWAT,QUST,RACE,REFR,REGN,RELA,REVB,RFCT,RGDL,SCEN,SCOL,SCPT,SCRL,SHOU,SLGM,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAT,TACT,TREE,TXST,VOLI,VTYP,WATR,WEAP,WOOP,WRLD,WTHR,ACHR","description":"Smashes all the things. Produced using autoset attributes on all record types found in Skyrim.esm and DLCs. Replaces the old \"Automatic\" setting.\r\n\r\nLast updated 04\/14\/2018.","tree":{"records":[{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Value"}]},{"t":2,"p":1,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"QUAL - Quality"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male"},{"t":3,"p":1,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO5S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"s":1,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon 2 (female)","c":[{"t":2,"p":1,"n":"ICO2 - Large Icon filename"},{"t":2,"p":1,"n":"MIC2 - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Armature","d":1,"c":[{"t":3,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"DNAM - Armor Rating"},{"t":3,"p":1,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Ambient Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type (reverb)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"AVSK - Skill","c":[{"t":5,"p":1,"n":"Skill Use Mult"},{"t":5,"p":1,"n":"Skill Offset Mult"},{"t":5,"p":1,"n":"Skill Improve Mult"},{"t":5,"p":1,"n":"Skill Improve Offset"}]},{"t":8,"s":1,"p":1,"n":"Perk Tree","d":1,"c":[{"t":6,"p":1,"n":"Node","c":[{"t":3,"p":1,"n":"PNAM - Perk"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"XNAM - Perk-Grid X"},{"t":3,"p":1,"n":"YNAM - Perk-Grid Y"},{"t":5,"p":1,"n":"HNAM - Horizontal Position"},{"t":5,"p":1,"n":"VNAM - Vertical Position"},{"t":3,"p":1,"n":"SNAM - Associated Skill"},{"t":8,"p":1,"n":"Connections","c":[{"t":3,"p":1,"n":"CNAM - Line to Index"}]},{"t":3,"p":1,"n":"INAM - Index"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Book Text"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"INAM - Inventory Art"},{"t":2,"p":1,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"PNAM - Pose Matching"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":2,"p":1,"n":"BPNI - IK Data - Start Node"},{"t":6,"p":1,"n":"BPND - ","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Tracking Max Angle"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":6,"p":1,"n":"Gore Effects Positioning","c":[{"t":6,"p":1,"n":"Translate","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Limb Replacement Scale"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land"}]},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits"}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Teaches"},{"t":3,"p":1,"n":"Maximum training level"},{"t":7,"p":1,"n":"Skill Weights","c":[{"t":3,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"Bleedout Default"},{"t":3,"p":1,"n":"Voice Points"},{"t":7,"p":1,"n":"Attribute Weights","c":[{"t":3,"p":1,"n":"Weight"}]}]}]},{"t":1,"p":1,"n":"CLDC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"FNAM - Playable"}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":3,"p":1,"n":"NAM1 - Created Object Count"}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Related Camera Path"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"}]},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Circle Mult"},{"t":5,"p":1,"n":"Fallback Mult"},{"t":5,"p":1,"n":"Flank Distance"},{"t":5,"p":1,"n":"Stalk Time"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"}]},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags"},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Effect Shader"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Inherit Scale"}]}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Can Be Equipped"}]},{"t":3,"p":1,"n":"DATA - Use All Parents"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"EYES - Eyes","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Texture"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"Relations","d":1,"c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Only Buys Stolen Items"},{"t":3,"p":1,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"XCNT - Count","c":[{"t":3,"p":1,"n":"Walk Forward Sets"},{"t":3,"p":1,"n":"Run Forward Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate Sets"},{"t":3,"p":1,"n":"Run Forward Alternate Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate 2 Sets"}]},{"t":7,"s":1,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Spell"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points"}]},{"t":3,"p":1,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points"}]}]},{"t":2,"p":1,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"HAIR","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - Filename"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Filename"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Related Idle Animation"}]},{"t":6,"n":"DATA - Data (unused)","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags"},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags"},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"RNAM - Radial Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SNAM - Radial Blur Ramp Up","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"UNAM - Radial Blur Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM1 - Radial Blur Ramp Down","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - Radial Blur Down Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"WNAM - DoF Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"XNAM - DoF Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - DoF Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unknown"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Bloom Blur Radius"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Receive Bloom Threshold"},{"t":5,"p":1,"n":"White"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Eye Adapt Strength"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"}]}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"CNAM - Favor Level"},{"t":8,"s":1,"p":1,"n":"Link To","d":1,"c":[{"t":3,"p":1,"n":"TCLT - Response"}]},{"t":3,"p":1,"n":"DNAM - Response Data"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDT - Response Data","c":[{"t":3,"p":1,"n":"Emotion Type"},{"t":3,"p":1,"n":"Emotion Value"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Response number"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"SCHR - Unknown"},{"t":3,"n":"QNAM - Unknown"},{"n":"NEXT - Marker"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TWAT - Walk Away Topic"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM2 - Hazard"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":8,"s":1,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Dist"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":6,"p":1,"n":"Light Fade Distances","c":[{"t":5,"p":1,"n":"Start"},{"t":5,"p":1,"n":"End"}]},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":5,"p":1,"n":"SNAM - Initial Scale"},{"t":6,"s":1,"p":1,"n":"RNAM - Initial Rotation","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]},{"t":3,"n":"INAM - Unused"}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]}]}]}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":3,"p":1,"n":"Magic Skill"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archtype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Second Actor Value"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"p":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Default Data","c":[{"t":5,"p":1,"n":"Left Walk"},{"t":5,"p":1,"n":"Left Run"},{"t":5,"p":1,"n":"Right Walk"},{"t":5,"p":1,"n":"Right Run"},{"t":5,"p":1,"n":"Forward Walk"},{"t":5,"p":1,"n":"Forward Run"},{"t":5,"p":1,"n":"Back Walk"},{"t":5,"p":1,"n":"Back Run"},{"t":5,"p":1,"n":"Rotate in Place Walk"},{"t":5,"p":1,"n":"Rotate in Place Run"},{"t":5,"p":1,"n":"Rotate while Moving Run"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track Filename"},{"t":2,"p":1,"n":"BNAM - Finale Filename"},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"},{"t":3,"n":"Preferred Merges Flag"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":7,"n":"NVSI - Unknown","c":[{"t":3,"n":"Navigation Mesh"}]}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Geometry","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"External Connections","c":[{"t":6,"n":"Connection","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Mesh"},{"t":3,"n":"Triangle"}]}]},{"t":7,"n":"Door Triangles","c":[{"t":6,"n":"Door Triangle","c":[{"t":3,"n":"Triangle before door"},{"t":11,"n":"Unknown"},{"t":3,"n":"Door"}]}]}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"PNAM - Unknown"},{"t":11,"n":"NNAM - Unknown"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Magicka Offset"},{"t":3,"p":1,"n":"Stamina Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Speed Multiplier"},{"t":3,"p":1,"n":"Disposition Base (unused)"},{"t":3,"p":1,"n":"Template Flags"},{"t":3,"p":1,"n":"Health Offset"},{"t":3,"p":1,"n":"Bleedout Override"}]},{"t":8,"s":1,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Template"},{"t":3,"p":1,"n":"RNAM - Race","lt":"Tint Layers","lf":"NAM7 - Weight"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Worn Armor"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - Player Skills","c":[{"t":7,"p":1,"n":"Skill Values","c":[{"t":3,"p":1,"n":"Skill"}]},{"t":7,"p":1,"n":"Skill Offsets","c":[{"t":3,"p":1,"n":"Skill"}]},{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Far away model distance"},{"t":3,"p":1,"n":"Geared up weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}],"lt":"NAM6 - Height","lf":"HCLF - Hair Color"},{"t":3,"p":1,"n":"HCLF - Hair Color","lt":"Head Parts","lf":"FTST - Head texture"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height","lt":"NAM7 - Weight","lf":"Head Parts"},{"t":5,"p":1,"n":"NAM7 - Weight","lt":"RNAM - Race","lf":"NAM6 - Height"},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":10,"p":1,"n":"Sound Types","d":1,"c":[{"t":6,"p":1,"n":"Sound Type","c":[{"t":3,"p":1,"n":"CSDT - Type"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CSDI - Sound"},{"t":3,"p":1,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"DOFT - Default outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime faction"},{"t":3,"p":1,"n":"FTST - Head texture","lt":"HCLF - Hair Color","lf":"QNAM - Texture lighting"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}],"lt":"FTST - Head texture","lf":"NAM9 - Face morph"},{"t":6,"s":1,"p":1,"n":"NAM9 - Face morph","c":[{"t":5,"p":1,"n":"Nose Long\/Short"},{"t":5,"p":1,"n":"Nose Up\/Down"},{"t":5,"p":1,"n":"Jaw Up\/Down"},{"t":5,"p":1,"n":"Jaw Narrow\/Wide"},{"t":5,"p":1,"n":"Jaw Farward\/Back"},{"t":5,"p":1,"n":"Cheeks Up\/Down"},{"t":5,"p":1,"n":"Cheeks Farward\/Back"},{"t":5,"p":1,"n":"Eyes Up\/Down"},{"t":5,"p":1,"n":"Eyes In\/Out"},{"t":5,"p":1,"n":"Brows Up\/Down"},{"t":5,"p":1,"n":"Brows In\/Out"},{"t":5,"p":1,"n":"Brows Farward\/Back"},{"t":5,"p":1,"n":"Lips Up\/Down"},{"t":5,"p":1,"n":"Lips In\/Out"},{"t":5,"p":1,"n":"Chin Narrow\/Wide"},{"t":5,"p":1,"n":"Chin Up\/Down"},{"t":5,"p":1,"n":"Chin Underbite\/Overbite"},{"t":5,"p":1,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}],"lt":"QNAM - Texture lighting","lf":"NAMA - Face parts"},{"t":6,"s":1,"p":1,"n":"NAMA - Face parts","c":[{"t":3,"p":1,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Eyes"},{"t":3,"p":1,"n":"Mouth"}],"lt":"NAM9 - Face morph","lf":"Tint Layers"},{"t":10,"p":1,"n":"Tint Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":3,"p":1,"n":"TINI - Tint Index"},{"t":6,"p":1,"n":"TINC - Tint Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"p":1,"n":"Alpha"}]},{"t":3,"p":1,"n":"TINV - Interpolation Value"},{"t":3,"p":1,"n":"TIAS - Preset"}]}],"lt":"NAMA - Face parts","lf":"RNAM - Race"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"s":1,"p":1,"n":"INAM - Items","d":1,"c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags"}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags"},{"t":6,"p":1,"n":"IDLC - ","c":[{"t":3,"p":1,"n":"Animation Count"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags"},{"t":3,"p":1,"n":"Clear General Flags"},{"t":3,"p":1,"n":"Set Interrupt Flags"},{"t":3,"p":1,"n":"Clear Interrupt Flags"},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCDA - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Tracer Chance"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model Filename"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"PWAT","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"fragmentCount"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Object Window Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"s":1,"p":1,"n":"Stages","d":1,"c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags"},{"t":3,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"s":1,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":6,"p":1,"n":"FNAM - Alias Flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Additional Flags"}]},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFL - Specific Location"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":8,"s":1,"p":1,"n":"Targets","d":1,"c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":7,"p":1,"n":"Skill Boosts","c":[{"t":6,"p":1,"n":"Skill Boost","c":[{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Male Height"},{"t":5,"p":1,"n":"Female Height"},{"t":5,"p":1,"n":"Male Weight"},{"t":5,"p":1,"n":"Female Weight"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Starting Health"},{"t":5,"p":1,"n":"Starting Magicka"},{"t":5,"p":1,"n":"Starting Stamina"},{"t":5,"p":1,"n":"Base Carry Weight"},{"t":5,"p":1,"n":"Base Mass"},{"t":5,"p":1,"n":"Acceleration rate"},{"t":5,"p":1,"n":"Deceleration rate"},{"t":3,"p":1,"n":"Size"},{"t":3,"p":1,"n":"Head Biped Object"},{"t":3,"p":1,"n":"Hair Biped Object"},{"t":5,"p":1,"n":"Injured Health Pct"},{"t":3,"p":1,"n":"Shield Biped Object"},{"t":5,"p":1,"n":"Health Regen"},{"t":5,"p":1,"n":"Magicka Regen"},{"t":5,"p":1,"n":"Stamina Regen"},{"t":5,"p":1,"n":"Unarmed Damage"},{"t":5,"p":1,"n":"Unarmed Reach"},{"t":3,"p":1,"n":"Body Biped Object"},{"t":5,"p":1,"n":"Aim Angle Tolerance"},{"t":5,"p":1,"n":"Flight Radius"},{"t":5,"p":1,"n":"Angular Acceleration Rate"},{"t":5,"p":1,"n":"Angular Tolerance"},{"t":3,"p":1,"n":"Flags 2"},{"t":6,"p":1,"n":"Mount Data","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Unknown"}]}]},{"p":1,"n":"MNAM - Male Marker"},{"t":2,"p":1,"n":"ANAM - Male Skeletal Model"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"p":1,"n":"FNAM - Female Marker"},{"t":2,"p":1,"n":"ANAM - Female Skeletal Model"},{"p":1,"n":"NAM2 - Marker NAM2 #1"},{"t":8,"p":1,"n":"Movement Type Names","c":[{"t":2,"p":1,"n":"MTNM - Name"}]},{"t":7,"p":1,"n":"VTCK - Voices","c":[{"t":3,"p":1,"n":"Voice"}]},{"t":7,"p":1,"n":"DNAM - Decapitate Armors","c":[{"t":3,"p":1,"n":"Decapitate Armor"}]},{"t":7,"p":1,"n":"HCLF - Default Hair Colors","c":[{"t":3,"p":1,"n":"Default Hair Color"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"p":1,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"p":1,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":6,"p":1,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"p":1,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]},{"t":6,"p":1,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"HNAM - Hairs","c":[{"t":3,"p":1,"n":"Hair"}]},{"t":7,"p":1,"n":"ENAM - Eyes","c":[{"t":3,"p":1,"n":"Eye"}]},{"t":3,"p":1,"n":"GNAM - Body Part Data"},{"p":1,"n":"NAM2 - Marker NAM2 #2"},{"p":1,"n":"NAM3 - Marker NAM3 #3"},{"t":6,"s":1,"p":1,"n":"Male Behavior Graph","c":[{"p":1,"n":"MNAM - Male Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Female Behavior Graph","c":[{"p":1,"n":"FNAM - Female Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"NAM4 - Material Type"},{"t":3,"p":1,"n":"NAM5 - Impact Data Set"},{"t":3,"p":1,"n":"NAM7 - Decapitation FX"},{"t":3,"p":1,"n":"ONAM - Open Loot Sound"},{"t":3,"p":1,"n":"LNAM - Close Loot Sound"},{"t":8,"p":1,"n":"Biped Object Names","c":[{"t":2,"p":1,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Override Values","c":[{"t":5,"n":"Left - Walk"},{"t":5,"n":"Left - Run"},{"t":5,"n":"Right - Walk"},{"t":5,"n":"Right - Run"},{"t":5,"n":"Forward - Walk"},{"t":5,"n":"Forward - Run"},{"t":5,"n":"Back - Walk"},{"t":5,"n":"Back - Run"},{"t":5,"n":"Rotate - Walk"},{"t":5,"n":"Unknown"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":8,"p":1,"n":"Equip Slots","c":[{"t":3,"p":1,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"p":1,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"s":1,"p":1,"n":"Male Head Data","c":[{"p":1,"n":"MNAM - Male Data Marker"},{"t":10,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Male","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Male","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Male","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Default Face Texture Male"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Female Head Data","c":[{"p":1,"n":"NAM0 - Head Data Marker"},{"p":1,"n":"FNAM - Female Data Marker"},{"t":10,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Female","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Female","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Female","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Default Face Texture Female"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":6,"s":1,"p":1,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"s":1,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":8,"p":1,"n":"Linked Rooms","c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Lit Water","d":1,"c":[{"t":3,"p":1,"n":"XLTW - Water"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.35+\/-"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Shadow Depth Bias"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XTNM - Teleport Message Box"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":5,"p":1,"n":"XCHG - Charge"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":6,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"RGDL","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":3,"p":1,"n":"LNAM - Flags"},{"t":3,"p":1,"n":"DNAM - Behaviour Flags"}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer Seconds"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"t":3,"p":1,"n":"HTID - Headtrack Actor ID"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"NEXT - Marker"},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"SCOL","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCPT","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCRL - Scroll","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - Item","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Words of Power","d":1,"c":[{"t":6,"p":1,"n":"SNAM - ","c":[{"t":3,"p":1,"n":"Word"},{"t":3,"p":1,"n":"Spell"},{"t":5,"p":1,"n":"Recovery Time"}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SOUL - Contained Soul"},{"t":3,"p":1,"n":"SLCP - Maximum Capacity"},{"t":3,"p":1,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags"},{"t":3,"p":1,"n":"Quest Flags"}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"PNAM - Parent"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"CNAM - Unknown"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":2,"p":1,"n":"FNAM - String"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"BNAM - Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Type"},{"t":11,"n":"CNAM - Unknown"},{"t":11,"n":"SNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"L"},{"t":3,"p":1,"n":"R"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"BL"},{"t":3,"p":1,"n":"BR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ANAM - Attenuation Values","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Min Distance"},{"t":5,"p":1,"n":"Max Distance"},{"t":7,"p":1,"n":"Curve","c":[{"t":3,"p":1,"n":"Value"}]}]}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":11,"n":"FNAM - Unknown"},{"t":11,"n":"SNDD - Unknown"},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"ICON - Particle Texture"}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"LOD","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX02 - Environment Mask\/Subsurface Tint"},{"t":2,"p":1,"n":"TX03 - Glow\/Detail Map"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Backlight Mask\/Specular"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"VOLI - Volumetric Lighting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Intensity"},{"t":5,"p":1,"n":"DNAM - Custom Color - Contribution"},{"t":5,"p":1,"n":"ENAM - Red"},{"t":5,"p":1,"n":"FNAM - Green"},{"t":5,"p":1,"n":"GNAM - Blue"},{"t":5,"p":1,"n":"HNAM - Density - Contribution"},{"t":5,"p":1,"n":"INAM - Density - Size"},{"t":5,"p":1,"n":"JNAM - Density - Wind Speed"},{"t":5,"p":1,"n":"KNAM - Density - Falling Speed"},{"t":5,"p":1,"n":"LNAM - Phase Function - Contribution"},{"t":5,"p":1,"n":"MNAM - Phase Function - Scattering"},{"t":5,"p":1,"n":"NNAM - Sampling Repartition - Range Factor"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"p":1,"n":"ANAM - Opacity"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":11,"n":"MNAM - Unused"},{"t":3,"p":1,"n":"TNAM - Material"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":3,"p":1,"n":"DATA - Damage Per Second"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Power"},{"t":5,"p":1,"n":"Water Properties - Reflectivity Amount"},{"t":5,"p":1,"n":"Water Properties - Fresnel Amount"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Displacement Simulator - Starting Size"},{"t":5,"p":1,"n":"Displacement Simulator - Force"},{"t":5,"p":1,"n":"Displacement Simulator - Velocity"},{"t":5,"p":1,"n":"Displacement Simulator - Falloff"},{"t":5,"p":1,"n":"Displacement Simulator - Dampner"},{"t":5,"p":1,"n":"Noise Properties - Noise Falloff"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"p":1,"n":"Water Properties - Refraction Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Specular Power"},{"t":5,"p":1,"n":"Specular Properties - Specular Radius"},{"t":5,"p":1,"n":"Specular Properties - Specular Brightness"},{"t":5,"p":1,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"p":1,"n":"Water Properties - Reflection Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"p":1,"n":"Depth Properties - Reflections"},{"t":5,"p":1,"n":"Depth Properties - Refraction"},{"t":5,"p":1,"n":"Depth Properties - Normals"},{"t":5,"p":1,"n":"Depth Properties - Specular Lighting"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Power"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Noise Layer One - Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Noise Layer Two - Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Noise Layer Three - Noise Texture"},{"t":2,"p":1,"n":"NAM5 - Flow Normals - Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Has Scope","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"WNAM - 1st Person Model Object"},{"t":3,"p":1,"n":"SNAM - Attack Sound"},{"t":3,"p":1,"n":"XNAM - Attack Sound 2D"},{"t":3,"p":1,"n":"NAM7 - Attack Loop Sound"},{"t":3,"p":1,"n":"TNAM - Attack Fail Sound"},{"t":3,"p":1,"n":"UNAM - Idle Sound"},{"t":3,"p":1,"n":"NAM9 - Equip Sound"},{"t":3,"p":1,"n":"NAM8 - Unequip Sound"},{"t":6,"s":1,"p":1,"n":"DATA - Game Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Damage"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reach"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Base VATS To-Hit Chance"},{"t":3,"p":1,"n":"Attack Animation"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Embedded Weapon AV (unused)"},{"t":5,"p":1,"n":"Range Min"},{"t":5,"p":1,"n":"Range Max"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Flags2"},{"t":5,"p":1,"n":"Animation Attack Mult"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":5,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":3,"p":1,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"% Mult"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Effect"}]},{"t":3,"p":1,"n":"VNAM - Detection Sound Level"},{"t":3,"p":1,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WOOP - Word of Power","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"TNAM - Translation"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"n":"Unused RNAM","c":[{"t":6,"n":"RNAM - Grid","c":[{"t":3,"n":"Y"},{"t":3,"n":"X"},{"t":7,"n":"References","c":[{"t":6,"n":"Reference","c":[{"t":3,"n":"Ref"},{"t":3,"n":"Y"},{"t":3,"n":"X"}]}]}]}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":6,"p":1,"n":"Camera Data","c":[{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Initial Pitch"}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"p":1,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"DNAM - Unused"},{"t":11,"n":"CNAM - Unused"},{"t":11,"n":"ANAM - Unused"},{"t":11,"n":"BNAM - Unused"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"s":1,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"s":1,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"HNAM - Volumetric Lighting","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"}]},{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XMRC - Merchant Container"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XHLP - Health"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XCLP - Linked Reference Color","c":[{"t":6,"p":1,"n":"Link Start Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Link End Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XHOR - Horse"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]}]},"name":"Smash.All","hash":"B5A65E9D","color":128} \ No newline at end of file +{"records":"ACHR,ACTI,ADDN,ALCH,AMMO,ANIO,APPA,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BOOK,BPTD,CAMS,CELL,CLAS,CLDC,CLFM,CLMT,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DIAL,DLBR,DLVW,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,EYES,FACT,FLOR,FLST,FSTP,FSTS,FURN,GLOB,GMST,GRAS,HAIR,HAZD,HDPT,IDLM,IMAD,IMGS,INFO,INGR,IPCT,IPDS,KEYM,KYWD,LAND,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MUSC,MUST,NPC_,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,Play,PMIS,PROJ,PWAT,QUST,RACE,REFR,REGN,RELA,REVB,RFCT,RGDL,SCEN,SCOL,SCPT,SCRL,SHOU,SLGM,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAT,TACT,TREE,TXST,VOLI,VTYP,WATR,WEAP,WOOP,WRLD,WTHR,AACT","description":"Smashes all the things. Produced using autoset attributes on all record types. Replaces the old \"Automatic\" setting.\r\n\r\nLast updated 8\/17\/2021.","tree":{"records":[{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Starts Dead"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"No AI Acquire"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XMRC - Merchant Container"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XHLP - Health"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XCLP - Linked Reference Color","c":[{"t":6,"p":1,"n":"Link Start Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Link End Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XHOR - Horse"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Has Tree LOD"},{"t":4,"n":"Unknown 7"},{"t":4,"p":1,"n":"Must Update Anims"},{"t":4,"p":1,"n":"Hidden From Local Map"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"p":1,"n":"Dangerous"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"p":1,"n":"Ignore Object Interaction"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"p":1,"n":"Is Marker"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"Obstacle"},{"t":4,"p":1,"n":"NavMesh Generation - Filter"},{"t":4,"p":1,"n":"NavMesh Generation - Bounding Box"},{"t":4,"n":"Unknown 28"},{"t":4,"p":1,"n":"Child Can Use"},{"t":4,"p":1,"n":"NavMesh Generation - Ground"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"No Displacement"},{"t":4,"p":1,"n":"Ignored by Sandbox"}]},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"p":1,"n":"Medicine"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":"Food Item"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"p":1,"n":"Medicine"},{"t":4,"p":1,"n":"Poison"}]},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Ignores Normal Weapon Resistance"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"p":1,"n":"Non-Bolt"}]},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":2,"p":1,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"QUAL - Quality"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Enabled"}]},{"t":3,"p":1,"n":"Weight slider - Female","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Enabled"}]},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model FileName"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model FileName"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model FileName"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model FileName"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO5S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Shield"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model FileName"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model FileName"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon 2 (female)","c":[{"t":2,"p":1,"n":"ICO2 - Large Icon FileName"},{"t":2,"p":1,"n":"MIC2 - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"p":1,"n":"30 - Head"},{"t":4,"p":1,"n":"31 - Hair"},{"t":4,"p":1,"n":"32 - Body"},{"t":4,"p":1,"n":"33 - Hands"},{"t":4,"p":1,"n":"34 - Forearms"},{"t":4,"p":1,"n":"35 - Amulet"},{"t":4,"p":1,"n":"36 - Ring"},{"t":4,"p":1,"n":"37 - Feet"},{"t":4,"p":1,"n":"38 - Calves"},{"t":4,"p":1,"n":"39 - Shield"},{"t":4,"p":1,"n":"40 - Tail"},{"t":4,"p":1,"n":"41 - LongHair"},{"t":4,"p":1,"n":"42 - Circlet"},{"t":4,"p":1,"n":"43 - Ears"},{"t":4,"p":1,"n":"44 - Unnamed"},{"t":4,"p":1,"n":"45 - Unnamed"},{"t":4,"p":1,"n":"46 - Unnamed"},{"t":4,"p":1,"n":"47 - Unnamed"},{"t":4,"p":1,"n":"48 - Unnamed"},{"t":4,"p":1,"n":"49 - Unnamed"},{"t":4,"p":1,"n":"50 - DecapitateHead"},{"t":4,"p":1,"n":"51 - Decapitate"},{"t":4,"p":1,"n":"52 - Unnamed"},{"t":4,"p":1,"n":"53 - Unnamed"},{"t":4,"p":1,"n":"54 - Unnamed"},{"t":4,"p":1,"n":"55 - Unnamed"},{"t":4,"p":1,"n":"56 - Unnamed"},{"t":4,"p":1,"n":"57 - Unnamed"},{"t":4,"p":1,"n":"58 - Unnamed"},{"t":4,"p":1,"n":"59 - Unnamed"},{"t":4,"p":1,"n":"60 - Unnamed"},{"t":4,"p":1,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Armature","d":1,"c":[{"t":3,"p":1,"n":"MODL - Model FileName"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"DNAM - Armor Rating"},{"t":3,"p":1,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Ambient Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type (reverb)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Family Association"}]}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"AVSK - Skill","c":[{"t":5,"p":1,"n":"Skill Use Mult"},{"t":5,"p":1,"n":"Skill Offset Mult"},{"t":5,"p":1,"n":"Skill Improve Mult"},{"t":5,"p":1,"n":"Skill Improve Offset"}]},{"t":8,"s":1,"p":1,"n":"Perk Tree","d":1,"c":[{"t":6,"p":1,"n":"Node","c":[{"t":3,"p":1,"n":"PNAM - Perk"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"XNAM - Perk-Grid X"},{"t":3,"p":1,"n":"YNAM - Perk-Grid Y"},{"t":5,"p":1,"n":"HNAM - Horizontal Position"},{"t":5,"p":1,"n":"VNAM - Vertical Position"},{"t":3,"p":1,"n":"SNAM - Associated Skill"},{"t":8,"p":1,"n":"Connections","c":[{"t":3,"p":1,"n":"CNAM - Line to Index"}]},{"t":3,"p":1,"n":"INAM - Index"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":2,"p":1,"n":"DESC - Book Text"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Teaches Skill"},{"t":4,"p":1,"n":"Can't be Taken"},{"t":4,"p":1,"n":"Teaches Spell"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"INAM - Inventory Art"},{"t":2,"p":1,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"PNAM - Pose Matching"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":2,"p":1,"n":"BPNI - IK Data - Start Node"},{"t":6,"p":1,"n":"BPND - BPND","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Severable"},{"t":4,"p":1,"n":"IK Data"},{"t":4,"p":1,"n":"IK Data - Biped Data"},{"t":4,"p":1,"n":"Explodable"},{"t":4,"p":1,"n":"IK Data - Is Head"},{"t":4,"p":1,"n":"IK Data - Headtracking"},{"t":4,"p":1,"n":"To Hit Chance - Absolute"}]},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Tracking Max Angle"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":6,"p":1,"n":"Gore Effects Positioning","c":[{"t":6,"p":1,"n":"Translate","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Limb Replacement Scale"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Position Follows Location"},{"t":4,"p":1,"n":"Rotation Follows Target"},{"t":4,"p":1,"n":"Don't Follow Bone"},{"t":4,"p":1,"n":"First Person Camera"},{"t":4,"p":1,"n":"No Tracer"},{"t":4,"p":1,"n":"Start At Time Zero"}]},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"p":1,"n":"Off Limits"},{"t":4,"p":1,"n":"Compressed"},{"t":4,"p":1,"n":"Can't Wait"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Is Interior Cell"},{"t":4,"p":1,"n":"Has Water"},{"t":4,"p":1,"n":"Can't Travel From Here"},{"t":4,"p":1,"n":"No LOD Water"},{"t":4,"n":"Unknown 5"},{"t":4,"p":1,"n":"Public Area"},{"t":4,"p":1,"n":"Hand Changed"},{"t":4,"p":1,"n":"Show Sky"},{"t":4,"p":1,"n":"Use Sky Lighting"}]},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land","c":[{"t":4,"p":1,"n":"Quad 1"},{"t":4,"p":1,"n":"Quad 2"},{"t":4,"p":1,"n":"Quad 3"},{"t":4,"p":1,"n":"Quad 4"}]}]},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits","c":[{"t":4,"p":1,"n":"Ambient Color"},{"t":4,"p":1,"n":"Directional Color"},{"t":4,"p":1,"n":"Fog Color"},{"t":4,"p":1,"n":"Fog Near"},{"t":4,"p":1,"n":"Fog Far"},{"t":4,"p":1,"n":"Directional Rotation"},{"t":4,"p":1,"n":"Directional Fade"},{"t":4,"p":1,"n":"Clip Distance"},{"t":4,"p":1,"n":"Fog Power"},{"t":4,"p":1,"n":"Fog Max"},{"t":4,"p":1,"n":"Light Fade Distances"}]}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Teaches"},{"t":3,"p":1,"n":"Maximum training level"},{"t":7,"p":1,"n":"Skill Weights","c":[{"t":3,"p":1,"n":"One Handed"},{"t":3,"p":1,"n":"Two Handed"},{"t":3,"p":1,"n":"Archery"},{"t":3,"p":1,"n":"Block"},{"t":3,"p":1,"n":"Smithing"},{"t":3,"p":1,"n":"Heavy Armor"},{"t":3,"p":1,"n":"Light Armor"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"p":1,"n":"Lockpicking"},{"t":3,"p":1,"n":"Sneak"},{"t":3,"p":1,"n":"Alchemy"},{"t":3,"p":1,"n":"Speech"},{"t":3,"p":1,"n":"Alteration"},{"t":3,"p":1,"n":"Conjuration"},{"t":3,"p":1,"n":"Destruction"},{"t":3,"p":1,"n":"Illusion"},{"t":3,"p":1,"n":"Restoration"},{"t":3,"p":1,"n":"Enchanting"}]},{"t":5,"p":1,"n":"Bleedout Default"},{"t":3,"p":1,"n":"Voice Points"},{"t":7,"p":1,"n":"Attribute Weights","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":3,"n":"Unknown"}]}]}]},{"t":1,"p":1,"n":"CLDC","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"FNAM - Playable"}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":10,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":3,"p":1,"n":"NAM1 - Created Object Count"}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags","c":[{"t":4,"p":1,"n":"Trigger Volume"},{"t":4,"p":1,"n":"Sensor"},{"t":4,"p":1,"n":"Navmesh Obstacle"}]},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"Obstacle"},{"t":4,"p":1,"n":"NavMesh Generation - Filter"},{"t":4,"p":1,"n":"NavMesh Generation - Bounding Box"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"NavMesh Generation - Ground"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Allow Sounds When Animation"},{"t":4,"p":1,"n":"Respawns"},{"t":4,"p":1,"n":"Show Owner"}]},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Previous Sibling"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"p":1,"n":"Allow Dual Wielding"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"}]},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Circle Mult"},{"t":5,"p":1,"n":"Fallback Mult"},{"t":5,"p":1,"n":"Flank Distance"},{"t":5,"p":1,"n":"Stalk Time"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"}]},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Dueling"},{"t":4,"p":1,"n":"Flanking"},{"t":4,"p":1,"n":"Allow Dual Wielding"}]}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model FileName"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Has Collision Data"}]}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags","c":[{"t":4,"p":1,"n":"Do All Before Repeating"}]},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Top-Level"},{"t":4,"p":1,"n":"Blocking"},{"t":4,"p":1,"n":"Exclusive"}]},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"p":1,"n":"Is Marker"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Automatic"},{"t":4,"p":1,"n":"Hidden"},{"t":4,"p":1,"n":"Minimal Use"},{"t":4,"p":1,"n":"Sliding"},{"t":4,"p":1,"n":"Do Not Open in Combat Search"}]}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Effect Shader"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Inherit Scale","c":[{"t":4,"p":1,"n":"Hit Effect Art"},{"t":4,"p":1,"n":"Projectile"},{"t":4,"p":1,"n":"Explosion"}]}]}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Never Resets"},{"t":4,"p":1,"n":"Match PC Below Minimum Level"},{"t":4,"p":1,"n":"Disable Combat Boundary"}]},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Membrane Shader"},{"t":4,"p":1,"n":"Membrane Grayscale Color"},{"t":4,"p":1,"n":"Membrane Grayscale Alpha"},{"t":4,"p":1,"n":"No Particle Shader"},{"t":4,"p":1,"n":"Edge Effect Inverse"},{"t":4,"p":1,"n":"Affect Skin Only"},{"t":4,"p":1,"n":"Ignore Alpha"},{"t":4,"p":1,"n":"Project UVs"},{"t":4,"p":1,"n":"Ignore Base Geometry Alpha"},{"t":4,"p":1,"n":"Lighting"},{"t":4,"p":1,"n":"No Weapons"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Particle Animated"},{"t":4,"p":1,"n":"Particle Grayscale Color"},{"t":4,"p":1,"n":"Particle Grayscale Alpha"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Use Blood Geometry"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Auto-Calc"},{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Extend Duration On Recast"}]},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Can Be Equipped"}]},{"t":3,"p":1,"n":"DATA - Use All Parents"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Always Uses World Orientation"},{"t":4,"p":1,"n":"Knock Down - Always"},{"t":4,"p":1,"n":"Knock Down - By Formula"},{"t":4,"p":1,"n":"Ignore LOS Check"},{"t":4,"p":1,"n":"Push Explosion Source Ref Only"},{"t":4,"p":1,"n":"Ignore Image Space Swap"},{"t":4,"p":1,"n":"Chain"},{"t":4,"p":1,"n":"No Controller Vibration"}]},{"t":3,"p":1,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"EYES - Eyes","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Texture"},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Playable"},{"t":4,"p":1,"n":"Not Male"},{"t":4,"p":1,"n":"Not Female"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"p":1,"n":"Relations","d":1,"c":[{"t":6,"s":1,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags","d":1,"c":[{"t":4,"p":1,"n":"Hidden From NPC"},{"t":4,"p":1,"n":"Special Combat"},{"t":4,"p":1,"n":"Unknown 3"},{"t":4,"p":1,"n":"Unknown 4"},{"t":4,"p":1,"n":"Unknown 5"},{"t":4,"p":1,"n":"Unknown 6"},{"t":4,"p":1,"n":"Track Crime"},{"t":4,"p":1,"n":"Ignore Crimes: Murder"},{"t":4,"p":1,"n":"Ignore Crimes: Assault"},{"t":4,"p":1,"n":"Ignore Crimes: Stealing"},{"t":4,"p":1,"n":"Ignore Crimes: Trespass"},{"t":4,"p":1,"n":"Do Not Report Crimes Against Members"},{"t":4,"p":1,"n":"Crime Gold - Use Defaults"},{"t":4,"p":1,"n":"Ignore Crimes: Pickpocket"},{"t":4,"p":1,"n":"Vendor"},{"t":4,"p":1,"n":"Can Be Owner"},{"t":4,"p":1,"n":"Ignore Crimes: Werewolf"},{"t":4,"p":1,"n":"Unknown 18"},{"t":4,"p":1,"n":"Unknown 19"},{"t":4,"p":1,"n":"Unknown 20"},{"t":4,"p":1,"n":"Unknown 21"},{"t":4,"p":1,"n":"Unknown 22"},{"t":4,"p":1,"n":"Unknown 23"},{"t":4,"p":1,"n":"Unknown 24"},{"t":4,"p":1,"n":"Unknown 25"},{"t":4,"p":1,"n":"Unknown 26"},{"t":4,"p":1,"n":"Unknown 27"},{"t":4,"p":1,"n":"Unknown 28"},{"t":4,"p":1,"n":"Unknown 29"},{"t":4,"p":1,"n":"Unknown 30"},{"t":4,"p":1,"n":"Unknown 31"},{"t":4,"p":1,"n":"Unknown 32"}]}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Only Buys Stolen Items"},{"t":3,"p":1,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"s":1,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"XCNT - Count","c":[{"t":3,"p":1,"n":"Walk Forward Sets"},{"t":3,"p":1,"n":"Run Forward Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate Sets"},{"t":3,"p":1,"n":"Run Forward Alternate Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate 2 Sets"}]},{"t":7,"s":1,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Is Perch"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"p":1,"n":"Is Marker"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Must Exit To Talk"},{"t":4,"p":1,"n":"Child Can Use"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"p":1,"n":"Ignored By Sandbox"}]},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags","c":[{"t":4,"p":1,"n":"Sit 0"},{"t":4,"p":1,"n":"Sit 1"},{"t":4,"p":1,"n":"Sit 2"},{"t":4,"p":1,"n":"Sit 3"},{"t":4,"p":1,"n":"Sit 4"},{"t":4,"p":1,"n":"Sit 5"},{"t":4,"p":1,"n":"Sit 6"},{"t":4,"p":1,"n":"Sit 7"},{"t":4,"p":1,"n":"Sit 8"},{"t":4,"p":1,"n":"Sit 9"},{"t":4,"p":1,"n":"Sit 10"},{"t":4,"p":1,"n":"Sit 11"},{"t":4,"p":1,"n":"Sit 12"},{"t":4,"p":1,"n":"Sit 13"},{"t":4,"p":1,"n":"Sit 14"},{"t":4,"p":1,"n":"Sit 15"},{"t":4,"p":1,"n":"Sit 16"},{"t":4,"p":1,"n":"Sit 17"},{"t":4,"p":1,"n":"Sit 18"},{"t":4,"p":1,"n":"Sit 19"},{"t":4,"p":1,"n":"Sit 20"},{"t":4,"p":1,"n":"Sit 21"},{"t":4,"p":1,"n":"Sit 22"},{"t":4,"p":1,"n":"Sit 23"},{"t":4,"n":"Unknown 25"},{"t":4,"p":1,"n":"Disables Activation"},{"t":4,"p":1,"n":"Is Perch"},{"t":4,"p":1,"n":"Must Exit to Talk"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Spell"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points","c":[{"t":4,"p":1,"n":"Front"},{"t":4,"p":1,"n":"Behind"},{"t":4,"p":1,"n":"Right"},{"t":4,"p":1,"n":"Left"},{"t":4,"p":1,"n":"Up"}]}]},{"t":3,"p":1,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points","c":[{"t":4,"p":1,"n":"Front"},{"t":4,"p":1,"n":"Behind"},{"t":4,"p":1,"n":"Right"},{"t":4,"p":1,"n":"Left"},{"t":4,"p":1,"n":"Up"}]}]}]},{"t":2,"p":1,"n":"XMRK - Model FileName"}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Constant"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Vertex Lighting"},{"t":4,"p":1,"n":"Uniform Scaling"},{"t":4,"p":1,"n":"Fit to Slope"}]}]}]},{"t":1,"p":1,"n":"HAIR","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Affects Player Only"},{"t":4,"p":1,"n":"Inherit Duration from Spawn Spell"},{"t":4,"p":1,"n":"Align to Impact Normal"},{"t":4,"p":1,"n":"Inherit Radius from Spawn Spell"},{"t":4,"p":1,"n":"Drop to Ground"}]},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"Playable"},{"t":4,"p":1,"n":"Male"},{"t":4,"p":1,"n":"Female"},{"t":4,"p":1,"n":"Is Extra Part"},{"t":4,"p":1,"n":"Use Solid Tint"}]},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - FileName"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - FileName"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Parent"},{"t":3,"n":"Previous Sibling"}]},{"t":6,"n":"DATA - Data (unused)","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags","c":[{"t":4,"n":"Parent"},{"t":4,"n":"Sequence"},{"t":4,"n":"No Attacking"},{"t":4,"n":"Blocking"}]},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"p":1,"n":"Child Can Use"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"IDLF - Flags","c":[{"t":4,"p":1,"n":"Run in Sequence"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Do Once"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Ignored by Sandbox"}]},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Animatable"}]},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags","c":[{"t":4,"n":"Use Target"}]},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags","c":[{"t":4,"n":"Use Target"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Mode - Front"},{"t":4,"n":"Mode - Back"},{"t":4,"n":"No Sky"},{"t":4,"n":"Blur Radius Bit 2"},{"t":4,"n":"Blur Radius Bit 1"},{"t":4,"n":"Blur Radius Bit 0"}]},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"RNAM - Radial Blur Strength"},{"t":7,"p":1,"n":"SNAM - Radial Blur Ramp Up"},{"t":7,"p":1,"n":"UNAM - Radial Blur Start"},{"t":7,"p":1,"n":"NAM1 - Radial Blur Ramp Down","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - Radial Blur Down Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"WNAM - DoF Strength"},{"t":7,"p":1,"n":"XNAM - DoF Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - DoF Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unknown"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Bloom Blur Radius"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Receive Bloom Threshold"},{"t":5,"p":1,"n":"White"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Eye Adapt Strength"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"}]}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"p":1,"n":"Actor Changed"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Script Fragments","c":[{"t":3,"p":1,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"}]},{"t":2,"p":1,"n":"FileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Goodbye"},{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Say once"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"p":1,"n":"Random end"},{"t":4,"p":1,"n":"Invisible continue"},{"t":4,"p":1,"n":"Walk Away"},{"t":4,"p":1,"n":"Walk Away Invisible in Menu"},{"t":4,"p":1,"n":"Force subtitle"},{"t":4,"p":1,"n":"Can move while greeting"},{"t":4,"p":1,"n":"No LIP File"},{"t":4,"p":1,"n":"Requires post-processing"},{"t":4,"p":1,"n":"Audio Output Override"},{"t":4,"p":1,"n":"Spends favor points"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"CNAM - Favor Level"},{"t":8,"p":1,"n":"Link To","d":1,"c":[{"t":3,"p":1,"n":"TCLT - Response"}]},{"t":3,"p":1,"n":"DNAM - Response Data"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDT - Response Data","c":[{"t":3,"p":1,"n":"Emotion Type"},{"t":3,"p":1,"n":"Emotion Value"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Response number"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Use Emotion Animation"}]}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"}]}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"SCHR - Unknown"},{"t":3,"n":"QNAM - Unknown"},{"n":"NEXT - Marker"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TWAT - Walk Away Topic"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No auto-calculation"},{"t":4,"p":1,"n":"Food item"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"References Persist"}]}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Decal Data"}]},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Parallax"},{"t":4,"p":1,"n":"Alpha - Blending"},{"t":4,"p":1,"n":"Alpha - Testing"},{"t":4,"p":1,"n":"No Subtextures"}]},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM2 - Hazard"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - PNAM","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Compressed"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LCTN - Location","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":8,"s":1,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Rotates"},{"t":4,"p":1,"n":"Shrinks When Occluded"}]}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Dist"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":6,"p":1,"n":"Light Fade Distances","c":[{"t":5,"p":1,"n":"Start"},{"t":5,"p":1,"n":"End"}]},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"p":1,"n":"Portal-strict"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"Obstacle"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Dynamic"},{"t":4,"p":1,"n":"Can be Carried"},{"t":4,"p":1,"n":"Negative"},{"t":4,"p":1,"n":"Flicker"},{"t":4,"n":"Unknown"},{"t":4,"p":1,"n":"Off By Default"},{"t":4,"p":1,"n":"Flicker Slow"},{"t":4,"p":1,"n":"Pulse"},{"t":4,"p":1,"n":"Pulse Slow"},{"t":4,"p":1,"n":"Spot Light"},{"t":4,"p":1,"n":"Shadow Spotlight"},{"t":4,"p":1,"n":"Shadow Hemisphere"},{"t":4,"p":1,"n":"Shadow Omnidirectional"},{"t":4,"p":1,"n":"Portal-strict"}]},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Displays In Main Menu"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":5,"p":1,"n":"SNAM - Initial Scale"},{"t":6,"s":1,"p":1,"n":"RNAM - Initial Rotation","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]},{"t":3,"p":1,"n":"INAM - Flags","c":[{"t":4,"p":1,"n":"Is Snow"}]}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags","d":1,"c":[{"t":4,"p":1,"n":"Calculate from all levels <= player's level"},{"t":4,"p":1,"n":"Calculate for each item in count"},{"t":4,"p":1,"n":"Use All"},{"t":4,"p":1,"n":"Special Loot"}]},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags","c":[{"t":4,"p":1,"n":"Calculate from all levels <= player's level"},{"t":4,"p":1,"n":"Calculate for each item in count"}]},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags","c":[{"t":4,"p":1,"n":"Calculate from all levels <= player's level"},{"t":4,"p":1,"n":"Calculate for each item in count"},{"t":4,"p":1,"n":"Use All Spells"}]},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]}]}]}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Single Pass"}]},{"t":11,"n":"Unused"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Stair Material"},{"t":4,"p":1,"n":"Arrows Stick"}]},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Message Box"},{"t":4,"p":1,"n":"Auto Display"}]},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Hostile"},{"t":4,"p":1,"n":"Recover"},{"t":4,"p":1,"n":"Detrimental"},{"t":4,"p":1,"n":"Snap to Navmesh"},{"t":4,"p":1,"n":"No Hit Event"},{"t":4,"p":1,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unknown 7"},{"t":4,"p":1,"n":"Unknown 8"},{"t":4,"p":1,"n":"Dispel with Keywords"},{"t":4,"p":1,"n":"No Duration"},{"t":4,"p":1,"n":"No Magnitude"},{"t":4,"p":1,"n":"No Area"},{"t":4,"p":1,"n":"FX Persist"},{"t":4,"p":1,"n":"Unknown 14"},{"t":4,"p":1,"n":"Gory Visuals"},{"t":4,"p":1,"n":"Hide in UI"},{"t":4,"p":1,"n":"Unknown 17"},{"t":4,"p":1,"n":"No Recast"},{"t":4,"p":1,"n":"Unknown 19"},{"t":4,"p":1,"n":"Unknown 20"},{"t":4,"p":1,"n":"Unknown 21"},{"t":4,"p":1,"n":"Power Affects Magnitude"},{"t":4,"p":1,"n":"Power Affects Duration"},{"t":4,"p":1,"n":"Unknown 24"},{"t":4,"p":1,"n":"Unknown 25"},{"t":4,"p":1,"n":"Unknown 26"},{"t":4,"p":1,"n":"Painless"},{"t":4,"p":1,"n":"No Hit Effect"},{"t":4,"p":1,"n":"No Death Dispel"},{"t":4,"p":1,"n":"Unknown 30"},{"t":4,"p":1,"n":"Unknown 31"},{"t":4,"p":1,"n":"Unknown 32"}]},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":3,"p":1,"n":"Magic Skill"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"s":1,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archtype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Second Actor Value"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"s":1,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"s":1,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"p":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Default Data","c":[{"t":5,"p":1,"n":"Left Walk"},{"t":5,"p":1,"n":"Left Run"},{"t":5,"p":1,"n":"Right Walk"},{"t":5,"p":1,"n":"Right Run"},{"t":5,"p":1,"n":"Forward Walk"},{"t":5,"p":1,"n":"Forward Run"},{"t":5,"p":1,"n":"Back Walk"},{"t":5,"p":1,"n":"Back Run"},{"t":5,"p":1,"n":"Rotate in Place Walk"},{"t":5,"p":1,"n":"Rotate in Place Run"},{"t":5,"p":1,"n":"Rotate while Moving Run"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"p":1,"n":"Must Update Anims"},{"t":4,"p":1,"n":"Hidden From Local Map"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"p":1,"n":"Has Currents"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"Obstacle"},{"t":4,"p":1,"n":"NavMesh Generation - Filter"},{"t":4,"p":1,"n":"NavMesh Generation - Bounding Box"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"NavMesh Generation - Ground"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"n":"On Local Map"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"}]},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags","d":1,"c":[{"t":4,"p":1,"n":"Plays One Selection"},{"t":4,"p":1,"n":"Abrupt Transition"},{"t":4,"p":1,"n":"Cycle Tracks"},{"t":4,"p":1,"n":"Maintain Track Order"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Ducks Current Track"},{"t":4,"p":1,"n":"Doesn't Queue"}]},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track FileName"},{"t":2,"p":1,"n":"BNAM - Finale FileName"},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":3,"n":"CITC - Condition Count"},{"t":10,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"},{"t":3,"n":"Preferred Merges Flag"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":7,"n":"NVSI - Unknown","c":[{"t":3,"n":"Navigation Mesh"}]}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":6,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"n":"Record Flags","c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Compressed"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"AutoGen"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"NavmeshGenCell"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Geometry","c":[{"t":3,"n":"Version"},{"t":11,"n":"Magic"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Edge Links","c":[{"t":6,"n":"Connection","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Mesh"},{"t":3,"n":"Triangle"}]}]},{"t":7,"n":"Door Triangles","c":[{"t":6,"n":"Door Triangle","c":[{"t":3,"n":"Triangle before door"},{"t":11,"n":"Unknown"},{"t":3,"n":"Door"}]}]},{"t":11,"n":"NavMeshGrid"}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"PNAM - Unknown"},{"t":11,"n":"NNAM - Unknown"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Compressed"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"p":1,"n":"Bleedout Override"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags","d":1,"c":[{"t":4,"p":1,"n":"Female"},{"t":4,"p":1,"n":"Essential"},{"t":4,"p":1,"n":"Is CharGen Face Preset"},{"t":4,"p":1,"n":"Respawn"},{"t":4,"p":1,"n":"Auto-calc stats"},{"t":4,"p":1,"n":"Unique"},{"t":4,"p":1,"n":"Doesn't affect stealth meter"},{"t":4,"p":1,"n":"PC Level Mult"},{"t":4,"p":1,"n":"Use Template?"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"p":1,"n":"Protected"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Summonable"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Doesn't bleed"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Bleedout Override"},{"t":4,"p":1,"n":"Opposite Gender Anims"},{"t":4,"p":1,"n":"Simple Actor"},{"t":4,"p":1,"n":"looped script?"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"looped audio?"},{"t":4,"p":1,"n":"Is Ghost"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Invulnerable"}]},{"t":3,"p":1,"n":"Magicka Offset"},{"t":3,"p":1,"n":"Stamina Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level","lf":"Calc max level"},{"t":3,"p":1,"n":"Calc max level","lt":"Calc min level"},{"t":3,"p":1,"n":"Speed Multiplier"},{"t":3,"p":1,"n":"Disposition Base (unused)"},{"t":3,"p":1,"n":"Template Flags","d":1,"c":[{"t":4,"p":1,"n":"Use Traits"},{"t":4,"p":1,"n":"Use Stats"},{"t":4,"p":1,"n":"Use Factions"},{"t":4,"p":1,"n":"Use Spell List"},{"t":4,"p":1,"n":"Use AI Data"},{"t":4,"p":1,"n":"Use AI Packages"},{"t":4,"p":1,"n":"Use Model\/Animation?"},{"t":4,"p":1,"n":"Use Base Data"},{"t":4,"p":1,"n":"Use Inventory"},{"t":4,"p":1,"n":"Use Script"},{"t":4,"p":1,"n":"Use Def Pack List"},{"t":4,"p":1,"n":"Use Attack Data"},{"t":4,"p":1,"n":"Use Keywords"}]},{"t":3,"p":1,"n":"Health Offset"},{"t":3,"p":1,"n":"Bleedout Override"}]},{"t":8,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Template"},{"t":3,"p":1,"n":"RNAM - Race","lt":"Tint Layers","lf":"NAM7 - Weight"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Worn Armor"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags","c":[{"t":4,"p":1,"n":"Ignore Weapon"},{"t":4,"p":1,"n":"Bash Attack"},{"t":4,"p":1,"n":"Power Attack"},{"t":4,"p":1,"n":"Left Attack"},{"t":4,"p":1,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"p":1,"n":"Override Data"}]},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - Player Skills","c":[{"t":7,"p":1,"n":"Skill Values","c":[{"t":3,"p":1,"n":"Skill #0 (OneHanded)"},{"t":3,"p":1,"n":"Skill #1 (TwoHanded)"},{"t":3,"p":1,"n":"Skill #2 (Marksman)"},{"t":3,"p":1,"n":"Skill #3 (Block)"},{"t":3,"p":1,"n":"Skill #4 (Smithing)"},{"t":3,"p":1,"n":"Skill #5 (HeavyArmor)"},{"t":3,"p":1,"n":"Skill #6 (LightArmor)"},{"t":3,"p":1,"n":"Skill #7 (Pickpocket)"},{"t":3,"p":1,"n":"Skill #8 (Lockpicking)"},{"t":3,"p":1,"n":"Skill #9 (Sneak)"},{"t":3,"p":1,"n":"Skill #10 (Alchemy)"},{"t":3,"p":1,"n":"Skill #11 (Speechcraft)"},{"t":3,"p":1,"n":"Skill #12 (Alteration)"},{"t":3,"p":1,"n":"Skill #13 (Conjuration)"},{"t":3,"p":1,"n":"Skill #14 (Destruction)"},{"t":3,"p":1,"n":"Skill #15 (Illusion)"},{"t":3,"p":1,"n":"Skill #16 (Restoration)"},{"t":3,"p":1,"n":"Skill #17 (Enchanting)"}]},{"t":7,"p":1,"n":"Skill Offsets","c":[{"t":3,"p":1,"n":"Skill #0 (OneHanded)"},{"t":3,"p":1,"n":"Skill #1 (TwoHanded)"},{"t":3,"p":1,"n":"Skill #2 (Marksman)"},{"t":3,"p":1,"n":"Skill #3 (Block)"},{"t":3,"p":1,"n":"Skill #4 (Smithing)"},{"t":3,"p":1,"n":"Skill #5 (HeavyArmor)"},{"t":3,"p":1,"n":"Skill #6 (LightArmor)"},{"t":3,"p":1,"n":"Skill #7 (Pickpocket)"},{"t":3,"p":1,"n":"Skill #8 (Lockpicking)"},{"t":3,"p":1,"n":"Skill #9 (Sneak)"},{"t":3,"p":1,"n":"Skill #10 (Alchemy)"},{"t":3,"p":1,"n":"Skill #11 (Speechcraft)"},{"t":3,"p":1,"n":"Skill #12 (Alteration)"},{"t":3,"p":1,"n":"Skill #13 (Conjuration)"},{"t":3,"p":1,"n":"Skill #14 (Destruction)"},{"t":3,"p":1,"n":"Skill #15 (Illusion)"},{"t":3,"p":1,"n":"Skill #16 (Restoration)"},{"t":3,"p":1,"n":"Skill #17 (Enchanting)"}]},{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Far away model distance"},{"t":3,"p":1,"n":"Geared up weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}],"lt":"NAM6 - Height","lf":"HCLF - Hair Color"},{"t":3,"p":1,"n":"HCLF - Hair Color","lt":"Head Parts","lf":"FTST - Head texture"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height","lt":"NAM7 - Weight","lf":"Head Parts"},{"t":5,"p":1,"n":"NAM7 - Weight","lt":"RNAM - Race","lf":"NAM6 - Height"},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":10,"p":1,"n":"Sound Types","d":1,"c":[{"t":6,"p":1,"n":"Sound Type","c":[{"t":3,"p":1,"n":"CSDT - Type"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CSDI - Sound"},{"t":3,"p":1,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"DOFT - Default outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime faction"},{"t":3,"p":1,"n":"FTST - Head texture","lt":"HCLF - Hair Color","lf":"QNAM - Texture lighting"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}],"lt":"FTST - Head texture","lf":"NAM9 - Face morph"},{"t":6,"s":1,"p":1,"n":"NAM9 - Face morph","c":[{"t":5,"p":1,"n":"Nose Long\/Short"},{"t":5,"p":1,"n":"Nose Up\/Down"},{"t":5,"p":1,"n":"Jaw Up\/Down"},{"t":5,"p":1,"n":"Jaw Narrow\/Wide"},{"t":5,"p":1,"n":"Jaw Farward\/Back"},{"t":5,"p":1,"n":"Cheeks Up\/Down"},{"t":5,"p":1,"n":"Cheeks Farward\/Back"},{"t":5,"p":1,"n":"Eyes Up\/Down"},{"t":5,"p":1,"n":"Eyes In\/Out"},{"t":5,"p":1,"n":"Brows Up\/Down"},{"t":5,"p":1,"n":"Brows In\/Out"},{"t":5,"p":1,"n":"Brows Farward\/Back"},{"t":5,"p":1,"n":"Lips Up\/Down"},{"t":5,"p":1,"n":"Lips In\/Out"},{"t":5,"p":1,"n":"Chin Narrow\/Wide"},{"t":5,"p":1,"n":"Chin Up\/Down"},{"t":5,"p":1,"n":"Chin Underbite\/Overbite"},{"t":5,"p":1,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}],"lt":"QNAM - Texture lighting","lf":"NAMA - Face parts"},{"t":6,"s":1,"p":1,"n":"NAMA - Face parts","c":[{"t":3,"p":1,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Eyes"},{"t":3,"p":1,"n":"Mouth"}],"lt":"NAM9 - Face morph","lf":"Tint Layers"},{"t":10,"p":1,"n":"Tint Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":3,"p":1,"n":"TINI - Tint Index"},{"t":6,"p":1,"n":"TINC - Tint Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"p":1,"n":"Alpha"}]},{"t":3,"p":1,"n":"TINV - Interpolation Value"},{"t":3,"p":1,"n":"TIAS - Preset"}]}],"lt":"NAMA - Face parts","lf":"RNAM - Race"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"INAM - Items","d":1,"c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"},{"t":4,"p":1,"n":"OnChange"}]},{"t":2,"p":1,"n":"FileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags"},{"t":6,"p":1,"n":"IDLC - IDLC","c":[{"t":3,"p":1,"n":"Animation Count"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags","c":[{"t":4,"p":1,"n":"Public"}]}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Repeat when Complete"},{"t":4,"n":"Unknown 1"}]}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Success Completes Package"}]},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Clear General Flags","c":[{"t":4,"p":1,"n":"Offers Services"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Must complete"},{"t":4,"p":1,"n":"Maintain Speed at Goal"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Unlock doors at package start"},{"t":4,"p":1,"n":"Unlock doors at package end"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Continue if PC Near"},{"t":4,"p":1,"n":"Once per day"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"p":1,"n":"Preferred Speed"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"Always Sneak"},{"t":4,"p":1,"n":"Allow Swimming"},{"t":4,"n":"Unknown 20"},{"t":4,"p":1,"n":"Ignore Combat"},{"t":4,"p":1,"n":"Weapons Unequipped"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"Weapon Drawn"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"No Combat Alert"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Wear Sleep Outfit (unused)"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Set Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Clear Interrupt Flags","c":[{"t":4,"p":1,"n":"Hellos to player"},{"t":4,"p":1,"n":"Random conversations"},{"t":4,"p":1,"n":"Observe combat behavior"},{"t":4,"p":1,"n":"Greet corpse behavior"},{"t":4,"p":1,"n":"Reaction to player actions"},{"t":4,"p":1,"n":"Friendly fire comments"},{"t":4,"p":1,"n":"Aggro Radius Behavior"},{"t":4,"p":1,"n":"Allow Idle Chatter"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"World Interactions"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"}]},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags","c":[{"t":4,"p":1,"n":"Public"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCDA - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"FileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags","c":[{"t":4,"p":1,"n":"Run Immediately"},{"t":4,"p":1,"n":"Replace Default"}]},{"t":3,"p":1,"n":"Fragment Index"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"Player Reference","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PLYR - Player"}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Turn Off Fire"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"p":1,"n":"Don't Havok Settle"},{"t":4,"p":1,"n":"No Respawn"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Hitscan"},{"t":4,"p":1,"n":"Explosion"},{"t":4,"p":1,"n":"Alt. Trigger"},{"t":4,"p":1,"n":"Muzzle Flash"},{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Can Be Disabled"},{"t":4,"p":1,"n":"Can Be Picked Up"},{"t":4,"p":1,"n":"Supersonic"},{"t":4,"p":1,"n":"Pins Limbs"},{"t":4,"p":1,"n":"Pass Through Small Transparent"},{"t":4,"p":1,"n":"Disable Combat Aim Correction"},{"t":4,"p":1,"n":"Rotation"}]},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Tracer Chance"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model FileName"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"PWAT","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"FragmentCount"},{"t":2,"p":1,"n":"FileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"s":1,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Start Game Enabled"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Allow repeated stages"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Run Once"},{"t":4,"p":1,"n":"Exclude from dialogue export"},{"t":4,"p":1,"n":"Warn on alias fill failure"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"}]},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Object Window Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"s":1,"p":1,"n":"Stages","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Unknown 1"},{"t":4,"p":1,"n":"Start Up Stage"},{"t":4,"p":1,"n":"Shut Down Stage"},{"t":4,"p":1,"n":"Keep Instance Data From Here On"}]},{"t":3,"p":1,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags","c":[{"t":4,"p":1,"n":"Complete Quest"},{"t":4,"p":1,"n":"Fail Quest"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"},{"t":11,"p":1,"n":"SCHR - Unused"},{"t":11,"p":1,"n":"SCTX - Unused"},{"t":11,"p":1,"n":"QNAM - Unused"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"ORed With Previous"}]},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Compass Marker Ignores Locks"}]},{"t":11,"p":1,"n":"Unused"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":3,"p":1,"n":"ANAM - Next Alias ID"},{"t":8,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":6,"p":1,"n":"FNAM - Alias Flags","d":1,"c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Reserves Location\/Reference"},{"t":4,"p":1,"n":"Optional"},{"t":4,"p":1,"n":"Quest Object"},{"t":4,"p":1,"n":"Allow Reuse in Quest"},{"t":4,"p":1,"n":"Allow Dead"},{"t":4,"p":1,"n":"Matching Ref - In Loaded Area"},{"t":4,"p":1,"n":"Essential"},{"t":4,"p":1,"n":"Allow Disabled"},{"t":4,"p":1,"n":"Stores Text"},{"t":4,"p":1,"n":"Allow Reserved"},{"t":4,"p":1,"n":"Protected"},{"t":4,"p":1,"n":"Forced by Aliases?"},{"t":4,"p":1,"n":"Allow Destroyed"},{"t":4,"p":1,"n":"Matching Ref - Closest"},{"t":4,"p":1,"n":"Uses Stored Text"},{"t":4,"p":1,"n":"Initially Disabled"}]},{"t":3,"p":1,"n":"Additional Flags","c":[{"t":4,"p":1,"n":"Allow Cleared"},{"t":4,"p":1,"n":"Clear Names When Removed"}]}]},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFL - Specific Location"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"s":1,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"s":1,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"s":1,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"s":1,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"s":1,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":10,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"p":1,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]},{"t":6,"n":"Alias","c":[{"t":3,"n":"ALLS - Location Alias ID"},{"t":2,"n":"ALID - Alias Name"},{"t":6,"n":"FNAM - Alias Flags","c":[{"t":3,"n":"Flags","c":[{"t":4,"n":"Reserves Location\/Reference"},{"t":4,"n":"Optional"},{"t":4,"n":"Quest Object"},{"t":4,"n":"Allow Reuse in Quest"},{"t":4,"n":"Allow Dead"},{"t":4,"n":"Matching Ref - In Loaded Area"},{"t":4,"n":"Essential"},{"t":4,"n":"Allow Disabled"},{"t":4,"n":"Stores Text"},{"t":4,"n":"Allow Reserved"},{"t":4,"n":"Protected"},{"t":4,"n":"Forced by Aliases?"},{"t":4,"n":"Allow Destroyed"},{"t":4,"n":"Matching Ref - Closest"},{"t":4,"n":"Uses Stored Text"},{"t":4,"n":"Initially Disabled"}]},{"t":3,"n":"Additional Flags","c":[{"t":4,"n":"Allow Cleared"},{"t":4,"n":"Clear Names When Removed"}]}]},{"t":3,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"n":"ALFL - Specific Location"},{"t":3,"n":"ALFR - Forced Reference"},{"t":3,"n":"ALUA - Unique Actor"},{"t":6,"n":"Location Alias Reference","c":[{"t":3,"n":"ALFA - Alias"},{"t":3,"n":"KNAM - Keyword"},{"t":3,"n":"ALRT - Ref Type"}]},{"t":6,"n":"External Alias Reference","c":[{"t":3,"n":"ALEQ - Quest"},{"t":3,"n":"ALEA - Alias"}]},{"t":6,"n":"Create Reference to Object","c":[{"t":3,"n":"ALCO - Object"},{"t":6,"n":"ALCA - Alias","c":[{"t":3,"n":"Alias"},{"t":3,"n":"Create"}]},{"t":3,"n":"ALCL - Level"}]},{"t":6,"n":"Find Matching Reference Near Alias","c":[{"t":3,"n":"ALNA - Alias"},{"t":3,"n":"ALNT - Type"}]},{"t":6,"n":"Find Matching Reference From Event","c":[{"t":2,"n":"ALFE - From Event"},{"t":11,"n":"ALFD - Event Data"}]},{"t":10,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - CTDA","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":3,"n":"Variable Name"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Knowable"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords"},{"t":3,"n":"COCT - Count"},{"t":10,"n":"Items","c":[{"t":6,"n":"Item","c":[{"t":6,"n":"CNTO - Item","c":[{"t":3,"n":"Item"},{"t":3,"n":"Count"}]},{"t":6,"n":"COED - Extra Data","c":[{"t":3,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"n":"Global Variable"},{"t":3,"n":"Required Rank"},{"t":5,"n":"Item Condition"}]}]}]},{"t":3,"n":"SPOR - Spectator override package list"},{"t":3,"n":"OCOR - Observe dead body override package list"},{"t":3,"n":"GWOR - Guard warn override package list"},{"t":3,"n":"ECOR - Combat override package list"},{"t":3,"n":"ALDN - Display Name"},{"t":8,"n":"Alias Spells","c":[{"t":3,"n":"ALSP - Spell"}]},{"t":8,"n":"ALFC - Alias Factions","c":[{"t":3,"n":"ALFC - Faction"}]},{"t":8,"n":"Alias Package Data","c":[{"t":3,"n":"ALPC - Package"}]},{"t":3,"n":"VTCK - Voice Types"},{"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":8,"s":1,"p":1,"n":"Targets","d":1,"c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Compass Marker Ignores Locks"}]},{"t":11,"n":"Unknown"}]},{"t":10,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"RACE - Race","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"p":1,"n":"Critter?"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"n":"30 - Head"},{"t":4,"n":"31 - Hair"},{"t":4,"n":"32 - Body"},{"t":4,"n":"33 - Hands"},{"t":4,"n":"34 - Forearms"},{"t":4,"n":"35 - Amulet"},{"t":4,"n":"36 - Ring"},{"t":4,"n":"37 - Feet"},{"t":4,"n":"38 - Calves"},{"t":4,"n":"39 - Shield"},{"t":4,"n":"40 - Tail"},{"t":4,"n":"41 - LongHair"},{"t":4,"n":"42 - Circlet"},{"t":4,"n":"43 - Ears"},{"t":4,"n":"44 - Unnamed"},{"t":4,"n":"45 - Unnamed"},{"t":4,"n":"46 - Unnamed"},{"t":4,"n":"47 - Unnamed"},{"t":4,"n":"48 - Unnamed"},{"t":4,"n":"49 - Unnamed"},{"t":4,"n":"50 - DecapitateHead"},{"t":4,"n":"51 - Decapitate"},{"t":4,"n":"52 - Unnamed"},{"t":4,"n":"53 - Unnamed"},{"t":4,"n":"54 - Unnamed"},{"t":4,"n":"55 - Unnamed"},{"t":4,"n":"56 - Unnamed"},{"t":4,"n":"57 - Unnamed"},{"t":4,"n":"58 - Unnamed"},{"t":4,"n":"59 - Unnamed"},{"t":4,"n":"60 - Unnamed"},{"t":4,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags","c":[{"t":4,"n":"30 - Head"},{"t":4,"n":"31 - Hair"},{"t":4,"n":"32 - Body"},{"t":4,"n":"33 - Hands"},{"t":4,"n":"34 - Forearms"},{"t":4,"n":"35 - Amulet"},{"t":4,"n":"36 - Ring"},{"t":4,"n":"37 - Feet"},{"t":4,"n":"38 - Calves"},{"t":4,"n":"39 - Shield"},{"t":4,"n":"40 - Tail"},{"t":4,"n":"41 - LongHair"},{"t":4,"n":"42 - Circlet"},{"t":4,"n":"43 - Ears"},{"t":4,"n":"44 - Unnamed"},{"t":4,"n":"45 - Unnamed"},{"t":4,"n":"46 - Unnamed"},{"t":4,"n":"47 - Unnamed"},{"t":4,"n":"48 - Unnamed"},{"t":4,"n":"49 - Unnamed"},{"t":4,"n":"50 - DecapitateHead"},{"t":4,"n":"51 - Decapitate"},{"t":4,"n":"52 - Unnamed"},{"t":4,"n":"53 - Unnamed"},{"t":4,"n":"54 - Unnamed"},{"t":4,"n":"55 - Unnamed"},{"t":4,"n":"56 - Unnamed"},{"t":4,"n":"57 - Unnamed"},{"t":4,"n":"58 - Unnamed"},{"t":4,"n":"59 - Unnamed"},{"t":4,"n":"60 - Unnamed"},{"t":4,"n":"61 - FX01"}]},{"t":3,"p":1,"n":"General Flags","c":[{"t":4,"n":"(ARMA)Modulates Voice"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"(ARMO)Non-Playable"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"}]},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"p":1,"n":"DATA - DATA","c":[{"t":9,"s":1,"p":1,"n":"Skill Boosts","c":[{"t":6,"p":1,"n":"Skill Boost","c":[{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Male Height"},{"t":5,"p":1,"n":"Female Height"},{"t":5,"p":1,"n":"Male Weight"},{"t":5,"p":1,"n":"Female Weight"},{"t":3,"p":1,"n":"Flags","d":1,"c":[{"t":4,"p":1,"n":"Playable"},{"t":4,"p":1,"n":"FaceGen Head"},{"t":4,"p":1,"n":"Child"},{"t":4,"p":1,"n":"Tilt Front\/Back"},{"t":4,"p":1,"n":"Tilt Left\/Right"},{"t":4,"p":1,"n":"No Shadow"},{"t":4,"p":1,"n":"Swims"},{"t":4,"p":1,"n":"Flies"},{"t":4,"p":1,"n":"Walks"},{"t":4,"p":1,"n":"Immobile"},{"t":4,"p":1,"n":"Not Pushable"},{"t":4,"p":1,"n":"No Combat In Water"},{"t":4,"p":1,"n":"No Rotating to Head-Track"},{"t":4,"p":1,"n":"Don't Show Blood Spray"},{"t":4,"p":1,"n":"Don't Show Blood Decal"},{"t":4,"p":1,"n":"Uses Head Track Anims"},{"t":4,"p":1,"n":"Spells Align w\/Magic Node"},{"t":4,"p":1,"n":"Use World Raycasts For FootIK"},{"t":4,"p":1,"n":"Allow Ragdoll Collision"},{"t":4,"p":1,"n":"Regen HP In Combat"},{"t":4,"p":1,"n":"Can't Open Doors"},{"t":4,"p":1,"n":"Allow PC Dialogue"},{"t":4,"p":1,"n":"No Knockdowns"},{"t":4,"p":1,"n":"Allow Pickpocket"},{"t":4,"p":1,"n":"Always Use Proxy Controller"},{"t":4,"p":1,"n":"Don't Show Weapon Blood"},{"t":4,"p":1,"n":"Overlay Head Part List"},{"t":4,"p":1,"n":"Override Head Part List"},{"t":4,"p":1,"n":"Can Pickup Items"},{"t":4,"p":1,"n":"Allow Multiple Membrane Shaders"},{"t":4,"p":1,"n":"Can Dual Wield"},{"t":4,"p":1,"n":"Avoids Roads"}]},{"t":5,"p":1,"n":"Starting Health"},{"t":5,"p":1,"n":"Starting Magicka"},{"t":5,"p":1,"n":"Starting Stamina"},{"t":5,"p":1,"n":"Base Carry Weight"},{"t":5,"p":1,"n":"Base Mass"},{"t":5,"p":1,"n":"Acceleration rate"},{"t":5,"p":1,"n":"Deceleration rate"},{"t":3,"p":1,"n":"Size"},{"t":3,"p":1,"n":"Head Biped Object"},{"t":3,"p":1,"n":"Hair Biped Object"},{"t":5,"p":1,"n":"Injured Health Pct"},{"t":3,"p":1,"n":"Shield Biped Object"},{"t":5,"p":1,"n":"Health Regen"},{"t":5,"p":1,"n":"Magicka Regen"},{"t":5,"p":1,"n":"Stamina Regen"},{"t":5,"p":1,"n":"Unarmed Damage"},{"t":5,"p":1,"n":"Unarmed Reach"},{"t":3,"p":1,"n":"Body Biped Object"},{"t":5,"p":1,"n":"Aim Angle Tolerance"},{"t":5,"p":1,"n":"Flight Radius"},{"t":5,"p":1,"n":"Angular Acceleration Rate"},{"t":5,"p":1,"n":"Angular Tolerance"},{"t":3,"p":1,"n":"Flags 2","d":1,"c":[{"t":4,"p":1,"n":"Use Advanced Avoidance"},{"t":4,"p":1,"n":"Non-Hostile"},{"t":4,"p":1,"n":"Unknown 2"},{"t":4,"p":1,"n":"Unknown 3"},{"t":4,"p":1,"n":"Allow Mounted Combat"}]},{"t":6,"p":1,"n":"Mount Data","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"n":"Unknown"}]}]},{"p":1,"n":"MNAM - Male Marker"},{"t":2,"p":1,"n":"ANAM - Male Skeletal Model"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"p":1,"n":"FNAM - Female Marker"},{"t":2,"p":1,"n":"ANAM - Female Skeletal Model"},{"p":1,"n":"NAM2 - Marker NAM2 #1"},{"t":8,"p":1,"n":"MTNM - Movement Type Names","c":[{"t":2,"p":1,"n":"MTNM - Name"}]},{"t":7,"p":1,"n":"VTCK - Voices","c":[{"t":3,"p":1,"n":"Male"},{"t":3,"p":1,"n":"Female"}]},{"t":7,"p":1,"n":"DNAM - Decapitate Armors","c":[{"t":3,"p":1,"n":"Male"},{"t":3,"p":1,"n":"Female"}]},{"t":7,"p":1,"n":"HCLF - Default Hair Colors","c":[{"t":3,"p":1,"n":"Male"},{"t":3,"p":1,"n":"Female"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"p":1,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"p":1,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"n":"Attack Flags","c":[{"t":4,"n":"Ignore Weapon"},{"t":4,"n":"Bash Attack"},{"t":4,"n":"Power Attack"},{"t":4,"n":"Left Attack"},{"t":4,"n":"Rotating Attack"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Override Data"}]},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":6,"p":1,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"p":1,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]},{"t":6,"p":1,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"HNAM - Hairs","c":[{"t":3,"p":1,"n":"Hair"}]},{"t":7,"p":1,"n":"ENAM - Eyes","c":[{"t":3,"p":1,"n":"Eye"}]},{"t":3,"p":1,"n":"GNAM - Body Part Data"},{"p":1,"n":"NAM2 - Marker NAM2 #2"},{"p":1,"n":"NAM3 - Marker NAM3 #3"},{"t":6,"s":1,"p":1,"n":"Male Behavior Graph","c":[{"p":1,"n":"MNAM - Male Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Female Behavior Graph","c":[{"p":1,"n":"FNAM - Female Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"NAM4 - Material Type"},{"t":3,"p":1,"n":"NAM5 - Impact Data Set"},{"t":3,"p":1,"n":"NAM7 - Decapitation FX"},{"t":3,"p":1,"n":"ONAM - Open Loot Sound"},{"t":3,"p":1,"n":"LNAM - Close Loot Sound"},{"t":8,"s":1,"p":1,"n":"Biped Object Names","c":[{"t":2,"p":1,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Override Values","c":[{"t":5,"n":"Left - Walk"},{"t":5,"n":"Left - Run"},{"t":5,"n":"Right - Walk"},{"t":5,"n":"Right - Run"},{"t":5,"n":"Forward - Walk"},{"t":5,"n":"Forward - Run"},{"t":5,"n":"Back - Walk"},{"t":5,"n":"Back - Run"},{"t":5,"n":"Rotate - Walk"},{"t":5,"n":"Unknown"}]}]}]},{"t":3,"p":1,"n":"VNAM - Equipment Flags","d":1,"c":[{"t":4,"p":1,"n":"Hand To Hand Melee"},{"t":4,"p":1,"n":"One Hand Sword"},{"t":4,"p":1,"n":"One Hand Dagger"},{"t":4,"p":1,"n":"One Hand Axe"},{"t":4,"p":1,"n":"One Hand Mace"},{"t":4,"p":1,"n":"Two Hand Sword"},{"t":4,"p":1,"n":"Two Hand Axe"},{"t":4,"p":1,"n":"Bow"},{"t":4,"p":1,"n":"Staff"},{"t":4,"p":1,"n":"Spell"},{"t":4,"p":1,"n":"Shield"},{"t":4,"p":1,"n":"Torch"},{"t":4,"p":1,"n":"Crossbow"}]},{"t":8,"p":1,"n":"Equip Slots","c":[{"t":3,"p":1,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"p":1,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"p":1,"n":"Male Head Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"s":1,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"p":1,"n":"Available Morphs","c":[{"t":11,"p":1,"n":"MPAI - Unknown"},{"t":6,"p":1,"n":"MPAV - Nose Variants","c":[{"t":3,"p":1,"n":"Nose Morph Flags","c":[{"t":4,"p":1,"n":"NoseType0"},{"t":4,"p":1,"n":"NoseType1"},{"t":4,"p":1,"n":"NoseType2"},{"t":4,"p":1,"n":"NoseType3"},{"t":4,"p":1,"n":"NoseType4"},{"t":4,"p":1,"n":"NoseType5"},{"t":4,"p":1,"n":"NoseType6"},{"t":4,"p":1,"n":"NoseType7"},{"t":4,"p":1,"n":"NoseType8"},{"t":4,"p":1,"n":"NoseType9"},{"t":4,"p":1,"n":"NoseType10"},{"t":4,"p":1,"n":"NoseType11"},{"t":4,"p":1,"n":"NoseType12"},{"t":4,"p":1,"n":"NoseType13"},{"t":4,"p":1,"n":"NoseType14"},{"t":4,"p":1,"n":"NoseType15"},{"t":4,"p":1,"n":"NoseType16"},{"t":4,"p":1,"n":"NoseType17"},{"t":4,"p":1,"n":"NoseType18"},{"t":4,"p":1,"n":"NoseType19"},{"t":4,"p":1,"n":"NoseType20"},{"t":4,"p":1,"n":"NoseType21"},{"t":4,"p":1,"n":"NoseType22"},{"t":4,"p":1,"n":"NoseType23"},{"t":4,"p":1,"n":"NoseType24"},{"t":4,"p":1,"n":"NoseType25"},{"t":4,"p":1,"n":"NoseType26"},{"t":4,"p":1,"n":"NoseType27"},{"t":4,"p":1,"n":"NoseType28"},{"t":4,"p":1,"n":"NoseType29"},{"t":4,"p":1,"n":"NoseType30"},{"t":4,"p":1,"n":"NoseType31"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Brow Variants","c":[{"t":3,"p":1,"n":"Brow Morph Flags","c":[{"t":4,"p":1,"n":"BrowType0"},{"t":4,"p":1,"n":"BrowType1"},{"t":4,"p":1,"n":"BrowType2"},{"t":4,"p":1,"n":"BrowType3"},{"t":4,"p":1,"n":"BrowType4"},{"t":4,"p":1,"n":"BrowType5"},{"t":4,"p":1,"n":"BrowType6"},{"t":4,"p":1,"n":"BrowType7"},{"t":4,"p":1,"n":"BrowType8"},{"t":4,"p":1,"n":"BrowType9"},{"t":4,"p":1,"n":"BrowType10"},{"t":4,"p":1,"n":"BrowType11"},{"t":4,"p":1,"n":"BrowType12"},{"t":4,"p":1,"n":"BrowType13"},{"t":4,"p":1,"n":"BrowType14"},{"t":4,"p":1,"n":"BrowType15"},{"t":4,"p":1,"n":"BrowType16"},{"t":4,"p":1,"n":"BrowType17"},{"t":4,"p":1,"n":"BrowType18"},{"t":4,"p":1,"n":"BrowType19"},{"t":4,"p":1,"n":"BrowType20"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Eye Variants","c":[{"t":3,"p":1,"n":"Eye Morph Flags 1","c":[{"t":4,"p":1,"n":"EyesType0"},{"t":4,"p":1,"n":"EyesType1"},{"t":4,"p":1,"n":"EyesType2"},{"t":4,"p":1,"n":"EyesType3"},{"t":4,"p":1,"n":"EyesType4"},{"t":4,"p":1,"n":"EyesType5"},{"t":4,"p":1,"n":"EyesType6"},{"t":4,"p":1,"n":"EyesType7"},{"t":4,"p":1,"n":"EyesType8"},{"t":4,"p":1,"n":"EyesType9"},{"t":4,"p":1,"n":"EyesType10"},{"t":4,"p":1,"n":"EyesType11"},{"t":4,"p":1,"n":"EyesType12"},{"t":4,"p":1,"n":"EyesType13"},{"t":4,"p":1,"n":"EyesType14"},{"t":4,"p":1,"n":"EyesType15"},{"t":4,"p":1,"n":"EyesType16"},{"t":4,"p":1,"n":"EyesType17"},{"t":4,"p":1,"n":"EyesType18"},{"t":4,"p":1,"n":"EyesType19"},{"t":4,"p":1,"n":"EyesType20"},{"t":4,"p":1,"n":"EyesType21"},{"t":4,"p":1,"n":"EyesType22"},{"t":4,"p":1,"n":"EyesType23"},{"t":4,"p":1,"n":"EyesType24"},{"t":4,"p":1,"n":"EyesType25"},{"t":4,"p":1,"n":"EyesType26"},{"t":4,"p":1,"n":"EyesType27"},{"t":4,"p":1,"n":"EyesType28"},{"t":4,"p":1,"n":"EyesType29"},{"t":4,"p":1,"n":"EyesType30"},{"t":4,"p":1,"n":"EyesType31"}]},{"t":3,"p":1,"n":"Eye Morph Flags 2","c":[{"t":4,"p":1,"n":"EyesType32"},{"t":4,"p":1,"n":"EyesType33"},{"t":4,"p":1,"n":"EyesType34"},{"t":4,"p":1,"n":"EyesType35"},{"t":4,"p":1,"n":"EyesType36"},{"t":4,"p":1,"n":"EyesType37"},{"t":4,"p":1,"n":"EyesType38"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Lip Variants","c":[{"t":3,"p":1,"n":"Lip Morph Flags","c":[{"t":4,"p":1,"n":"LipType0"},{"t":4,"p":1,"n":"LipType1"},{"t":4,"p":1,"n":"LipType2"},{"t":4,"p":1,"n":"LipType3"},{"t":4,"p":1,"n":"LipType4"},{"t":4,"p":1,"n":"LipType5"},{"t":4,"p":1,"n":"LipType6"},{"t":4,"p":1,"n":"LipType7"},{"t":4,"p":1,"n":"LipType8"},{"t":4,"p":1,"n":"LipType9"},{"t":4,"p":1,"n":"LipType10"},{"t":4,"p":1,"n":"LipType11"},{"t":4,"p":1,"n":"LipType12"},{"t":4,"p":1,"n":"LipType13"},{"t":4,"p":1,"n":"LipType14"},{"t":4,"p":1,"n":"LipType15"},{"t":4,"p":1,"n":"LipType16"},{"t":4,"p":1,"n":"LipType17"},{"t":4,"p":1,"n":"LipType18"},{"t":4,"p":1,"n":"LipType19"},{"t":4,"p":1,"n":"LipType20"},{"t":4,"p":1,"n":"LipType21"},{"t":4,"p":1,"n":"LipType22"},{"t":4,"p":1,"n":"LipType23"},{"t":4,"p":1,"n":"LipType24"},{"t":4,"p":1,"n":"LipType25"},{"t":4,"p":1,"n":"LipType26"},{"t":4,"p":1,"n":"LipType27"},{"t":4,"p":1,"n":"LipType28"},{"t":4,"p":1,"n":"LipType29"},{"t":4,"p":1,"n":"LipType30"},{"t":4,"p":1,"n":"LipType31"}]},{"t":11,"p":1,"n":"Unknown"}]}]},{"t":8,"p":1,"n":"Race Presets Male","c":[{"t":3,"p":1,"n":"RPRM - Preset NPC"}]},{"t":8,"p":1,"n":"Available Hair Colors Male","d":1,"c":[{"t":3,"p":1,"n":"AHCM - Hair Color"}]},{"t":8,"p":1,"n":"Face Details Texture Set List Male","c":[{"t":3,"p":1,"n":"FTSM - Texture Set"}]},{"t":3,"p":1,"n":"DFTM - Default Face Texture Male"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"p":1,"n":"Female Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"n":"FNAM - Female Data Marker"},{"t":10,"s":1,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"p":1,"n":"Available Morphs","c":[{"t":11,"p":1,"n":"MPAI - Unknown"},{"t":6,"p":1,"n":"MPAV - Nose Variants","c":[{"t":3,"p":1,"n":"Nose Morph Flags","c":[{"t":4,"p":1,"n":"NoseType0"},{"t":4,"p":1,"n":"NoseType1"},{"t":4,"p":1,"n":"NoseType2"},{"t":4,"p":1,"n":"NoseType3"},{"t":4,"p":1,"n":"NoseType4"},{"t":4,"p":1,"n":"NoseType5"},{"t":4,"p":1,"n":"NoseType6"},{"t":4,"p":1,"n":"NoseType7"},{"t":4,"p":1,"n":"NoseType8"},{"t":4,"p":1,"n":"NoseType9"},{"t":4,"p":1,"n":"NoseType10"},{"t":4,"p":1,"n":"NoseType11"},{"t":4,"p":1,"n":"NoseType12"},{"t":4,"p":1,"n":"NoseType13"},{"t":4,"p":1,"n":"NoseType14"},{"t":4,"p":1,"n":"NoseType15"},{"t":4,"p":1,"n":"NoseType16"},{"t":4,"p":1,"n":"NoseType17"},{"t":4,"p":1,"n":"NoseType18"},{"t":4,"p":1,"n":"NoseType19"},{"t":4,"p":1,"n":"NoseType20"},{"t":4,"p":1,"n":"NoseType21"},{"t":4,"p":1,"n":"NoseType22"},{"t":4,"p":1,"n":"NoseType23"},{"t":4,"p":1,"n":"NoseType24"},{"t":4,"p":1,"n":"NoseType25"},{"t":4,"p":1,"n":"NoseType26"},{"t":4,"p":1,"n":"NoseType27"},{"t":4,"p":1,"n":"NoseType28"},{"t":4,"p":1,"n":"NoseType29"},{"t":4,"p":1,"n":"NoseType30"},{"t":4,"p":1,"n":"NoseType31"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Brow Variants","c":[{"t":3,"p":1,"n":"Brow Morph Flags","c":[{"t":4,"p":1,"n":"BrowType0"},{"t":4,"p":1,"n":"BrowType1"},{"t":4,"p":1,"n":"BrowType2"},{"t":4,"p":1,"n":"BrowType3"},{"t":4,"p":1,"n":"BrowType4"},{"t":4,"p":1,"n":"BrowType5"},{"t":4,"p":1,"n":"BrowType6"},{"t":4,"p":1,"n":"BrowType7"},{"t":4,"p":1,"n":"BrowType8"},{"t":4,"p":1,"n":"BrowType9"},{"t":4,"p":1,"n":"BrowType10"},{"t":4,"p":1,"n":"BrowType11"},{"t":4,"p":1,"n":"BrowType12"},{"t":4,"p":1,"n":"BrowType13"},{"t":4,"p":1,"n":"BrowType14"},{"t":4,"p":1,"n":"BrowType15"},{"t":4,"p":1,"n":"BrowType16"},{"t":4,"p":1,"n":"BrowType17"},{"t":4,"p":1,"n":"BrowType18"},{"t":4,"p":1,"n":"BrowType19"},{"t":4,"p":1,"n":"BrowType20"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Eye Variants","c":[{"t":3,"p":1,"n":"Eye Morph Flags 1","c":[{"t":4,"p":1,"n":"EyesType0"},{"t":4,"p":1,"n":"EyesType1"},{"t":4,"p":1,"n":"EyesType2"},{"t":4,"p":1,"n":"EyesType3"},{"t":4,"p":1,"n":"EyesType4"},{"t":4,"p":1,"n":"EyesType5"},{"t":4,"p":1,"n":"EyesType6"},{"t":4,"p":1,"n":"EyesType7"},{"t":4,"p":1,"n":"EyesType8"},{"t":4,"p":1,"n":"EyesType9"},{"t":4,"p":1,"n":"EyesType10"},{"t":4,"p":1,"n":"EyesType11"},{"t":4,"p":1,"n":"EyesType12"},{"t":4,"p":1,"n":"EyesType13"},{"t":4,"p":1,"n":"EyesType14"},{"t":4,"p":1,"n":"EyesType15"},{"t":4,"p":1,"n":"EyesType16"},{"t":4,"p":1,"n":"EyesType17"},{"t":4,"p":1,"n":"EyesType18"},{"t":4,"p":1,"n":"EyesType19"},{"t":4,"p":1,"n":"EyesType20"},{"t":4,"p":1,"n":"EyesType21"},{"t":4,"p":1,"n":"EyesType22"},{"t":4,"p":1,"n":"EyesType23"},{"t":4,"p":1,"n":"EyesType24"},{"t":4,"p":1,"n":"EyesType25"},{"t":4,"p":1,"n":"EyesType26"},{"t":4,"p":1,"n":"EyesType27"},{"t":4,"p":1,"n":"EyesType28"},{"t":4,"p":1,"n":"EyesType29"},{"t":4,"p":1,"n":"EyesType30"},{"t":4,"p":1,"n":"EyesType31"}]},{"t":3,"p":1,"n":"Eye Morph Flags 2","c":[{"t":4,"p":1,"n":"EyesType32"},{"t":4,"p":1,"n":"EyesType33"},{"t":4,"p":1,"n":"EyesType34"},{"t":4,"p":1,"n":"EyesType35"},{"t":4,"p":1,"n":"EyesType36"},{"t":4,"p":1,"n":"EyesType37"},{"t":4,"p":1,"n":"EyesType38"}]},{"t":11,"p":1,"n":"Unknown"}]},{"t":6,"p":1,"n":"MPAV - Lip Variants","c":[{"t":3,"p":1,"n":"Lip Morph Flags","c":[{"t":4,"p":1,"n":"LipType0"},{"t":4,"p":1,"n":"LipType1"},{"t":4,"p":1,"n":"LipType2"},{"t":4,"p":1,"n":"LipType3"},{"t":4,"p":1,"n":"LipType4"},{"t":4,"p":1,"n":"LipType5"},{"t":4,"p":1,"n":"LipType6"},{"t":4,"p":1,"n":"LipType7"},{"t":4,"p":1,"n":"LipType8"},{"t":4,"p":1,"n":"LipType9"},{"t":4,"p":1,"n":"LipType10"},{"t":4,"p":1,"n":"LipType11"},{"t":4,"p":1,"n":"LipType12"},{"t":4,"p":1,"n":"LipType13"},{"t":4,"p":1,"n":"LipType14"},{"t":4,"p":1,"n":"LipType15"},{"t":4,"p":1,"n":"LipType16"},{"t":4,"p":1,"n":"LipType17"},{"t":4,"p":1,"n":"LipType18"},{"t":4,"p":1,"n":"LipType19"},{"t":4,"p":1,"n":"LipType20"},{"t":4,"p":1,"n":"LipType21"},{"t":4,"p":1,"n":"LipType22"},{"t":4,"p":1,"n":"LipType23"},{"t":4,"p":1,"n":"LipType24"},{"t":4,"p":1,"n":"LipType25"},{"t":4,"p":1,"n":"LipType26"},{"t":4,"p":1,"n":"LipType27"},{"t":4,"p":1,"n":"LipType28"},{"t":4,"p":1,"n":"LipType29"},{"t":4,"p":1,"n":"LipType30"},{"t":4,"p":1,"n":"LipType31"}]},{"t":11,"p":1,"n":"Unknown"}]}]},{"t":8,"p":1,"n":"Race Presets Female","c":[{"t":3,"p":1,"n":"RPRF - Preset NPC"}]},{"t":8,"p":1,"n":"Available Hair Colors Female","d":1,"c":[{"t":3,"p":1,"n":"AHCF - Hair Color"}]},{"t":8,"p":1,"n":"Face Details Texture Set List Female","c":[{"t":3,"p":1,"n":"FTSF - Texture Set"}]},{"t":3,"p":1,"n":"DFTF - Default Face Texture Female"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"p":1,"n":"Persistent"},{"t":4,"p":1,"n":"Initially Disabled"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Is Full LOD"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"p":1,"n":"Filter (Collision Geometry)"},{"t":4,"p":1,"n":"Bounding Box (Collision Geometry)"},{"t":4,"p":1,"n":"Reflected By Auto Water"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"Ground"},{"t":4,"p":1,"n":"Multibound"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":6,"s":1,"p":1,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Has Image Space"},{"t":4,"p":1,"n":"Has Lighting Template"}]},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template","lt":"INAM - Image Space"},{"t":3,"p":1,"n":"INAM - Image Space","lf":"LNAM - Lighting Template"},{"t":8,"s":1,"p":1,"n":"Linked Rooms","d":1,"c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type","c":[{"t":4,"p":1,"n":"Reflection"},{"t":4,"p":1,"n":"Refraction"}]}]}]},{"t":8,"s":1,"p":1,"n":"Lit Water","d":1,"c":[{"t":3,"p":1,"n":"XLTW - Water"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.35+\/-"},{"t":5,"p":1,"n":"End Distance Cap"},{"t":5,"p":1,"n":"Shadow Depth Bias"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"No Alarm"}]}]},{"t":3,"p":1,"n":"XTNM - Teleport Message Box"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags","c":[{"t":4,"p":1,"n":"Parent Activate Only"}]},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":""},{"t":4,"p":1,"n":"Leveled Lock"}]}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":5,"p":1,"n":"XCHG - Charge"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Set Enable State to Opposite of Parent"},{"t":4,"p":1,"n":"Pop In"}]},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag","c":[{"t":4,"p":1,"n":"Use Default"},{"t":4,"p":1,"n":"Activate"},{"t":4,"p":1,"n":"Open"},{"t":4,"p":1,"n":"Open by Default"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags","c":[{"t":4,"p":1,"n":"Visible"},{"t":4,"p":1,"n":"Can Travel To"},{"t":4,"p":1,"n":"\"Show All\" Hidden"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - TNAM","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":7,"p":1,"n":"XLOD - Distant LOD Data","c":[{"t":5,"p":1,"n":""}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Border Region"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Override"}]},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":6,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Secret"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"p":1,"n":"Secret"}]},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Rotate to Face Target"},{"t":4,"p":1,"n":"Attach to Camera"},{"t":4,"p":1,"n":"Inherit Rotation"}]}]}]},{"t":1,"p":1,"n":"RGDL","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"OnBegin"},{"t":4,"p":1,"n":"OnEnd"}]},{"t":2,"p":1,"n":"FileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Begin on Quest Start"},{"t":4,"p":1,"n":"Stop on Quest End"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"Repeat Conditions While True"},{"t":4,"p":1,"n":"Interruptible"}]},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":3,"p":1,"n":"LNAM - Flags","c":[{"t":4,"p":1,"n":"No Player Activation"},{"t":4,"p":1,"n":"Optional"}]},{"t":3,"p":1,"n":"DNAM - Behaviour Flags","c":[{"t":4,"p":1,"n":"Death Pause (unsused)"},{"t":4,"p":1,"n":"Death End"},{"t":4,"p":1,"n":"Combat Pause"},{"t":4,"p":1,"n":"Combat End"},{"t":4,"p":1,"n":"Dialogue Pause"},{"t":4,"p":1,"n":"Dialogue End"},{"t":4,"p":1,"n":"OBS_COM Pause"},{"t":4,"p":1,"n":"OBS_COM End"}]}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Face Target"},{"t":4,"p":1,"n":"Looping"},{"t":4,"p":1,"n":"Headtrack Player"}]},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer Seconds"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"t":3,"p":1,"n":"HTID - Headtrack Actor ID"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"NEXT - Marker"},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"SCOL - Static Collection","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"ONAM - Static"},{"t":7,"p":1,"n":"DATA - Placements"}]}]}]},{"t":1,"p":1,"n":"SCPT","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCRL - Scroll","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - Item","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Manual Cost Calc"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"PC Start Spell"},{"t":4,"n":"Unknown 19"},{"t":4,"p":1,"n":"Area Effect Ignores LOS"},{"t":4,"p":1,"n":"Ignore Resistance"},{"t":4,"p":1,"n":"No Absorb\/Reflect"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"No Dual Cast Modification"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"p":1,"n":"Treat spells as powers"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Words of Power","d":1,"c":[{"t":6,"p":1,"n":"SNAM - SNAM","c":[{"t":3,"p":1,"n":"Word"},{"t":3,"p":1,"n":"Spell"},{"t":5,"p":1,"n":"Recovery Time"}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"p":1,"n":"Can Hold NPC Soul"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - DATA","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SOUL - Contained Soul"},{"t":3,"p":1,"n":"SLCP - Maximum Capacity"},{"t":3,"p":1,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Previous Sibling "},{"t":3,"n":"CITC - Condition Count"},{"t":10,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags","c":[{"t":4,"p":1,"n":"Random"},{"t":4,"p":1,"n":"Warn if no child quest started"}]},{"t":3,"p":1,"n":"Quest Flags","c":[{"t":4,"p":1,"n":"Do all before repeating"},{"t":4,"p":1,"n":"Shares event"},{"t":4,"p":1,"n":"Num quests to run"}]}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags","c":[{"t":4,"p":1,"n":"Mute When Submerged"},{"t":4,"p":1,"n":"Should Appear on Menu"}]},{"t":3,"p":1,"n":"PNAM - Parent"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"CNAM - Unknown"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":2,"p":1,"n":"FNAM - String"},{"t":10,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"BNAM - Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Attenuates With Distance"},{"t":4,"p":1,"n":"Allows Rumble"}]},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Type"},{"t":11,"n":"CNAM - Unknown"},{"t":11,"n":"SNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"Channel 0","c":[{"t":3,"p":1,"n":"L"},{"t":3,"p":1,"n":"R"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"BL"},{"t":3,"p":1,"n":"BR"}]},{"t":6,"p":1,"n":"Channel 1","c":[{"t":3,"p":1,"n":"L"},{"t":3,"p":1,"n":"R"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"BL"},{"t":3,"p":1,"n":"BR"}]},{"t":6,"p":1,"n":"Channel 2? (unused)","c":[{"t":3,"p":1,"n":"L"},{"t":3,"p":1,"n":"R"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"BL"},{"t":3,"p":1,"n":"BR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ANAM - Attenuation Values","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Min Distance"},{"t":5,"p":1,"n":"Max Distance"},{"t":7,"p":1,"n":"Curve","c":[{"t":3,"p":1,"n":""}]}]}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":11,"n":"FNAM - Unknown"},{"t":11,"n":"SNDD - Unknown"},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Manual Cost Calc"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"p":1,"n":"PC Start Spell"},{"t":4,"n":"Unknown 19"},{"t":4,"p":1,"n":"Area Effect Ignores LOS"},{"t":4,"p":1,"n":"Ignore Resistance"},{"t":4,"p":1,"n":"No Absorb\/Reflect"},{"t":4,"n":"Unknown 23"},{"t":4,"p":1,"n":"No Dual Cast Modification"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"},{"t":4,"n":"Unknown 32"}]},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - EFIT","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":10,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - CTDA","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Variable Name"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Knowable"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation Range"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"ICON - Particle Texture"}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Never Fades"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"p":1,"n":"Has Tree LOD"},{"t":4,"p":1,"n":"Add-On LOD Object"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Hidden From Local Map"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"n":"Unknown 12"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"n":"Unknown 16"},{"t":4,"p":1,"n":"Uses HD LOD Texture"},{"t":4,"n":"Unknown 18"},{"t":4,"p":1,"n":"Has Currents"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"p":1,"n":"Is Marker"},{"t":4,"n":"Unknown 24"},{"t":4,"p":1,"n":"Obstacle"},{"t":4,"p":1,"n":"NavMesh Generation - Filter"},{"t":4,"p":1,"n":"NavMesh Generation - Bounding Box"},{"t":4,"p":1,"n":"Show In World Map"},{"t":4,"n":"Unknown 29"},{"t":4,"p":1,"n":"NavMesh Generation - Ground"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Considered Snow"}]},{"t":11,"n":"Unused"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"Level 0","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 1","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 2","c":[{"t":2,"p":1,"n":"Mesh"}]},{"t":6,"p":1,"n":"Level 3","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Hidden From Local Map"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"p":1,"n":"Random Anim Start"},{"t":4,"p":1,"n":"Radio Station"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"p":1,"n":"Has Distant LOD"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX02 - Environment Mask\/Subsurface Tint"},{"t":2,"p":1,"n":"TX03 - Glow\/Detail Map"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Backlight Mask\/Specular"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Parallax"},{"t":4,"p":1,"n":"Alpha - Blending"},{"t":4,"p":1,"n":"Alpha - Testing"},{"t":4,"p":1,"n":"No Subtextures"}]},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"No Specular Map"},{"t":4,"p":1,"n":"Facegen Textures"},{"t":4,"p":1,"n":"Has Model Space Normal Map"}]}]},{"t":1,"p":1,"n":"VOLI - Volumetric Lighting","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Intensity"},{"t":5,"p":1,"n":"DNAM - Custom Color - Contribution"},{"t":5,"p":1,"n":"ENAM - Red"},{"t":5,"p":1,"n":"FNAM - Green"},{"t":5,"p":1,"n":"GNAM - Blue"},{"t":5,"p":1,"n":"HNAM - Density - Contribution"},{"t":5,"p":1,"n":"INAM - Density - Size"},{"t":5,"p":1,"n":"JNAM - Density - Wind Speed"},{"t":5,"p":1,"n":"KNAM - Density - Falling Speed"},{"t":5,"p":1,"n":"LNAM - Phase Function - Contribution"},{"t":5,"p":1,"n":"MNAM - Phase Function - Scattering"},{"t":5,"p":1,"n":"NNAM - Sampling Repartition - Range Factor"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags","c":[{"t":4,"p":1,"n":"Allow Default Dialog"},{"t":4,"p":1,"n":"Female"}]}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"p":1,"n":"ANAM - Opacity"},{"t":3,"p":1,"n":"FNAM - Flags","d":1,"c":[{"t":4,"p":1,"n":"Causes Damage"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"p":1,"n":"Enable Flowmap"},{"t":4,"p":1,"n":"Blend Normals"},{"t":4,"n":"Unknown 5"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"}]},{"t":11,"n":"MNAM - Unused"},{"t":3,"p":1,"n":"TNAM - Material"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":3,"p":1,"n":"DATA - Unused"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Power"},{"t":5,"p":1,"n":"Water Properties - Reflectivity Amount"},{"t":5,"p":1,"n":"Water Properties - Fresnel Amount"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Displacement Simulator - Starting Size"},{"t":5,"p":1,"n":"Displacement Simulator - Force"},{"t":5,"p":1,"n":"Displacement Simulator - Velocity"},{"t":5,"p":1,"n":"Displacement Simulator - Falloff"},{"t":5,"p":1,"n":"Displacement Simulator - Dampner"},{"t":5,"p":1,"n":"Noise Properties - Noise Falloff"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"p":1,"n":"Water Properties - Refraction Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Specular Power"},{"t":5,"p":1,"n":"Specular Properties - Specular Radius"},{"t":5,"p":1,"n":"Specular Properties - Specular Brightness"},{"t":5,"p":1,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"p":1,"n":"Water Properties - Reflection Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"p":1,"n":"Depth Properties - Reflections"},{"t":5,"p":1,"n":"Depth Properties - Refraction"},{"t":5,"p":1,"n":"Depth Properties - Normals"},{"t":5,"p":1,"n":"Depth Properties - Specular Lighting"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Power"},{"t":5,"p":1,"n":"Noise Properties - Flowmap Scale"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Noise Layer One - Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Noise Layer Two - Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Noise Layer Three - Noise Texture"},{"t":2,"p":1,"n":"NAM5 - Flow Normals - Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"p":1,"n":"Non-Playable"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","d":1,"c":[{"t":6,"s":1,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"p":1,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"p":1,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon FileName"},{"t":2,"p":1,"n":"MICO - Small Icon FileName"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructible","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Cap Damage"},{"t":4,"p":1,"n":"Disable"},{"t":4,"p":1,"n":"Destroy"},{"t":4,"p":1,"n":"Ignore External Dmg"}]},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model FileName"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","d":1,"c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Has Scope","c":[{"t":2,"p":1,"n":"MOD3 - Model FileName"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"WNAM - 1st Person Model Object"},{"t":3,"p":1,"n":"SNAM - Attack Sound"},{"t":3,"p":1,"n":"XNAM - Attack Sound 2D"},{"t":3,"p":1,"n":"NAM7 - Attack Loop Sound"},{"t":3,"p":1,"n":"TNAM - Attack Fail Sound"},{"t":3,"p":1,"n":"UNAM - Idle Sound"},{"t":3,"p":1,"n":"NAM9 - Equip Sound"},{"t":3,"p":1,"n":"NAM8 - Unequip Sound"},{"t":6,"s":1,"p":1,"n":"DATA - Game Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Damage"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reach"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Ignores Normal Weapon Resistance"},{"t":4,"p":1,"n":"Automatic (unused)"},{"t":4,"p":1,"n":"Has Scope (unused)"},{"t":4,"p":1,"n":"Can't Drop"},{"t":4,"p":1,"n":"Hide Backpack (unused)"},{"t":4,"p":1,"n":"Embedded Weapon (unused)"},{"t":4,"p":1,"n":"Don't Use 1st Person IS Anim (unused)"},{"t":4,"p":1,"n":"Non-playable"}]},{"t":5,"p":1,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Base VATS To-Hit Chance"},{"t":3,"p":1,"n":"Attack Animation"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Embedded Weapon AV (unused)"},{"t":5,"p":1,"n":"Range Min"},{"t":5,"p":1,"n":"Range Max"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Flags2","c":[{"t":4,"p":1,"n":"Player Only"},{"t":4,"p":1,"n":"NPCs Use Ammo"},{"t":4,"p":1,"n":"No Jam After Reload (unused)"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Minor Crime"},{"t":4,"p":1,"n":"Range Fixed"},{"t":4,"p":1,"n":"Not Used in Normal Combat"},{"t":4,"n":"Unknown 8"},{"t":4,"p":1,"n":"Don't Use 3rd Person IS Anim (unused)"},{"t":4,"p":1,"n":"Burst Shot"},{"t":4,"p":1,"n":"Rumble - Alternate"},{"t":4,"p":1,"n":"Long Bursts"},{"t":4,"p":1,"n":"Non-hostile"},{"t":4,"p":1,"n":"Bound Weapon"}]},{"t":5,"p":1,"n":"Animation Attack Mult"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":5,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":3,"p":1,"n":"Damage"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"% Mult"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"On Death"}]},{"t":3,"p":1,"n":"Effect"}]},{"t":3,"p":1,"n":"VNAM - Detection Sound Level"},{"t":3,"p":1,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WOOP - Word of Power","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"TNAM - Translation"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"p":1,"n":"Can't Wait"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Large References","d":1,"c":[{"t":6,"p":1,"n":"RNAM - Grid","c":[{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"X"},{"t":7,"p":1,"n":"References","c":[{"t":6,"n":"Reference","c":[{"t":3,"n":"Ref"},{"t":3,"n":"Y"},{"t":3,"n":"X"}]}]}]}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - PNAM","c":[{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Use Land Data"},{"t":4,"p":1,"n":"Use LOD Data"},{"t":4,"p":1,"n":"Use Map Data"},{"t":4,"p":1,"n":"Use Water Data"},{"t":4,"p":1,"n":"Use Climate Data"},{"t":4,"p":1,"n":"Use Image Space Data (unused)"},{"t":4,"p":1,"n":"Use Sky Cell"}]},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":6,"p":1,"n":"Camera Data","c":[{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Initial Pitch"}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags","d":1,"c":[{"t":4,"p":1,"n":"Small World"},{"t":4,"p":1,"n":"Can't Fast Travel"},{"t":4,"n":"Unknown 3"},{"t":4,"p":1,"n":"No LOD Water"},{"t":4,"p":1,"n":"No Landscape"},{"t":4,"p":1,"n":"No Sky"},{"t":4,"p":1,"n":"Fixed Dimensions"},{"t":4,"p":1,"n":"No Grass"}]},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"p":1,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"DNAM - Unused"},{"t":11,"n":"CNAM - Unused"},{"t":11,"n":"ANAM - Unused"},{"t":11,"n":"BNAM - Unused"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"s":1,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"s":1,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags","c":[{"t":4,"p":1,"n":"Weather - Pleasant"},{"t":4,"p":1,"n":"Weather - Cloudy"},{"t":4,"p":1,"n":"Weather - Rainy"},{"t":4,"p":1,"n":"Weather - Snow"},{"t":4,"p":1,"n":"Sky Statics - Always Visible"},{"t":4,"p":1,"n":"Sky Statics - Follows Sun Position"}]},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers","d":1,"c":[{"t":4,"p":1,"n":"0"},{"t":4,"p":1,"n":"1"},{"t":4,"p":1,"n":"2"},{"t":4,"p":1,"n":"3"},{"t":4,"p":1,"n":"4"},{"t":4,"p":1,"n":"5"},{"t":4,"p":1,"n":"6"},{"t":4,"p":1,"n":"7"},{"t":4,"p":1,"n":"8"},{"t":4,"p":1,"n":"9"},{"t":4,"p":1,"n":"10"},{"t":4,"p":1,"n":"11"},{"t":4,"p":1,"n":"12"},{"t":4,"p":1,"n":"13"},{"t":4,"p":1,"n":"14"},{"t":4,"p":1,"n":"15"},{"t":4,"p":1,"n":"16"},{"t":4,"p":1,"n":"17"},{"t":4,"p":1,"n":"18"},{"t":4,"p":1,"n":"19"},{"t":4,"p":1,"n":"20"},{"t":4,"p":1,"n":"21"},{"t":4,"p":1,"n":"22"},{"t":4,"p":1,"n":"23"},{"t":4,"p":1,"n":"24"},{"t":4,"p":1,"n":"25"},{"t":4,"p":1,"n":"26"},{"t":4,"p":1,"n":"27"},{"t":4,"p":1,"n":"28"},{"t":4,"p":1,"n":"29"},{"t":4,"p":1,"n":"30"},{"t":4,"p":1,"n":"31"}]},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"HNAM - Volumetric Lighting","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model FileName"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"}]},{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":6,"p":1,"n":"Record Header","c":[{"t":2,"n":"Signature"},{"t":3,"n":"Data Size"},{"t":3,"p":1,"n":"Record Flags","d":1,"c":[{"t":4,"n":"Unknown 0"},{"t":4,"n":"Unknown 1"},{"t":4,"n":"Unknown 2"},{"t":4,"n":"Unknown 3"},{"t":4,"n":"Unknown 4"},{"t":4,"p":1,"n":"Deleted"},{"t":4,"n":"Unknown 6"},{"t":4,"n":"Unknown 7"},{"t":4,"n":"Unknown 8"},{"t":4,"n":"Unknown 9"},{"t":4,"n":"Unknown 10"},{"t":4,"n":"Unknown 11"},{"t":4,"p":1,"n":"Ignored"},{"t":4,"n":"Unknown 13"},{"t":4,"n":"Unknown 14"},{"t":4,"n":"Unknown 15"},{"t":4,"n":"Unknown 16"},{"t":4,"n":"Unknown 17"},{"t":4,"n":"Unknown 18"},{"t":4,"n":"Unknown 19"},{"t":4,"n":"Unknown 20"},{"t":4,"n":"Unknown 21"},{"t":4,"n":"Unknown 22"},{"t":4,"n":"Unknown 23"},{"t":4,"n":"Unknown 24"},{"t":4,"n":"Unknown 25"},{"t":4,"n":"Unknown 26"},{"t":4,"n":"Unknown 27"},{"t":4,"n":"Unknown 28"},{"t":4,"n":"Unknown 29"},{"t":4,"n":"Unknown 30"},{"t":4,"n":"Unknown 31"}]},{"t":3,"n":"FormID"},{"t":11,"n":"Version Control Info 1"},{"t":3,"n":"Form Version"},{"t":11,"n":"Version Control Info 2"}]},{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]}]},"name":"Smash.All","hash":"011B7A28","color":128} \ No newline at end of file diff --git a/frontend/settings/Skyrim/Smash.All.old.json b/frontend/settings/Skyrim/Smash.All.old.json new file mode 100755 index 0000000..272a037 --- /dev/null +++ b/frontend/settings/Skyrim/Smash.All.old.json @@ -0,0 +1 @@ +{"records":"ACHR,ACTI,ADDN,ALCH,AMMO,ANIO,APPA,ARMA,ARMO,ARTO,ASPC,ASTP,AVIF,BOOK,BPTD,CAMS,CELL,CLAS,CLDC,CLFM,CLMT,COBJ,COLL,CONT,CPTH,CSTY,DEBR,DIAL,DLBR,DLVW,DOOR,DUAL,ECZN,EFSH,ENCH,EQUP,EXPL,EYES,FACT,FLOR,FLST,FSTP,FSTS,FURN,GLOB,GMST,GRAS,HAIR,HAZD,HDPT,IDLM,IMAD,IMGS,INFO,INGR,IPCT,IPDS,KEYM,KYWD,LAND,LCRT,LENS,LGTM,LIGH,LSCR,LTEX,LVLI,LVLN,LVSP,MATO,MATT,MESG,MGEF,MISC,MOVT,MSTT,MUSC,MUST,NPC_,OTFT,PACK,PARW,PBAR,PBEA,PCON,PERK,PFLA,PGRE,PHZD,PMIS,PROJ,PWAT,QUST,RACE,REFR,REGN,RELA,REVB,RFCT,RGDL,SCEN,SCOL,SCPT,SCRL,SHOU,SLGM,SMBN,SMEN,SMQN,SNCT,SNDR,SOPM,SOUN,SPEL,SPGD,STAT,TACT,TREE,TXST,VOLI,VTYP,WATR,WEAP,WOOP,WRLD,WTHR,AACT","description":"Smashes all the things. Produced using autoset attributes on all record types found in Skyrim.esm and DLCs. Replaces the old \"Automatic\" setting.\r\n\r\nLast updated 04\/14\/2018.","tree":{"records":[{"t":1,"p":1,"n":"ACHR - Placed NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":6,"s":1,"p":1,"n":"Patrol Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":3,"p":1,"n":"TNAM - Topic"}]},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XMRC - Merchant Container"},{"t":3,"p":1,"n":"XCNT - Count"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":5,"p":1,"n":"XHLP - Health"},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XCLP - Linked Reference Color","c":[{"t":6,"p":1,"n":"Link Start Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Link End Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XHOR - Horse"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIBS - Ignored By Sandbox"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"ACTI - Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"PNAM - Marker Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"SNAM - Sound - Looping"},{"t":3,"p":1,"n":"VNAM - Sound - Activation"},{"t":3,"p":1,"n":"WNAM - Water Type"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"}]},{"t":1,"p":1,"n":"ADDN - Addon Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Node Index"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Master Particle System Cap"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"ALCH - Ingestible","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":5,"p":1,"n":"DATA - Weight"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Value"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Addiction"},{"t":5,"p":1,"n":"Addiction Chance"},{"t":3,"p":1,"n":"Sound - Consume"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"AMMO - Ammunition","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Damage"},{"t":3,"p":1,"n":"Value"}]},{"t":2,"p":1,"n":"ONAM - Short Name"}]},{"t":1,"p":1,"n":"ANIO - Animated Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":2,"p":1,"n":"BNAM - Unload Event"}]},{"t":1,"p":1,"n":"APPA - Alchemical Apparatus","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"p":1,"n":"QUAL - Quality"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"ARMA - Armor Addon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Male Priority"},{"t":3,"p":1,"n":"Female Priority"},{"t":3,"p":1,"n":"Weight slider - Male"},{"t":3,"p":1,"n":"Weight slider - Female"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Detection Sound Value"},{"t":5,"p":1,"n":"Weapon Adjust"}]},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Male 1st Person","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Female 1st Person","c":[{"t":2,"p":1,"n":"MOD5 - Model Filename"},{"t":11,"p":1,"n":"MO5T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO5S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"NAM0 - Male Skin Texture"},{"t":3,"p":1,"n":"NAM1 - Female Skin texture"},{"t":3,"p":1,"n":"NAM2 - Male Skin Texture Swap List"},{"t":3,"p":1,"n":"NAM3 - Female Skin Texture Swap List"},{"t":8,"s":1,"p":1,"n":"Additional Races","d":1,"c":[{"t":3,"p":1,"n":"MODL - Race"}]},{"t":3,"p":1,"n":"SNDD - Footstep Sound"},{"t":3,"p":1,"n":"ONAM - Art Object"}]},{"t":1,"p":1,"n":"ARMO - Armor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Male world model","c":[{"t":2,"p":1,"n":"MOD2 - Model Filename"},{"t":11,"p":1,"n":"MO2T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO2S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Female world model","c":[{"t":2,"p":1,"n":"MOD4 - Model Filename"},{"t":11,"p":1,"n":"MO4T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO4S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon 2 (female)","c":[{"t":2,"p":1,"n":"ICO2 - Large Icon filename"},{"t":2,"p":1,"n":"MIC2 - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BODT - Body Template","lf":"BODT - Body Template"},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}],"lt":"BOD2 - Biped Body Template","lf":"BOD2 - Biped Body Template"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":2,"p":1,"n":"BMCT - Ragdoll Constraint Template"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"RNAM - Race"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Armature","d":1,"c":[{"t":3,"p":1,"n":"MODL - Model Filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"DNAM - Armor Rating"},{"t":3,"p":1,"n":"TNAM - Template Armor"}]},{"t":1,"p":1,"n":"ARTO - Art Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DNAM - Art Type"}]},{"t":1,"p":1,"n":"ASPC - Acoustic Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"SNAM - Ambient Sound"},{"t":3,"p":1,"n":"RDAT - Use Sound from Region (Interiors Only)"},{"t":3,"p":1,"n":"BNAM - Environment Type (reverb)"}]},{"t":1,"p":1,"n":"ASTP - Association Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MPRT - Male Parent Title"},{"t":2,"p":1,"n":"FPRT - Female Parent Title"},{"t":2,"p":1,"n":"MCHT - Male Child Title"},{"t":2,"p":1,"n":"FCHT - Female Child Title"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"AVIF - Actor Value Information","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"ANAM - Abbreviation"},{"t":11,"n":"CNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"AVSK - Skill","c":[{"t":5,"p":1,"n":"Skill Use Mult"},{"t":5,"p":1,"n":"Skill Offset Mult"},{"t":5,"p":1,"n":"Skill Improve Mult"},{"t":5,"p":1,"n":"Skill Improve Offset"}]},{"t":8,"s":1,"p":1,"n":"Perk Tree","d":1,"c":[{"t":6,"p":1,"n":"Node","c":[{"t":3,"p":1,"n":"PNAM - Perk"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"XNAM - Perk-Grid X"},{"t":3,"p":1,"n":"YNAM - Perk-Grid Y"},{"t":5,"p":1,"n":"HNAM - Horizontal Position"},{"t":5,"p":1,"n":"VNAM - Vertical Position"},{"t":3,"p":1,"n":"SNAM - Associated Skill"},{"t":8,"p":1,"n":"Connections","c":[{"t":3,"p":1,"n":"CNAM - Line to Index"}]},{"t":3,"p":1,"n":"INAM - Index"}]}]}]},{"t":1,"p":1,"n":"BOOK - Book","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Book Text"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"INAM - Inventory Art"},{"t":2,"p":1,"n":"CNAM - Description"}]},{"t":1,"p":1,"n":"BPTD - Body Part Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":10,"p":1,"n":"Body Parts","d":1,"c":[{"t":6,"p":1,"n":"Body Part","c":[{"t":2,"p":1,"n":"BPTN - Part Name"},{"t":2,"p":1,"n":"PNAM - Pose Matching"},{"t":2,"p":1,"n":"BPNN - Part Node"},{"t":2,"p":1,"n":"BPNT - VATS Target"},{"t":2,"p":1,"n":"BPNI - IK Data - Start Node"},{"t":6,"p":1,"n":"BPND - ","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Part Type"},{"t":3,"p":1,"n":"Health Percent"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"To Hit Chance"},{"t":3,"p":1,"n":"Explodable - Explosion Chance %"},{"t":3,"p":1,"n":"Explodable - Debris Count"},{"t":3,"p":1,"n":"Explodable - Debris"},{"t":3,"p":1,"n":"Explodable - Explosion"},{"t":5,"p":1,"n":"Tracking Max Angle"},{"t":5,"p":1,"n":"Explodable - Debris Scale"},{"t":3,"p":1,"n":"Severable - Debris Count"},{"t":3,"p":1,"n":"Severable - Debris"},{"t":3,"p":1,"n":"Severable - Explosion"},{"t":5,"p":1,"n":"Severable - Debris Scale"},{"t":6,"p":1,"n":"Gore Effects Positioning","c":[{"t":6,"p":1,"n":"Translate","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Severable - Impact DataSet"},{"t":3,"p":1,"n":"Explodable - Impact DataSet"},{"t":3,"p":1,"n":"Severable - Decal Count"},{"t":3,"p":1,"n":"Explodable - Decal Count"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Limb Replacement Scale"}]},{"t":2,"p":1,"n":"NAM1 - Limb Replacement Model"},{"t":2,"p":1,"n":"NAM4 - Gore Effects - Target Bone"},{"t":11,"p":1,"n":"NAM5 - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"CAMS - Camera Shot","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Action"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Time Multipliers","c":[{"t":5,"p":1,"n":"Player"},{"t":5,"p":1,"n":"Target"},{"t":5,"p":1,"n":"Global"}]},{"t":5,"p":1,"n":"Max Time"},{"t":5,"p":1,"n":"Min Time"},{"t":5,"p":1,"n":"Target % Between Actors"},{"t":5,"p":1,"n":"Near Target Distance"}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"}]},{"t":1,"p":1,"n":"CELL - Cell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"XCLC - Grid","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Force Hide Land"}]},{"t":6,"s":1,"p":1,"n":"XCLL - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Distance"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":5,"p":1,"n":"Light Fade Begin"},{"t":5,"p":1,"n":"Light Fade End"},{"t":3,"p":1,"n":"Inherits"}]},{"t":11,"n":"TVDT - Occlusion Data"},{"t":11,"n":"MHDT - Max Height Data"},{"t":3,"p":1,"n":"LTMP - Lighting Template"},{"t":11,"n":"LNAM - Unknown"},{"t":5,"p":1,"n":"XCLW - Water Height"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":7,"p":1,"n":"XCLR - Regions","c":[{"t":3,"p":1,"n":"Region"}]},{"t":3,"p":1,"n":"XLCN - Location"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":3,"p":1,"n":"XCWT - Water"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XILL - Lock List"},{"t":2,"p":1,"n":"XWEM - Water Environment Map"},{"t":3,"p":1,"n":"XCCM - Sky\/Weather from Region"},{"t":3,"p":1,"n":"XCAS - Acoustic Space"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XCMO - Music Type"},{"t":3,"p":1,"n":"XCIM - Image Space"}]},{"t":1,"p":1,"n":"CLAS - Class","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Teaches"},{"t":3,"p":1,"n":"Maximum training level"},{"t":7,"p":1,"n":"Skill Weights","c":[{"t":3,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"Bleedout Default"},{"t":3,"p":1,"n":"Voice Points"},{"t":7,"p":1,"n":"Attribute Weights","c":[{"t":3,"p":1,"n":"Weight"}]}]}]},{"t":1,"p":1,"n":"CLDC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"CLFM - Color","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"FNAM - Playable"}]},{"t":1,"p":1,"n":"CLMT - Climate","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"WLST - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]},{"t":2,"p":1,"n":"FNAM - Sun Texture"},{"t":2,"p":1,"n":"GNAM - Sun Glare Texture"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"TNAM - Timing","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Begin"},{"t":3,"p":1,"n":"End"}]},{"t":3,"p":1,"n":"Volatility"},{"t":3,"p":1,"n":"Moons \/ Phase Length"}]}]},{"t":1,"p":1,"n":"COBJ - Constructible Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"CNAM - Created Object"},{"t":3,"p":1,"n":"BNAM - Workbench Keyword"},{"t":3,"p":1,"n":"NAM1 - Created Object Count"}]},{"t":1,"p":1,"n":"COLL - Collision Layer","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"p":1,"n":"BNAM - Index"},{"t":6,"s":1,"p":1,"n":"FNAM - Debug Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"GNAM - Flags"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":3,"n":"INTV - Interactables Count"},{"t":7,"p":1,"n":"CNAM - Collides With","c":[{"t":3,"p":1,"n":"Forms"}]}]},{"t":1,"p":1,"n":"CONT - Container","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"QNAM - Sound - Close"}]},{"t":1,"p":1,"n":"CPTH - Camera Path","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"ANAM - Related Camera Paths","c":[{"t":3,"p":1,"n":"Related Camera Path"}]},{"t":3,"p":1,"n":"DATA - Camera Zoom"},{"t":8,"s":1,"p":1,"n":"Camera Shots","d":1,"c":[{"t":3,"p":1,"n":"SNAM - Camera Shot"}]}]},{"t":1,"p":1,"n":"CSTY - Combat Style","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CSGD - General","c":[{"t":5,"p":1,"n":"Offensive Mult"},{"t":5,"p":1,"n":"Defensive Mult"},{"t":5,"p":1,"n":"Group Offensive Mult"},{"t":5,"p":1,"n":"Equipment Score Mult - Melee"},{"t":5,"p":1,"n":"Equipment Score Mult - Magic"},{"t":5,"p":1,"n":"Equipment Score Mult - Ranged"},{"t":5,"p":1,"n":"Equipment Score Mult - Shout"},{"t":5,"p":1,"n":"Equipment Score Mult - Unarmed"},{"t":5,"p":1,"n":"Equipment Score Mult - Staff"},{"t":5,"p":1,"n":"Avoid Threat Chance"}]},{"t":11,"n":"CSMD - Unknown"},{"t":6,"s":1,"p":1,"n":"CSME - Melee","c":[{"t":5,"p":1,"n":"Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Staggered Mult"},{"t":5,"p":1,"n":"Power Attack Blocking Mult"},{"t":5,"p":1,"n":"Bash Mult"},{"t":5,"p":1,"n":"Bash Recoil Mult"},{"t":5,"p":1,"n":"Bash Attack Mult"},{"t":5,"p":1,"n":"Bash Power Attack Mult"},{"t":5,"p":1,"n":"Special Attack Mult"}]},{"t":6,"s":1,"p":1,"n":"CSCR - Close Range","c":[{"t":5,"p":1,"n":"Circle Mult"},{"t":5,"p":1,"n":"Fallback Mult"},{"t":5,"p":1,"n":"Flank Distance"},{"t":5,"p":1,"n":"Stalk Time"}]},{"t":6,"s":1,"p":1,"n":"CSLR - Long Range","c":[{"t":5,"p":1,"n":"Strafe Mult"}]},{"t":6,"s":1,"p":1,"n":"CSFL - Flight","c":[{"t":5,"p":1,"n":"Hover Chance"},{"t":5,"p":1,"n":"Dive Bomb Chance"},{"t":5,"p":1,"n":"Ground Attack Chance"},{"t":5,"p":1,"n":"Hover Time"},{"t":5,"p":1,"n":"Ground Attack Time"},{"t":5,"p":1,"n":"Perch Attack Chance"},{"t":5,"p":1,"n":"Perch Attack Time"},{"t":5,"p":1,"n":"Flying Attack Chance"}]},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"DEBR - Debris","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Models","d":1,"c":[{"t":6,"p":1,"n":"Model","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Percentage"},{"t":2,"p":1,"n":"Model Filename"},{"t":3,"p":1,"n":"Flags"}]},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"}]}]}]},{"t":1,"p":1,"n":"DIAL - Dialog Topic","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":5,"p":1,"n":"PNAM - Priority"},{"t":3,"p":1,"n":"BNAM - Branch"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Topic Flags"},{"t":3,"p":1,"n":"Category"},{"t":3,"p":1,"n":"Subtype"}]},{"t":2,"p":1,"n":"SNAM - Subtype Name"},{"t":3,"p":1,"n":"TIFC - Info Count"}]},{"t":1,"p":1,"n":"DLBR - Dialog Branch","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":3,"n":"TNAM - Unknown"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Starting Topic"}]},{"t":1,"p":1,"n":"DLVW - Dialog View","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"QNAM - Quest"},{"t":8,"s":1,"p":1,"n":"Branches","d":1,"c":[{"t":3,"p":1,"n":"BNAM - Branch"}]},{"t":8,"n":"Unknown TNAM","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"TNAM - Unknown"}]}]},{"t":11,"n":"ENAM - Unknown"},{"t":11,"n":"DNAM - Unknown"}]},{"t":1,"n":"DOBJ - Default Object Manager","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"DNAM - Objects","c":[{"t":6,"n":"Object","c":[{"t":3,"n":"Use"},{"t":3,"n":"Object ID"}]}]}]},{"t":1,"p":1,"n":"DOOR - Door","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"SNAM - Sound - Open"},{"t":3,"p":1,"n":"ANAM - Sound - Close"},{"t":3,"p":1,"n":"BNAM - Sound - Loop"},{"t":3,"p":1,"n":"FNAM - Flags"}]},{"t":1,"p":1,"n":"DUAL - Dual Cast Data","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Effect Shader"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Inherit Scale"}]}]},{"t":1,"p":1,"n":"ECZN - Encounter Zone","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Min Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Max Level"}]}]},{"t":1,"p":1,"n":"EFSH - Effect Shader","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"ICON - Fill Texture"},{"t":2,"p":1,"n":"ICO2 - Particle Shader Texture"},{"t":2,"p":1,"n":"NAM7 - Holes Texture"},{"t":2,"p":1,"n":"NAM8 - Membrane Palette Texture"},{"t":2,"p":1,"n":"NAM9 - Particle Palette Texture"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Membrane Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Membrane Shader - Blend Operation"},{"t":3,"p":1,"n":"Membrane Shader - Z Test Function"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 1","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Presistent Alpha Ratio"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Animation Speed (V)"},{"t":5,"p":1,"n":"Edge Effect - Fall Off"},{"t":6,"p":1,"n":"Edge Effect - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade In Time"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Time"},{"t":5,"p":1,"n":"Edge Effect - Alpha Fade Out Time"},{"t":5,"p":1,"n":"Edge Effect - Persistent Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Amplitude"},{"t":5,"p":1,"n":"Edge Effect - Alpha Pulse Frequency"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Full Alpha Ratio"},{"t":5,"p":1,"n":"Edge Effect - Full Alpha Ratio"},{"t":3,"p":1,"n":"Membrane Shader - Dest Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Source Blend Mode"},{"t":3,"p":1,"n":"Particle Shader - Blend Operation"},{"t":3,"p":1,"n":"Particle Shader - Z Test Function"},{"t":3,"p":1,"n":"Particle Shader - Dest Blend Mode"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Up Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Time"},{"t":5,"p":1,"n":"Particle Shader - Particle Birth Ramp Down Time"},{"t":5,"p":1,"n":"Particle Shader - Full Particle Birth Ratio"},{"t":5,"p":1,"n":"Particle Shader - Persistant Particle Count"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime"},{"t":5,"p":1,"n":"Particle Shader - Particle Lifetime +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Acceleration Along Normal"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #1"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #2"},{"t":5,"p":1,"n":"Particle Shader - Initial Velocity #3"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #1"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #2"},{"t":5,"p":1,"n":"Particle Shader - Acceleration #3"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 1 Time"},{"t":5,"p":1,"n":"Particle Shader - Scale Key 2 Time"},{"t":6,"p":1,"n":"Color Key 1 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 2 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Color Key 3 - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Color Key 1 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 2 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 3 - Color Alpha"},{"t":5,"p":1,"n":"Color Key 1 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 2 - Color Key Time"},{"t":5,"p":1,"n":"Color Key 3 - Color Key Time"},{"t":5,"p":1,"n":"Particle Shader - Initial Speed Along Normal +\/-"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg)"},{"t":5,"p":1,"n":"Particle Shader - Initial Rotation (deg) +\/-"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec)"},{"t":5,"p":1,"n":"Particle Shader - Rotation Speed (deg\/sec) +\/-"},{"t":3,"p":1,"n":"Addon Models"},{"t":5,"p":1,"n":"Holes - Start Time"},{"t":5,"p":1,"n":"Holes - End Time"},{"t":5,"p":1,"n":"Holes - Start Val"},{"t":5,"p":1,"n":"Holes - End Val"},{"t":5,"p":1,"n":"Edge Width (alpha units)"},{"t":6,"p":1,"n":"Edge Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Explosion Wind Speed"},{"t":3,"p":1,"n":"Texture Count U"},{"t":3,"p":1,"n":"Texture Count V"},{"t":5,"p":1,"n":"Addon Models - Fade In Time"},{"t":5,"p":1,"n":"Addon Models - Fade Out Time"},{"t":5,"p":1,"n":"Addon Models - Scale Start"},{"t":5,"p":1,"n":"Addon Models - Scale End"},{"t":5,"p":1,"n":"Addon Models - Scale In Time"},{"t":5,"p":1,"n":"Addon Models - Scale Out Time"},{"t":3,"p":1,"n":"Ambient Sound"},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 2","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key 3","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fill\/Texture Effect - Color Key Scale\/Time","c":[{"t":5,"p":1,"n":"Color Key 1 - Scale"},{"t":5,"p":1,"n":"Color Key 2 - Scale"},{"t":5,"p":1,"n":"Color Key 3 - Scale"},{"t":5,"p":1,"n":"Color Key 1 - Time"},{"t":5,"p":1,"n":"Color Key 2 - Time"},{"t":5,"p":1,"n":"Color Key 3 - Time"}]},{"t":5,"p":1,"n":"Color Scale"},{"t":5,"p":1,"n":"Birth Position Offset"},{"t":5,"p":1,"n":"Birth Position Offset Range +\/-"},{"t":6,"p":1,"n":"Particle Shader Animated","c":[{"t":3,"p":1,"n":"Start Frame"},{"t":3,"p":1,"n":"Start Frame Variation"},{"t":3,"p":1,"n":"End Frame"},{"t":3,"p":1,"n":"Loop Start Frame"},{"t":3,"p":1,"n":"Loop Start Variation"},{"t":3,"p":1,"n":"Frame Count"},{"t":3,"p":1,"n":"Frame Count Variation"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (U)"},{"t":5,"p":1,"n":"Fill\/Texture Effect - Texture Scale (V)"},{"t":3,"p":1,"n":"Scene Graph Emit Depth Limit (unused)"}]}]},{"t":1,"p":1,"n":"ENCH - Object Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Enchantment Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Enchantment Amount"},{"t":3,"p":1,"n":"Target Type"},{"t":3,"p":1,"n":"Enchant Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Base Enchantment"},{"t":3,"p":1,"n":"Worn Restrictions"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"EQUP - Equip Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"p":1,"n":"PNAM - Slot Parents","c":[{"t":3,"p":1,"n":"Can Be Equipped"}]},{"t":3,"p":1,"n":"DATA - Use All Parents"}]},{"t":1,"p":1,"n":"EXPL - Explosion","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Sound 1"},{"t":3,"p":1,"n":"Sound 2"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Placed Object"},{"t":3,"p":1,"n":"Spawn Projectile"},{"t":5,"p":1,"n":"Force"},{"t":5,"p":1,"n":"Damage"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"IS Radius"},{"t":5,"p":1,"n":"Vertical Offset Mult"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Sound Level"}]}]},{"t":1,"p":1,"n":"EYES - Eyes","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"ICON - Texture"},{"t":3,"p":1,"n":"DATA - Flags"}]},{"t":1,"p":1,"n":"FACT - Faction","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"s":1,"p":1,"n":"Relations","d":1,"c":[{"t":6,"p":1,"n":"XNAM - Relation","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Modifier"},{"t":3,"p":1,"n":"Group Combat Reaction"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Flags","c":[{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"JAIL - Exterior Jail Marker"},{"t":3,"p":1,"n":"WAIT - Follower Wait Marker"},{"t":3,"p":1,"n":"STOL - Stolen Goods Container"},{"t":3,"p":1,"n":"PLCN - Player Inventory Container"},{"t":3,"p":1,"n":"CRGR - Shared Crime Faction List"},{"t":3,"p":1,"n":"JOUT - Jail Outfit"},{"t":6,"s":1,"p":1,"n":"CRVA - Crime Values","c":[{"t":3,"p":1,"n":"Arrest"},{"t":3,"p":1,"n":"Attack On Sight"},{"t":3,"p":1,"n":"Murder"},{"t":3,"p":1,"n":"Assault"},{"t":3,"p":1,"n":"Trespass"},{"t":3,"p":1,"n":"Pickpocket"},{"t":3,"n":"Unknown"},{"t":5,"p":1,"n":"Steal Multiplier"},{"t":3,"p":1,"n":"Escape"},{"t":3,"p":1,"n":"Werewolf"}]},{"t":10,"p":1,"n":"Ranks","d":1,"c":[{"t":6,"p":1,"n":"Rank","c":[{"t":3,"p":1,"n":"RNAM - Rank#"},{"t":2,"p":1,"n":"MNAM - Male Title"},{"t":2,"p":1,"n":"FNAM - Female Title"},{"t":2,"n":"INAM - Insignia Unused"}]}]},{"t":3,"p":1,"n":"VEND - Vendor Buy\/Sell List"},{"t":3,"p":1,"n":"VENC - Merchant Container"},{"t":6,"s":1,"p":1,"n":"VENV - Vendor Values","c":[{"t":3,"p":1,"n":"Start Hour"},{"t":3,"p":1,"n":"End Hour"},{"t":3,"p":1,"n":"Radius"},{"t":11,"n":"Unknown 1"},{"t":3,"p":1,"n":"Only Buys Stolen Items"},{"t":3,"p":1,"n":"Not\/Sell Buy"},{"t":11,"n":"Unknown 2"}]},{"t":6,"s":1,"p":1,"n":"PLVD - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"FLOR - Flora","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":2,"p":1,"n":"RNAM - Activate Text Override"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Seasonal ingredient production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer "},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]}]},{"t":1,"p":1,"n":"FLST - FormID List","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"FormIDs","d":1,"c":[{"t":3,"p":1,"n":"LNAM - FormID"}]}]},{"t":1,"p":1,"n":"FSTP - Footstep","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DATA - Impact Data Set"},{"t":2,"p":1,"n":"ANAM - Tag"}]},{"t":1,"p":1,"n":"FSTS - Footstep Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"XCNT - Count","c":[{"t":3,"p":1,"n":"Walk Forward Sets"},{"t":3,"p":1,"n":"Run Forward Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate Sets"},{"t":3,"p":1,"n":"Run Forward Alternate Sets"},{"t":3,"p":1,"n":"Walk Forward Alternate 2 Sets"}]},{"t":7,"s":1,"p":1,"n":"DATA - Footstep Sets","c":[{"t":3,"p":1,"n":"Footstep"}]}]},{"t":1,"p":1,"n":"FURN - Furniture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"KNAM - Interaction Keyword"},{"t":3,"p":1,"n":"MNAM - Active Markers \/ Flags"},{"t":6,"s":1,"p":1,"n":"WBDT - Workbench Data","c":[{"t":3,"p":1,"n":"Bench Type"},{"t":3,"p":1,"n":"Uses Skill"}]},{"t":3,"p":1,"n":"NAM1 - Associated Spell"},{"t":8,"s":1,"p":1,"n":"Markers","d":1,"c":[{"t":6,"p":1,"n":"Marker","c":[{"t":3,"p":1,"n":"ENAM - Marker Index"},{"t":6,"p":1,"n":"NAM0 - Disabled Entry Points","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Disabled Points"}]},{"t":3,"p":1,"n":"FNMK - Marker Keyword"}]}]},{"t":8,"s":1,"p":1,"n":"Marker Entry Points","d":1,"c":[{"t":6,"p":1,"n":"FNPR - Marker","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Entry Points"}]}]},{"t":2,"p":1,"n":"XMRK - Model Filename"}]},{"t":1,"p":1,"n":"GLOB - Global","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Type"},{"t":5,"p":1,"n":"FLTV - Value"}]},{"t":1,"p":1,"n":"GMST - Game Setting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"Name"},{"t":3,"p":1,"n":"Int"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"}]},{"t":1,"p":1,"n":"GRAS - Grass","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Units From Water"},{"t":3,"p":1,"n":"Units From Water Type"},{"t":5,"p":1,"n":"Position Range"},{"t":5,"p":1,"n":"Height Range"},{"t":5,"p":1,"n":"Color Range"},{"t":5,"p":1,"n":"Wave Period"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"HAIR","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"HAZD - Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"MNAM - Image Space Modifier"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Limit"},{"t":5,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Image Space Radius"},{"t":5,"p":1,"n":"Target Interval"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Spell"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Impact Data Set"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":1,"p":1,"n":"HDPT - Head Part","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"PNAM - Type"},{"t":8,"s":1,"p":1,"n":"Extra Parts","d":1,"c":[{"t":3,"p":1,"n":"HNAM - Part"}]},{"t":8,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"NAM0 - Part Type"},{"t":2,"p":1,"n":"NAM1 - Filename"}]}]},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"CNAM - Color"},{"t":3,"p":1,"n":"RNAM - Valid Races"}]},{"t":1,"n":"IDLE - Idle Animation","c":[{"t":2,"n":"EDID - Editor ID"},{"t":8,"n":"Conditions","c":[{"t":6,"n":"Condition","c":[{"t":6,"n":"CTDA - ","c":[{"t":3,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"n":"Comparison Value - Float"},{"t":3,"n":"Comparison Value - Global"},{"t":3,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"n":"None"},{"t":3,"n":"Integer"},{"t":5,"n":"Float"},{"t":11,"n":"Variable Name (unused)"},{"t":3,"n":"Sex"},{"t":3,"n":"Actor Value"},{"t":3,"n":"Crime Type"},{"t":3,"n":"Axis"},{"t":3,"n":"Quest Stage (unused)"},{"t":3,"n":"Misc Stat"},{"t":3,"n":"Alignment"},{"t":3,"n":"Equip Type"},{"t":3,"n":"Form Type"},{"t":3,"n":"Critical Stage"},{"t":3,"n":"Object Reference"},{"t":3,"n":"Inventory Object"},{"t":3,"n":"Actor"},{"t":3,"n":"Voice Type"},{"t":3,"n":"Idle"},{"t":3,"n":"Form List"},{"t":3,"n":"Quest"},{"t":3,"n":"Faction"},{"t":3,"n":"Cell"},{"t":3,"n":"Class"},{"t":3,"n":"Race"},{"t":3,"n":"Actor Base"},{"t":3,"n":"Global"},{"t":3,"n":"Weather"},{"t":3,"n":"Package"},{"t":3,"n":"Encounter Zone"},{"t":3,"n":"Perk"},{"t":3,"n":"Owner"},{"t":3,"n":"Furniture"},{"t":3,"n":"Effect Item"},{"t":3,"n":"Base Effect"},{"t":3,"n":"Worldspace"},{"t":3,"n":"VATS Value Function"},{"t":3,"n":"VATS Value Param (INVALID)"},{"t":3,"n":"Referenceable Object"},{"t":3,"n":"Region"},{"t":3,"n":"Keyword"},{"t":3,"n":"Player Action"},{"t":3,"n":"Casting Type"},{"t":3,"n":"Shout"},{"t":3,"n":"Location"},{"t":3,"n":"Location Ref Type"},{"t":3,"n":"Alias"},{"t":3,"n":"Packdata ID"},{"t":3,"n":"Association Type"},{"t":3,"n":"Furniture Anim"},{"t":3,"n":"Furniture Entry"},{"t":3,"n":"Scene"},{"t":3,"n":"Ward State"},{"t":3,"n":"Event"},{"t":3,"n":"Event Data"},{"t":3,"n":"Quest Stage"},{"t":3,"n":"Weapon"},{"t":3,"n":"Weapon List"},{"t":3,"n":"Target"},{"t":3,"n":"Target List"},{"t":3,"n":"Target Part"},{"t":3,"n":"VATS Action"},{"t":3,"n":"Critical Effect"},{"t":3,"n":"Critical Effect List"},{"t":3,"n":"Weapon Type"},{"t":3,"n":"Projectile Type"},{"t":3,"n":"Delivery Type"},{"t":3,"n":"Run On"},{"t":3,"n":"Reference"},{"t":3,"n":"Parameter #3"}]},{"t":2,"n":"CIS1 - Parameter #1"},{"t":2,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"n":"DNAM - Filename"},{"t":2,"n":"ENAM - Animation Event"},{"t":7,"n":"ANAM - Related Idle Animations","c":[{"t":3,"n":"Related Idle Animation"}]},{"t":6,"n":"DATA - Data (unused)","c":[{"t":6,"n":"Looping seconds (both 255 forever)","c":[{"t":3,"n":"Min"},{"t":3,"n":"Max"}]},{"t":3,"n":"Flags"},{"t":3,"n":"Animation Group Section"},{"t":3,"n":"Replay Delay"}]}]},{"t":1,"p":1,"n":"IDLM - Idle Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"IDLF - Flags"},{"t":3,"p":1,"n":"IDLC - Animation Count"},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"IMAD - Image Space Adapter","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DNAM - Data Count","c":[{"t":3,"n":"Flags"},{"t":5,"n":"Duration"},{"t":6,"n":"HDR","c":[{"t":3,"n":"Eye Adapt Speed Mult"},{"t":3,"n":"Eye Adapt Speed Add"},{"t":3,"n":"Bloom Blur Radius Mult"},{"t":3,"n":"Bloom Blur Radius Add"},{"t":3,"n":"Bloom Threshold Mult"},{"t":3,"n":"Bloom Threshold Add"},{"t":3,"n":"Bloom Scale Mult"},{"t":3,"n":"Bloom Scale Add"},{"t":3,"n":"Target Lum Min Mult"},{"t":3,"n":"Target Lum Min Add"},{"t":3,"n":"Target Lum Max Mult"},{"t":3,"n":"Target Lum Max Add"},{"t":3,"n":"Sunlight Scale Mult"},{"t":3,"n":"Sunlight Scale Add"},{"t":3,"n":"Sky Scale Mult"},{"t":3,"n":"Sky Scale Add"}]},{"t":3,"n":"Unknown08 Mult"},{"t":3,"n":"Unknown48 Add"},{"t":3,"n":"Unknown09 Mult"},{"t":3,"n":"Unknown49 Add"},{"t":3,"n":"Unknown0A Mult"},{"t":3,"n":"Unknown4A Add"},{"t":3,"n":"Unknown0B Mult"},{"t":3,"n":"Unknown4B Add"},{"t":3,"n":"Unknown0C Mult"},{"t":3,"n":"Unknown4C Add"},{"t":3,"n":"Unknown0D Mult"},{"t":3,"n":"Unknown4D Add"},{"t":3,"n":"Unknown0E Mult"},{"t":3,"n":"Unknown4E Add"},{"t":3,"n":"Unknown0F Mult"},{"t":3,"n":"Unknown4F Add"},{"t":3,"n":"Unknown10 Mult"},{"t":3,"n":"Unknown50 Add"},{"t":6,"n":"Cinematic","c":[{"t":3,"n":"Saturation Mult"},{"t":3,"n":"Saturation Add"},{"t":3,"n":"Brightness Mult"},{"t":3,"n":"Brightness Add"},{"t":3,"n":"Contrast Mult"},{"t":3,"n":"Contrast Add"}]},{"t":3,"n":"Unknown14 Mult"},{"t":3,"n":"Unknown54 Add"},{"t":3,"n":"Tint Color"},{"t":3,"n":"Blur Radius"},{"t":3,"n":"Double Vision Strength"},{"t":3,"n":"Radial Blur Strength"},{"t":3,"n":"Radial Blur Ramp Up"},{"t":3,"n":"Radial Blur Start"},{"t":3,"n":"Radial Blur Flags"},{"t":5,"n":"Radial Blur Center X"},{"t":5,"n":"Radial Blur Center Y"},{"t":3,"n":"DoF Strength"},{"t":3,"n":"DoF Distance"},{"t":3,"n":"DoF Range"},{"t":3,"n":"DoF Flags"},{"t":3,"n":"Radial Blur Ramp Down"},{"t":3,"n":"Radial Blur Down Start"},{"t":3,"n":"Fade Color"},{"t":3,"n":"Motion Blur Strength"}]},{"t":7,"p":1,"n":"BNAM - Blur Radius","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"VNAM - Double Vision Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"TNAM - Tint Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"NAM3 - Fade Color","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"},{"t":5,"p":1,"n":"Alpha"}]}]},{"t":7,"p":1,"n":"RNAM - Radial Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SNAM - Radial Blur Ramp Up","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"UNAM - Radial Blur Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM1 - Radial Blur Ramp Down","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM2 - Radial Blur Down Start","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"WNAM - DoF Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"XNAM - DoF Distance","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"YNAM - DoF Range","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"NAM4 - Motion Blur Strength","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":6,"s":1,"p":1,"n":"HDR","c":[{"t":7,"p":1,"n":"aIAD - Eye Adapt Speed Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"@IAD - Eye Adapt Speed Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"bIAD - Bloom Blur Radius Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"AIAD - Bloom Blur Radius Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"cIAD - Bloom Threshold Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"BIAD - Bloom Threshold Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"dIAD - Bloom Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"CIAD - Bloom Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"eIAD - Target Lum Min Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"DIAD - Target Lum Min Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"fIAD - Target Lum Max Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"EIAD - Target Lum Max Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"gIAD - Sunlight Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"FIAD - Sunlight Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"hIAD - Sky Scale Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"GIAD - Sky Scale Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"iIAD - Unknown"},{"t":11,"n":"HIAD - Unknown"},{"t":11,"n":"jIAD - Unknown"},{"t":11,"n":"IIAD - Unknown"},{"t":11,"n":"kIAD - Unknown"},{"t":11,"n":"JIAD - Unknown"},{"t":11,"n":"lIAD - Unknown"},{"t":11,"n":"KIAD - Unknown"},{"t":11,"n":"mIAD - Unknown"},{"t":11,"n":"LIAD - Unknown"},{"t":11,"n":"nIAD - Unknown"},{"t":11,"n":"MIAD - Unknown"},{"t":11,"n":"oIAD - Unknown"},{"t":11,"n":"NIAD - Unknown"},{"t":11,"n":"pIAD - Unknown"},{"t":11,"n":"OIAD - Unknown"},{"t":11,"n":"qIAD - Unknown"},{"t":11,"n":"PIAD - Unknown"},{"t":6,"s":1,"p":1,"n":"Cinematic","c":[{"t":7,"p":1,"n":"rIAD - Saturation Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"QIAD - Saturation Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"sIAD - Brightness Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"RIAD - Brightness Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"tIAD - Contrast Mult","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]},{"t":7,"p":1,"n":"SIAD - Contrast Add","c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Time"},{"t":5,"p":1,"n":"Value"}]}]}]},{"t":11,"n":"uIAD - Unknown"},{"t":11,"n":"TIAD - Unknown"}]},{"t":1,"p":1,"n":"IMGS - Image Space","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"ENAM - Unknown"},{"t":6,"s":1,"p":1,"n":"HNAM - HDR","c":[{"t":5,"p":1,"n":"Eye Adapt Speed"},{"t":5,"p":1,"n":"Bloom Blur Radius"},{"t":5,"p":1,"n":"Bloom Threshold"},{"t":5,"p":1,"n":"Bloom Scale"},{"t":5,"p":1,"n":"Receive Bloom Threshold"},{"t":5,"p":1,"n":"White"},{"t":5,"p":1,"n":"Sunlight Scale"},{"t":5,"p":1,"n":"Sky Scale"},{"t":5,"p":1,"n":"Eye Adapt Strength"}]},{"t":6,"s":1,"p":1,"n":"CNAM - Cinematic","c":[{"t":5,"p":1,"n":"Saturation"},{"t":5,"p":1,"n":"Brightness"},{"t":5,"p":1,"n":"Contrast"}]},{"t":6,"s":1,"p":1,"n":"TNAM - Tint","c":[{"t":5,"p":1,"n":"Amount"},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Depth of Field","c":[{"t":5,"p":1,"n":"Strength"},{"t":5,"p":1,"n":"Distance"},{"t":5,"p":1,"n":"Range"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Sky \/ Blur Radius"}]}]},{"t":1,"p":1,"n":"INFO - Dialog response","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":11,"n":"DATA - Unknown"},{"t":6,"s":1,"p":1,"n":"ENAM - Response flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Reset Hours"}]},{"t":3,"p":1,"n":"TPIC - Topic"},{"t":3,"p":1,"n":"PNAM - Previous INFO"},{"t":3,"p":1,"n":"CNAM - Favor Level"},{"t":8,"s":1,"p":1,"n":"Link To","d":1,"c":[{"t":3,"p":1,"n":"TCLT - Response"}]},{"t":3,"p":1,"n":"DNAM - Response Data"},{"t":8,"s":1,"p":1,"n":"Responses","d":1,"c":[{"t":6,"p":1,"n":"Response","c":[{"t":6,"p":1,"n":"TRDT - Response Data","c":[{"t":3,"p":1,"n":"Emotion Type"},{"t":3,"p":1,"n":"Emotion Value"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Response number"},{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"NAM1 - Response Text"},{"t":2,"p":1,"n":"NAM2 - Script Notes"},{"t":2,"p":1,"n":"NAM3 - Edits"},{"t":3,"p":1,"n":"SNAM - Idle Animations: Speaker"},{"t":3,"p":1,"n":"LNAM - Idle Animations: Listener"}]}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":8,"n":"Unknown","c":[{"t":6,"n":"Unknown","c":[{"t":11,"n":"SCHR - Unknown"},{"t":3,"n":"QNAM - Unknown"},{"n":"NEXT - Marker"}]}]},{"t":2,"p":1,"n":"RNAM - Prompt"},{"t":3,"p":1,"n":"ANAM - Speaker"},{"t":3,"p":1,"n":"TWAT - Walk Away Topic"},{"t":3,"p":1,"n":"ONAM - Audio Output Override"}]},{"t":1,"p":1,"n":"INGR - Ingredient","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"n":"Ingredient Value"},{"t":3,"p":1,"n":"Flags"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"IPCT - Impact","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":5,"p":1,"n":"Effect - Duration"},{"t":3,"p":1,"n":"Effect - Orientation"},{"t":5,"p":1,"n":"Angle Threshold"},{"t":5,"p":1,"n":"Placement Radius"},{"t":3,"p":1,"n":"Sound Level"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Impact Result"},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Texture Set"},{"t":3,"p":1,"n":"ENAM - Secondary Texture Set"},{"t":3,"p":1,"n":"SNAM - Sound 1"},{"t":3,"p":1,"n":"NAM1 - Sound 2"},{"t":3,"p":1,"n":"NAM2 - Hazard"}]},{"t":1,"p":1,"n":"IPDS - Impact Data Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"s":1,"p":1,"n":"Data","d":1,"c":[{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Material"},{"t":3,"p":1,"n":"Impact"}]}]}]},{"t":1,"p":1,"n":"KEYM - Key","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"KYWD - Keyword","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LAND - Landscape","d":1,"c":[{"t":11,"n":"DATA - Unknown"},{"t":11,"n":"VNML - Vertex Normals"},{"t":11,"n":"VHGT - Vertext Height Map"},{"t":11,"n":"VCLR - Vertex Colours"},{"t":8,"s":1,"p":1,"n":"Layers","d":1,"c":[{"t":6,"p":1,"n":"Base Layer","c":[{"t":6,"p":1,"n":"BTXT - Base Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]}]},{"t":6,"p":1,"n":"Alpha Layer","c":[{"t":6,"p":1,"n":"ATXT - Alpha Layer Header","c":[{"t":3,"p":1,"n":"Texture"},{"t":3,"p":1,"n":"Quadrant"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Layer"}]},{"t":11,"p":1,"n":"VTXT - Alpha Layer Data"}]}]},{"t":7,"p":1,"n":"VTEX - Textures","c":[{"t":3,"p":1,"n":"Texture"}]}]},{"t":1,"p":1,"n":"LCRT - Location Reference Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"n":"LCTN - Location","c":[{"t":2,"n":"EDID - Editor ID"},{"t":7,"n":"ACPR - Actor Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCPR - Location Cell Persistent Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCPR - Reference Cell Persistent Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACUN - Actor Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"LCUN - Location Cell Unique","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Location"}]}]},{"t":7,"n":"RCUN - Reference Cell Unique","c":[{"t":3,"n":"Actor"}]},{"t":7,"n":"ACSR - Actor Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCSR - Location Cell Static Reference","c":[{"t":6,"n":"","c":[{"t":3,"n":"Loc Ref Type"},{"t":3,"n":"Marker"},{"t":3,"n":"Location"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"RCSR - Reference Cell Static Reference","c":[{"t":3,"n":"Ref"}]},{"t":8,"n":"Actor Cell Encounter Cell","c":[{"t":6,"n":"ACEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Location Cell Encounter Cell","c":[{"t":6,"n":"LCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":8,"n":"Reference Cell Encounter Cell","c":[{"t":6,"n":"RCEC - Unknown","c":[{"t":3,"n":"Location"},{"t":7,"n":"Coordinates","c":[{"t":6,"n":"","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]}]}]},{"t":7,"n":"ACID - Actor Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"LCID - Location Cell Marker Reference","c":[{"t":3,"n":"Ref"}]},{"t":7,"n":"ACEP - Actor Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":7,"n":"LCEP - Location Cell Enable Point","c":[{"t":6,"n":"","c":[{"t":3,"n":"Actor"},{"t":3,"n":"Ref"},{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]}]},{"t":2,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"n":"KWDA - Keywords","c":[{"t":3,"n":"Keyword"}]},{"t":3,"n":"PNAM - Parent Location"},{"t":3,"n":"NAM1 - Music"},{"t":3,"n":"FNAM - Unreported Crime Faction"},{"t":3,"n":"MNAM - World Location Marker Ref"},{"t":5,"n":"RNAM - World Location Radius"},{"t":3,"n":"NAM0 - Horse Marker Ref"},{"t":6,"n":"CNAM - Color","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"LENS - Lens Flare","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Color Influence"},{"t":5,"p":1,"n":"DNAM - Fade Distance Radius Scale"},{"t":3,"n":"LFSP - Count"},{"t":8,"s":1,"p":1,"n":"Lens Flare Sprites","d":1,"c":[{"t":6,"p":1,"n":"Flare","c":[{"t":2,"p":1,"n":"DNAM - Lens Flare Sprite ID"},{"t":2,"p":1,"n":"FNAM - Texture"},{"t":6,"p":1,"n":"LFSD - Lens Flare Data","c":[{"t":6,"p":1,"n":"Tint","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"},{"t":5,"p":1,"n":"Position"},{"t":5,"p":1,"n":"Angular Fade"},{"t":5,"p":1,"n":"Opacity"},{"t":3,"p":1,"n":"Flags"}]}]}]}]},{"t":1,"p":1,"n":"LGTM - Lighting Template","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Lighting","c":[{"t":6,"p":1,"n":"Ambient Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Directional Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Fog Color Near","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Near"},{"t":5,"p":1,"n":"Fog Far"},{"t":3,"p":1,"n":"Directional Rotation XY"},{"t":3,"p":1,"n":"Directional Rotation Z"},{"t":5,"p":1,"n":"Directional Fade"},{"t":5,"p":1,"n":"Fog Clip Dist"},{"t":5,"p":1,"n":"Fog Power"},{"t":6,"p":1,"n":"Ambient Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"Fog Color Far","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Fog Max"},{"t":6,"p":1,"n":"Light Fade Distances","c":[{"t":5,"p":1,"n":"Start"},{"t":5,"p":1,"n":"End"}]},{"t":11,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DALC - Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":1,"p":1,"n":"LIGH - Light","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Time"},{"t":3,"p":1,"n":"Radius"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Falloff Exponent"},{"t":5,"p":1,"n":"FOV"},{"t":5,"p":1,"n":"Near Clip"},{"t":6,"p":1,"n":"Flicker Effect","c":[{"t":5,"p":1,"n":"Period"},{"t":5,"p":1,"n":"Intensity Amplitude"},{"t":5,"p":1,"n":"Movement Amplitude"}]},{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":5,"p":1,"n":"FNAM - Fade value"},{"t":3,"p":1,"n":"SNAM - Sound"}]},{"t":1,"p":1,"n":"LSCR - Load Screen","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"NNAM - Loading Screen NIF"},{"t":5,"p":1,"n":"SNAM - Initial Scale"},{"t":6,"s":1,"p":1,"n":"RNAM - Initial Rotation","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"ONAM - Rotation Offset Constraints","c":[{"t":3,"p":1,"n":"Min"},{"t":3,"p":1,"n":"Max"}]},{"t":6,"s":1,"p":1,"n":"XNAM - Initial Translation Offset","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"MOD2 - Camera Path"}]},{"t":1,"p":1,"n":"LTEX - Landscape Texture","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"TNAM - Texture Set"},{"t":3,"p":1,"n":"MNAM - Material Type"},{"t":6,"s":1,"p":1,"n":"HNAM - Havok Data","c":[{"t":3,"p":1,"n":"Friction"},{"t":3,"p":1,"n":"Restitution"}]},{"t":3,"p":1,"n":"SNAM - Texture Specular Exponent"},{"t":8,"s":1,"p":1,"n":"Grasses","d":1,"c":[{"t":3,"p":1,"n":"GNAM - Grass"}]},{"t":3,"n":"INAM - Unused"}]},{"t":1,"p":1,"n":"LVLI - Leveled Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]}]},{"t":1,"p":1,"n":"LVLN - Leveled NPC","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"p":1,"n":"LVLG - Global"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":1,"p":1,"n":"LVSP - Leveled Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":3,"p":1,"n":"LVLD - Chance None"},{"t":3,"p":1,"n":"LVLF - Flags"},{"t":3,"n":"LLCT - Count"},{"t":10,"p":1,"n":"Leveled List Entries","d":1,"c":[{"t":6,"p":1,"n":"Leveled List Entry","c":[{"t":6,"p":1,"n":"LVLO - Base Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Count"}]}]}]}]},{"t":1,"p":1,"n":"MATO - Material Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":8,"s":1,"p":1,"n":"Property Data","d":1,"c":[{"t":11,"p":1,"n":"DNAM - Data"}]},{"t":6,"s":1,"p":1,"n":"DATA - Directional Material Data","c":[{"t":5,"p":1,"n":"Falloff Scale"},{"t":5,"p":1,"n":"Falloff Bias"},{"t":5,"p":1,"n":"Noise UV Scale"},{"t":5,"p":1,"n":"Material UV Scale"},{"t":6,"p":1,"n":"Projection Vector","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":5,"p":1,"n":"Normal Dampener"},{"t":6,"p":1,"n":"Single Pass Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"MATT - Material Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Material Parent"},{"t":2,"p":1,"n":"MNAM - Material Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Havok Display Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"p":1,"n":"BNAM - Buoyancy"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"HNAM - Havok Impact Data Set"}]},{"t":1,"p":1,"n":"MESG - Message","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"DESC - Description"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"INAM - Icon (unused)"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":3,"p":1,"n":"TNAM - Display Time"},{"t":8,"s":1,"p":1,"n":"Menu Buttons","d":1,"c":[{"t":6,"p":1,"n":"Menu Button","c":[{"t":2,"p":1,"n":"ITXT - Button Text"},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"MGEF - Magic Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"Magic Effect Data","c":[{"t":6,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Base Cost"},{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Assoc. Item"},{"t":3,"p":1,"n":"Magic Skill"},{"t":3,"p":1,"n":"Resist Value"},{"t":3,"p":1,"n":"Counter Effect count"},{"t":3,"p":1,"n":"Casting Light"},{"t":5,"p":1,"n":"Taper Weight"},{"t":3,"p":1,"n":"Hit Shader"},{"t":3,"p":1,"n":"Enchant Shader"},{"t":3,"p":1,"n":"Minimum Skill Level"},{"t":6,"p":1,"n":"Spellmaking","c":[{"t":3,"p":1,"n":"Area"},{"t":5,"p":1,"n":"Casting Time"}]},{"t":5,"p":1,"n":"Taper Curve"},{"t":5,"p":1,"n":"Taper Duration"},{"t":5,"p":1,"n":"Second AV Weight"},{"t":3,"p":1,"n":"Archtype"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Projectile"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Delivery"},{"t":3,"p":1,"n":"Second Actor Value"},{"t":3,"p":1,"n":"Casting Art"},{"t":3,"p":1,"n":"Hit Effect Art"},{"t":3,"p":1,"n":"Impact Data"},{"t":5,"p":1,"n":"Skill Usage Multiplier"},{"t":6,"p":1,"n":"Dual Casting","c":[{"t":3,"p":1,"n":"Art"},{"t":5,"p":1,"n":"Scale"}]},{"t":3,"p":1,"n":"Enchant Art"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Equip Ability"},{"t":3,"p":1,"n":"Image Space Modifier"},{"t":3,"p":1,"n":"Perk to Apply"},{"t":3,"p":1,"n":"Casting Sound Level"},{"t":6,"p":1,"n":"Script Effect AI","c":[{"t":5,"p":1,"n":"Score"},{"t":5,"p":1,"n":"Delay Time"}]}]}]},{"t":8,"s":1,"p":1,"n":"Counter Effects","d":1,"c":[{"t":3,"n":"ESCE - Effect"}]},{"t":7,"p":1,"n":"SNDD - Sounds","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Sound"}]}]},{"t":2,"p":1,"n":"DNAM - Magic Item Description"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"MISC - Misc. Item","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]}]},{"t":1,"p":1,"n":"MOVT - Movement Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"MNAM - Name"},{"t":6,"s":1,"p":1,"n":"SPED - Default Data","c":[{"t":5,"p":1,"n":"Left Walk"},{"t":5,"p":1,"n":"Left Run"},{"t":5,"p":1,"n":"Right Walk"},{"t":5,"p":1,"n":"Right Run"},{"t":5,"p":1,"n":"Forward Walk"},{"t":5,"p":1,"n":"Forward Run"},{"t":5,"p":1,"n":"Back Walk"},{"t":5,"p":1,"n":"Back Run"},{"t":5,"p":1,"n":"Rotate in Place Walk"},{"t":5,"p":1,"n":"Rotate in Place Run"},{"t":5,"p":1,"n":"Rotate while Moving Run"}]},{"t":6,"s":1,"p":1,"n":"INAM - Anim Change Thresholds","c":[{"t":5,"p":1,"n":"Directional"},{"t":5,"p":1,"n":"Movement Speed"},{"t":5,"p":1,"n":"Rotation Speed"}]}]},{"t":1,"p":1,"n":"MSTT - Moveable Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"DATA - Flags"},{"t":3,"p":1,"n":"SNAM - Looping Sound"}]},{"t":1,"p":1,"n":"MUSC - Music Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":6,"s":1,"p":1,"n":"PNAM - Data","c":[{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Ducking (dB)"}]},{"t":5,"p":1,"n":"WNAM - Fade Duration"},{"t":7,"p":1,"n":"TNAM - Music Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"p":1,"n":"MUST - Music Track","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"CNAM - Track Type"},{"t":5,"p":1,"n":"FLTV - Duration"},{"t":5,"p":1,"n":"DNAM - Fade-Out"},{"t":2,"p":1,"n":"ANAM - Track Filename"},{"t":2,"p":1,"n":"BNAM - Finale Filename"},{"t":7,"p":1,"n":"FNAM - Cue Points","c":[{"t":5,"p":1,"n":"Point"}]},{"t":6,"s":1,"p":1,"n":"LNAM - Loop Data","c":[{"t":5,"p":1,"n":"Loop Begins"},{"t":5,"p":1,"n":"Loop Ends"},{"t":3,"p":1,"n":"Loop Count"}]},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":7,"p":1,"n":"SNAM - Tracks","c":[{"t":3,"p":1,"n":"Track"}]}]},{"t":1,"n":"NAVI - Navigation Mesh Info Map","c":[{"t":2,"n":"EDID - Editor ID"},{"t":3,"n":"NVER - Version"},{"t":8,"n":"Navigation Map Infos","c":[{"t":6,"n":"NVMI - Navigation Map Info","c":[{"t":3,"n":"Navigation Mesh"},{"t":11,"n":"Unknown"},{"t":5,"n":"X"},{"t":5,"n":"Y"},{"t":5,"n":"Z"},{"t":3,"n":"Preferred Merges Flag"},{"t":7,"n":"Merged To","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Preferred Merges","c":[{"t":3,"n":"Mesh"}]},{"t":7,"n":"Linked Doors","c":[{"t":6,"n":"Door","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Door Ref"}]}]},{"t":3,"n":"Is Island"},{"t":11,"n":"Unused"},{"t":6,"n":"Island Data","c":[{"t":11,"n":"Unknown"},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]}]},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"}]}]},{"t":6,"n":"NVPP - Preferred Pathing","c":[{"t":7,"n":"NavMeshes","c":[{"t":7,"n":"Set","c":[{"t":3,"n":""}]}]},{"t":7,"n":"NavMesh Tree?","c":[{"t":6,"n":"","c":[{"t":3,"n":"NavMesh"},{"t":3,"n":"Index\/Node"}]}]}]},{"t":7,"n":"NVSI - Unknown","c":[{"t":3,"n":"Navigation Mesh"}]}]},{"t":1,"n":"NAVM - Navigation Mesh","c":[{"t":2,"n":"EDID - Editor ID"},{"t":6,"n":"NVNM - Geometry","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Parent Worldspace"},{"t":6,"n":"Coordinates","c":[{"t":3,"n":"Grid Y"},{"t":3,"n":"Grid X"}]},{"t":3,"n":"Parent Cell"},{"t":7,"n":"Vertices","c":[{"t":11,"n":"Vertex"}]},{"t":7,"n":"Triangles","c":[{"t":11,"n":"Triangle"}]},{"t":7,"n":"External Connections","c":[{"t":6,"n":"Connection","c":[{"t":11,"n":"Unknown"},{"t":3,"n":"Mesh"},{"t":3,"n":"Triangle"}]}]},{"t":7,"n":"Door Triangles","c":[{"t":6,"n":"Door Triangle","c":[{"t":3,"n":"Triangle before door"},{"t":11,"n":"Unknown"},{"t":3,"n":"Door"}]}]}]},{"t":11,"n":"ONAM - Unknown"},{"t":11,"n":"PNAM - Unknown"},{"t":11,"n":"NNAM - Unknown"}]},{"t":1,"p":1,"n":"NPC_ - Non-Player Character (Actor)","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"ACBS - Configuration","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Magicka Offset"},{"t":3,"p":1,"n":"Stamina Offset"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Level Mult"},{"t":3,"p":1,"n":"Calc min level"},{"t":3,"p":1,"n":"Calc max level"},{"t":3,"p":1,"n":"Speed Multiplier"},{"t":3,"p":1,"n":"Disposition Base (unused)"},{"t":3,"p":1,"n":"Template Flags"},{"t":3,"p":1,"n":"Health Offset"},{"t":3,"p":1,"n":"Bleedout Override"}]},{"t":8,"s":1,"p":1,"n":"Factions","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Faction","c":[{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"INAM - Death item"},{"t":3,"p":1,"n":"VTCK - Voice"},{"t":3,"p":1,"n":"TPLT - Template"},{"t":3,"p":1,"n":"RNAM - Race","lt":"Tint Layers","lf":"NAM7 - Weight"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","d":1,"c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"WNAM - Worn Armor"},{"t":3,"p":1,"n":"ANAM - Far away model"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","d":1,"c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"n":"PRKZ - Perk Count"},{"t":8,"s":1,"p":1,"n":"Perks","d":1,"c":[{"t":6,"p":1,"n":"PRKR - Perk","c":[{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unused"}]}]},{"t":3,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","d":1,"c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":6,"s":1,"p":1,"n":"AIDT - AI Data","c":[{"t":3,"p":1,"n":"Aggression"},{"t":3,"p":1,"n":"Confidence"},{"t":3,"p":1,"n":"Energy Level"},{"t":3,"p":1,"n":"Responsibility"},{"t":3,"p":1,"n":"Mood"},{"t":3,"p":1,"n":"Assistance"},{"t":6,"p":1,"n":"Aggro","c":[{"t":3,"p":1,"n":"Aggro Radius Behavior"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Warn"},{"t":3,"p":1,"n":"Warn\/Attack"},{"t":3,"p":1,"n":"Attack"}]}]},{"t":8,"s":1,"p":1,"n":"Packages","d":1,"c":[{"t":3,"p":1,"n":"PKID - Package"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"CNAM - Class"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"SHRT - Short Name"},{"t":11,"n":"DATA - Marker"},{"t":6,"s":1,"p":1,"n":"DNAM - Player Skills","c":[{"t":7,"p":1,"n":"Skill Values","c":[{"t":3,"p":1,"n":"Skill"}]},{"t":7,"p":1,"n":"Skill Offsets","c":[{"t":3,"p":1,"n":"Skill"}]},{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"Magicka"},{"t":3,"p":1,"n":"Stamina"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Far away model distance"},{"t":3,"p":1,"n":"Geared up weapons"}]},{"t":8,"s":1,"p":1,"n":"Head Parts","d":1,"c":[{"t":3,"p":1,"n":"PNAM - Head Part"}],"lt":"NAM6 - Height","lf":"HCLF - Hair Color"},{"t":3,"p":1,"n":"HCLF - Hair Color","lt":"Head Parts","lf":"FTST - Head texture"},{"t":3,"p":1,"n":"ZNAM - Combat Style"},{"t":3,"p":1,"n":"GNAM - Gift Filter"},{"t":11,"n":"NAM5 - Unknown"},{"t":5,"p":1,"n":"NAM6 - Height","lt":"NAM7 - Weight","lf":"Head Parts"},{"t":5,"p":1,"n":"NAM7 - Weight","lt":"RNAM - Race","lf":"NAM6 - Height"},{"t":3,"p":1,"n":"NAM8 - Sound Level"},{"t":10,"p":1,"n":"Sound Types","d":1,"c":[{"t":6,"p":1,"n":"Sound Type","c":[{"t":3,"p":1,"n":"CSDT - Type"},{"t":10,"p":1,"n":"Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"CSDI - Sound"},{"t":3,"p":1,"n":"CSDC - Sound Chance"}]}]}]}]},{"t":3,"p":1,"n":"CSCR - Inherits Sounds From"},{"t":3,"p":1,"n":"DOFT - Default outfit"},{"t":3,"p":1,"n":"SOFT - Sleeping outfit"},{"t":3,"p":1,"n":"DPLT - Default Package List"},{"t":3,"p":1,"n":"CRIF - Crime faction"},{"t":3,"p":1,"n":"FTST - Head texture","lt":"HCLF - Hair Color","lf":"QNAM - Texture lighting"},{"t":6,"s":1,"p":1,"n":"QNAM - Texture lighting","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}],"lt":"FTST - Head texture","lf":"NAM9 - Face morph"},{"t":6,"s":1,"p":1,"n":"NAM9 - Face morph","c":[{"t":5,"p":1,"n":"Nose Long\/Short"},{"t":5,"p":1,"n":"Nose Up\/Down"},{"t":5,"p":1,"n":"Jaw Up\/Down"},{"t":5,"p":1,"n":"Jaw Narrow\/Wide"},{"t":5,"p":1,"n":"Jaw Farward\/Back"},{"t":5,"p":1,"n":"Cheeks Up\/Down"},{"t":5,"p":1,"n":"Cheeks Farward\/Back"},{"t":5,"p":1,"n":"Eyes Up\/Down"},{"t":5,"p":1,"n":"Eyes In\/Out"},{"t":5,"p":1,"n":"Brows Up\/Down"},{"t":5,"p":1,"n":"Brows In\/Out"},{"t":5,"p":1,"n":"Brows Farward\/Back"},{"t":5,"p":1,"n":"Lips Up\/Down"},{"t":5,"p":1,"n":"Lips In\/Out"},{"t":5,"p":1,"n":"Chin Narrow\/Wide"},{"t":5,"p":1,"n":"Chin Up\/Down"},{"t":5,"p":1,"n":"Chin Underbite\/Overbite"},{"t":5,"p":1,"n":"Eyes Farward\/Back"},{"t":5,"n":"Unknown"}],"lt":"QNAM - Texture lighting","lf":"NAMA - Face parts"},{"t":6,"s":1,"p":1,"n":"NAMA - Face parts","c":[{"t":3,"p":1,"n":"Nose"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Eyes"},{"t":3,"p":1,"n":"Mouth"}],"lt":"NAM9 - Face morph","lf":"Tint Layers"},{"t":10,"p":1,"n":"Tint Layers","d":1,"c":[{"t":6,"p":1,"n":"Layer","c":[{"t":3,"p":1,"n":"TINI - Tint Index"},{"t":6,"p":1,"n":"TINC - Tint Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":3,"p":1,"n":"Alpha"}]},{"t":3,"p":1,"n":"TINV - Interpolation Value"},{"t":3,"p":1,"n":"TIAS - Preset"}]}],"lt":"NAMA - Face parts","lf":"RNAM - Race"}]},{"t":1,"p":1,"n":"OTFT - Outfit","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":7,"s":1,"p":1,"n":"INAM - Items","d":1,"c":[{"t":3,"p":1,"n":"Item"}]}]},{"t":1,"p":1,"n":"PACK - Package","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"PKDT - Pack Data","c":[{"t":3,"p":1,"n":"General Flags"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Interrupt Override"},{"t":3,"p":1,"n":"Preferred Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Interrupt Flags"}]},{"t":6,"s":1,"p":1,"n":"PSDT - Schedule","c":[{"t":3,"p":1,"n":"Month"},{"t":3,"p":1,"n":"Day of week"},{"t":3,"p":1,"n":"Date"},{"t":3,"p":1,"n":"Hour"},{"t":3,"p":1,"n":"Minute"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Duration (minutes)"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"Idle Animations","c":[{"t":3,"p":1,"n":"IDLF - Flags"},{"t":6,"p":1,"n":"IDLC - ","c":[{"t":3,"p":1,"n":"Animation Count"},{"t":11,"n":"Unknown"}]},{"t":5,"p":1,"n":"IDLT - Idle Timer Setting"},{"t":7,"p":1,"n":"IDLA - Animations","c":[{"t":3,"p":1,"n":"Animation"}]},{"t":11,"n":"IDLB - Unknown"}]},{"t":3,"p":1,"n":"CNAM - Combat Style"},{"t":3,"p":1,"n":"QNAM - Owner Quest"},{"t":6,"s":1,"p":1,"n":"PKCU - Counter","c":[{"t":3,"p":1,"n":"Data Input Count"},{"t":3,"p":1,"n":"Package Template"},{"t":3,"p":1,"n":"Version Counter (autoincremented)"}]},{"t":6,"s":1,"p":1,"n":"Package Data","c":[{"t":8,"p":1,"n":"Data Input Values","c":[{"t":6,"p":1,"n":"Value","c":[{"t":2,"p":1,"n":"ANAM - Type"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Bool"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"n":"BNAM - Unknown"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]},{"t":6,"p":1,"n":"PLDT - Location","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Cell"},{"t":11,"p":1,"n":"Near Package Start Location"},{"t":11,"p":1,"n":"Near Editor Location"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Keyword"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Radius"}]},{"t":6,"p":1,"n":"PTDA - Target","c":[{"t":6,"p":1,"n":"Target Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Object ID"},{"t":3,"p":1,"n":"Object Type"},{"t":3,"p":1,"n":"Alias"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Count \/ Distance"}]}]},{"t":11,"n":"TPIC - Unknown"}]}]},{"t":8,"p":1,"n":"Data Inputs","c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]}]},{"t":11,"n":"XNAM - Marker"},{"t":6,"s":1,"p":1,"n":"Procedure Tree","c":[{"t":8,"p":1,"n":"Branches","c":[{"t":6,"p":1,"n":"Branch","c":[{"t":2,"p":1,"n":"ANAM - Branch Type"},{"t":3,"p":1,"n":"CITC - Condition Count"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"p":1,"n":"PRCB - Root","c":[{"t":3,"p":1,"n":"Branch Count"},{"t":3,"p":1,"n":"Flags"}]},{"t":2,"p":1,"n":"PNAM - Procedure Type"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"p":1,"n":"Data Input Indexes","c":[{"t":3,"p":1,"n":"PKC2 - Index"}]},{"t":8,"p":1,"n":"Flags Override","c":[{"t":6,"p":1,"n":"PFO2 - Data","c":[{"t":3,"p":1,"n":"Set General Flags"},{"t":3,"p":1,"n":"Clear General Flags"},{"t":3,"p":1,"n":"Set Interrupt Flags"},{"t":3,"p":1,"n":"Clear Interrupt Flags"},{"t":3,"p":1,"n":"Preferred Speed Override"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Unknown","c":[{"t":11,"n":"PFOR - Unknown"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Data Inputs","d":1,"c":[{"t":6,"p":1,"n":"Data Input","c":[{"t":3,"p":1,"n":"UNAM - Index"},{"t":2,"p":1,"n":"BNAM - Name"},{"t":3,"p":1,"n":"PNAM - Flags"}]}]},{"t":6,"s":1,"p":1,"n":"OnBegin","c":[{"p":1,"n":"POBA - OnBegin Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnEnd","c":[{"p":1,"n":"POEA - OnEnd Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]},{"t":6,"s":1,"p":1,"n":"OnChange","c":[{"p":1,"n":"POCA - OnChange Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCDA - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"},{"t":11,"n":"TNAM - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":1,"p":1,"n":"PARW - Placed Arrow","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBAR - Placed Barrier","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PBEA - Placed Beam","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PCON - Placed Cone\/Voice","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PERK - Perk","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Fragment Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Trait"},{"t":3,"p":1,"n":"Level"},{"t":3,"p":1,"n":"Num Ranks"},{"t":3,"p":1,"n":"Playable"},{"t":3,"p":1,"n":"Hidden"}]},{"t":3,"p":1,"n":"NNAM - Next Perk"},{"t":10,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":6,"p":1,"n":"PRKE - Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Rank"},{"t":3,"p":1,"n":"Priority"}]},{"t":6,"p":1,"n":"Quest + Stage","c":[{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Quest Stage"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"Ability"},{"t":6,"p":1,"n":"Entry Point","c":[{"t":3,"p":1,"n":"Entry Point"},{"t":3,"p":1,"n":"Function"},{"t":3,"p":1,"n":"Perk Condition Tab Count"}]},{"t":10,"p":1,"n":"Perk Conditions","c":[{"t":6,"p":1,"n":"Perk Condition","c":[{"t":3,"p":1,"n":"PRKC - Run On (Tab Index)"},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"p":1,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]},{"t":6,"p":1,"n":"Function Parameters","c":[{"t":3,"p":1,"n":"EPFT - Type"},{"t":2,"p":1,"n":"EPF2 - Button Label"},{"t":6,"p":1,"n":"EPF3 - Script Flags","c":[{"t":3,"p":1,"n":"Script Flags"},{"t":11,"n":"Unknown"}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Float"},{"t":6,"p":1,"n":"Float, Float","c":[{"t":5,"p":1,"n":"Float 1"},{"t":5,"p":1,"n":"Float 2"}]},{"t":3,"p":1,"n":"Leveled Item"},{"t":3,"p":1,"n":"Spell"},{"t":2,"p":1,"n":"Text"},{"t":6,"p":1,"n":"Actor Value, Float","c":[{"t":3,"p":1,"n":"Actor Value"},{"t":5,"p":1,"n":"Float"}]}]},{"p":1,"n":"PRKF - End Marker"}]}]}]},{"t":1,"p":1,"n":"PFLA - Placed Flame","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PGRE - Placed Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PHZD - Placed Hazard","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PMIS - Placed Missile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Projectile"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"PROJ - Projectile","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Gravity"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Light"},{"t":3,"p":1,"n":"Muzzle Flash - Light"},{"t":5,"p":1,"n":"Tracer Chance"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Proximity"},{"t":5,"p":1,"n":"Explosion - Alt. Trigger - Timer"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Sound"},{"t":5,"p":1,"n":"Muzzle Flash - Duration"},{"t":5,"p":1,"n":"Fade Duration"},{"t":5,"p":1,"n":"Impact Force"},{"t":3,"p":1,"n":"Sound - Countdown"},{"t":3,"p":1,"n":"Sound - Disable"},{"t":3,"p":1,"n":"Default Weapon Source"},{"t":5,"p":1,"n":"Cone Spread"},{"t":5,"p":1,"n":"Collision Radius"},{"t":5,"p":1,"n":"Lifetime"},{"t":5,"p":1,"n":"Relaunch Interval"},{"t":3,"p":1,"n":"Decal Data"},{"t":3,"p":1,"n":"Collision Layer"}]},{"t":6,"s":1,"p":1,"n":"Muzzle Flash Model","c":[{"t":2,"p":1,"n":"NAM1 - Model Filename"},{"t":11,"p":1,"n":"NAM2 - Texture Files Hashes"}]},{"t":3,"p":1,"n":"VNAM - Sound Level"}]},{"t":1,"p":1,"n":"PWAT","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"QUST - Quest","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"fragmentCount"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Quest Stage Index"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]},{"t":7,"p":1,"n":"Aliases","c":[{"t":6,"p":1,"n":"Alias","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Alias Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]}]}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"DNAM - General","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"Form Version"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":2,"p":1,"n":"ENAM - Event"},{"t":8,"s":1,"p":1,"n":"Text Display Globals","d":1,"c":[{"t":3,"p":1,"n":"QTGL - Global"}]},{"t":2,"p":1,"n":"FLTR - Object Window Filter"},{"t":6,"s":1,"p":1,"n":"Quest Dialogue Conditions","c":[{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":10,"s":1,"p":1,"n":"Stages","d":1,"c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"INDX - Stage Index","c":[{"t":3,"p":1,"n":"Stage Index"},{"t":3,"p":1,"n":"Flags"},{"t":3,"n":"Unknown"}]},{"t":8,"p":1,"n":"Log Entries","c":[{"t":6,"p":1,"n":"Log Entry","c":[{"t":3,"p":1,"n":"QSDT - Stage Flags"},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":2,"p":1,"n":"CNAM - Log Entry"},{"t":3,"p":1,"n":"NAM0 - Next Quest"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":11,"n":"QNAM - Unused"}]}]}]}]},{"t":8,"s":1,"p":1,"n":"Objectives","d":1,"c":[{"t":6,"p":1,"n":"Objective","c":[{"t":3,"p":1,"n":"QOBJ - Objective Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":2,"p":1,"n":"NNAM - Display Text"},{"t":8,"p":1,"n":"Targets","c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]}]},{"t":11,"n":"ANAM - Aliases Marker"},{"t":8,"s":1,"p":1,"n":"Aliases","d":1,"c":[{"t":6,"p":1,"n":"Alias","c":[{"t":3,"p":1,"n":"ALST - Reference Alias ID"},{"t":2,"p":1,"n":"ALID - Alias Name"},{"t":6,"p":1,"n":"FNAM - Alias Flags","c":[{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Additional Flags"}]},{"t":3,"p":1,"n":"ALFI - Force Into Alias When Filled"},{"t":3,"p":1,"n":"ALFL - Specific Location"},{"t":3,"p":1,"n":"ALFR - Forced Reference"},{"t":3,"p":1,"n":"ALUA - Unique Actor"},{"t":6,"p":1,"n":"Location Alias Reference","c":[{"t":3,"p":1,"n":"ALFA - Alias"},{"t":3,"p":1,"n":"KNAM - Keyword"},{"t":3,"p":1,"n":"ALRT - Ref Type"}]},{"t":6,"p":1,"n":"External Alias Reference","c":[{"t":3,"p":1,"n":"ALEQ - Quest"},{"t":3,"p":1,"n":"ALEA - Alias"}]},{"t":6,"p":1,"n":"Create Reference to Object","c":[{"t":3,"p":1,"n":"ALCO - Object"},{"t":6,"p":1,"n":"ALCA - Alias","c":[{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Create"}]},{"t":3,"p":1,"n":"ALCL - Level"}]},{"t":6,"p":1,"n":"Find Matching Reference Near Alias","c":[{"t":3,"p":1,"n":"ALNA - Alias"},{"t":3,"p":1,"n":"ALNT - Type"}]},{"t":6,"p":1,"n":"Find Matching Reference From Event","c":[{"t":2,"p":1,"n":"ALFE - From Event"},{"t":11,"p":1,"n":"ALFD - Event Data"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"COCT - Count"},{"t":10,"p":1,"n":"Items","c":[{"t":6,"p":1,"n":"Item","c":[{"t":6,"p":1,"n":"CNTO - Item","c":[{"t":3,"p":1,"n":"Item"},{"t":3,"p":1,"n":"Count"}]},{"t":6,"p":1,"n":"COED - Extra Data","c":[{"t":3,"p":1,"n":"Owner"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Global Variable"},{"t":3,"p":1,"n":"Required Rank"},{"t":5,"p":1,"n":"Item Condition"}]}]}]},{"t":3,"p":1,"n":"SPOR - Spectator override package list"},{"t":3,"p":1,"n":"OCOR - Observe dead body override package list"},{"t":3,"p":1,"n":"GWOR - Guard warn override package list"},{"t":3,"p":1,"n":"ECOR - Combat override package list"},{"t":3,"p":1,"n":"ALDN - Display Name"},{"t":8,"p":1,"n":"Alias Spells","c":[{"t":3,"p":1,"n":"ALSP - Spell"}]},{"t":8,"p":1,"n":"Alias Factions","c":[{"t":3,"p":1,"n":"ALFC - Faction"}]},{"t":8,"p":1,"n":"Alias Package Data","c":[{"t":3,"p":1,"n":"ALPC - Package"}]},{"t":3,"p":1,"n":"VTCK - Voice Types"},{"p":1,"n":"ALED - Alias End"}]}]},{"t":2,"p":1,"n":"NNAM - Description"},{"t":8,"s":1,"p":1,"n":"Targets","d":1,"c":[{"t":6,"p":1,"n":"Target","c":[{"t":6,"p":1,"n":"QSTA - Target","c":[{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"RACE - Race","c":[{"t":2,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"DESC - Description"},{"t":3,"n":"SPCT - Count"},{"t":8,"s":1,"p":1,"n":"Actor Effects","c":[{"t":3,"p":1,"n":"SPLO - Actor Effect"}]},{"t":3,"p":1,"n":"WNAM - Skin"},{"t":6,"s":1,"p":1,"n":"BOD2 - Biped Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":6,"s":1,"p":1,"n":"BODT - Body Template","c":[{"t":3,"p":1,"n":"First Person Flags"},{"t":3,"p":1,"n":"General Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Armor Type"}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":7,"p":1,"n":"Skill Boosts","c":[{"t":6,"p":1,"n":"Skill Boost","c":[{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Boost"}]}]},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Male Height"},{"t":5,"p":1,"n":"Female Height"},{"t":5,"p":1,"n":"Male Weight"},{"t":5,"p":1,"n":"Female Weight"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Starting Health"},{"t":5,"p":1,"n":"Starting Magicka"},{"t":5,"p":1,"n":"Starting Stamina"},{"t":5,"p":1,"n":"Base Carry Weight"},{"t":5,"p":1,"n":"Base Mass"},{"t":5,"p":1,"n":"Acceleration rate"},{"t":5,"p":1,"n":"Deceleration rate"},{"t":3,"p":1,"n":"Size"},{"t":3,"p":1,"n":"Head Biped Object"},{"t":3,"p":1,"n":"Hair Biped Object"},{"t":5,"p":1,"n":"Injured Health Pct"},{"t":3,"p":1,"n":"Shield Biped Object"},{"t":5,"p":1,"n":"Health Regen"},{"t":5,"p":1,"n":"Magicka Regen"},{"t":5,"p":1,"n":"Stamina Regen"},{"t":5,"p":1,"n":"Unarmed Damage"},{"t":5,"p":1,"n":"Unarmed Reach"},{"t":3,"p":1,"n":"Body Biped Object"},{"t":5,"p":1,"n":"Aim Angle Tolerance"},{"t":5,"p":1,"n":"Flight Radius"},{"t":5,"p":1,"n":"Angular Acceleration Rate"},{"t":5,"p":1,"n":"Angular Tolerance"},{"t":3,"p":1,"n":"Flags 2"},{"t":6,"p":1,"n":"Mount Data","c":[{"t":5,"p":1,"n":"Offset X"},{"t":5,"p":1,"n":"Offset Y"},{"t":5,"p":1,"n":"Unknown"}]}]},{"p":1,"n":"MNAM - Male Marker"},{"t":2,"p":1,"n":"ANAM - Male Skeletal Model"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"p":1,"n":"FNAM - Female Marker"},{"t":2,"p":1,"n":"ANAM - Female Skeletal Model"},{"p":1,"n":"NAM2 - Marker NAM2 #1"},{"t":8,"p":1,"n":"Movement Type Names","c":[{"t":2,"p":1,"n":"MTNM - Name"}]},{"t":7,"p":1,"n":"VTCK - Voices","c":[{"t":3,"p":1,"n":"Voice"}]},{"t":7,"p":1,"n":"DNAM - Decapitate Armors","c":[{"t":3,"p":1,"n":"Decapitate Armor"}]},{"t":7,"p":1,"n":"HCLF - Default Hair Colors","c":[{"t":3,"p":1,"n":"Default Hair Color"}]},{"t":3,"n":"TINL - Total Number of Tints in List"},{"t":5,"p":1,"n":"PNAM - FaceGen - Main clamp"},{"t":5,"p":1,"n":"UNAM - FaceGen - Face clamp"},{"t":3,"p":1,"n":"ATKR - Attack Race"},{"t":10,"p":1,"n":"Attacks","c":[{"t":6,"p":1,"n":"Attack","c":[{"t":6,"p":1,"n":"ATKD - Attack Data","c":[{"t":5,"p":1,"n":"Damage Mult"},{"t":5,"p":1,"n":"Attack Chance"},{"t":3,"p":1,"n":"Attack Spell"},{"t":3,"p":1,"n":"Attack Flags"},{"t":5,"p":1,"n":"Attack Angle"},{"t":5,"p":1,"n":"Strike Angle"},{"t":5,"p":1,"n":"Stagger"},{"t":3,"p":1,"n":"Attack Type"},{"t":5,"p":1,"n":"Knockdown"},{"t":5,"p":1,"n":"Recovery Time"},{"t":5,"p":1,"n":"Stamina Mult"}]},{"t":2,"p":1,"n":"ATKE - Attack Event"}]}]},{"t":6,"p":1,"n":"Body Data","c":[{"n":"NAM1 - Body Data Marker"},{"t":6,"p":1,"n":"Male Body Data","c":[{"n":"MNAM - Male Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]},{"t":6,"p":1,"n":"Female Body Data","c":[{"n":"FNAM - Female Data Marker"},{"t":10,"s":1,"p":1,"n":"Parts","d":1,"c":[{"t":6,"p":1,"n":"Part","c":[{"t":3,"p":1,"n":"INDX - Index"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]}]}]},{"t":7,"p":1,"n":"HNAM - Hairs","c":[{"t":3,"p":1,"n":"Hair"}]},{"t":7,"p":1,"n":"ENAM - Eyes","c":[{"t":3,"p":1,"n":"Eye"}]},{"t":3,"p":1,"n":"GNAM - Body Part Data"},{"p":1,"n":"NAM2 - Marker NAM2 #2"},{"p":1,"n":"NAM3 - Marker NAM3 #3"},{"t":6,"s":1,"p":1,"n":"Male Behavior Graph","c":[{"p":1,"n":"MNAM - Male Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Female Behavior Graph","c":[{"p":1,"n":"FNAM - Female Data Marker"},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"NAM4 - Material Type"},{"t":3,"p":1,"n":"NAM5 - Impact Data Set"},{"t":3,"p":1,"n":"NAM7 - Decapitation FX"},{"t":3,"p":1,"n":"ONAM - Open Loot Sound"},{"t":3,"p":1,"n":"LNAM - Close Loot Sound"},{"t":8,"p":1,"n":"Biped Object Names","c":[{"t":2,"p":1,"n":"NAME - Name"}]},{"t":10,"n":"Movement Types","c":[{"t":6,"n":"Movement Types","c":[{"t":3,"n":"MTYP - Movement Type"},{"t":6,"n":"SPED - Override Values","c":[{"t":5,"n":"Left - Walk"},{"t":5,"n":"Left - Run"},{"t":5,"n":"Right - Walk"},{"t":5,"n":"Right - Run"},{"t":5,"n":"Forward - Walk"},{"t":5,"n":"Forward - Run"},{"t":5,"n":"Back - Walk"},{"t":5,"n":"Back - Run"},{"t":5,"n":"Rotate - Walk"},{"t":5,"n":"Unknown"}]}]}]},{"t":3,"n":"VNAM - Equipment Flags"},{"t":8,"p":1,"n":"Equip Slots","c":[{"t":3,"p":1,"n":"QNAM - Equip Slot"}]},{"t":3,"n":"UNES - Unarmed Equip Slot"},{"t":8,"n":"Phoneme Target Names","c":[{"t":2,"n":"PHTN - Name"}]},{"t":6,"n":"FaceFX Phonemes","c":[{"t":6,"n":"IY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"IH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"EY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AE","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AA","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AO","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OY","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"OW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"UW","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ER","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"AX","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"S","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Z","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"ZH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"F","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"TH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"V","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"DH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"M","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"N","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"NG","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"L","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"R","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"W","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"Y","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"HH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"B","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"D","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"JH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"G","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"P","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"T","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"K","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"CH","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"SHOTSIL","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]},{"t":6,"n":"FLAP","c":[{"t":6,"n":"PHWT - Phoneme Target Weight","c":[{"t":5,"n":"Aah \/ LipBigAah"},{"t":5,"n":"BigAah \/ LipDST"},{"t":5,"n":"BMP \/ LipEee"},{"t":5,"n":"ChJsh \/ LipFV"},{"t":5,"n":"DST \/ LipK"},{"t":5,"n":"Eee \/ LipL"},{"t":5,"n":"Eh \/ LipR"},{"t":5,"n":"FV \/ LipTh"},{"t":5,"n":"I"},{"t":5,"n":"K"},{"t":5,"n":"N"},{"t":5,"n":"Oh"},{"t":5,"n":"OohQ"},{"t":5,"n":"R"},{"t":5,"n":"TH"},{"t":5,"n":"W"}]}]}]},{"t":3,"n":"WKMV - Base Movement Default - Walk"},{"t":3,"n":"RNMV - Base Movement Default - Run"},{"t":3,"n":"SWMV - Base Movement Default - Swim"},{"t":3,"n":"FLMV - Base Movement Default - Fly"},{"t":3,"n":"SNMV - Base Movement Default - Sneak"},{"t":3,"n":"SPMV - Base Movement Default - Sprint"},{"t":6,"p":1,"n":"Head Data","c":[{"n":"NAM0 - Head Data Marker"},{"t":6,"s":1,"p":1,"n":"Male Head Data","c":[{"p":1,"n":"MNAM - Male Data Marker"},{"t":10,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Male","c":[{"t":3,"n":"RPRM - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Male","c":[{"t":3,"n":"AHCM - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Male","c":[{"t":3,"n":"FTSM - Texture Set"}]},{"t":3,"n":"DFTM - Default Face Texture Male"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"Female Head Data","c":[{"p":1,"n":"NAM0 - Head Data Marker"},{"p":1,"n":"FNAM - Female Data Marker"},{"t":10,"p":1,"n":"Head Parts","c":[{"t":6,"p":1,"n":"Head Part","c":[{"t":3,"p":1,"n":"INDX - Head Part Number"},{"t":3,"p":1,"n":"HEAD - Head"}]}]},{"t":6,"n":"Available Morphs","c":[{"t":11,"n":"MPAI - Unknown"},{"t":6,"n":"MPAV - Nose Variants","c":[{"t":3,"n":"Nose Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Brow Variants","c":[{"t":3,"n":"Brow Morph Flags"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Eye Variants","c":[{"t":3,"n":"Eye Morph Flags 1"},{"t":3,"n":"Eye Morph Flags 2"},{"t":11,"n":"Unknown"}]},{"t":6,"n":"MPAV - Lip Variants","c":[{"t":3,"n":"Lip Morph Flags"},{"t":11,"n":"Unknown"}]}]},{"t":8,"n":"Race Presets Female","c":[{"t":3,"n":"RPRF - Preset NPC"}]},{"t":8,"n":"Available Hair Colors Female","c":[{"t":3,"n":"AHCF - Hair Color"}]},{"t":8,"n":"Face Details Texture Set List Female","c":[{"t":3,"n":"FTSF - Texture Set"}]},{"t":3,"n":"DFTF - Default Face Texture Female"},{"t":8,"p":1,"n":"Tint Masks","c":[{"t":6,"p":1,"n":"Tint Assets","c":[{"t":8,"p":1,"n":"Tint Layer","c":[{"t":6,"p":1,"n":"Texture","c":[{"t":3,"p":1,"n":"TINI - Index"},{"t":2,"p":1,"n":"TINT - File Name"},{"t":3,"p":1,"n":"TINP - Mask Type"},{"t":3,"p":1,"n":"TIND - Preset Default"}]}]},{"t":8,"p":1,"n":"Presets","c":[{"t":6,"p":1,"n":"Preset","c":[{"t":3,"p":1,"n":"TINC - Color"},{"t":5,"p":1,"n":"TINV - Default Value"},{"t":3,"p":1,"n":"TIRS - Index"}]}]}]}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]}]},{"t":3,"n":"NAM8 - Morph race"},{"t":3,"n":"RNAM - Armor race"}]},{"t":1,"p":1,"n":"REFR - Placed Object","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":3,"p":1,"n":"NAME - Base"},{"t":6,"s":1,"p":1,"n":"XMBO - Bound Half Extents","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"XPRM - Primitive","c":[{"t":6,"p":1,"n":"Bounds","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Color","c":[{"t":5,"p":1,"n":"Red"},{"t":5,"p":1,"n":"Green"},{"t":5,"p":1,"n":"Blue"}]},{"t":5,"n":"Unknown"},{"t":3,"p":1,"n":"Type"}]},{"t":11,"n":"XORD - Unknown"},{"t":6,"s":1,"p":1,"n":"XOCP - Occlusion Plane Data","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":7,"p":1,"n":"XPOD - Portal Data","c":[{"t":6,"p":1,"n":"References","c":[{"t":3,"p":1,"n":"Origin"},{"t":3,"p":1,"n":"Destination"}]}]},{"t":6,"s":1,"p":1,"n":"XPTL - Room Portal (unused)","c":[{"t":6,"p":1,"n":"Size","c":[{"t":5,"p":1,"n":"Width"},{"t":5,"p":1,"n":"Height"}]},{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation (Quaternion?)","c":[{"t":5,"p":1,"n":"q1"},{"t":5,"p":1,"n":"q2"},{"t":5,"p":1,"n":"q3"},{"t":5,"p":1,"n":"q4"}]}]},{"t":6,"s":1,"p":1,"n":"Bound Data","c":[{"t":6,"p":1,"n":"XRMR - Header","c":[{"t":3,"p":1,"n":"Linked Rooms Count"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"LNAM - Lighting Template"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":8,"p":1,"n":"Linked Rooms","c":[{"t":3,"p":1,"n":"XLRM - Linked Room"}]}]},{"p":1,"n":"XMBP - MultiBound Primitive Marker"},{"t":11,"n":"XRGD - Ragdoll Data"},{"t":11,"n":"XRGB - Ragdoll Biped Data"},{"t":5,"p":1,"n":"XRDS - Radius"},{"t":8,"s":1,"p":1,"n":"Reflected\/Refracted By","d":1,"c":[{"t":6,"p":1,"n":"XPWR - Water","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Lit Water","d":1,"c":[{"t":3,"p":1,"n":"XLTW - Water"}]},{"t":3,"p":1,"n":"XEMI - Emittance"},{"t":6,"s":1,"p":1,"n":"XLIG - Light Data","c":[{"t":5,"p":1,"n":"FOV 90+\/-"},{"t":5,"p":1,"n":"Fade 1.35+\/-"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Shadow Depth Bias"}]},{"t":6,"s":1,"p":1,"n":"XALP - Alpha","c":[{"t":3,"p":1,"n":"Cutoff"},{"t":3,"p":1,"n":"Base"}]},{"t":6,"s":1,"p":1,"n":"XTEL - Teleport Destination","c":[{"t":3,"p":1,"n":"Door"},{"t":6,"p":1,"n":"Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XTNM - Teleport Message Box"},{"t":3,"p":1,"n":"XMBR - MultiBound Reference"},{"t":11,"n":"XWCN - Unknown"},{"t":11,"n":"XWCS - Unknown"},{"t":6,"s":1,"p":1,"n":"XWCU - Water Velocity","c":[{"t":5,"p":1,"n":"X Offset"},{"t":5,"p":1,"n":"Y Offset"},{"t":5,"p":1,"n":"Z Offset"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"X Angle"},{"t":5,"p":1,"n":"Y Angle"},{"t":5,"p":1,"n":"Z Angle"}]},{"t":6,"n":"XCVL - Unknown","c":[{"t":11,"n":"Unknown"},{"t":5,"n":"X Angle"}]},{"t":3,"n":"XCZR - Unknown"},{"t":11,"n":"XCZA - Unknown"},{"t":3,"n":"XCZC - Unknown"},{"t":5,"p":1,"n":"XSCL - Scale"},{"t":3,"p":1,"n":"XSPC - Spawn Container"},{"t":6,"s":1,"p":1,"n":"Activate Parents","c":[{"t":3,"p":1,"n":"XAPD - Flags"},{"t":8,"p":1,"n":"Activate Parent Refs","c":[{"t":6,"p":1,"n":"XAPR - Activate Parent Ref","c":[{"t":3,"p":1,"n":"Reference"},{"t":5,"p":1,"n":"Delay"}]}]}]},{"t":3,"p":1,"n":"XLIB - Leveled Item Base Object"},{"t":3,"p":1,"n":"XLCM - Level Modifier"},{"t":3,"p":1,"n":"XLCN - Persistent Location"},{"t":3,"p":1,"n":"XTRI - Collision Layer"},{"t":6,"s":1,"p":1,"n":"XLOC - Lock Data","c":[{"t":3,"p":1,"n":"Level"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Key"},{"t":3,"p":1,"n":"Flags"}]},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":6,"s":1,"p":1,"n":"XNDP - Navigation Door Link","c":[{"t":3,"p":1,"n":"Navigation Mesh"},{"t":3,"p":1,"n":"Teleport Marker Triangle"},{"t":11,"n":"Unused"}]},{"t":7,"p":1,"n":"XLRT - Location Ref Type","c":[{"t":3,"p":1,"n":"Ref"}]},{"p":1,"n":"XIS2 - Ignored by Sandbox"},{"t":6,"s":1,"p":1,"n":"Ownership","c":[{"t":3,"p":1,"n":"XOWN - Owner"},{"t":3,"p":1,"n":"XRNK - Faction rank"}]},{"t":3,"p":1,"n":"XCNT - Item Count"},{"t":5,"p":1,"n":"XCHG - Charge"},{"t":3,"p":1,"n":"XLRL - Location Reference"},{"t":6,"s":1,"p":1,"n":"XESP - Enable Parent","c":[{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"}]},{"t":8,"s":1,"p":1,"n":"Linked References","d":1,"c":[{"t":6,"p":1,"n":"XLKR - Linked Reference","c":[{"t":3,"p":1,"n":"Keyword\/Ref"},{"t":3,"p":1,"n":"Ref"}]}]},{"t":8,"s":1,"p":1,"n":"Patrol","d":1,"c":[{"t":6,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"XPRD - Idle Time"},{"p":1,"n":"XPPA - Patrol Script Marker"},{"t":3,"p":1,"n":"INAM - Idle"},{"t":11,"n":"SCHR - Unused"},{"t":11,"n":"SCTX - Unused"},{"t":8,"p":1,"n":"Topic","c":[{"t":6,"p":1,"n":"PDTO - Topic Data","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Topic"},{"t":2,"p":1,"n":"Subtype"}]}]}]}]},{"t":3,"p":1,"n":"XACT - Action Flag"},{"t":5,"p":1,"n":"XHTW - Head-Tracking Weight"},{"t":5,"p":1,"n":"XFVC - Favor Cost"},{"p":1,"n":"ONAM - Open by Default"},{"t":6,"s":1,"p":1,"n":"Map Marker","c":[{"p":1,"n":"XMRK - Map Marker Data"},{"t":3,"p":1,"n":"FNAM - Map Flags"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"p":1,"n":"TNAM - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"XATR - Attach Ref"},{"t":7,"n":"XLOD - Distant LOD Data","c":[{"t":5,"n":"Unknown"}]},{"t":6,"s":1,"p":1,"n":"DATA - Position\/Rotation","c":[{"t":6,"p":1,"n":"Position","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"p":1,"n":"Rotation","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]}]}]},{"t":1,"p":1,"n":"REGN - Region","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"RCLR - Map Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]},{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":8,"s":1,"p":1,"n":"Region Areas","d":1,"c":[{"t":6,"p":1,"n":"Region Area","c":[{"t":3,"p":1,"n":"RPLI - Edge Fall-off"},{"t":7,"p":1,"n":"RPLD - Region Point List Data","c":[{"t":6,"p":1,"n":"Point","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]}]}]},{"t":10,"p":1,"n":"Region Data Entries","d":1,"c":[{"t":6,"p":1,"n":"Region Data Entry","c":[{"t":6,"p":1,"n":"RDAT - Data Header","c":[{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Priority"},{"t":11,"n":"Unknown"}]},{"t":6,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"RDMO - Music"},{"t":7,"p":1,"n":"RDSA - Sounds","c":[{"t":6,"p":1,"n":"Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Chance"}]}]},{"t":2,"p":1,"n":"RDMP - Map Name"},{"t":7,"p":1,"n":"RDOT - Objects","c":[{"t":6,"p":1,"n":"Object","c":[{"t":3,"p":1,"n":"Object"},{"t":3,"p":1,"n":"Parent Index"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Density"},{"t":3,"p":1,"n":"Clustering"},{"t":3,"p":1,"n":"Min Slope"},{"t":3,"p":1,"n":"Max Slope"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Radius wrt Parent"},{"t":3,"p":1,"n":"Radius"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Sink"},{"t":5,"p":1,"n":"Sink Variance"},{"t":5,"p":1,"n":"Size Variance"},{"t":6,"p":1,"n":"Angle Variance","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"},{"t":3,"p":1,"n":"Z"}]}]}]},{"t":7,"p":1,"n":"RDGS - Grasses","c":[{"t":6,"p":1,"n":"Grass","c":[{"t":3,"p":1,"n":"Grass"},{"t":11,"n":"Unknown"}]}]},{"t":7,"p":1,"n":"RDWT - Weather Types","c":[{"t":6,"p":1,"n":"Weather Type","c":[{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Chance"},{"t":3,"p":1,"n":"Global"}]}]}]}]}]},{"t":1,"p":1,"n":"RELA - Relationship","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Parent"},{"t":3,"p":1,"n":"Child"},{"t":3,"p":1,"n":"Rank"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Association Type"}]}]},{"t":1,"p":1,"n":"REVB - Reverb Parameters","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Decay Time (ms)"},{"t":3,"p":1,"n":"HF Reference (Hz)"},{"t":3,"p":1,"n":"Room Filter"},{"t":3,"p":1,"n":"Room HF Filter"},{"t":3,"p":1,"n":"Reflections"},{"t":3,"p":1,"n":"Reverb Amp"},{"t":3,"p":1,"n":"Decay HF Ratio"},{"t":3,"p":1,"n":"Reflect Delay (ms), scaled"},{"t":3,"p":1,"n":"Reverb Delay (ms)"},{"t":3,"p":1,"n":"Diffusion %"},{"t":3,"p":1,"n":"Density %"},{"t":3,"n":"Unknown"}]}]},{"t":1,"p":1,"n":"RFCT - Visual Effect","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"DATA - Effect Data","c":[{"t":3,"p":1,"n":"Effect Art"},{"t":3,"p":1,"n":"Shader"},{"t":3,"p":1,"n":"Flags"}]}]},{"t":1,"p":1,"n":"RGDL","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCEN - Scene","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]},{"t":6,"p":1,"n":"Script Fragments","c":[{"t":3,"n":"Unknown"},{"t":3,"p":1,"n":"Flags"},{"t":2,"p":1,"n":"fileName"},{"t":7,"p":1,"n":"Fragments","c":[{"t":6,"p":1,"n":"Fragment","c":[{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]},{"t":7,"p":1,"n":"Phase Fragments","c":[{"t":6,"p":1,"n":"Phase Fragment","c":[{"t":3,"p":1,"n":"Phase Flag"},{"t":3,"p":1,"n":"Phase Index"},{"t":3,"n":"Unknown"},{"t":2,"p":1,"n":"scriptName"},{"t":2,"p":1,"n":"fragmentName"}]}]}]}]},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":8,"s":1,"p":1,"n":"Phases","d":1,"c":[{"t":6,"p":1,"n":"Phase","c":[{"p":1,"n":"HNAM - Marker Phase Start"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":6,"p":1,"n":"Start Conditions","c":[{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"p":1,"n":"NEXT - Marker"},{"t":6,"p":1,"n":"Completion Conditions","c":[{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"t":3,"p":1,"n":"WNAM - Editor Width"},{"p":1,"n":"HNAM - Marker Phase End"}]}]},{"t":8,"s":1,"p":1,"n":"Actors","d":1,"c":[{"t":6,"p":1,"n":"Actor","c":[{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":3,"p":1,"n":"LNAM - Flags"},{"t":3,"p":1,"n":"DNAM - Behaviour Flags"}]}]},{"t":8,"s":1,"p":1,"n":"Actions","d":1,"c":[{"t":6,"p":1,"n":"Action","c":[{"t":3,"p":1,"n":"ANAM - Type"},{"t":2,"p":1,"n":"NAM0 - Name"},{"t":3,"p":1,"n":"ALID - Actor ID"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"INAM - Index"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"SNAM - Start Phase"},{"t":3,"p":1,"n":"ENAM - End Phase"},{"t":5,"p":1,"n":"SNAM - Timer Seconds"},{"t":8,"p":1,"n":"Packages","c":[{"t":3,"p":1,"n":"PNAM - Package"}]},{"t":3,"p":1,"n":"DATA - Topic"},{"t":3,"p":1,"n":"HTID - Headtrack Actor ID"},{"t":5,"p":1,"n":"DMAX - Looping - Max"},{"t":5,"p":1,"n":"DMIN - Looping - Min"},{"t":3,"p":1,"n":"DEMO - Emotion Type"},{"t":3,"p":1,"n":"DEVA - Emotion Value"},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"ANAM - End Marker"}]}]},{"t":6,"n":"Unused","c":[{"t":11,"n":"SCHR - Unknown"},{"t":11,"n":"SCDA - Unknown"},{"t":11,"n":"SCTX - Unknown"},{"t":11,"n":"QNAM - Unknown"},{"t":11,"n":"SCRO - Unknown"}]},{"p":1,"n":"NEXT - Marker"},{"t":3,"p":1,"n":"PNAM - Quest"},{"t":3,"p":1,"n":"INAM - Last Action Index"},{"t":11,"n":"VNAM - Unknown"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]},{"t":1,"p":1,"n":"SCOL","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCPT","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"}]},{"t":1,"p":1,"n":"SCRL - Scroll","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":6,"s":1,"p":1,"n":"DATA - Item","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SHOU - Shout","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":2,"p":1,"n":"DESC - Description"},{"t":8,"s":1,"p":1,"n":"Words of Power","d":1,"c":[{"t":6,"p":1,"n":"SNAM - ","c":[{"t":3,"p":1,"n":"Word"},{"t":3,"p":1,"n":"Spell"},{"t":5,"p":1,"n":"Recovery Time"}]}]}]},{"t":1,"p":1,"n":"SLGM - Soul Gem","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":6,"s":1,"p":1,"n":"DATA - ","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"}]},{"t":3,"p":1,"n":"SOUL - Contained Soul"},{"t":3,"p":1,"n":"SLCP - Maximum Capacity"},{"t":3,"p":1,"n":"NAM0 - Linked To"}]},{"t":1,"p":1,"n":"SMBN - Story Manager Branch Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"}]},{"t":1,"p":1,"n":"SMEN - Story Manager Event Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"},{"t":11,"n":"XNAM - Unknown"},{"t":2,"p":1,"n":"ENAM - Type"}]},{"t":1,"p":1,"n":"SMQN - Story Manager Quest Node","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"PNAM - Parent "},{"t":3,"p":1,"n":"SNAM - Child "},{"t":3,"n":"CITC - Condition Count"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Flags","c":[{"t":3,"p":1,"n":"Node Flags"},{"t":3,"p":1,"n":"Quest Flags"}]},{"t":3,"p":1,"n":"XNAM - Max concurrent quests"},{"t":3,"p":1,"n":"MNAM - Num quests to run"},{"t":3,"n":"QNAM - Quest Count"},{"t":10,"p":1,"n":"Quests","d":1,"c":[{"t":6,"p":1,"n":"Quest","c":[{"t":3,"p":1,"n":"NNAM - Quest"},{"t":11,"n":"FNAM - Unknown"},{"t":5,"p":1,"n":"RNAM - Hours until reset"}]}]}]},{"t":1,"p":1,"n":"SNCT - Sound Category","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":3,"p":1,"n":"PNAM - Parent"},{"t":3,"p":1,"n":"VNAM - Static Volume Multiplier"},{"t":3,"p":1,"n":"UNAM - Default Menu Value"}]},{"t":1,"p":1,"n":"SNDR - Sound Descriptor","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":11,"n":"CNAM - Unknown"},{"t":3,"p":1,"n":"GNAM - Category"},{"t":3,"p":1,"n":"SNAM - Alternate Sound For"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"Sound Files","c":[{"t":2,"p":1,"n":"ANAM - File Name"}]}]},{"t":3,"p":1,"n":"ONAM - Output Model"},{"t":2,"p":1,"n":"FNAM - String"},{"t":8,"s":1,"p":1,"n":"Conditions","d":1,"c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]},{"t":6,"s":1,"p":1,"n":"LNAM - Values","c":[{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Looping"},{"t":3,"p":1,"n":"Rumble Send Value = (Small \/ 7) + ((Big \/ 7) * 16)"}]},{"t":6,"s":1,"p":1,"n":"BNAM - Values","c":[{"t":3,"p":1,"n":"% Frequency Shift"},{"t":3,"p":1,"n":"% Frequency Variance"},{"t":3,"p":1,"n":"Priority"},{"t":3,"p":1,"n":"db Variance"},{"t":3,"p":1,"n":"Static Attenuation (db)"}]}]},{"t":1,"p":1,"n":"SOPM - Sound Output Model","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"NAM1 - Data","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Reverb Send %"}]},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Type"},{"t":11,"n":"CNAM - Unknown"},{"t":11,"n":"SNAM - Unknown"},{"t":6,"s":1,"p":1,"n":"ONAM - Output Values","c":[{"t":7,"p":1,"n":"Channels","c":[{"t":6,"p":1,"n":"","c":[{"t":3,"p":1,"n":"L"},{"t":3,"p":1,"n":"R"},{"t":3,"p":1,"n":"C"},{"t":3,"p":1,"n":"LFE"},{"t":3,"p":1,"n":"RL"},{"t":3,"p":1,"n":"RR"},{"t":3,"p":1,"n":"BL"},{"t":3,"p":1,"n":"BR"}]}]}]},{"t":6,"s":1,"p":1,"n":"ANAM - Attenuation Values","c":[{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Min Distance"},{"t":5,"p":1,"n":"Max Distance"},{"t":7,"p":1,"n":"Curve","c":[{"t":3,"p":1,"n":"Value"}]}]}]},{"t":1,"p":1,"n":"SOUN - Sound Marker","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":11,"n":"FNAM - Unknown"},{"t":11,"n":"SNDD - Unknown"},{"t":3,"p":1,"n":"SDSC - Sound Descriptor"}]},{"t":1,"p":1,"n":"SPEL - Spell","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":3,"p":1,"n":"MDOB - Menu Display Object"},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"SPIT - Data","c":[{"t":3,"p":1,"n":"Base Cost"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Type"},{"t":5,"p":1,"n":"Charge Time"},{"t":3,"p":1,"n":"Cast Type"},{"t":3,"p":1,"n":"Target Type"},{"t":5,"p":1,"n":"Cast Duration"},{"t":5,"p":1,"n":"Range"},{"t":3,"p":1,"n":"Half-cost Perk"}]},{"t":8,"s":1,"p":1,"n":"Effects","d":1,"c":[{"t":6,"p":1,"n":"Effect","c":[{"t":3,"p":1,"n":"EFID - Base Effect"},{"t":6,"p":1,"n":"EFIT - ","c":[{"t":5,"p":1,"n":"Magnitude"},{"t":3,"p":1,"n":"Area"},{"t":3,"p":1,"n":"Duration"}]},{"t":8,"s":1,"p":1,"n":"Conditions","c":[{"t":6,"p":1,"n":"Condition","c":[{"t":6,"p":1,"n":"CTDA - ","c":[{"t":3,"p":1,"n":"Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Comparison Value - Float"},{"t":3,"p":1,"n":"Comparison Value - Global"},{"t":3,"p":1,"n":"Function"},{"t":11,"n":"Unknown"},{"t":11,"p":1,"n":"None"},{"t":3,"p":1,"n":"Integer"},{"t":5,"p":1,"n":"Float"},{"t":11,"p":1,"n":"Variable Name (unused)"},{"t":3,"p":1,"n":"Sex"},{"t":3,"p":1,"n":"Actor Value"},{"t":3,"p":1,"n":"Crime Type"},{"t":3,"p":1,"n":"Axis"},{"t":3,"p":1,"n":"Quest Stage (unused)"},{"t":3,"p":1,"n":"Misc Stat"},{"t":3,"p":1,"n":"Alignment"},{"t":3,"p":1,"n":"Equip Type"},{"t":3,"p":1,"n":"Form Type"},{"t":3,"p":1,"n":"Critical Stage"},{"t":3,"p":1,"n":"Object Reference"},{"t":3,"p":1,"n":"Inventory Object"},{"t":3,"p":1,"n":"Actor"},{"t":3,"p":1,"n":"Voice Type"},{"t":3,"p":1,"n":"Idle"},{"t":3,"p":1,"n":"Form List"},{"t":3,"p":1,"n":"Quest"},{"t":3,"p":1,"n":"Faction"},{"t":3,"p":1,"n":"Cell"},{"t":3,"p":1,"n":"Class"},{"t":3,"p":1,"n":"Race"},{"t":3,"p":1,"n":"Actor Base"},{"t":3,"p":1,"n":"Global"},{"t":3,"p":1,"n":"Weather"},{"t":3,"p":1,"n":"Package"},{"t":3,"p":1,"n":"Encounter Zone"},{"t":3,"p":1,"n":"Perk"},{"t":3,"p":1,"n":"Owner"},{"t":3,"p":1,"n":"Furniture"},{"t":3,"p":1,"n":"Effect Item"},{"t":3,"p":1,"n":"Base Effect"},{"t":3,"p":1,"n":"Worldspace"},{"t":3,"p":1,"n":"VATS Value Function"},{"t":3,"p":1,"n":"VATS Value Param (INVALID)"},{"t":3,"p":1,"n":"Referenceable Object"},{"t":3,"p":1,"n":"Region"},{"t":3,"p":1,"n":"Keyword"},{"t":3,"p":1,"n":"Player Action"},{"t":3,"p":1,"n":"Casting Type"},{"t":3,"p":1,"n":"Shout"},{"t":3,"p":1,"n":"Location"},{"t":3,"p":1,"n":"Location Ref Type"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"Packdata ID"},{"t":3,"p":1,"n":"Association Type"},{"t":3,"p":1,"n":"Furniture Anim"},{"t":3,"p":1,"n":"Furniture Entry"},{"t":3,"p":1,"n":"Scene"},{"t":3,"p":1,"n":"Ward State"},{"t":3,"p":1,"n":"Event"},{"t":3,"p":1,"n":"Event Data"},{"t":3,"p":1,"n":"Quest Stage"},{"t":3,"p":1,"n":"Weapon"},{"t":3,"p":1,"n":"Weapon List"},{"t":3,"p":1,"n":"Target"},{"t":3,"p":1,"n":"Target List"},{"t":3,"p":1,"n":"Target Part"},{"t":3,"p":1,"n":"VATS Action"},{"t":3,"p":1,"n":"Critical Effect"},{"t":3,"p":1,"n":"Critical Effect List"},{"t":3,"p":1,"n":"Weapon Type"},{"t":3,"p":1,"n":"Projectile Type"},{"t":3,"p":1,"n":"Delivery Type"},{"t":3,"p":1,"n":"Run On"},{"t":3,"p":1,"n":"Reference"},{"t":3,"p":1,"n":"Parameter #3"}]},{"t":2,"p":1,"n":"CIS1 - Parameter #1"},{"t":2,"p":1,"n":"CIS2 - Parameter #2"}]}]}]}]}]},{"t":1,"p":1,"n":"SPGD - Shader Particle Geometry","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"Data","c":[{"t":5,"p":1,"n":"Gravity Velocity"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"Rotation Velocity"},{"t":5,"p":1,"n":"Particle Size X"},{"t":5,"p":1,"n":"Center Offset Min"},{"t":5,"p":1,"n":"Particle Size Y"},{"t":5,"p":1,"n":"Center Offset Max"},{"t":5,"p":1,"n":"Initial Rotation"},{"t":3,"p":1,"n":"# of Subtextures X"},{"t":3,"p":1,"n":"# of Subtextures Y"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Box Size"},{"t":5,"p":1,"n":"Particle Density"}]},{"t":2,"p":1,"n":"ICON - Particle Texture"}]},{"t":1,"p":1,"n":"STAT - Static","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"DNAM - Direction Material","c":[{"t":5,"p":1,"n":"Max Angle (30-120)"},{"t":3,"p":1,"n":"Material"}]},{"t":7,"p":1,"n":"MNAM - Distant LOD","c":[{"t":6,"p":1,"n":"LOD","c":[{"t":2,"p":1,"n":"Mesh"}]}]}]},{"t":1,"p":1,"n":"TACT - Talking Activator","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":11,"n":"PNAM - Unknown"},{"t":3,"p":1,"n":"SNAM - Looping Sound"},{"t":11,"n":"FNAM - Unknown"},{"t":3,"p":1,"n":"VNAM - Voice Type"}]},{"t":1,"p":1,"n":"TREE - Tree","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":3,"p":1,"n":"PFIG - Ingredient"},{"t":3,"p":1,"n":"SNAM - Harvest Sound"},{"t":6,"s":1,"p":1,"n":"PFPC - Ingredient Production","c":[{"t":3,"p":1,"n":"Spring"},{"t":3,"p":1,"n":"Summer"},{"t":3,"p":1,"n":"Fall"},{"t":3,"p":1,"n":"Winter"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"CNAM - Tree Data","c":[{"t":5,"p":1,"n":"Trunk Flexibility"},{"t":5,"p":1,"n":"Branch Flexibility"},{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Leaf Amplitude"},{"t":5,"p":1,"n":"Leaf Frequency"}]}]},{"t":1,"p":1,"n":"TXST - Texture Set","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":6,"s":1,"p":1,"n":"Textures (RGB\/A)","c":[{"t":2,"p":1,"n":"TX00 - Difuse"},{"t":2,"p":1,"n":"TX01 - Normal\/Gloss"},{"t":2,"p":1,"n":"TX02 - Environment Mask\/Subsurface Tint"},{"t":2,"p":1,"n":"TX03 - Glow\/Detail Map"},{"t":2,"p":1,"n":"TX04 - Height"},{"t":2,"p":1,"n":"TX05 - Environment"},{"t":2,"p":1,"n":"TX06 - Multilayer"},{"t":2,"p":1,"n":"TX07 - Backlight Mask\/Specular"}]},{"t":6,"s":1,"p":1,"n":"DODT - Decal Data","c":[{"t":5,"p":1,"n":"Min Width"},{"t":5,"p":1,"n":"Max Width"},{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Depth"},{"t":5,"p":1,"n":"Shininess"},{"t":6,"p":1,"n":"Parallax","c":[{"t":5,"p":1,"n":"Scale"},{"t":3,"p":1,"n":"Passes"}]},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"},{"t":6,"p":1,"n":"Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"VOLI - Volumetric Lighting","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":5,"p":1,"n":"CNAM - Intensity"},{"t":5,"p":1,"n":"DNAM - Custom Color - Contribution"},{"t":5,"p":1,"n":"ENAM - Red"},{"t":5,"p":1,"n":"FNAM - Green"},{"t":5,"p":1,"n":"GNAM - Blue"},{"t":5,"p":1,"n":"HNAM - Density - Contribution"},{"t":5,"p":1,"n":"INAM - Density - Size"},{"t":5,"p":1,"n":"JNAM - Density - Wind Speed"},{"t":5,"p":1,"n":"KNAM - Density - Falling Speed"},{"t":5,"p":1,"n":"LNAM - Phase Function - Contribution"},{"t":5,"p":1,"n":"MNAM - Phase Function - Scattering"},{"t":5,"p":1,"n":"NNAM - Sampling Repartition - Range Factor"}]},{"t":1,"p":1,"n":"VTYP - Voice Type","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":3,"p":1,"n":"DNAM - Flags"}]},{"t":1,"p":1,"n":"WATR - Water","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":8,"n":"Unused","c":[{"t":2,"n":"NNAM - Noise Map"}]},{"t":3,"p":1,"n":"ANAM - Opacity"},{"t":3,"p":1,"n":"FNAM - Flags"},{"t":11,"n":"MNAM - Unused"},{"t":3,"p":1,"n":"TNAM - Material"},{"t":3,"p":1,"n":"SNAM - Open Sound"},{"t":3,"p":1,"n":"XNAM - Spell"},{"t":3,"p":1,"n":"INAM - Image Space"},{"t":3,"p":1,"n":"DATA - Damage Per Second"},{"t":6,"s":1,"p":1,"n":"DNAM - Visual Data","c":[{"t":5,"n":"Unknown"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Power"},{"t":5,"p":1,"n":"Water Properties - Reflectivity Amount"},{"t":5,"p":1,"n":"Water Properties - Fresnel Amount"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Distance - Far Plane"},{"t":6,"p":1,"n":"Shallow Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Deep Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Reflection Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Displacement Simulator - Starting Size"},{"t":5,"p":1,"n":"Displacement Simulator - Force"},{"t":5,"p":1,"n":"Displacement Simulator - Velocity"},{"t":5,"p":1,"n":"Displacement Simulator - Falloff"},{"t":5,"p":1,"n":"Displacement Simulator - Dampner"},{"t":5,"p":1,"n":"Noise Properties - Noise Falloff"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Direction"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Wind Speed"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Wind Speed"},{"t":5,"p":1,"n":"Fog Properties - Above Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Amount"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Near Plane"},{"t":5,"p":1,"n":"Fog Properties - Under Water - Fog Distance - Far Plane"},{"t":5,"p":1,"n":"Water Properties - Refraction Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Specular Power"},{"t":5,"p":1,"n":"Specular Properties - Specular Radius"},{"t":5,"p":1,"n":"Specular Properties - Specular Brightness"},{"t":5,"p":1,"n":"Noise Properties - Layer One - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - UV Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer One - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Two - Amplitude Scale"},{"t":5,"p":1,"n":"Noise Properties - Layer Three - Amplitude Scale"},{"t":5,"p":1,"n":"Water Properties - Reflection Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Magnitude"},{"t":5,"p":1,"n":"Specular Properties - Sun Specular Magnitude"},{"t":5,"p":1,"n":"Depth Properties - Reflections"},{"t":5,"p":1,"n":"Depth Properties - Refraction"},{"t":5,"p":1,"n":"Depth Properties - Normals"},{"t":5,"p":1,"n":"Depth Properties - Specular Lighting"},{"t":5,"p":1,"n":"Specular Properties - Sun Sparkle Power"}]},{"t":11,"n":"GNAM - Unused"},{"t":6,"s":1,"p":1,"n":"NAM0 - Linear Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":6,"s":1,"p":1,"n":"NAM1 - Angular Velocity","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"},{"t":5,"p":1,"n":"Z"}]},{"t":2,"p":1,"n":"NAM2 - Noise Layer One - Noise Texture"},{"t":2,"p":1,"n":"NAM3 - Noise Layer Two - Noise Texture"},{"t":2,"p":1,"n":"NAM4 - Noise Layer Three - Noise Texture"},{"t":2,"p":1,"n":"NAM5 - Flow Normals - Noise Texture"}]},{"t":1,"p":1,"n":"WEAP - Weapon","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"VMAD - Virtual Machine Adapter","c":[{"t":3,"p":1,"n":"Version"},{"t":3,"p":1,"n":"Object Format"},{"t":7,"p":1,"n":"Scripts","c":[{"t":6,"p":1,"n":"Script","c":[{"t":2,"p":1,"n":"scriptName"},{"t":3,"p":1,"n":"Flags"},{"t":7,"p":1,"n":"Properties","c":[{"t":6,"p":1,"n":"Property","c":[{"t":2,"p":1,"n":"propertyName"},{"t":3,"p":1,"n":"Type"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]},{"t":2,"p":1,"n":"String"},{"t":3,"p":1,"n":"Int32"},{"t":5,"p":1,"n":"Float"},{"t":3,"p":1,"n":"Bool"},{"t":7,"p":1,"n":"Array of Object","c":[{"t":6,"p":1,"n":"Object v2","c":[{"t":3,"n":"Unused"},{"t":3,"p":1,"n":"Alias"},{"t":3,"p":1,"n":"FormID"}]},{"t":6,"p":1,"n":"Object v1","c":[{"t":3,"p":1,"n":"FormID"},{"t":3,"p":1,"n":"Alias"},{"t":3,"n":"Unused"}]}]},{"t":7,"p":1,"n":"Array of String","c":[{"t":2,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Int32","c":[{"t":3,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Float","c":[{"t":5,"p":1,"n":"Element"}]},{"t":7,"p":1,"n":"Array of Bool","c":[{"t":3,"p":1,"n":"Element"}]}]}]}]}]}]},{"t":6,"s":1,"p":1,"n":"OBND - Object Bounds","c":[{"t":3,"p":1,"n":"X1"},{"t":3,"p":1,"n":"Y1"},{"t":3,"p":1,"n":"Z1"},{"t":3,"p":1,"n":"X2"},{"t":3,"p":1,"n":"Y2"},{"t":3,"p":1,"n":"Z2"}]},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":6,"s":1,"p":1,"n":"Icon","c":[{"t":2,"p":1,"n":"ICON - Large Icon filename"},{"t":2,"p":1,"n":"MICO - Small Icon filename"}]},{"t":3,"p":1,"n":"EITM - Object Effect"},{"t":3,"p":1,"n":"EAMT - Enchantment Amount"},{"t":6,"s":1,"p":1,"n":"Destructable","c":[{"t":6,"p":1,"n":"DEST - Header","c":[{"t":3,"p":1,"n":"Health"},{"t":3,"p":1,"n":"DEST Count"},{"t":3,"p":1,"n":"VATS Targetable"},{"t":11,"n":"Unknown"}]},{"t":8,"p":1,"n":"Stages","c":[{"t":6,"p":1,"n":"Stage","c":[{"t":6,"p":1,"n":"DSTD - Destruction Stage Data","c":[{"t":3,"p":1,"n":"Health %"},{"t":3,"p":1,"n":"Index"},{"t":3,"p":1,"n":"Model Damage Stage"},{"t":3,"p":1,"n":"Flags"},{"t":3,"p":1,"n":"Self Damage per Second"},{"t":3,"p":1,"n":"Explosion"},{"t":3,"p":1,"n":"Debris"},{"t":3,"p":1,"n":"Debris Count"}]},{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"DMDL - Model Filename"},{"t":11,"p":1,"n":"DMDT - Texture Files Hashes"},{"t":7,"p":1,"n":"DMDS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"p":1,"n":"DSTF - End Marker"}]}]}]},{"t":3,"p":1,"n":"ETYP - Equipment Type"},{"t":3,"p":1,"n":"BIDS - Block Bash Impact Data Set"},{"t":3,"p":1,"n":"BAMT - Alternate Block Material"},{"t":3,"p":1,"n":"YNAM - Sound - Pick Up"},{"t":3,"p":1,"n":"ZNAM - Sound - Put Down"},{"t":3,"n":"KSIZ - Keyword Count"},{"t":7,"p":1,"n":"KWDA - Keywords","c":[{"t":3,"p":1,"n":"Keyword"}]},{"t":2,"p":1,"n":"DESC - Description"},{"t":6,"s":1,"p":1,"n":"Has Scope","c":[{"t":2,"p":1,"n":"MOD3 - Model Filename"},{"t":11,"p":1,"n":"MO3T - Texture Files Hashes"},{"t":7,"p":1,"n":"MO3S - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]},{"t":11,"n":"NNAM - Unused"},{"t":3,"p":1,"n":"INAM - Impact Data Set"},{"t":3,"p":1,"n":"WNAM - 1st Person Model Object"},{"t":3,"p":1,"n":"SNAM - Attack Sound"},{"t":3,"p":1,"n":"XNAM - Attack Sound 2D"},{"t":3,"p":1,"n":"NAM7 - Attack Loop Sound"},{"t":3,"p":1,"n":"TNAM - Attack Fail Sound"},{"t":3,"p":1,"n":"UNAM - Idle Sound"},{"t":3,"p":1,"n":"NAM9 - Equip Sound"},{"t":3,"p":1,"n":"NAM8 - Unequip Sound"},{"t":6,"s":1,"p":1,"n":"DATA - Game Data","c":[{"t":3,"p":1,"n":"Value"},{"t":5,"p":1,"n":"Weight"},{"t":3,"p":1,"n":"Damage"}]},{"t":6,"s":1,"p":1,"n":"DNAM - Data","c":[{"t":3,"p":1,"n":"Animation Type"},{"t":11,"n":"Unused"},{"t":5,"p":1,"n":"Speed"},{"t":5,"p":1,"n":"Reach"},{"t":3,"p":1,"n":"Flags"},{"t":5,"p":1,"n":"Sight FOV"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Base VATS To-Hit Chance"},{"t":3,"p":1,"n":"Attack Animation"},{"t":3,"p":1,"n":"# Projectiles"},{"t":3,"p":1,"n":"Embedded Weapon AV (unused)"},{"t":5,"p":1,"n":"Range Min"},{"t":5,"p":1,"n":"Range Max"},{"t":3,"p":1,"n":"On Hit"},{"t":3,"p":1,"n":"Flags2"},{"t":5,"p":1,"n":"Animation Attack Mult"},{"t":5,"p":1,"n":"Rumble - Left Motor Strength"},{"t":5,"p":1,"n":"Rumble - Right Motor Strength"},{"t":5,"p":1,"n":"Rumble - Duration"},{"t":3,"p":1,"n":"Skill"},{"t":3,"p":1,"n":"Resist"},{"t":5,"p":1,"n":"Stagger"}]},{"t":6,"s":1,"p":1,"n":"CRDT - Critical Data","c":[{"t":3,"p":1,"n":"Damage"},{"t":11,"n":"Unknown"},{"t":5,"p":1,"n":"% Mult"},{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unused"},{"t":3,"p":1,"n":"Effect"}]},{"t":3,"p":1,"n":"VNAM - Detection Sound Level"},{"t":3,"p":1,"n":"CNAM - Template"}]},{"t":1,"p":1,"n":"WOOP - Word of Power","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"FULL - Name"},{"t":2,"p":1,"n":"TNAM - Translation"}]},{"t":1,"p":1,"n":"WRLD - Worldspace","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":8,"n":"Unused RNAM","c":[{"t":6,"n":"RNAM - Grid","c":[{"t":3,"n":"Y"},{"t":3,"n":"X"},{"t":7,"n":"References","c":[{"t":6,"n":"Reference","c":[{"t":3,"n":"Ref"},{"t":3,"n":"Y"},{"t":3,"n":"X"}]}]}]}]},{"t":11,"n":"MHDT - Max Height Data"},{"t":2,"p":1,"n":"FULL - Name"},{"t":6,"s":1,"p":1,"n":"WCTR - Fixed Dimensions Center Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":3,"p":1,"n":"LTMP - Interior Lighting"},{"t":3,"p":1,"n":"XEZN - Encounter Zone"},{"t":3,"p":1,"n":"XLCN - Location"},{"t":6,"s":1,"p":1,"n":"Parent","c":[{"t":3,"p":1,"n":"WNAM - Worldspace"},{"t":6,"p":1,"n":"PNAM - ","c":[{"t":3,"p":1,"n":"Flags"},{"t":11,"n":"Unknown"}]}]},{"t":3,"p":1,"n":"CNAM - Climate"},{"t":3,"p":1,"n":"NAM2 - Water"},{"t":3,"p":1,"n":"NAM3 - LOD Water Type"},{"t":5,"p":1,"n":"NAM4 - LOD Water Height"},{"t":6,"s":1,"p":1,"n":"DNAM - Land Data","c":[{"t":5,"p":1,"n":"Default Land Height"},{"t":5,"p":1,"n":"Default Water Height"}]},{"t":2,"p":1,"n":"ICON - Map Image"},{"t":6,"s":1,"p":1,"n":"Cloud Model","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":6,"s":1,"p":1,"n":"MNAM - Map Data","c":[{"t":6,"p":1,"n":"Usable Dimensions","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"Cell Coordinates","c":[{"t":6,"p":1,"n":"NW Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"SE Cell","c":[{"t":3,"p":1,"n":"X"},{"t":3,"p":1,"n":"Y"}]}]},{"t":6,"p":1,"n":"Camera Data","c":[{"t":5,"p":1,"n":"Min Height"},{"t":5,"p":1,"n":"Max Height"},{"t":5,"p":1,"n":"Initial Pitch"}]}]},{"t":6,"s":1,"p":1,"n":"ONAM - World Map Offset Data","c":[{"t":5,"p":1,"n":"World Map Scale"},{"t":5,"p":1,"n":"Cell X Offset"},{"t":5,"p":1,"n":"Cell Y Offset"},{"t":5,"p":1,"n":"Cell Z Offset"}]},{"t":5,"p":1,"n":"NAMA - Distant LOD Multiplier"},{"t":3,"p":1,"n":"DATA - Flags"},{"t":6,"s":1,"p":1,"n":"Object Bounds","c":[{"t":6,"p":1,"n":"NAM0 - Min","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]},{"t":6,"p":1,"n":"NAM9 - Max","c":[{"t":5,"p":1,"n":"X"},{"t":5,"p":1,"n":"Y"}]}]},{"t":3,"p":1,"n":"ZNAM - Music"},{"t":2,"p":1,"n":"NNAM - Canopy Shadow (unused)"},{"t":2,"p":1,"n":"XNAM - Water Noise Texture"},{"t":2,"p":1,"n":"TNAM - HD LOD Diffuse Texture"},{"t":2,"p":1,"n":"UNAM - HD LOD Normal Texture"},{"t":2,"p":1,"n":"XWEM - Water Environment Map (unused)"},{"t":11,"n":"OFST - Offset Data"}]},{"t":1,"p":1,"n":"WTHR - Weather","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":2,"p":1,"n":"00TX - Cloud Texture Layer #0"},{"t":2,"p":1,"n":"10TX - Cloud Texture Layer #1"},{"t":2,"p":1,"n":"20TX - Cloud Texture Layer #2"},{"t":2,"p":1,"n":"30TX - Cloud Texture Layer #3"},{"t":2,"p":1,"n":"40TX - Cloud Texture Layer #4"},{"t":2,"p":1,"n":"50TX - Cloud Texture Layer #5"},{"t":2,"p":1,"n":"60TX - Cloud Texture Layer #6"},{"t":2,"p":1,"n":"70TX - Cloud Texture Layer #7"},{"t":2,"p":1,"n":"80TX - Cloud Texture Layer #8"},{"t":2,"p":1,"n":"90TX - Cloud Texture Layer #9"},{"t":2,"p":1,"n":":0TX - Cloud Texture Layer #10"},{"t":2,"p":1,"n":";0TX - Cloud Texture Layer #11"},{"t":2,"p":1,"n":"<0TX - Cloud Texture Layer #12"},{"t":2,"p":1,"n":"=0TX - Cloud Texture Layer #13"},{"t":2,"p":1,"n":">0TX - Cloud Texture Layer #14"},{"t":2,"p":1,"n":"?0TX - Cloud Texture Layer #15"},{"t":2,"p":1,"n":"@0TX - Cloud Texture Layer #16"},{"t":2,"p":1,"n":"A0TX - Cloud Texture Layer #17"},{"t":2,"p":1,"n":"B0TX - Cloud Texture Layer #18"},{"t":2,"p":1,"n":"C0TX - Cloud Texture Layer #19"},{"t":2,"p":1,"n":"D0TX - Cloud Texture Layer #20"},{"t":2,"p":1,"n":"E0TX - Cloud Texture Layer #21"},{"t":2,"p":1,"n":"F0TX - Cloud Texture Layer #22"},{"t":2,"p":1,"n":"G0TX - Cloud Texture Layer #23"},{"t":2,"p":1,"n":"H0TX - Cloud Texture Layer #24"},{"t":2,"p":1,"n":"I0TX - Cloud Texture Layer #25"},{"t":2,"p":1,"n":"J0TX - Cloud Texture Layer #26"},{"t":2,"p":1,"n":"K0TX - Cloud Texture Layer #27"},{"t":2,"p":1,"n":"L0TX - Cloud Texture Layer #28"},{"t":11,"n":"DNAM - Unused"},{"t":11,"n":"CNAM - Unused"},{"t":11,"n":"ANAM - Unused"},{"t":11,"n":"BNAM - Unused"},{"t":11,"n":"LNAM - Unknown"},{"t":3,"p":1,"n":"MNAM - Precipitation Type"},{"t":3,"p":1,"n":"NNAM - Visual Effect"},{"t":11,"n":"ONAM - Unused"},{"t":6,"s":1,"p":1,"n":"Cloud Speed","c":[{"t":7,"p":1,"n":"RNAM - Y Speed","c":[{"t":3,"p":1,"n":"Layer"}]},{"t":7,"p":1,"n":"QNAM - X Speed","c":[{"t":3,"p":1,"n":"Layer"}]}]},{"t":7,"s":1,"p":1,"n":"PNAM - Cloud Colors","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":7,"s":1,"p":1,"n":"JNAM - Cloud Alphas","c":[{"t":6,"p":1,"n":"Layer","c":[{"t":5,"p":1,"n":"Sunrise"},{"t":5,"p":1,"n":"Day"},{"t":5,"p":1,"n":"Sunset"},{"t":5,"p":1,"n":"Night"}]}]},{"t":6,"s":1,"p":1,"n":"NAM0 - Weather Colors","c":[{"t":6,"p":1,"n":"Sky-Upper","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Near","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"n":"Unknown","c":[{"t":6,"n":"Sunrise","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Day","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Sunset","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"n":"Night","c":[{"t":3,"n":"Red"},{"t":3,"n":"Green"},{"t":3,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sunlight","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Stars","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky-Lower","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Horizon","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Effect Lighting","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Diffuse","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Cloud LOD Ambient","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Fog Far","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sky Statics","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Water Multiplier","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Sun Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Moon Glare","c":[{"t":6,"p":1,"n":"Sunrise","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Day","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Sunset","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Night","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]}]},{"t":6,"s":1,"p":1,"n":"FNAM - Fog Distance","c":[{"t":5,"p":1,"n":"Day - Near"},{"t":5,"p":1,"n":"Day - Far"},{"t":5,"p":1,"n":"Night - Near"},{"t":5,"p":1,"n":"Night - Far"},{"t":5,"p":1,"n":"Day - Power"},{"t":5,"p":1,"n":"Night - Power"},{"t":5,"p":1,"n":"Day - Max"},{"t":5,"p":1,"n":"Night - Max"}]},{"t":6,"s":1,"p":1,"n":"DATA - Data","c":[{"t":3,"p":1,"n":"Wind Speed"},{"t":11,"n":"Unknown"},{"t":3,"p":1,"n":"Trans Delta"},{"t":3,"p":1,"n":"Sun Glare"},{"t":3,"p":1,"n":"Sun Damage"},{"t":3,"p":1,"n":"Precipitation - Begin Fade In"},{"t":3,"p":1,"n":"Precipitation - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Begin Fade In"},{"t":3,"p":1,"n":"Thunder\/Lightning - End Fade Out"},{"t":3,"p":1,"n":"Thunder\/Lightning - Frequency"},{"t":3,"p":1,"n":"Flags"},{"t":6,"p":1,"n":"Lightning Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"}]},{"t":3,"p":1,"n":"Visual Effect - Begin"},{"t":3,"p":1,"n":"Visual Effect - End"},{"t":3,"p":1,"n":"Wind Direction"},{"t":3,"p":1,"n":"Wind Direction Range"}]},{"t":3,"p":1,"n":"NAM1 - Disabled Cloud Layers"},{"t":8,"s":1,"p":1,"n":"Sounds","d":1,"c":[{"t":6,"p":1,"n":"SNAM - Sound","c":[{"t":3,"p":1,"n":"Sound"},{"t":3,"p":1,"n":"Type"}]}]},{"t":8,"s":1,"p":1,"n":"Sky Statics","d":1,"c":[{"t":3,"p":1,"n":"TNAM - Static"}]},{"t":6,"s":1,"p":1,"n":"IMSP - Image Spaces","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"HNAM - Volumetric Lighting","c":[{"t":3,"p":1,"n":"Sunrise"},{"t":3,"p":1,"n":"Day"},{"t":3,"p":1,"n":"Sunset"},{"t":3,"p":1,"n":"Night"}]},{"t":6,"s":1,"p":1,"n":"Directional Ambient Lighting Colors","c":[{"t":6,"p":1,"n":"DALC - Sunrise","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Day","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Sunset","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]},{"t":6,"p":1,"n":"DALC - Night","c":[{"t":6,"p":1,"n":"Directional","c":[{"t":6,"p":1,"n":"X+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"X-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Y-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z+","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":6,"p":1,"n":"Z-","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]}]},{"t":6,"p":1,"n":"Specular","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unused"}]},{"t":5,"p":1,"n":"Scale"}]}]},{"t":11,"n":"NAM2 - Unused"},{"t":11,"n":"NAM3 - Unused"},{"t":6,"s":1,"p":1,"n":"Aurora","c":[{"t":6,"p":1,"n":"Model","c":[{"t":2,"p":1,"n":"MODL - Model Filename"},{"t":11,"p":1,"n":"MODT - Texture Files Hashes"},{"t":7,"p":1,"n":"MODS - Alternate Textures","c":[{"t":6,"p":1,"n":"Alternate Texture","c":[{"t":2,"p":1,"n":"3D Name"},{"t":3,"p":1,"n":"New Texture"},{"t":3,"p":1,"n":"3D Index"}]}]}]}]},{"t":3,"p":1,"n":"GNAM - Sun Glare Lens Flare"}]},{"t":1,"p":1,"n":"AACT - Action","d":1,"c":[{"t":2,"p":1,"n":"EDID - Editor ID"},{"t":6,"s":1,"p":1,"n":"CNAM - Color","c":[{"t":3,"p":1,"n":"Red"},{"t":3,"p":1,"n":"Green"},{"t":3,"p":1,"n":"Blue"},{"t":11,"n":"Unknown"}]}]}]},"name":"Smash.All.old","hash":"4380CF09","color":128} \ No newline at end of file diff --git a/frontend/smash.res b/frontend/smash.res old mode 100644 new mode 100755 diff --git a/lib/loggerpro b/lib/loggerpro new file mode 160000 index 0000000..e7f2608 --- /dev/null +++ b/lib/loggerpro @@ -0,0 +1 @@ +Subproject commit e7f2608a7b4afabc3f9ca966ef88d923e44e7dcd diff --git a/lib/mte/CRC32.pas b/lib/mte/CRC32.pas old mode 100644 new mode 100755 index a7eaff5..51255df --- a/lib/mte/CRC32.pas +++ b/lib/mte/CRC32.pas @@ -1,6 +1,7 @@ unit CRC32; interface + type Long = record LoWord: Word; @@ -8,16 +9,17 @@ Long = record end; // exported functions - function FileCRC32(FileName: string): string; - function StrCRC32(input: string): string; +function FileCRC32(FileName: string): string; +function StrCRC32(input: string): string; const CRCPOLY = $EDB88320; var - CRCTable: array[0..512] Of Longint; + CRCTable: array [0 .. 512] Of Longint; implementation + {$WARNINGS OFF} uses @@ -38,20 +40,21 @@ procedure BuildCRCTable; else r := r shr 1; CRCTable[i] := r; - end; + end; end; function RecountCRC(b: byte; CrcOld: Longint): Longint; begin - RecountCRC := CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF) + RecountCRC := CRCTable[byte(CrcOld xor Longint(b)) + ] xor ((CrcOld shr 8) and $00FFFFFF) end; function HextW(w: Word): string; const - h: array[0..15] Of char = '0123456789ABCDEF'; + h: array [0 .. 15] Of char = '0123456789ABCDEF'; begin HextW := ''; - HextW := h[Hi(w) shr 4] + h[Hi(w) and $F] + h[Lo(w) shr 4]+h[Lo(w) and $F]; + HextW := h[Hi(w) shr 4] + h[Hi(w) and $F] + h[Lo(w) shr 4] + h[Lo(w) and $F]; end; function HextL(l: Longint): string; @@ -63,8 +66,8 @@ function HextL(l: Longint): string; function FileCRC32(FileName: string): string; var Buffer: PChar; - F: File of Byte; - B: array[0..255] of Byte; + F: File of byte; + b: array [0 .. 255] of byte; CRC: Longint; e, i: Integer; begin @@ -73,14 +76,14 @@ function FileCRC32(FileName: string): string; AssignFile(F, FileName); FileMode := 0; Reset(F); - GetMem(Buffer, SizeOf(B)); + GetMem(Buffer, SizeOf(b)); repeat - FillChar(B, SizeOf(B), 0); - BlockRead(F, B, SizeOf(B), e); - for i := 0 to (e-1) do + FillChar(b, SizeOf(b), 0); + BlockRead(F, b, SizeOf(b), e); + for i := 0 to (e - 1) do CRC := RecountCRC(b[i], CRC); until (e < 255) or (IOresult <> 0); - FreeMem(Buffer, SizeOf(B)); + FreeMem(Buffer, SizeOf(b)); CloseFile(F); CRC := Not CRC; Result := HextL(CRC); @@ -88,15 +91,15 @@ function FileCRC32(FileName: string): string; function StrCRC32(input: string): string; var - B: TArray; + b: TArray; CRC: Longint; i: Integer; begin BuildCRCTable; CRC := $FFFFFFFF; - B := TEncoding.UTF8.GetBytes(input); - for i := 0 to Pred(Length(B)) do - CRC := RecountCRC(B[i], CRC); + b := TEncoding.UTF8.GetBytes(input); + for i := 0 to Pred(Length(b)) do + CRC := RecountCRC(b[i], CRC); CRC := Not CRC; Result := HextL(CRC); end; diff --git a/lib/mte/RttiIni.pas b/lib/mte/RttiIni.pas old mode 100644 new mode 100755 index 033b689..a96aea2 --- a/lib/mte/RttiIni.pas +++ b/lib/mte/RttiIni.pas @@ -14,16 +14,16 @@ IniSectionAttribute = class(TCustomAttribute) property Section: string read FSection write FSection; end; - TRttiIni = class (TObject) + TRttiIni = class(TObject) private - class function ReadValue(section: string; var ini: TMemIniFile; + class function ReadValue(Section: string; var ini: TMemIniFile; field: TRttiField): TValue; - class procedure WriteValue(section: string; var ini: TMemIniFile; + class procedure WriteValue(Section: string; var ini: TMemIniFile; field: TRttiField; aValue: TValue); class function GetIniAttribute(Obj: TRttiObject): IniSectionAttribute; public - class procedure Load(filename: string; obj: TObject); - class procedure Save(filename: string; obj: TObject); + class procedure Load(filename: string; Obj: TObject); + class procedure Save(filename: string; Obj: TObject); end; implementation @@ -37,113 +37,116 @@ constructor IniSectionAttribute.Create(const aSection: String); { TIniPersist } class function TRttiIni.GetIniAttribute(Obj: TRttiObject): IniSectionAttribute; var - Attr: TCustomAttribute; + Attr: TCustomAttribute; begin - for Attr in Obj.GetAttributes do begin + for Attr in Obj.GetAttributes do + begin if Attr is IniSectionAttribute then exit(IniSectionAttribute(Attr)); end; result := nil; end; -class procedure TRttiIni.Load(filename: string; obj: TObject); +class procedure TRttiIni.Load(filename: string; Obj: TObject); var ctx: TRttiContext; objType: TRttiType; - Field: TRttiField; + field: TRttiField; IniSection: IniSectionAttribute; - Ini: TMemIniFile; + ini: TMemIniFile; CurrentSection: string; value: TValue; begin ctx := TRttiContext.Create; try - Ini := TMemIniFile.Create(FileName); + ini := TMemIniFile.Create(filename); try objType := ctx.GetType(Obj.ClassInfo); - for Field in objType.GetFields do begin - IniSection := GetIniAttribute(Field); + for field in objType.GetFields do + begin + IniSection := GetIniAttribute(field); if Assigned(IniSection) then CurrentSection := IniSection.Section; - value := ReadValue(CurrentSection, ini, Field); + value := ReadValue(CurrentSection, ini, field); if not value.IsEmpty then - field.SetValue(obj, value); + field.SetValue(Obj, value); end; finally - Ini.Free; + ini.Free; end; finally ctx.Free; end; end; -class function TRttiIni.ReadValue(section: string; var ini: TMemIniFile; +class function TRttiIni.ReadValue(Section: string; var ini: TMemIniFile; field: TRttiField): TValue; var fieldType: string; begin - Result := TValue.Empty; - fieldType := field.FieldType.Name; + result := TValue.Empty; + fieldType := field.fieldType.Name; // exit if value doesn't exist in ini being loaded // this allows us to use default values from the object's constructor - if not ini.ValueExists(section, field.Name) then + if not ini.ValueExists(Section, field.Name) then exit; // load string, Integer, and Boolean fields from ini if fieldType = 'string' then - Result := TValue.From(ini.ReadString(section, field.Name, '')) + result := TValue.From(ini.ReadString(Section, field.Name, '')) else if fieldType = 'Integer' then - Result := TValue.From(ini.ReadInteger(section, field.Name, 0)) + result := TValue.From(ini.ReadInteger(Section, field.Name, 0)) else if fieldType = 'Int64' then - Result := TValue.From(ini.ReadInteger(section, field.Name, 0)) + result := TValue.From(ini.ReadInteger(Section, field.Name, 0)) else if fieldType = 'TDateTime' then - Result := TValue.From(ini.ReadFloat(section, field.Name, 0)) + result := TValue.From(ini.ReadFloat(Section, field.Name, 0)) else if fieldType = 'Boolean' then - Result := TValue.From(ini.ReadBool(section, field.Name, false)); + result := TValue.From(ini.ReadBool(Section, field.Name, false)); end; -class procedure TRttiIni.WriteValue(section: string; var ini: TMemIniFile; +class procedure TRttiIni.WriteValue(Section: string; var ini: TMemIniFile; field: TRttiField; aValue: TValue); var fieldType: string; begin - fieldType := field.FieldType.Name; + fieldType := field.fieldType.Name; if fieldType = 'string' then - ini.WriteString(section, field.Name, aValue.AsString) + ini.WriteString(Section, field.Name, aValue.AsString) else if fieldType = 'Integer' then - ini.WriteInteger(section, field.Name, aValue.AsInteger) + ini.WriteInteger(Section, field.Name, aValue.AsInteger) else if fieldType = 'Int64' then - ini.WriteInteger(section, field.Name, aValue.AsInt64) + ini.WriteInteger(Section, field.Name, aValue.AsInt64) else if fieldType = 'TDateTime' then - ini.WriteFloat(section, field.Name, aValue.AsType) + ini.WriteFloat(Section, field.Name, aValue.AsType) else if fieldType = 'Boolean' then - ini.WriteBool(section, field.Name, aValue.AsBoolean) + ini.WriteBool(Section, field.Name, aValue.AsBoolean) end; -class procedure TRttiIni.Save(filename: string; obj: TObject); +class procedure TRttiIni.Save(filename: string; Obj: TObject); var - ctx: TRttiContext; - objType: TRttiType; - field: TRttiField; - IniSection: IniSectionAttribute; - ini: TMemIniFile; - CurrentSection: string; + ctx: TRttiContext; + objType: TRttiType; + field: TRttiField; + IniSection: IniSectionAttribute; + ini: TMemIniFile; + CurrentSection: string; begin ctx := TRttiContext.Create; try - ini := TMemIniFile.Create(FileName); + ini := TMemIniFile.Create(filename); try objType := ctx.GetType(Obj.ClassInfo); - for field in objType.GetFields do begin - IniSection := GetIniAttribute(Field); + for field in objType.GetFields do + begin + IniSection := GetIniAttribute(field); if Assigned(IniSection) then CurrentSection := IniSection.Section; - WriteValue(CurrentSection, ini, field, Field.GetValue(obj)); + WriteValue(CurrentSection, ini, field, field.GetValue(Obj)); end; finally - Ini.UpdateFile; - Ini.Free; + ini.UpdateFile; + ini.Free; end; finally ctx.Free; diff --git a/lib/mte/RttiJson.pas b/lib/mte/RttiJson.pas old mode 100644 new mode 100755 index c2c6fcf..84ff6c7 --- a/lib/mte/RttiJson.pas +++ b/lib/mte/RttiJson.pas @@ -6,9 +6,9 @@ interface SysUtils, Rtti, // superobject json library superobject; - + type - TRttiJson = class (TObject) + TRttiJson = class(TObject) public class function ToJson(obj: TObject): string; class function FromJson(json: string; classType: TClass): TObject; @@ -25,17 +25,19 @@ class function TRttiJson.ToJson(obj: TObject): string; date: TDateTime; begin jsonObj := SO; - rtype := TRTTIContext.Create.GetType(obj.ClassType); + rtype := TRTTIContext.Create.GetType(obj.classType); // loop through fields - for field in rType.GetFields do begin - fieldType := field.FieldType.ToString; + for field in rtype.GetFields do + begin + fieldType := field.fieldType.ToString; // handle datatypes I use if (fieldType = 'string') then jsonObj.S[field.Name] := field.GetValue(obj).ToString else if (fieldType = 'Integer') then jsonObj.I[field.Name] := field.GetValue(obj).AsInteger - else if (fieldType = 'TDateTime') then begin + else if (fieldType = 'TDateTime') then + begin date := StrToFloat(field.GetValue(obj).ToString); jsonObj.S[field.Name] := DateTimeToStr(date); end; @@ -63,14 +65,16 @@ class function TRttiJson.FromJson(json: string; classType: TClass): TObject; Result := classType.Create; // loop through fields - for field in rType.GetFields do begin - fieldType := field.FieldType.ToString; + for field in rtype.GetFields do + begin + fieldType := field.fieldType.ToString; // handle datatypes I use if (fieldType = 'string') then field.SetValue(Result, jsonObj.S[field.Name]) else if (fieldType = 'Integer') then field.SetValue(Result, jsonObj.I[field.Name]) - else if (fieldType = 'TDateTime') then begin + else if (fieldType = 'TDateTime') then + begin date := StrToDateTime(jsonObj.S[field.Name]); field.SetValue(Result, TValue.From(date)); end; @@ -79,4 +83,4 @@ Result := classType.Create; context.Free; end; -end. \ No newline at end of file +end. diff --git a/lib/mte/RttiTranslation.pas b/lib/mte/RttiTranslation.pas old mode 100644 new mode 100755 index d1391ef..4b22e78 --- a/lib/mte/RttiTranslation.pas +++ b/lib/mte/RttiTranslation.pas @@ -22,18 +22,18 @@ FormSectionAttribute = class(TCustomAttribute) property Section: string read FSection write FSection; end; - TRttiTranslation = class (TObject) + TRttiTranslation = class(TObject) private - class function ReadValue(section: string; var sl: TStringList; + class function ReadValue(Section: string; var sl: TStringList; field: TRttiField; subfield: string): string; - class procedure WriteValue(section: string; value: string; var sl: TStringList; - field: TRttiField; subfield: string); + class procedure WriteValue(Section: string; value: string; + var sl: TStringList; field: TRttiField; subfield: string); class function GetPrefixAttribute(Obj: TRttiObject): FormPrefixAttribute; class function GetSectionAttribute(Obj: TRttiObject): FormSectionAttribute; public - class procedure Load(filename: string; obj: TObject); overload; - class procedure Load(var sl: TStringList; obj: TObject); overload; - class procedure Save(filename: string; obj: TObject); + class procedure Load(filename: string; Obj: TObject); overload; + class procedure Load(var sl: TStringList; Obj: TObject); overload; + class procedure Save(filename: string; Obj: TObject); end; implementation @@ -51,46 +51,50 @@ constructor FormSectionAttribute.Create(const aSection: String); end; { TRttiTranslation } -class function TRttiTranslation.GetPrefixAttribute(Obj: TRttiObject): FormPrefixAttribute; +class function TRttiTranslation.GetPrefixAttribute(Obj: TRttiObject) + : FormPrefixAttribute; var Attr: TCustomAttribute; begin - for Attr in Obj.GetAttributes do begin + for Attr in Obj.GetAttributes do + begin if Attr is FormPrefixAttribute then exit(FormPrefixAttribute(Attr)); end; result := nil; end; -class function TRttiTranslation.GetSectionAttribute(Obj: TRttiObject): FormSectionAttribute; +class function TRttiTranslation.GetSectionAttribute(Obj: TRttiObject) + : FormSectionAttribute; var Attr: TCustomAttribute; begin - for Attr in Obj.GetAttributes do begin + for Attr in Obj.GetAttributes do + begin if Attr is FormSectionAttribute then exit(FormSectionAttribute(Attr)); end; result := nil; end; -class procedure TRttiTranslation.Load(filename: string; obj: TObject); +class procedure TRttiTranslation.Load(filename: string; Obj: TObject); var sl: TStringList; begin sl := TStringList.Create; try sl.LoadFromFile(filename); - TRttiTranslation.Load(sl, obj); + TRttiTranslation.Load(sl, Obj); finally sl.Free; end; end; -class procedure TRttiTranslation.Load(var sl: TStringList; obj: TObject); +class procedure TRttiTranslation.Load(var sl: TStringList; Obj: TObject); var ctx: TRttiContext; objType: TRttiType; - Field: TRttiField; + field: TRttiField; FormPrefix: FormPrefixAttribute; FormSection: FormSectionAttribute; CurrentPrefix, CurrentSection, FieldName, value: string; @@ -109,10 +113,12 @@ class procedure TRttiTranslation.Load(var sl: TStringList; obj: TObject); ctx := TRttiContext.Create; try objType := ctx.GetType(Obj.ClassInfo); - for Field in objType.GetFields do begin + for field in objType.GetFields do + begin // START BY FINDING FORM PREFIX, SKIP FIELDS UNTIL FOUND - if not Assigned(FormPrefix) then begin - FormPrefix := GetPrefixAttribute(Field); + if not Assigned(FormPrefix) then + begin + FormPrefix := GetPrefixAttribute(field); if Assigned(FormPrefix) then CurrentPrefix := FormPrefix.Prefix else @@ -120,7 +126,7 @@ class procedure TRttiTranslation.Load(var sl: TStringList; obj: TObject); end; // IF FORM SECTION, DUMP SECTION - FormSection := GetSectionAttribute(Field); + FormSection := GetSectionAttribute(field); if Assigned(FormSection) then CurrentSection := FormSection.Section; @@ -129,89 +135,124 @@ class procedure TRttiTranslation.Load(var sl: TStringList; obj: TObject); continue; // LOAD VALUES - FieldName := Field.FieldType.Name; - if FieldName = 'TCheckBox' then begin - aCheckBox := TCheckBox(field.GetValue(obj).AsType); - if Assigned(aCheckBox) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aCheckBox.Caption := value; - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + FieldName := field.FieldType.Name; + if FieldName = 'TCheckBox' then + begin + aCheckBox := TCheckBox(field.GetValue(Obj).AsType); + if Assigned(aCheckBox) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aCheckBox.Caption := value; + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aCheckBox.ShowHint := value <> ''; - if aCheckBox.ShowHint then aCheckBox.Hint := value; + if aCheckBox.ShowHint then + aCheckBox.Hint := value; end; end - else if FieldName = 'TButton' then begin - aButton := TButton(field.GetValue(obj).AsType); - if Assigned(aButton) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aButton.Caption := value; - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + else if FieldName = 'TButton' then + begin + aButton := TButton(field.GetValue(Obj).AsType); + if Assigned(aButton) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aButton.Caption := value; + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aButton.ShowHint := value <> ''; - if aButton.ShowHint then aButton.Hint := value; + if aButton.ShowHint then + aButton.Hint := value; end; end - else if FieldName = 'TLabel' then begin - aLabel := TLabel(field.GetValue(obj).AsType); - if Assigned(aLabel) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aLabel.Caption := value; - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + else if FieldName = 'TLabel' then + begin + aLabel := TLabel(field.GetValue(Obj).AsType); + if Assigned(aLabel) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aLabel.Caption := value; + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aLabel.ShowHint := value <> ''; - if aLabel.ShowHint then aLabel.Hint := value; + if aLabel.ShowHint then + aLabel.Hint := value; end; end - else if FieldName = 'TTabSheet' then begin - aTabSheet := TTabSheet(field.GetValue(obj).AsType); - if Assigned(aTabSheet) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aTabSheet.Caption := value; - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + else if FieldName = 'TTabSheet' then + begin + aTabSheet := TTabSheet(field.GetValue(Obj).AsType); + if Assigned(aTabSheet) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aTabSheet.Caption := value; + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aTabSheet.ShowHint := value <> ''; - if aTabSheet.ShowHint then aTabSheet.Hint := value; + if aTabSheet.ShowHint then + aTabSheet.Hint := value; end; end - else if FieldName = 'TGroupBox' then begin - aGroupBox := TGroupBox(field.GetValue(obj).AsType); - if Assigned(aGroupBox) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aGroupBox.Caption := value; - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + else if FieldName = 'TGroupBox' then + begin + aGroupBox := TGroupBox(field.GetValue(Obj).AsType); + if Assigned(aGroupBox) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aGroupBox.Caption := value; + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aGroupBox.ShowHint := value <> ''; - if aGroupBox.ShowHint then aGroupBox.Hint := value; + if aGroupBox.ShowHint then + aGroupBox.Hint := value; end; end - else if FieldName = 'TSpeedButton' then begin - aSpeedButton := TSpeedButton(field.GetValue(obj).AsType); - if Assigned(aSpeedButton) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Hint'); + else if FieldName = 'TSpeedButton' then + begin + aSpeedButton := TSpeedButton(field.GetValue(Obj).AsType); + if Assigned(aSpeedButton) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Hint'); aSpeedButton.ShowHint := value <> ''; - if aSpeedButton.ShowHint then aSpeedButton.Hint := value; + if aSpeedButton.ShowHint then + aSpeedButton.Hint := value; end; end - else if FieldName = 'TMenuItem' then begin - aMenuItem := TMenuItem(field.GetValue(obj).AsType); - if Assigned(aMenuItem) then begin - value := ReadValue(CurrentPrefix, sl, Field, 'Caption'); - if value <> '' then aMenuItem.Caption := value; + else if FieldName = 'TMenuItem' then + begin + aMenuItem := TMenuItem(field.GetValue(Obj).AsType); + if Assigned(aMenuItem) then + begin + value := ReadValue(CurrentPrefix, sl, field, 'Caption'); + if value <> '' then + aMenuItem.Caption := value; end; end - else if FieldName = 'TComboBox' then begin - aComboBox := TComboBox(field.GetValue(obj).AsType); - if Assigned(aComboBox) then begin - for i := 0 to Pred(aComboBox.Items.Count) do begin - value := ReadValue(CurrentPrefix, sl, Field, 'Item'+IntToStr(i)); - if value <> '' then aComboBox.Items[i] := value; + else if FieldName = 'TComboBox' then + begin + aComboBox := TComboBox(field.GetValue(Obj).AsType); + if Assigned(aComboBox) then + begin + for i := 0 to Pred(aComboBox.Items.Count) do + begin + value := ReadValue(CurrentPrefix, sl, field, 'Item' + IntToStr(i)); + if value <> '' then + aComboBox.Items[i] := value; end; end; end - else if FieldName = 'TListView' then begin - aListView := TListView(field.GetValue(obj).AsType); - if Assigned(aListView) then begin + else if FieldName = 'TListView' then + begin + aListView := TListView(field.GetValue(Obj).AsType); + if Assigned(aListView) then + begin if not aListView.ShowColumnHeaders then continue; - for i := 0 to Pred(aListView.Columns.Count) do begin - value := ReadValue(CurrentPrefix, sl, Field, 'Column'+IntToStr(i)); - if value <> '' then aListView.Columns[i].Caption := value; + for i := 0 to Pred(aListView.Columns.Count) do + begin + value := ReadValue(CurrentPrefix, sl, field, + 'Column' + IntToStr(i)); + if value <> '' then + aListView.Columns[i].Caption := value; end; end; end; @@ -221,32 +262,32 @@ class procedure TRttiTranslation.Load(var sl: TStringList; obj: TObject); end; end; -class function TRttiTranslation.ReadValue(section: string; var sl: TStringList; +class function TRttiTranslation.ReadValue(Section: string; var sl: TStringList; field: TRttiField; subfield: string): string; var - name: string; + Name: string; begin // load value from stringlist - name := Format('%s_%s_%s', [section, field.Name, subfield]); - Result := StringReplace(sl.Values[name], '#13#10', #13#10, [rfReplaceAll]); + name := Format('%s_%s_%s', [Section, field.Name, subfield]); + result := StringReplace(sl.Values[name], '#13#10', #13#10, [rfReplaceAll]); end; -class procedure TRttiTranslation.WriteValue(section: string; value: string; var sl: TStringList; - field: TRttiField; subfield: string); +class procedure TRttiTranslation.WriteValue(Section: string; value: string; + var sl: TStringList; field: TRttiField; subfield: string); var - name: string; + Name: string; begin if value = '' then exit; - name := Format('%s_%s_%s', [section, field.Name, subfield]); + name := Format('%s_%s_%s', [Section, field.Name, subfield]); sl.Values[name] := StringReplace(value, #13#10, '#13#10', [rfReplaceAll]); end; -class procedure TRttiTranslation.Save(filename: string; obj: TObject); +class procedure TRttiTranslation.Save(filename: string; Obj: TObject); var ctx: TRttiContext; objType: TRttiType; - Field: TRttiField; + field: TRttiField; FormPrefix: FormPrefixAttribute; FormSection: FormSectionAttribute; sl: TStringList; @@ -272,16 +313,19 @@ class procedure TRttiTranslation.Save(filename: string; obj: TObject); sl.LoadFromFile(filename); // ADD HEADER IF NEW OBJECT - Header := Format('{ %s }', [obj.ClassName]); + Header := Format('{ %s }', [Obj.ClassName]); bNewObject := sl.IndexOf(Header) = -1; - if bNewObject then sl.Add(Header); + if bNewObject then + sl.Add(Header); try objType := ctx.GetType(Obj.ClassInfo); - for Field in objType.GetFields do begin + for field in objType.GetFields do + begin // START BY FINDING FORM PREFIX, SKIP FIELDS UNTIL FOUND - if not Assigned(FormPrefix) then begin - FormPrefix := GetPrefixAttribute(Field); + if not Assigned(FormPrefix) then + begin + FormPrefix := GetPrefixAttribute(field); if Assigned(FormPrefix) then CurrentPrefix := FormPrefix.Prefix else @@ -289,13 +333,15 @@ class procedure TRttiTranslation.Save(filename: string; obj: TObject); end; // IF FORM SECTION, DUMP SECTION - FormSection := GetSectionAttribute(Field); - if Assigned(FormSection) then begin + FormSection := GetSectionAttribute(field); + if Assigned(FormSection) then + begin CurrentSection := FormSection.Section; if CurrentSection = 'DontTranslate' then continue; Header := Format('{ ## %s ## }', [FormSection.Section]); - if (sl.IndexOf(Header) = -1) then sl.Add(Header); + if (sl.IndexOf(Header) = -1) then + sl.Add(Header); end; // SKIP ALL ITEMS IN 'DontTranslate' SECTION @@ -303,83 +349,104 @@ class procedure TRttiTranslation.Save(filename: string; obj: TObject); continue; // HANDLE COMPONENTS - FieldName := Field.FieldType.Name; + FieldName := field.FieldType.Name; // Handle TCheckBox - if FieldName = 'TCheckBox' then begin - aCheckBox := TCheckBox(field.GetValue(obj).AsType); - if Assigned(aCheckBox) then begin + if FieldName = 'TCheckBox' then + begin + aCheckBox := TCheckBox(field.GetValue(Obj).AsType); + if Assigned(aCheckBox) then + begin WriteValue(CurrentPrefix, aCheckBox.Caption, sl, field, 'Caption'); WriteValue(CurrentPrefix, aCheckBox.Hint, sl, field, 'Hint'); end; end // Handle TButton - else if FieldName = 'TButton' then begin - aButton := TButton(field.GetValue(obj).AsType); - if Assigned(aButton) then begin + else if FieldName = 'TButton' then + begin + aButton := TButton(field.GetValue(Obj).AsType); + if Assigned(aButton) then + begin WriteValue(CurrentPrefix, aButton.Caption, sl, field, 'Caption'); WriteValue(CurrentPrefix, aButton.Hint, sl, field, 'Hint'); end; end // Handle TLabel - else if FieldName = 'TLabel' then begin - aLabel := TLabel(field.GetValue(obj).AsType); - if Assigned(aLabel) then begin + else if FieldName = 'TLabel' then + begin + aLabel := TLabel(field.GetValue(Obj).AsType); + if Assigned(aLabel) then + begin WriteValue(CurrentPrefix, aLabel.Caption, sl, field, 'Caption'); WriteValue(CurrentPrefix, aLabel.Hint, sl, field, 'Hint'); end; end // Handle TTabSheet - else if FieldName = 'TTabSheet' then begin - aTabSheet := TTabSheet(field.GetValue(obj).AsType); - if Assigned(aTabSheet) then begin + else if FieldName = 'TTabSheet' then + begin + aTabSheet := TTabSheet(field.GetValue(Obj).AsType); + if Assigned(aTabSheet) then + begin WriteValue(CurrentPrefix, aTabSheet.Caption, sl, field, 'Caption'); WriteValue(CurrentPrefix, aTabSheet.Hint, sl, field, 'Hint'); end; end // Handle TGroupBox - else if FieldName = 'TGroupBox' then begin - aGroupBox := TGroupBox(field.GetValue(obj).AsType); - if Assigned(aGroupBox) then begin + else if FieldName = 'TGroupBox' then + begin + aGroupBox := TGroupBox(field.GetValue(Obj).AsType); + if Assigned(aGroupBox) then + begin WriteValue(CurrentPrefix, aGroupBox.Caption, sl, field, 'Caption'); WriteValue(CurrentPrefix, aGroupBox.Hint, sl, field, 'Hint'); end; end // Handle TSpeedButton - else if FieldName = 'TSpeedButton' then begin - aSpeedButton := TSpeedButton(field.GetValue(obj).AsType); - if Assigned(aSpeedButton) then begin - WriteValue(CurrentPrefix, aSpeedButton.Caption, sl, field, 'Caption'); + else if FieldName = 'TSpeedButton' then + begin + aSpeedButton := TSpeedButton(field.GetValue(Obj) + .AsType); + if Assigned(aSpeedButton) then + begin + WriteValue(CurrentPrefix, aSpeedButton.Caption, sl, field, + 'Caption'); WriteValue(CurrentPrefix, aSpeedButton.Hint, sl, field, 'Hint'); end; end // Handle TMenuItem - else if FieldName = 'TMenuItem' then begin - aMenuItem := TMenuItem(field.GetValue(obj).AsType); + else if FieldName = 'TMenuItem' then + begin + aMenuItem := TMenuItem(field.GetValue(Obj).AsType); if Assigned(aMenuItem) then WriteValue(CurrentPrefix, aMenuItem.Caption, sl, field, 'Caption'); end // Handle TComboBox - else if FieldName = 'TComboBox' then begin - aComboBox := TComboBox(field.GetValue(obj).AsType); + else if FieldName = 'TComboBox' then + begin + aComboBox := TComboBox(field.GetValue(Obj).AsType); if Assigned(aComboBox) then for i := 0 to Pred(aComboBox.Items.Count) do - WriteValue(CurrentPrefix, aComboBox.Items[i], sl, field, 'Item'+IntToStr(i)); + WriteValue(CurrentPrefix, aComboBox.Items[i], sl, field, + 'Item' + IntToStr(i)); end // Handle TListView - else if FieldName = 'TListView' then begin - aListView := TListView(field.GetValue(obj).AsType); - if Assigned(aListView) then begin + else if FieldName = 'TListView' then + begin + aListView := TListView(field.GetValue(Obj).AsType); + if Assigned(aListView) then + begin if not aListView.ShowColumnHeaders then continue; for i := 0 to Pred(aListView.Columns.Count) do - WriteValue(CurrentPrefix, aListView.Columns[i].Caption, sl, field, 'Column'+IntToStr(i)); + WriteValue(CurrentPrefix, aListView.Columns[i].Caption, sl, field, + 'Column' + IntToStr(i)); end; end; end; finally - if bNewObject then sl.Add(' '); + if bNewObject then + sl.Add(' '); ForceDirectories(ExtractFilePath(filename)); - sl.SaveToFile(fileName); + sl.SaveToFile(filename); sl.Free; end; finally diff --git a/lib/mte/W7Taskbar.pas b/lib/mte/W7Taskbar.pas old mode 100644 new mode 100755 index 339cf89..b5e8d27 --- a/lib/mte/W7Taskbar.pas +++ b/lib/mte/W7Taskbar.pas @@ -9,10 +9,12 @@ interface TTaskBarProgressState = (tbpsNone, tbpsIndeterminate, tbpsNormal, tbpsError, tbpsPaused); - function InitializeTaskbarAPI: boolean; - function SetTaskbarProgressState(const AState: TTaskBarProgressState): boolean; - function SetTaskbarProgressValue(const ACurrent: UInt64; const AMax: UInt64): boolean; - function SetTaskbarOverlayIcon(const AIcon: THandle; const ADescription: String): boolean; +function InitializeTaskbarAPI: boolean; +function SetTaskbarProgressState(const AState: TTaskBarProgressState): boolean; +function SetTaskbarProgressValue(const ACurrent: UInt64; + const AMax: UInt64): boolean; +function SetTaskbarOverlayIcon(const AIcon: THandle; + const ADescription: String): boolean; implementation @@ -26,37 +28,49 @@ implementation type ITaskBarList3 = interface(IUnknown) - ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}'] + ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}'] function HrInit(): HRESULT; stdcall; function AddTab(hwnd: THandle): HRESULT; stdcall; function DeleteTab(hwnd: THandle): HRESULT; stdcall; function ActivateTab(hwnd: THandle): HRESULT; stdcall; function SetActiveAlt(hwnd: THandle): HRESULT; stdcall; - function MarkFullscreenWindow(hwnd: THandle; fFullscreen: Boolean): HRESULT; stdcall; - function SetProgressValue(hwnd: THandle; ullCompleted: UInt64; ullTotal: UInt64): HRESULT; stdcall; - function SetProgressState(hwnd: THandle; tbpFlags: Cardinal): HRESULT; stdcall; + function MarkFullscreenWindow(hwnd: THandle; fFullscreen: boolean) + : HRESULT; stdcall; + function SetProgressValue(hwnd: THandle; ullCompleted: UInt64; + ullTotal: UInt64): HRESULT; stdcall; + function SetProgressState(hwnd: THandle; tbpFlags: Cardinal) + : HRESULT; stdcall; function RegisterTab(hwnd: THandle; hwndMDI: THandle): HRESULT; stdcall; function UnregisterTab(hwndTab: THandle): HRESULT; stdcall; - function SetTabOrder(hwndTab: THandle; hwndInsertBefore: THandle): HRESULT; stdcall; - function SetTabActive(hwndTab: THandle; hwndMDI: THandle; tbatFlags: Cardinal): HRESULT; stdcall; - function ThumbBarAddButtons(hwnd: THandle; cButtons: Cardinal; pButtons: Pointer): HRESULT; stdcall; - function ThumbBarUpdateButtons(hwnd: THandle; cButtons: Cardinal; pButtons: Pointer): HRESULT; stdcall; - function ThumbBarSetImageList(hwnd: THandle; himl: THandle): HRESULT; stdcall; - function SetOverlayIcon(hwnd: THandle; hIcon: THandle; pszDescription: PChar): HRESULT; stdcall; - function SetThumbnailTooltip(hwnd: THandle; pszDescription: PChar): HRESULT; stdcall; - function SetThumbnailClip(hwnd: THandle; var prcClip: TRect): HRESULT; stdcall; + function SetTabOrder(hwndTab: THandle; hwndInsertBefore: THandle) + : HRESULT; stdcall; + function SetTabActive(hwndTab: THandle; hwndMDI: THandle; + tbatFlags: Cardinal): HRESULT; stdcall; + function ThumbBarAddButtons(hwnd: THandle; cButtons: Cardinal; + pButtons: Pointer): HRESULT; stdcall; + function ThumbBarUpdateButtons(hwnd: THandle; cButtons: Cardinal; + pButtons: Pointer): HRESULT; stdcall; + function ThumbBarSetImageList(hwnd: THandle; himl: THandle) + : HRESULT; stdcall; + function SetOverlayIcon(hwnd: THandle; hIcon: THandle; + pszDescription: PChar): HRESULT; stdcall; + function SetThumbnailTooltip(hwnd: THandle; pszDescription: PChar) + : HRESULT; stdcall; + function SetThumbnailClip(hwnd: THandle; var prcClip: TRect) + : HRESULT; stdcall; end; var TaskBarInterface: ITaskBarList3; -function InitializeTaskbarAPI: Boolean; +function InitializeTaskbarAPI: boolean; var Unknown: IInterface; Temp: ITaskBarList3; begin // return true and exit if already initialized - if Assigned(TaskBarInterface) then begin + if Assigned(TaskBarInterface) then + begin Result := True; Exit; end; @@ -64,7 +78,8 @@ function InitializeTaskbarAPI: Boolean; // create COM object for taskbar CID try Unknown := CreateComObject(TASKBAR_CID); - if Assigned(Unknown) then begin + if Assigned(Unknown) then + begin Temp := Unknown as ITaskBarList3; if Temp.HrInit() = S_OK then TaskBarInterface := Temp; @@ -91,14 +106,18 @@ function SetTaskbarProgressState(const AState: TTaskBarProgressState): boolean; // exit if api not initialized if not CheckAPI then - exit; + Exit; // check if state is valid, else use no progress case AState of - tbpsIndeterminate: Flag := TBPF_INDETERMINATE; - tbpsNormal: Flag := TBPF_NORMAL; - tbpsError: Flag := TBPF_ERROR; - tbpsPaused: Flag := TBPF_PAUSED; + tbpsIndeterminate: + Flag := TBPF_INDETERMINATE; + tbpsNormal: + Flag := TBPF_NORMAL; + tbpsError: + Flag := TBPF_ERROR; + tbpsPaused: + Flag := TBPF_PAUSED; else Flag := TBPF_NOPROGRESS; end; @@ -107,34 +126,40 @@ function SetTaskbarProgressState(const AState: TTaskBarProgressState): boolean; Result := TaskBarInterface.SetProgressState(Application.Handle, Flag) = S_OK; end; -function SetTaskbarProgressValue(const ACurrent:UInt64; const AMax: UInt64): boolean; +function SetTaskbarProgressValue(const ACurrent: UInt64; + const AMax: UInt64): boolean; begin Result := False; // exit if api not initialized if not CheckAPI then - exit; + Exit; // set progress value - Result := TaskBarInterface.SetProgressValue(Application.Handle, ACurrent, AMax) = S_OK; + Result := TaskBarInterface.SetProgressValue(Application.Handle, ACurrent, + AMax) = S_OK; end; -function SetTaskbarOverlayIcon(const AIcon: THandle; const ADescription: String): boolean; +function SetTaskbarOverlayIcon(const AIcon: THandle; + const ADescription: String): boolean; begin Result := False; // exit if api not initialized if not CheckAPI then - exit; + Exit; // set icon - Result := TaskBarInterface.SetOverlayIcon(Application.Handle, AIcon, PWideChar(ADescription)) = S_OK; + Result := TaskBarInterface.SetOverlayIcon(Application.Handle, AIcon, + PWideChar(ADescription)) = S_OK; end; initialization - TaskBarInterface := nil; + +TaskBarInterface := nil; finalization - TaskBarInterface := nil; + +TaskBarInterface := nil; end. diff --git a/lib/mte/mteBase.pas b/lib/mte/mteBase.pas old mode 100644 new mode 100755 index 42676a6..f556e60 --- a/lib/mte/mteBase.pas +++ b/lib/mte/mteBase.pas @@ -3,18 +3,19 @@ interface uses - Classes, Menus, + Classes, Menus, Generics.Collections, // third party libraries superobject, // mte units mteTracker, // xEdit units - wbHelpers, wbInterface, wbImplementation; + wbHelpers, wbLoadOrder, wbInterface, wbImplementation; type - TSmashType = ( stUnknown, stRecord, stString, stInteger, stFlag, stFloat, + TSmashType = (stUnknown, stRecord, stString, stInteger, stFlag, stFloat, stStruct, stUnsortedArray, stUnsortedStructArray, stSortedArray, - stSortedStructArray, stByteArray, stUnion ); + stSortedStructArray, stByteArray, stUnion); + TBasePlugin = class(TObject) public _File: IwbFile; @@ -37,74 +38,86 @@ TBasePlugin = class(TObject) procedure GetHash; function GetFormIndex: Integer; end; + TPluginHelpers = class - class function CreateNewBasePlugin(var list: TList; filename: string): TBasePlugin; - class function BasePluginByFilename(var list: TList; filename: string): TBasePlugin; - class function BasePluginLoadOrder(var list: TList; filename: string): integer; + class function CreateNewBasePlugin(var list: TList; filename: string) + : TBasePlugin; + class function BasePluginByFilename(var list: TList; filename: string) + : TBasePlugin; + class function BasePluginLoadOrder(var list: TList; + filename: string): Integer; end; + THeaderHelpers = class class procedure LoadPluginHeaders(var sl: TStringList); class procedure GetPluginMasters(filename: string; var sl: TStringList); - class procedure GetPluginDependencies(filename: string; var sl: TStringList); + class procedure GetPluginDependencies(filename: string; + var sl: TStringList); end; { General Helper Functions } - function etToString(et: TwbElementType): string; - function dtToString(dt: TwbDefType): string; - function ctToString(ct: TConflictThis): string; - function stToString(st: TSmashType): string; - function SmashType(def: IwbNamedDef): TSmashtype; - function GetSmashType(element: IwbElement): TSmashType; - function ElementByIndexedPath(e: IwbElement; ip: string): IwbElement; - function IndexedPath(e: IwbElement): string; - function GetAllValues(e: IwbElement): string; - function IsSortedDef(def: IwbNamedDef): boolean; - function IsSorted(e: IwbElement): boolean; - function HasStructChildren(e: IwbElement): boolean; - function HasStructChildrenDef(def: IwbNamedDef): boolean; - function WinningOverrideInFiles(rec: IwbMainRecord; - var sl: TStringList): IwbMainRecord; - function IsOverride(aRecord: IwbMainRecord): boolean; - function ExtractFormID(filename: string): string; - function RemoveFileIndex(formID: string): string; - function LocalFormID(aRecord: IwbMainRecord): integer; - function LoadOrderPrefix(aRecord: IwbMainRecord): integer; - function CountOverrides(aFile: IwbFile): integer; - function OverrideCountInFiles(rec: IwbMainRecord; var files: TStringList): Integer; - procedure AddRequiredBy(var lst: TList; filename: string; - var masters: TStringList); - procedure GetMasters(aFile: IwbFile; var sl: TStringList); - procedure AddMasters(aFile: IwbFile; var sl: TStringList); - function RemoveSelfOrContainer(const aElement: IwbElement): boolean; - procedure UndeleteAndDisable(const aRecord: IwbMainRecord); - function LoadOrderCompare(List: TStringList; Index1, Index2: Integer): Integer; - - { Record Prototyping Functions } - function GetElementObj(var obj: ISuperObject; name: string): ISuperObject; - function CreateRecordObj(var tree: ISuperObject; rec: IwbMainRecord): ISuperObject; - function GetRecordObj(var tree: ISuperObject; name: string): ISuperObject; - function GetRecordDef(sig: TwbSignature): TwbRecordDefEntry; - function BuildDef(def: IwbNamedDef; name: string): ISuperObject; - function BuildRecordDef(sName: string; mrDef: IwbRecordDef; out recObj: ISuperObject): boolean; overload; - function BuildRecordDef(sName: string; out recObj: ISuperObject): boolean; overload; - function GetEditableFileContainer: IwbContainerElementRef; - - { Plugin Error Functions } - function FixErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; - var errors: TStringList): IwbMainRecord; - function CheckForErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; - var errors: TStringList): IwbMainRecord; - - { Asset Handling Functions } - procedure ExtractBSA(ContainerName, folder, destination: string); overload; - procedure ExtractBSA(ContainerName, destination: string; var ignore: TStringList); overload; - function BSAExists(filename: string): boolean; - function INIExists(filename: string): boolean; - function TranslationExists(filename: string): boolean; - function FaceDataExists(filename: string): boolean; - function VoiceDataExists(filename: string): boolean; - function FragmentsExist(f: IwbFile): boolean; - function ReferencesSelf(f: IwbFile): boolean; +function etToString(et: TwbElementType): string; +function dtToString(dt: TwbDefType): string; +function ctToString(ct: TConflictThis): string; +function stToString(st: TSmashType): string; +function SmashType(def: IwbNamedDef): TSmashType; +function GetSmashType(element: IwbElement): TSmashType; +function ElementByIndexedPath(e: IwbElement; ip: string): IwbElement; +function IndexedPath(e: IwbElement): string; +function GetAllValues(e: IwbElement): string; +function IsSortedDef(def: IwbNamedDef): boolean; +function IsSorted(e: IwbElement): boolean; +function HasStructChildren(e: IwbElement): boolean; +function HasStructChildrenDef(def: IwbNamedDef): boolean; +function WinningOverrideInFiles(rec: IwbMainRecord; var sl: TStringList) + : IwbMainRecord; +procedure OverridesInMasters(rec: IwbMainRecord; var rl: TList); +function IsOverride(aRecord: IwbMainRecord): boolean; +function ExtractFormID(filename: string): string; +function RemoveFileIndex(formID: string): string; +function LocalFormID(aRecord: IwbMainRecord): Integer; +function LoadOrderPrefix(aRecord: IwbMainRecord): Integer; +function CountOverrides(aFile: IwbFile): Integer; +function OverrideCountInFiles(rec: IwbMainRecord; + var files: TStringList): Integer; +procedure AddRequiredBy(var lst: TList; filename: string; + var masters: TStringList); +procedure GetMasters(aFile: IwbFile; var sl: TStringList); +procedure AddMasters(aFile: IwbFile; var sl: TStringList); +function RemoveSelfOrContainer(const aElement: IwbElement): boolean; +procedure UndeleteAndDisable(const aRecord: IwbMainRecord); +function LoadOrderCompare(list: TStringList; Index1, Index2: Integer): Integer; + +{ Record Prototyping Functions } +function GetElementObj(var obj: ISuperObject; name: string): ISuperObject; +function CreateRecordObj(var tree: ISuperObject; rec: IwbMainRecord) + : ISuperObject; +function GetRecordObj(var tree: ISuperObject; name: string): ISuperObject; +function GetRecordDef(sig: TwbSignature): TwbRecordDefEntry; +function BuildDef(def: IwbNamedDef; name: string): ISuperObject; +function BuildRecordDef(sName: string; mrDef: IwbRecordDef; + out recObj: ISuperObject): boolean; overload; +function BuildRecordDef(sName: string; out recObj: ISuperObject) + : boolean; overload; +function GetEditableFileContainer: IwbContainerElementRef; + +{ Plugin Error Functions } +function FixErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; + var errors: TStringList): IwbMainRecord; +function CheckForErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; + var errors: TStringList): IwbMainRecord; + +{ Asset Handling Functions } +procedure ExtractBSA(ContainerName, folder, destination: string); overload; +procedure ExtractBSA(ContainerName, destination: string; + var ignore: TStringList); overload; +function BSAExists(filename: string): boolean; +function INIExists(filename: string): boolean; +function TranslationExists(filename: string): boolean; +function FaceDataExists(filename: string): boolean; +function VoiceDataExists(filename: string): boolean; +function FragmentsExist(f: IwbFile): boolean; +function ReferencesSelf(f: IwbFile): boolean; var PluginsList: TList; @@ -141,13 +154,14 @@ procedure TBasePlugin.GetData(var lst: TList); hasData := true; // get data - filename := _File.FileName; + filename := _File.filename; Container := _File as IwbContainer; Container := Container.Elements[0] as IwbContainer; author := Container.GetElementEditValue('CNAM - Author'); // we have to subtract 1 because this count includes the // file header for some reason - numRecords := Container.GetElementNativeValue('HEDR - Header\Number of Records') - 1; + numRecords := Container.GetElementNativeValue + ('HEDR - Header\Number of Records') - 1; // get masters, required by GetMasters(_File, masters); @@ -179,37 +193,33 @@ function TBasePlugin.GetFormIndex: Integer; Result := 0; Container := self._File as IwbContainer; Container := Container.Elements[0] as IwbContainer; - if Container.ElementExists['Master Files'] then begin + if Container.ElementExists['Master Files'] then + begin MasterFiles := Container.ElementByPath['Master Files'] as IwbContainer; Result := MasterFiles.ElementCount; end; end; - -{*****************************************************************************} +{ ***************************************************************************** } { PLUGIN HELPERS Helper methods for dealing with TBasePlugins. } -{*****************************************************************************} +{ ***************************************************************************** } { Create a new plugin } -class function TPluginHelpers.CreateNewBasePlugin(var list: TList; filename: string): TBasePlugin; +class function TPluginHelpers.CreateNewBasePlugin(var list: TList; + filename: string): TBasePlugin; var aFile: IwbFile; - LoadOrder: integer; + LoadOrder: Integer; plugin: TBasePlugin; begin Result := nil; LoadOrder := PluginsList.Count + 1; - // fail if maximum load order reached - if LoadOrder > 254 then begin - Tracker.Write('Maximum load order reached! Can''t create file '+filename); - exit; - end; // create new plugin file SysUtils.FormatSettings.DecimalSeparator := '.'; - aFile := wbNewFile(wbDataPath + filename, LoadOrder); + aFile := wbNewFile(wbDataPath + filename, LoadOrder, false); aFile._AddRef; // create new plugin object @@ -220,15 +230,18 @@ class function TPluginHelpers.CreateNewBasePlugin(var list: TList; filename: str end; { Gets the load order of the plugin matching the given name } -class function TPluginHelpers.BasePluginLoadOrder(var list: TList; filename: string): integer; +class function TPluginHelpers.BasePluginLoadOrder(var list: TList; + filename: string): Integer; var - i: integer; + i: Integer; plugin: TBasePlugin; begin Result := -1; - for i := 0 to Pred(list.Count) do begin + for i := 0 to Pred(list.Count) do + begin plugin := TBasePlugin(list[i]); - if plugin.filename = filename then begin + if plugin.filename = filename then + begin Result := i; exit; end; @@ -236,15 +249,18 @@ class function TPluginHelpers.BasePluginLoadOrder(var list: TList; filename: str end; { Gets a plugin matching the given name. } -class function TPluginHelpers.BasePluginByFilename(var list: TList; filename: string): TBasePlugin; +class function TPluginHelpers.BasePluginByFilename(var list: TList; + filename: string): TBasePlugin; var - i: integer; + i: Integer; plugin: TBasePlugin; begin Result := nil; - for i := 0 to Pred(list.count) do begin + for i := 0 to Pred(list.Count) do + begin plugin := TBasePlugin(list[i]); - if plugin.filename = filename then begin + if plugin.filename = filename then + begin Result := plugin; exit; end; @@ -261,19 +277,22 @@ class procedure THeaderHelpers.LoadPluginHeaders(var sl: TStringList); HeaderList := TList.Create; // load plugin headers for each plugin in @sl - for i := 0 to Pred(sl.Count) do try - aFile := wbFile(wbDataPath + sl[i], -1, '', False, True); - plugin := TBasePlugin.Create; - plugin._File := aFile; - HeaderList.Add(plugin); - except - on x: Exception do begin - Tracker.Write('Failed to load '+sl[i]); + for i := 0 to Pred(sl.Count) do + try + aFile := wbFile(sl[i], -1, '', [fsOnlyHeader]); + plugin := TBasePlugin.Create; + plugin._File := aFile; + HeaderList.Add(plugin); + except + on x: Exception do + begin + Tracker.Write('Failed to load ' + sl[i]); + end; end; - end; // get data for each plugin in the header list - for i := 0 to Pred(HeaderList.Count) do begin + for i := 0 to Pred(HeaderList.Count) do + begin plugin := TBasePlugin(HeaderList[i]); plugin.GetData(HeaderList); end; @@ -283,14 +302,17 @@ class procedure THeaderHelpers.GetPluginMasters(filename: string; var sl: TStringList); var plugin: TBasePlugin; - i: integer; + i: Integer; begin // get plugin plugin := TPluginHelpers.BasePluginByFilename(HeaderList, filename); - if not Assigned(plugin) then exit; + if not Assigned(plugin) then + exit; // add its masters to @sl - for i := 0 to Pred(plugin.masters.Count) do begin - if sl.IndexOf(plugin.masters[i]) > -1 then continue; + for i := 0 to Pred(plugin.masters.Count) do + begin + if sl.IndexOf(plugin.masters[i]) > -1 then + continue; sl.Add(plugin.masters[i]); GetPluginMasters(plugin.masters[i], sl); end; @@ -300,21 +322,23 @@ class procedure THeaderHelpers.GetPluginDependencies(filename: string; var sl: TStringList); var plugin: TBasePlugin; - i: integer; + i: Integer; begin // get plugin plugin := TPluginHelpers.BasePluginByFilename(HeaderList, filename); - if not Assigned(plugin) then exit; + if not Assigned(plugin) then + exit; // add its required by to @sl - for i := 0 to Pred(plugin.requiredBy.Count) do begin - if sl.IndexOf(plugin.requiredBy[i]) > -1 then continue; + for i := 0 to Pred(plugin.requiredBy.Count) do + begin + if sl.IndexOf(plugin.requiredBy[i]) > -1 then + continue; sl.Add(plugin.requiredBy[i]); GetPluginDependencies(plugin.requiredBy[i], sl); end; end; - -{******************************************************************************} +{ ****************************************************************************** } { General Helper Functions Set of functions that read bethesda plugin files for various attributes. @@ -332,7 +356,7 @@ class procedure THeaderHelpers.GetPluginDependencies(filename: string; - WinningOverrideInFiles - IsOverride - LocalFormID - -LoadOrderPrefix + -LoadOrderPrefix - CountOverrides - GetMasters - AddMasters @@ -347,25 +371,38 @@ class procedure THeaderHelpers.GetPluginDependencies(filename: string; - PluginsModified - CreatSEQFile } -{*****************************************************************************} +{ ***************************************************************************** } { Converts a TwbElementType to a string } function etToString(et: TwbElementType): string; begin case Ord(et) of - Ord(etFile): Result := 'etFile'; - Ord(etMainRecord): Result := 'etMainRecord'; - Ord(etGroupRecord): Result := 'etGroupRecord'; - Ord(etSubRecord): Result := 'etSubRecord'; - Ord(etSubRecordStruct): Result := 'etSubRecordStruct'; - Ord(etSubRecordArray): Result := 'etSubRecordArray'; - Ord(etSubRecordUnion): Result := 'etSubRecordUnion'; - Ord(etArray): Result := 'etArray'; - Ord(etStruct): Result := 'etStruct'; - Ord(etValue): Result := 'etValue'; - Ord(etFlag): Result := 'etFlag'; - Ord(etStringListTerminator): Result := 'etStringListTerminator'; - Ord(etUnion): Result := 'etUnion'; + Ord(etFile): + Result := 'etFile'; + Ord(etMainRecord): + Result := 'etMainRecord'; + Ord(etGroupRecord): + Result := 'etGroupRecord'; + Ord(etSubRecord): + Result := 'etSubRecord'; + Ord(etSubRecordStruct): + Result := 'etSubRecordStruct'; + Ord(etSubRecordArray): + Result := 'etSubRecordArray'; + Ord(etSubRecordUnion): + Result := 'etSubRecordUnion'; + Ord(etArray): + Result := 'etArray'; + Ord(etStruct): + Result := 'etStruct'; + Ord(etValue): + Result := 'etValue'; + Ord(etFlag): + Result := 'etFlag'; + Ord(etStringListTerminator): + Result := 'etStringListTerminator'; + Ord(etUnion): + Result := 'etUnion'; end; end; @@ -373,118 +410,184 @@ function etToString(et: TwbElementType): string; function dtToString(dt: TwbDefType): string; begin case Ord(dt) of - Ord(dtRecord): Result := 'dtRecord'; - Ord(dtSubRecord): Result := 'dtSubRecord'; - Ord(dtSubRecordArray): Result := 'dtSubRecordArray'; - Ord(dtSubRecordStruct): Result := 'dtSubRecordStruct'; - Ord(dtSubRecordUnion): Result := 'dtSubRecordUnion'; - Ord(dtString): Result := 'dtString'; - Ord(dtLString): Result := 'dtLString'; - Ord(dtLenString): Result := 'dtLenString'; - Ord(dtByteArray): Result := 'dtByteArray'; - Ord(dtInteger): Result := 'dtInteger'; - Ord(dtIntegerFormater): Result := 'dtIntegerFormatter'; - Ord(dtFloat): Result := 'dtFloat'; - Ord(dtArray): Result := 'dtArray'; - Ord(dtStruct): Result := 'dtStruct'; - Ord(dtUnion): Result := 'dtUnion'; - Ord(dtEmpty): Result := 'dtEmpty'; + Ord(dtRecord): + Result := 'dtRecord'; + Ord(dtSubRecord): + Result := 'dtSubRecord'; + Ord(dtSubRecordArray): + Result := 'dtSubRecordArray'; + Ord(dtSubRecordStruct): + Result := 'dtSubRecordStruct'; + Ord(dtSubRecordUnion): + Result := 'dtSubRecordUnion'; + Ord(dtString): + Result := 'dtString'; + Ord(dtLString): + Result := 'dtLString'; + Ord(dtLenString): + Result := 'dtLenString'; + Ord(dtByteArray): + Result := 'dtByteArray'; + Ord(dtInteger): + Result := 'dtInteger'; + Ord(dtIntegerFormater): + Result := 'dtIntegerFormatter'; + Ord(dtFloat): + Result := 'dtFloat'; + Ord(dtArray): + Result := 'dtArray'; + Ord(dtStruct): + Result := 'dtStruct'; + Ord(dtUnion): + Result := 'dtUnion'; + Ord(dtEmpty): + Result := 'dtEmpty'; end; end; function ctToString(ct: TConflictThis): string; begin case Ord(ct) of - Ord(ctUnknown): Result := 'ctUnknown'; - Ord(ctIgnored): Result := 'ctIgnored'; - Ord(ctNotDefined): Result := 'ctNotDefined'; - Ord(ctIdenticalToMaster): Result := 'ctIdenticalToMaster'; - Ord(ctOnlyOne): Result := 'ctOnlyOne'; - Ord(ctHiddenByModGroup): Result := 'ctHiddenByModGroup'; - Ord(ctMaster): Result := 'ctMaster'; - Ord(ctConflictBenign): Result := 'ctConflictBenign'; - Ord(ctOverride): Result := 'ctOverride'; - Ord(ctIdenticalToMasterWinsConflict): Result := 'ctIdenticalToMasterWinsConflict'; - Ord(ctConflictWins): Result := 'ctConflictWins'; - Ord(ctConflictLoses): Result := 'ctConflictLoses'; + Ord(ctUnknown): + Result := 'ctUnknown'; + Ord(ctIgnored): + Result := 'ctIgnored'; + Ord(ctNotDefined): + Result := 'ctNotDefined'; + Ord(ctIdenticalToMaster): + Result := 'ctIdenticalToMaster'; + Ord(ctOnlyOne): + Result := 'ctOnlyOne'; + Ord(ctHiddenByModGroup): + Result := 'ctHiddenByModGroup'; + Ord(ctMaster): + Result := 'ctMaster'; + Ord(ctConflictBenign): + Result := 'ctConflictBenign'; + Ord(ctOverride): + Result := 'ctOverride'; + Ord(ctIdenticalToMasterWinsConflict): + Result := 'ctIdenticalToMasterWinsConflict'; + Ord(ctConflictWins): + Result := 'ctConflictWins'; + Ord(ctConflictLoses): + Result := 'ctConflictLoses'; end; end; function stToString(st: TSmashType): string; begin case Ord(st) of - Ord(stUnknown): Result := 'Unknown'; - Ord(stRecord): Result := 'Record'; - Ord(stString): Result := 'String'; - Ord(stInteger): Result := 'Integer'; - Ord(stFlag): Result := 'Flag'; - Ord(stFloat): Result := 'Float'; - Ord(stStruct): Result := 'Struct'; - Ord(stUnsortedArray): Result := 'Unsorted Array'; - Ord(stUnsortedStructArray): Result := 'Unsorted Struct Array'; - Ord(stSortedArray): Result := 'Sorted Array'; - Ord(stSortedStructArray): Result := 'Sorted Struct Array'; - Ord(stByteArray): Result := 'Byte Array'; - Ord(stUnion): Result := 'Union'; - else Result := 'Unknown'; + Ord(stUnknown): + Result := 'Unknown'; + Ord(stRecord): + Result := 'Record'; + Ord(stString): + Result := 'String'; + Ord(stInteger): + Result := 'Integer'; + Ord(stFlag): + Result := 'Flag'; + Ord(stFloat): + Result := 'Float'; + Ord(stStruct): + Result := 'Struct'; + Ord(stUnsortedArray): + Result := 'Unsorted Array'; + Ord(stUnsortedStructArray): + Result := 'Unsorted Struct Array'; + Ord(stSortedArray): + Result := 'Sorted Array'; + Ord(stSortedStructArray): + Result := 'Sorted Struct Array'; + Ord(stByteArray): + Result := 'Byte Array'; + Ord(stUnion): + Result := 'Union'; + else + Result := 'Unknown'; end; end; -function SmashType(def: IwbNamedDef): TSmashtype; +function SmashType(def: IwbNamedDef): TSmashType; var subDef: IwbSubRecordDef; dt: TwbDefType; bIsSorted, bHasStructChildren: boolean; begin dt := def.DefType; - if Supports(def, IwbSubrecordDef, subDef) then + if Supports(def, IwbSubRecordDef, subDef) then dt := subDef.GetValue.DefType; case Ord(dt) of - Ord(dtRecord): Result := stRecord; - Ord(dtSubRecord): Result := stUnknown; - Ord(dtSubRecordStruct): Result := stStruct; - Ord(dtSubRecordUnion): Result := stUnion; - Ord(dtString): Result := stString; - Ord(dtLString): Result := stString; - Ord(dtLenString): Result := stString; - Ord(dtByteArray): Result := stByteArray; - Ord(dtInteger): Result := stInteger; - Ord(dtIntegerFormater): Result := stInteger; - Ord(dtIntegerFormaterUnion): Result := stInteger; - Ord(dtFlag): Result := stFlag; - Ord(dtFloat): Result := stFloat; - Ord(dtSubRecordArray), Ord(dtArray): begin - bIsSorted := IsSortedDef(def); - bHasStructChildren := HasStructChildrenDef(def); - if bIsSorted then begin - if bHasStructChildren then - Result := stSortedStructArray - else - Result := stSortedArray; - end - else begin - if bHasStructChildren then - Result := stUnsortedStructArray + Ord(dtRecord): + Result := stRecord; + Ord(dtSubRecord): + Result := stUnknown; + Ord(dtSubRecordStruct): + Result := stStruct; + Ord(dtSubRecordUnion): + Result := stUnion; + Ord(dtString): + Result := stString; + Ord(dtLString): + Result := stString; + Ord(dtLenString): + Result := stString; + Ord(dtByteArray): + Result := stByteArray; + Ord(dtInteger): + Result := stInteger; + Ord(dtIntegerFormater): + Result := stInteger; + Ord(dtIntegerFormaterUnion): + Result := stInteger; + Ord(dtFlag): + Result := stFlag; + Ord(dtFloat): + Result := stFloat; + Ord(dtSubRecordArray), Ord(dtArray): + begin + bIsSorted := IsSortedDef(def); + bHasStructChildren := HasStructChildrenDef(def); + if bIsSorted then + begin + if bHasStructChildren then + Result := stSortedStructArray + else + Result := stSortedArray; + end else - Result := stUnsortedArray; + begin + if bHasStructChildren then + Result := stUnsortedStructArray + else + Result := stUnsortedArray; + end; end; - end; - Ord(dtStruct): Result := stStruct; - Ord(dtUnion): Result := stUnion; - Ord(dtEmpty): Result := stUnknown; - Ord(dtStructChapter): Result := stStruct; - else Result := stUnknown; + Ord(dtStruct): + Result := stStruct; + Ord(dtUnion): + Result := stUnion; + Ord(dtEmpty): + Result := stUnknown; + Ord(dtStructChapter): + Result := stStruct; + else + Result := stUnknown; end; end; function GetSmashType(element: IwbElement): TSmashType; begin - Result := SmashType(element.Def); + if Assigned(element.ResolvedValueDef) then + Result := SmashType(element.ResolvedValueDef) + else + Result := SmashType(element.def); end; function ElementByIndexedPath(e: IwbElement; ip: string): IwbElement; var - i, index: integer; + i, index: Integer; path: TStringList; c: IwbContainerElementRef; begin @@ -502,14 +605,17 @@ function ElementByIndexedPath(e: IwbElement; ip: string): IwbElement; exit; // traverse path - for i := 0 to Pred(path.count) do begin - if Pos('[', path[i]) > 0 then begin + for i := 0 to Pred(path.Count) do + begin + if Pos('[', path[i]) > 0 then + begin index := StrToInt(GetTextIn(path[i], '[', ']')); e := c.Elements[index]; if not Supports(e, IwbContainerElementRef, c) then exit; end - else begin + else + begin e := c.ElementByPath[path[i]]; if not Supports(e, IwbContainerElementRef, c) then exit; @@ -526,11 +632,12 @@ function IndexedPath(e: IwbElement): string; a: string; begin c := e.Container; - while (e.ElementType <> etMainRecord) do begin + while (e.ElementType <> etMainRecord) do + begin if c.ElementType = etSubRecordArray then - a := '['+IntToStr(c.IndexOf(e))+']' + a := '[' + IntToStr(c.IndexOf(e)) + ']' else - a := e.Name; + a := e.name; if Result <> '' then Result := a + '\' + Result else @@ -543,15 +650,18 @@ function IndexedPath(e: IwbElement): string; { Returns a string hash of all of the values contained in an element } function GetAllValues(e: IwbElement): string; var - i: integer; + i: Integer; c: IwbContainerElementRef; begin - Result := e.EditValue; - if not Supports(e, IwbContainerElementRef, c) then + if (GetSmashType(e) = stInteger) or not Supports(e, IwbContainerElementRef, c) then begin + Result := e.SortKey[false]; exit; + end; + Result := e.EditValue; // loop through children elements - for i := 0 to Pred(c.ElementCount) do begin + for i := 0 to Pred(c.ElementCount) do + begin if (Result <> '') then Result := Result + ';' + GetAllValues(c.Elements[i]) else @@ -566,9 +676,9 @@ function IsSortedDef(def: IwbNamedDef): boolean; begin Result := false; if Supports(def, IwbSubRecordArrayDef, sraDef) then - Result := Supports(sraDef.Element, IwbHasSortKeyDef) + Result := Supports(sraDef.element, IwbHasSortKeyDef) else if Supports(def, IwbArrayDef, arDef) then - Result := Supports(arDef.Element, IwbHasSortKeyDef); + Result := arDef.Sorted; end; { Returns true if @e is a sorted container } @@ -592,29 +702,51 @@ function HasStructChildren(e: IwbElement): boolean; Container: IwbContainerElementRef; begin Result := false; - if Supports(e, IwbContainerElementRef, Container) - and (Container.ElementCount > 0) then + if Supports(e, IwbContainerElementRef, Container) and + (Container.ElementCount > 0) then Result := GetSmashType(Container.Elements[0]) = stStruct; end; -{ Returns the most-winning override of @rec from the - files listed in @sl } -function WinningOverrideInFiles(rec: IwbMainRecord; - var sl: TStringList): IwbMainRecord; +{ Returns the most-winning override of @rec from the files listed in @sl } +function WinningOverrideInFiles(rec: IwbMainRecord; var sl: TStringList) + : IwbMainRecord; var i: Integer; ovr: IwbMainRecord; begin - Result := rec; - for i := Pred(rec.OverrideCount) downto 0 do begin + Result := rec.MasterOrSelf; + for i := Pred(rec.OverrideCount) downto 0 do + begin ovr := rec.Overrides[i]; - if sl.IndexOf(ovr._file.FileName) > -1 then begin + if sl.IndexOf(ovr._File.filename) > -1 then + begin Result := ovr; exit; end; end; end; +{ Returns the overrides of @rec from the masters of its file } +procedure OverridesInMasters(rec: IwbMainRecord; var rl: TList); +var + i: Integer; + f, mst: IwbFile; + id: TwbFormID; + ovr: IwbMainRecord; +begin + f := rec._File; + id := rec.FormID; + // TODO: Why does rec.Master sometimes return the wrong record?? + for i := 0 to Pred(f.MasterCount[false]) do + begin + mst := f.Masters[i, false]; + ovr := mst.RecordByFormID[id, true, false]; + // TODO: Better way to get only if override is in Masters[i]?? + if Assigned(ovr) and ovr._File.Equals(mst) then + rl.Add(ovr); + end; +end; + { Returns true if the input record is an override record } function IsOverride(aRecord: IwbMainRecord): boolean; begin @@ -623,20 +755,22 @@ function IsOverride(aRecord: IwbMainRecord): boolean; function ExtractFormID(filename: string): string; const - HexChars = ['0'..'9', 'A'..'F', 'a'..'f']; + HexChars = ['0' .. '9', 'A' .. 'F', 'a' .. 'f']; var i, counter: Integer; begin counter := 0; // we loop from the back because the formID is usually at the // end of the filename - for i := Length(filename) downto 1 do begin + for i := Length(filename) downto 1 do + begin if (filename[i] in HexChars) then Inc(counter) else counter := 0; // set result and exit if counter has reached 8 - if counter = 8 then begin + if counter = 8 then + begin Result := Copy(filename, i, 8); exit; end; @@ -651,25 +785,26 @@ function RemoveFileIndex(formID: string): string; end; { Gets the local formID of a record (so no load order prefix) } -function LocalFormID(aRecord: IwbMainRecord): integer; +function LocalFormID(aRecord: IwbMainRecord): Integer; begin - Result := aRecord.LoadOrderFormID and $00FFFFFF; + Result := aRecord.LoadOrderFormID.ToCardinal and $00FFFFFF; end; { Gets the load order prefix from the FormID of a record } -function LoadOrderPrefix(aRecord: IwbMainRecord): integer; +function LoadOrderPrefix(aRecord: IwbMainRecord): Integer; begin - Result := aRecord.LoadOrderFormID and $FF000000; + Result := aRecord.LoadOrderFormID.ToCardinal and $FF000000; end; { Returns the number of override records in a file } -function CountOverrides(aFile: IwbFile): integer; +function CountOverrides(aFile: IwbFile): Integer; var i: Integer; aRecord: IwbMainRecord; begin Result := 0; - for i := 0 to Pred(aFile.GetRecordCount) do begin + for i := 0 to Pred(aFile.GetRecordCount) do + begin aRecord := aFile.GetRecord(i); if IsOverride(aRecord) then Inc(Result); @@ -677,15 +812,17 @@ function CountOverrides(aFile: IwbFile): integer; end; { Returns the number of overrides of the specified record in the specified file set } -function OverrideCountInFiles(rec: IwbMainRecord; var files: TStringList): Integer; +function OverrideCountInFiles(rec: IwbMainRecord; + var files: TStringList): Integer; var i: Integer; ovr: IwbMainRecord; begin Result := 0; - for i := 0 to Pred(rec.OverrideCount) do begin + for i := 0 to Pred(rec.OverrideCount) do + begin ovr := rec.Overrides[i]; - if files.IndexOf(ovr._File.FileName) > -1 then + if files.IndexOf(ovr._File.filename) > -1 then Inc(Result); end; end; @@ -698,7 +835,8 @@ procedure AddRequiredBy(var lst: TList; filename: string; i: Integer; plugin: TBasePlugin; begin - for i := 0 to Pred(masters.Count) do begin + for i := 0 to Pred(masters.Count) do + begin plugin := TPluginHelpers.BasePluginByFilename(lst, masters[i]); if not Assigned(plugin) then continue; @@ -710,17 +848,20 @@ procedure AddRequiredBy(var lst: TList; filename: string; procedure GetMasters(aFile: IwbFile; var sl: TStringList); var Container, MasterFiles, MasterFile: IwbContainer; - i, iLoadOrder: integer; + i, iLoadOrder: Integer; filename: string; begin Container := aFile as IwbContainer; Container := Container.Elements[0] as IwbContainer; - if Container.ElementExists['Master Files'] then begin + if Container.ElementExists['Master Files'] then + begin MasterFiles := Container.ElementByPath['Master Files'] as IwbContainer; - for i := 0 to MasterFiles.ElementCount - 1 do begin + for i := 0 to MasterFiles.ElementCount - 1 do + begin MasterFile := MasterFiles.Elements[i] as IwbContainer; filename := MasterFile.GetElementEditValue('MAST - Filename'); - if sl.IndexOf(filename) = -1 then begin + if sl.IndexOf(filename) = -1 then + begin iLoadOrder := TPluginHelpers.BasePluginLoadOrder(PluginsList, filename); sl.AddObject(filename, TObject(iLoadOrder)); end; @@ -731,10 +872,11 @@ procedure GetMasters(aFile: IwbFile; var sl: TStringList); { Gets the masters in an IwbFile and puts them into a stringlist } procedure AddMasters(aFile: IwbFile; var sl: TStringList); var - i: integer; + i: Integer; begin - for i := 0 to Pred(sl.Count) do begin - if Lowercase(aFile.FileName) = Lowercase(sl[i]) then + for i := 0 to Pred(sl.Count) do + begin + if Lowercase(aFile.filename) = Lowercase(sl[i]) then continue; aFile.AddMasterIfMissing(sl[i]); end; @@ -747,7 +889,8 @@ function BSAExists(filename: string): boolean; begin Result := false; bsaFilename := ChangeFileExt(filename, '.bsa'); - if FileExists(wbDataPath + bsaFilename) then begin + if FileExists(wbDataPath + bsaFilename) then + begin ContainerName := wbDataPath + bsaFilename; if not wbContainerHandler.ContainerExists(ContainerName) then wbContainerHandler.AddBSA(ContainerName); @@ -771,9 +914,11 @@ function MatchingFileExists(path: string; filename: string): boolean; begin Result := false; filename := Lowercase(filename); - if FindFirst(path, faAnyFile, info) = 0 then begin + if FindFirst(path, faAnyFile, info) = 0 then + begin repeat - if Pos(filename, Lowercase(info.Name)) > 0 then begin + if Pos(filename, Lowercase(info.name)) > 0 then + begin Result := true; exit; end; @@ -790,14 +935,17 @@ function TranslationExists(filename: string): boolean; begin searchPath := wbDataPath + 'Interface\translations\*'; Result := MatchingFileExists(searchPath, ChangeFileExt(filename, '')); - if Result then exit; + if Result then + exit; // check in BSA - if BSAExists(filename) then begin + if BSAExists(filename) then + begin bsaFilename := ChangeFileExt(filename, '.bsa'); ContainerName := wbDataPath + bsaFilename; ResourceList := TStringList.Create; - wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, 'Interface\translations'); + wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, + 'Interface\translations'); Result := ResourceList.Count > 0; end; end; @@ -814,15 +962,19 @@ function FaceDataExists(filename: string): boolean; facetint := DirectoryExists(wbDataPath + facetintDir); facegeom := DirectoryExists(wbDataPath + facegeomDir); Result := facetint or facegeom; - if Result then exit; + if Result then + exit; // check in BSA - if BSAExists(filename) then begin + if BSAExists(filename) then + begin bsaFilename := ChangeFileExt(filename, '.bsa'); ContainerName := wbDataPath + bsaFilename; ResourceList := TStringList.Create; - wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, facetintDir); - wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, facegeomDir); + wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, + facetintDir); + wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, + facegeomDir); Result := ResourceList.Count > 0; end; end; @@ -835,14 +987,17 @@ function VoiceDataExists(filename: string): boolean; begin voiceDir := 'sound\voice\' + filename; Result := DirectoryExists(wbDataPath + voiceDir); - if Result then exit; + if Result then + exit; // check in BSA - if BSAExists(filename) then begin + if BSAExists(filename) then + begin bsaFilename := ChangeFileExt(filename, '.bsa'); ContainerName := wbDataPath + bsaFilename; ResourceList := TStringList.Create; - wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, voiceDir); + wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, + voiceDir); Result := ResourceList.Count > 0; end; end; @@ -850,11 +1005,12 @@ function VoiceDataExists(filename: string): boolean; { Returns true if Topic Info Fragments exist in @f } function TopicInfoFragmentsExist(f: IwbFile): boolean; const - infoFragmentsPath = 'VMAD - Virtual Machine Adapter\Data\Info VMAD\Script Fragments Info'; + infoFragmentsPath = + 'VMAD - Virtual Machine Adapter\Data\Info VMAD\Script Fragments Info'; var rec: IwbMainRecord; group: IwbGroupRecord; - subgroup, container: IwbContainer; + subgroup, Container: IwbContainer; element, fragments: IwbElement; i, j: Integer; begin @@ -865,19 +1021,21 @@ function TopicInfoFragmentsExist(f: IwbFile): boolean; // find all DIAL records group := f.GroupBySignature['DIAL']; - for i := 0 to Pred(group.ElementCount) do begin + for i := 0 to Pred(group.ElementCount) do + begin element := group.Elements[i]; // find all INFO records if not Supports(element, IwbContainer, subgroup) then continue; - for j := 0 to Pred(subgroup.ElementCount) do begin + for j := 0 to Pred(subgroup.ElementCount) do + begin if not Supports(subgroup.Elements[j], IwbMainRecord, rec) then continue; if not rec.IsMaster then continue; - if not Supports(rec, IwbContainer, container) then + if not Supports(rec, IwbContainer, Container) then continue; - fragments := container.ElementByPath[infoFragmentsPath]; + fragments := Container.ElementByPath[infoFragmentsPath]; if not Assigned(fragments) then continue; Result := true; @@ -888,11 +1046,12 @@ function TopicInfoFragmentsExist(f: IwbFile): boolean; { Returns true if Quest Fragments exist in @f } function QuestFragmentsExist(f: IwbFile): boolean; const - questFragmentsPath = 'VMAD - Virtual Machine Adapter\Data\Quest VMAD\Script Fragments Quest'; + questFragmentsPath = + 'VMAD - Virtual Machine Adapter\Data\Quest VMAD\Script Fragments Quest'; var rec: IwbMainRecord; group: IwbGroupRecord; - container: IwbContainer; + Container: IwbContainer; fragments: IwbElement; i: Integer; begin @@ -903,14 +1062,15 @@ function QuestFragmentsExist(f: IwbFile): boolean; // find all QUST records group := f.GroupBySignature['QUST']; - for i := 0 to Pred(group.ElementCount) do begin + for i := 0 to Pred(group.ElementCount) do + begin if not Supports(group.Elements[i], IwbMainRecord, rec) then continue; if not rec.IsMaster then continue; - if not Supports(rec, IwbContainer, container) then + if not Supports(rec, IwbContainer, Container) then continue; - fragments := container.ElementByPath[questFragmentsPath]; + fragments := Container.ElementByPath[questFragmentsPath]; if not Assigned(fragments) then continue; Result := true; @@ -920,11 +1080,12 @@ function QuestFragmentsExist(f: IwbFile): boolean; { Returns true if Quest Fragments exist in @f } function SceneFragmentsExist(f: IwbFile): boolean; const - sceneFragmentsPath = 'VMAD - Virtual Machine Adapter\Data\Quest VMAD\Script Fragments Quest'; + sceneFragmentsPath = + 'VMAD - Virtual Machine Adapter\Data\Quest VMAD\Script Fragments Quest'; var rec: IwbMainRecord; group: IwbGroupRecord; - container: IwbContainer; + Container: IwbContainer; fragments: IwbElement; i: Integer; begin @@ -935,14 +1096,15 @@ function SceneFragmentsExist(f: IwbFile): boolean; // find all SCEN records group := f.GroupBySignature['SCEN']; - for i := 0 to Pred(group.ElementCount) do begin + for i := 0 to Pred(group.ElementCount) do + begin if not Supports(group.Elements[i], IwbMainRecord, rec) then continue; if not rec.IsMaster then continue; - if not Supports(rec, IwbContainer, container) then + if not Supports(rec, IwbContainer, Container) then continue; - fragments := container.ElementByPath[sceneFragmentsPath]; + fragments := Container.ElementByPath[sceneFragmentsPath]; if not Assigned(fragments) then continue; Result := true; @@ -952,8 +1114,8 @@ function SceneFragmentsExist(f: IwbFile): boolean; { Returns true if file-specific Script Fragments for @f are found } function FragmentsExist(f: IwbFile): boolean; begin - Result := TopicInfoFragmentsExist(f) or QuestFragmentsExist(f) - or SceneFragmentsExist(f); + Result := TopicInfoFragmentsExist(f) or QuestFragmentsExist(f) or + SceneFragmentsExist(f); end; { References self } @@ -962,7 +1124,7 @@ function ReferencesSelf(f: IwbFile): boolean; i: Integer; filename, source: string; scripts: IwbGroupRecord; - container: IwbContainerElementRef; + Container: IwbContainerElementRef; rec: IwbMainRecord; begin // exit if has no script records in file @@ -971,15 +1133,17 @@ function ReferencesSelf(f: IwbFile): boolean; exit; // get scripts, and check them all for self-reference - filename := f.FileName; + filename := f.filename; scripts := f.GroupBySignature['SCPT']; - if not Supports(scripts, IwbContainerElementRef, container) then + if not Supports(scripts, IwbContainerElementRef, Container) then exit; - for i := 0 to Pred(container.ElementCount) do begin - if not Supports(container.Elements[i], IwbMainRecord, rec) then + for i := 0 to Pred(Container.ElementCount) do + begin + if not Supports(Container.Elements[i], IwbMainRecord, rec) then continue; source := rec.ElementEditValues['SCTX - Script Source']; - if Pos(filename, source) > 0 then begin + if Pos(filename, source) > 0 then + begin Result := true; break; end; @@ -992,62 +1156,76 @@ procedure ExtractBSA(ContainerName, folder, destination: string); ResourceList: TStringList; i: Integer; begin - if not wbContainerHandler.ContainerExists(ContainerName) then begin - Tracker.Write(' '+ContainerName+' not loaded.'); + if not wbContainerHandler.ContainerExists(ContainerName) then + begin + Tracker.Write(' ' + ContainerName + ' not loaded.'); exit; end; ResourceList := TStringList.Create; wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, folder); for i := 0 to Pred(ResourceList.Count) do - wbContainerHandler.ResourceCopy(ContainerName, ResourceList[i], destination); + wbContainerHandler.ResourceCopy(ContainerName, ResourceList[i], + destination); end; { Extracts assets from the BSA @filename to @destination, ignoring assets matching items in @ignore } -procedure ExtractBSA(ContainerName, destination: string; var ignore: TStringList); +procedure ExtractBSA(ContainerName, destination: string; + var ignore: TStringList); var ResourceList: TStringList; i, j: Integer; skip: boolean; begin - if not wbContainerHandler.ContainerExists(ContainerName) then begin - Tracker.Write(' '+ContainerName+' not loaded.'); + if not wbContainerHandler.ContainerExists(ContainerName) then + begin + Tracker.Write(' ' + ContainerName + ' not loaded.'); exit; end; ResourceList := TStringList.Create; wbContainerHandler.ContainerResourceList(ContainerName, ResourceList, ''); - for i := 0 to Pred(ResourceList.Count) do begin + for i := 0 to Pred(ResourceList.Count) do + begin skip := false; - for j := 0 to Pred(ignore.Count) do begin + for j := 0 to Pred(ignore.Count) do + begin skip := Pos(ignore[j], ResourceList[i]) > 0; - if skip then break; + if skip then + break; end; - if skip then continue; - wbContainerHandler.ResourceCopy(ContainerName, ResourceList[i], destination); + if skip then + continue; + wbContainerHandler.ResourceCopy(ContainerName, ResourceList[i], + destination); end; end; -function RemoveSelfOrContainer(const aElement: IwbElement): Boolean; +function RemoveSelfOrContainer(const aElement: IwbElement): boolean; var cElement: IwbElement; begin Result := false; - if aElement.IsRemoveable then begin + if aElement.IsRemoveable then + begin aElement.Remove; Result := true; end - else begin - if not Assigned(aElement.Container) then begin + else + begin + if not Assigned(aElement.Container) then + begin Tracker.Write(' Element has no container!'); exit; end; // if element isn't removable, try removing its container - if Supports(aElement.Container, IwbMainRecord) then begin + if Supports(aElement.Container, IwbMainRecord) then + begin Tracker.Write(' Reached main record, cannot remove element'); exit; end; - Tracker.Write(' Failed to remove '+aElement.Path+', removing container'); + Tracker.Write(' Failed to remove ' + aElement.path + + ', removing container'); if Supports(aElement.Container, IwbElement, cElement) then Result := RemoveSelfOrContainer(cElement); end; @@ -1057,7 +1235,7 @@ procedure UndeleteAndDisable(const aRecord: IwbMainRecord); var xesp: IwbElement; sig: string; - container: IwbContainerElementRef; + Container: IwbContainerElementRef; begin try sig := aRecord.Signature; @@ -1067,13 +1245,13 @@ procedure UndeleteAndDisable(const aRecord: IwbMainRecord); aRecord.IsDeleted := false; // set persistence flag depending on game - if (wbGameMode in [gmFO3,gmFNV,gmTES5]) - and ((sig = 'ACHR') or (sig = 'ACRE')) then + if (wbGameMode in [gmFO3, gmFNV, gmTES5]) and + ((sig = 'ACHR') or (sig = 'ACRE')) then aRecord.IsPersistent := true else if wbGameMode = gmTES4 then aRecord.IsPersistent := false; - // place it below the ground + // place it below the ground if not aRecord.IsPersistent then aRecord.ElementNativeValues['DATA\Position\Z'] := -30000; @@ -1082,21 +1260,21 @@ procedure UndeleteAndDisable(const aRecord: IwbMainRecord); aRecord.RemoveElement('XTEL'); // add enabled opposite of player (true - silent) - xesp := aRecord.Add('XESP', True); - if Assigned(xesp) and Supports(xesp, IwbContainerElementRef, container) then begin - container.ElementNativeValues['Reference'] := $14; // Player ref - container.ElementNativeValues['Flags'] := 1; // opposite of parent flag + xesp := aRecord.Add('XESP', true); + if Assigned(xesp) and Supports(xesp, IwbContainerElementRef, Container) then + begin + Container.ElementNativeValues['Reference'] := $14; // Player ref + Container.ElementNativeValues['Flags'] := 1; // opposite of parent flag end; // set to disable aRecord.IsInitiallyDisabled := true; except on x: Exception do - Tracker.Write(' Exception: '+x.Message); + Tracker.Write(' Exception: ' + x.Message); end; end; - function FixErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; var errors: TStringList): IwbMainRecord; const @@ -1116,38 +1294,48 @@ function FixErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; Tracker.UpdateProgress(1); Error := aElement.Check; - if Error <> '' then begin + if Error <> '' then + begin Result := aElement.ContainingMainRecord; // fix record marked as deleted errors (UDRs) - if Pos(cUDR, Error) = 1 then begin - if Assigned(Result) then begin - Tracker.Write(' Fixing UDR: '+Result.Name); + if Pos(cUDR, Error) = 1 then + begin + if Assigned(Result) then + begin + Tracker.Write(' Fixing UDR: ' + Result.name); UndeleteAndDisable(Result); end; end - else begin + else + begin // fix unresolved FormID errors by NULLing them out - if Pos(cUnresolved, Error) > 0 then begin - Tracker.Write(' Fixing Unresolved FormID: '+aElement.Path); + if Pos(cUnresolved, Error) > 0 then + begin + Tracker.Write(' Fixing Unresolved FormID: ' + aElement.path); aElement.NativeValue := 0; // we may end up with an invalid NULL reference, so we Check again Error := aElement.Check; - if Error = '' then exit; + if Error = '' then + exit; end; // fix invalid NULL references by removal - if Pos(cNULL, Error) = 1 then begin - Tracker.Write(' Removing NULL reference: '+aElement.Path); - if RemoveSelfOrContainer(aElement) then exit; + if Pos(cNULL, Error) = 1 then + begin + Tracker.Write(' Removing NULL reference: ' + aElement.path); + if RemoveSelfOrContainer(aElement) then + exit; end; // unhandled error - Tracker.Write(Format(' Unhandled error: %s -> %s', [aElement.Path, error])); - if Assigned(Result) and (lastRecord <> Result) then begin + Tracker.Write(Format(' Unhandled error: %s -> %s', + [aElement.path, Error])); + if Assigned(Result) and (lastRecord <> Result) then + begin lastRecord := Result; - errors.Add(Result.Name); + errors.Add(Result.name); end; - errors.Add(' '+aElement.Path + ' -> ' + Error); + errors.Add(' ' + aElement.path + ' -> ' + Error); end; end; @@ -1156,10 +1344,12 @@ function FixErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; exit; // recurse through children elements - for i := Pred(Container.ElementCount) downto 0 do begin + for i := Pred(Container.ElementCount) downto 0 do + begin Result := FixErrors(Container.Elements[i], Result, errors); // break if container got deleted - if not Assigned(Container) then break; + if not Assigned(Container) then + break; end; end; @@ -1179,14 +1369,16 @@ function CheckForErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; Error := aElement.Check; // log errors - if Error <> '' then begin + if Error <> '' then + begin Result := aElement.ContainingMainRecord; - if Assigned(Result) and (Result <> LastRecord) then begin - Tracker.Write(' '+Result.Name); - errors.Add(Result.Name); + if Assigned(Result) and (Result <> lastRecord) then + begin + Tracker.Write(' ' + Result.name); + errors.Add(Result.name); end; - msg := ' '+aElement.Path + ' -> ' + Error; - Tracker.Write(' '+msg); + msg := ' ' + aElement.path + ' -> ' + Error; + Tracker.Write(' ' + msg); errors.Add(msg); end; @@ -1197,17 +1389,16 @@ function CheckForErrors(const aElement: IwbElement; lastRecord: IwbMainRecord; end; { Comparator for sorting plugins } -function LoadOrderCompare(List: TStringList; Index1, Index2: Integer): Integer; +function LoadOrderCompare(list: TStringList; Index1, Index2: Integer): Integer; var LO1, LO2: Integer; begin - LO1 := Integer(List.Objects[Index1]); - LO2 := Integer(List.Objects[Index2]); + LO1 := Integer(list.Objects[Index1]); + LO2 := Integer(list.Objects[Index2]); Result := LO1 - LO2; end; - -{******************************************************************************} +{ ****************************************************************************** } { Record Prototyping Functions - GetElementObj - CreateRecordObj @@ -1217,7 +1408,7 @@ function LoadOrderCompare(List: TStringList; Index1, Index2: Integer): Integer; - BuildRecordDef - GetEditableFileContainer } -{******************************************************************************} +{ ****************************************************************************** } { GetElementObj: @@ -1234,22 +1425,25 @@ function GetElementObj(var obj: ISuperObject; name: string): ISuperObject; exit; if not Assigned(obj['c']) then exit; - for item in obj['c'] do begin - if item.S['n'] = name then begin + for item in obj['c'] do + begin + if item.s['n'] = name then + begin Result := item; exit; end; end; end; -function CreateRecordObj(var tree: ISuperObject; rec: IwbMainRecord): ISuperObject; +function CreateRecordObj(var tree: ISuperObject; rec: IwbMainRecord) + : ISuperObject; var item: ISuperObject; begin item := SO; - item.S['n'] := rec.Signature; - item.I['t'] := Ord(stRecord); - tree.A['records'].Add(item); + item.s['n'] := rec.Signature; + item.i['t'] := Ord(stRecord); + tree.a['records'].Add(item); Result := item; end; @@ -1260,8 +1454,9 @@ function GetRecordObj(var tree: ISuperObject; name: string): ISuperObject; begin Result := nil; aSignature := StrToSignature(name); - for item in tree['records'] do begin - if StrToSignature(item.S['n']) = aSignature then + for item in tree['records'] do + begin + if StrToSignature(item.s['n']) = aSignature then Result := item; end; end; @@ -1271,9 +1466,11 @@ function GetRecordDef(sig: TwbSignature): TwbRecordDefEntry; i: Integer; def: TwbRecordDefEntry; begin - for i := Low(wbRecordDefs) to High(wbRecordDefs) do begin + for i := Low(wbRecordDefs) to High(wbRecordDefs) do + begin def := wbRecordDefs[i]; - if def.rdeSignature = sig then begin + if def.rdeSignature = sig then + begin Result := def; exit; end; @@ -1282,48 +1479,52 @@ function GetRecordDef(sig: TwbSignature): TwbRecordDefEntry; function BuildElementDef(element: IwbElement): ISuperObject; var - container: IwbContainerElementRef; + Container: IwbContainerElementRef; i: Integer; childElement: IwbElement; begin // release object if something goes wrong Result := SO; try - Result.S['n'] := element.Name; - Result.I['t'] := Ord(GetSmashType(element)); + Result.s['n'] := element.name; + Result.i['t'] := Ord(GetSmashType(element)); // populate element children, if it supports them - if not Supports(element, IwbContainerElementRef, container) then + if not Supports(element, IwbContainerElementRef, Container) then exit; // assign to container if it doesn't have element but can hold them - if (container.ElementCount = 0) - and container.CanAssign(High(Integer), nil, false) then try - container.Assign(High(Integer), nil, false); - except - // oops, container assignment failed - // this catches an assertion error when assigning to a DOBJ record - on x: Exception do - exit; - end; + if (Container.ElementCount = 0) and Container.CanAssign(High(Integer), nil, + false) then + try + Container.Assign(High(Integer), nil, false); + except + // oops, container assignment failed + // this catches an assertion error when assigning to a DOBJ record + on x: Exception do + exit; + end; // if we have children, make children array and recurse - if container.ElementCount > 0 then begin + if Container.ElementCount > 0 then + begin Result.O['c'] := SA([]); // traverse children - for i := 0 to Pred(container.ElementCount) do begin - childElement := container.Elements[i]; - Result.A['c'].Add(BuildElementDef(childElement)); + for i := 0 to Pred(Container.ElementCount) do + begin + childElement := Container.Elements[i]; + Result.a['c'].Add(BuildElementDef(childElement)); end; end; except - on x: Exception do begin + on x: Exception do + begin Result._Release; raise x; end; end; end; -function IsUnionDef(def: IwbNamedDef; out unionDef: IwbUnionDef): Boolean; +function IsUnionDef(def: IwbNamedDef; out unionDef: IwbUnionDef): boolean; var subDef: IwbSubRecordDef; begin @@ -1333,14 +1534,15 @@ function IsUnionDef(def: IwbNamedDef; out unionDef: IwbUnionDef): Boolean; Result := Supports(def, IwbUnionDef, unionDef); end; -function HasDef(recObj: ISuperObject; name: String): Boolean; +function HasDef(recObj: ISuperObject; name: String): boolean; var i: Integer; begin - Result := False; - for i := 0 to Pred(recObj.A['c'].Length) do - if recObj.A['c'].O[i].S['n'] = name then begin - Result := True; + Result := false; + for i := 0 to Pred(recObj.a['c'].Length) do + if recObj.a['c'].O[i].s['n'] = name then + begin + Result := true; exit; end; end; @@ -1348,7 +1550,7 @@ function HasDef(recObj: ISuperObject; name: String): Boolean; procedure AddDefIfMissing(recObj: ISuperObject; def: IwbNamedDef; name: String); begin if not HasDef(recObj, name) then - recObj.A['c'].Add(BuildDef(def, name)); + recObj.a['c'].Add(BuildDef(def, name)); end; function SigToStr(sig: TwbSignature): String; @@ -1369,20 +1571,29 @@ procedure BuildChildDef(def: IwbNamedDef; recObj: ISuperObject); recDef: IwbRecordDef; name: String; begin - if IsUnionDef(def, unionDef) then begin + if IsUnionDef(def, unionDef) then + begin for i := 0 to Pred(unionDef.MemberCount) do BuildChildDef(unionDef.Members[i] as IwbNamedDef, recObj); end - else if Supports(def, IwbSubRecordUnionDef) and Supports(def, IwbRecordDef, recDef) then begin + else if Supports(def, IwbSubRecordUnionDef) and + Supports(def, IwbRecordDef, recDef) then + begin for i := 0 to Pred(recDef.MemberCount) do BuildChildDef(recDef.Members[i] as IwbNamedDef, recObj); end - else if Supports(def, IwbSignatureDef, sigDef) then begin - name := SigToStr(sigDef.DefaultSignature) + ' - ' + sigDef.Name; + else if (def.DefType = dtSubRecordStruct) or (def.DefType = dtSubRecordArray) + then + begin + AddDefIfMissing(recObj, def, def.name); + end + else if Supports(def, IwbSignatureDef, sigDef) then + begin + name := SigToStr(sigDef.DefaultSignature) + ' - ' + sigDef.name; AddDefIfMissing(recObj, def, name); end else - AddDefIfMissing(recObj, def, def.Name); + AddDefIfMissing(recObj, def, def.name); end; procedure BuildChildDefs(obj: ISuperObject; def: IwbNamedDef); @@ -1395,47 +1606,77 @@ procedure BuildChildDefs(obj: ISuperObject; def: IwbNamedDef); intDef: IwbIntegerDefFormaterUnion; sraDef: IwbSubRecordArrayDef; aDef: IwbArrayDef; + iDef: IwbIntegerDef; + fDef: IwbFlagsDef; begin // try SubRecordDef ValueDef if Supports(def, IwbSubRecordDef, subDef) then BuildChildDefs(obj, subDef.GetValue as IwbNamedDef) - // try IwbRecordDef - else if Supports(def, IwbRecordDef, recDef) then begin - if recDef.MemberCount = 0 then exit; + // try IwbFlagsDef + else if Supports(def, IwbIntegerDef, iDef) and Supports(iDef.Formater[nil], + IwbFlagsDef, fDef) then + begin + if fDef.FlagCount = 0 then + exit; + obj.O['c'] := SA([]); + for i := 0 to Pred(fDef.FlagCount) do begin + if fDef.Flags[i] = '' then + obj.a['c'][i] := BuildDef(fDef.FlagDef[i], 'Unknown ' + IntToStr(i)) + else + obj.a['c'][i] := BuildDef(fDef.FlagDef[i], fDef.Flags[i]); + //BuildChildDef(fDef.FlagDef[i] as IwbNamedDef, obj); + end; + end + // try IwbRecordDef 1 + else if Supports(def, IwbRecordDef, recDef) then + begin + if recDef.MemberCount = 0 then + exit; obj.O['c'] := SA([]); for i := 0 to Pred(recDef.MemberCount) do BuildChildDef(recDef.Members[i] as IwbNamedDef, obj); end // try IwbUnionDef - else if Supports(def, IwbUnionDef, unionDef) then begin - if unionDef.MemberCount = 0 then exit; + else if Supports(def, IwbUnionDef, unionDef) then + begin + if unionDef.MemberCount = 0 then + exit; obj.O['c'] := SA([]); for i := 0 to Pred(unionDef.MemberCount) do BuildChildDef(unionDef.Members[i] as IwbNamedDef, obj); end // try IwbStructDef - else if Supports(def, IwbStructDef, structDef) then begin - if structDef.MemberCount = 0 then exit; + else if Supports(def, IwbStructDef, structDef) then + begin + if structDef.MemberCount = 0 then + exit; obj.O['c'] := SA([]); for i := 0 to Pred(structDef.MemberCount) do BuildChildDef(structDef.Members[i] as IwbNamedDef, obj); end // try IwbIntegerDefFormaterUnion - else if Supports(def, IwbIntegerDefFormaterUnion, intDef) then begin - if intDef.MemberCount = 0 then exit; + else if Supports(def, IwbIntegerDefFormaterUnion, intDef) then + begin + if intDef.MemberCount = 0 then + exit; obj.O['c'] := SA([]); for i := 0 to Pred(intDef.MemberCount) do BuildChildDef(intDef.Members[i] as IwbNamedDef, obj); end // try IwbSubRecordArrayDef - else if Supports(def, IwbSubRecordArrayDef, sraDef) then begin + else if Supports(def, IwbSubRecordArrayDef, sraDef) then + begin obj.O['c'] := SA([]); - BuildChildDef(sraDef.Element as IwbNamedDef, obj); + BuildChildDef(sraDef.element as IwbNamedDef, obj); end // try IwbArrayDef - else if Supports(def, IwbArrayDef, aDef) then begin + else if Supports(def, IwbArrayDef, aDef) then + begin + if aDef.ElementCount = 0 then + exit; obj.O['c'] := SA([]); - BuildChildDef(aDef.Element as IwbNamedDef, obj); + for i := 0 to Pred(aDef.ElementCount) do + AddDefIfMissing(obj, aDef.element as IwbNamedDef, aDef.ElementLabel[i]); end; end; @@ -1444,30 +1685,34 @@ function BuildDef(def: IwbNamedDef; name: string): ISuperObject; // release object if something goes wrong Result := SO; try - Result.S['n'] := name; - Result.I['t'] := Ord(SmashType(def)); + Result.s['n'] := name; + Result.i['t'] := Ord(SmashType(def)); BuildChildDefs(Result, def); except - on x: Exception do begin + on x: Exception do + begin Result._Release; raise x; end; end; end; -function BuildRecordDef(sName: string; mrDef: IwbRecordDef; out recObj: ISuperObject): boolean; overload; +function BuildRecordDef(sName: string; mrDef: IwbRecordDef; + out recObj: ISuperObject): boolean; overload; var i: Integer; begin recObj := SO; try - recObj.S['n'] := sName; - recObj.I['t'] := Ord(stRecord); + recObj.s['n'] := sName; + recObj.i['t'] := Ord(stRecord); recObj.O['c'] := SA([]); + BuildChildDef(mrDef.RecordHeaderStruct as IwbNamedDef, recObj); for i := 0 to Pred(mrDef.MemberCount) do BuildChildDef(mrDef.Members[i] as IwbNamedDef, recObj); except - on x: Exception do begin + on x: Exception do + begin recObj._Release; raise x; end; @@ -1514,45 +1759,49 @@ function GetEditableFileContainer: IwbContainerElementRef; procedure PopulateAddList(var AddItem: TMenuItem; Event: TNotifyEvent); var i: Integer; - RecordDef: PwbRecordDef; + RecordDef: PwbMainRecordDef; item: TMenuItem; begin // populate wbGroupOrder to additem - with TStringList.Create do try - Sorted := True; - Duplicates := dupIgnore; - - // initialize list contents - AddStrings(wbGroupOrder); - Sorted := False; - - // get record def names, if available - for i := Pred(Count) downto 0 do - if wbFindRecordDef(AnsiString(Strings[i]), RecordDef) then - Strings[i] := Strings[i] + ' - ' + RecordDef.Name - else - Delete(i); - - // populate menu items - for i := 0 to Pred(Count) do begin - if Length(Strings[i]) < 4 then - continue; - item := TMenuItem.Create(AddItem); - item.Caption := Strings[i]; - item.OnClick := Event; - AddItem.Add(item); + with TStringList.Create do + try + Sorted := true; + Duplicates := dupIgnore; + + // initialize list contents + AddStrings(wbGroupOrder); + Sorted := false; + + // get record def names, if available + for i := Pred(Count) downto 0 do + if wbFindRecordDef(AnsiString(Strings[i]), RecordDef) then + Strings[i] := Strings[i] + ' - ' + RecordDef.name + else + Delete(i); + + // populate menu items + for i := 0 to Pred(Count) do + begin + if Length(Strings[i]) < 4 then + continue; + item := TMenuItem.Create(AddItem); + item.Caption := Strings[i]; + item.OnClick := Event; + AddItem.Add(item); + end; + finally + Free; end; - finally - Free; - end; end; initialization + begin PluginsList := TList.Create; end; finalization + begin FreeList(PluginsList); end; diff --git a/lib/mte/mteChangeLogForm.dfm b/lib/mte/mteChangeLogForm.dfm old mode 100644 new mode 100755 diff --git a/lib/mte/mteChangeLogForm.pas b/lib/mte/mteChangeLogForm.pas old mode 100644 new mode 100755 index 5e8ffa8..d79bb56 --- a/lib/mte/mteChangeLogForm.pas +++ b/lib/mte/mteChangeLogForm.pas @@ -11,10 +11,10 @@ interface type TChangeLogForm = class(TForm) [FormPrefix('mpCha')] - ScrollBox: TScrollBox; - LabelPrompt: TLabel; - ButtonInstall: TButton; - ButtonSkip: TButton; + ScrollBox: TScrollBox; + LabelPrompt: TLabel; + ButtonInstall: TButton; + ButtonSkip: TButton; procedure FormCreate(Sender: TObject); procedure CreateVersionLabel(line: string; var top: Integer); @@ -27,7 +27,7 @@ TChangeLogForm = class(TForm) end; // public entry point - function ChangeLogPrompt(AOwner: TComponent): boolean; +function ChangeLogPrompt(AOwner: TComponent): boolean; const spacing = 5; @@ -44,12 +44,12 @@ implementation procedure TChangeLogForm.FormCreate(Sender: TObject); begin - {// do a translation dump? - if bTranslationDump then + { // do a translation dump? + if bTranslationDump then TRttiTranslation.Save('lang\english.lang', self); - // load translation - TRttiTranslation.Load(language, self);} + // load translation + TRttiTranslation.Load(language, self); } // display changelog DisplayChangelog; @@ -68,7 +68,7 @@ procedure TChangeLogForm.CreateVersionLabel(line: string; var top: Integer); lbl := TLabel.Create(ScrollBox); lbl.Parent := ScrollBox; lbl.Autosize := true; - lbl.Top := top; + lbl.top := top; lbl.Left := 8; lbl.Caption := line; lbl.Font.Style := [fsBold]; @@ -84,9 +84,9 @@ procedure TChangeLogForm.CreateLabel(line: string; var top: Integer); // make label lbl := TLabel.Create(ScrollBox); lbl.Parent := ScrollBox; - lbl.AutoSize := true; + lbl.Autosize := true; lbl.WordWrap := true; - lbl.Top := top; + lbl.top := top; lbl.Left := 20; lbl.Width := ScrollBox.ClientWidth - 36; lbl.Caption := Trim(line); @@ -104,14 +104,16 @@ procedure TChangeLogForm.DisplayChangelog; start := 0; if not Assigned(clChangelog) then exit; - for i := 0 to Pred(clChangelog.Count) do begin + for i := 0 to Pred(clChangelog.Count) do + begin line := clChangelog[i]; if not IsVersionLine(line) then continue; // identify start of changelog as first version newer than current version lineVersion := Copy(line, 9, Length(line)); - if VersionCompare(clProgramVersion, lineVersion) then begin + if VersionCompare(clProgramVersion, lineVersion) then + begin start := i; break; end; @@ -120,7 +122,8 @@ procedure TChangeLogForm.DisplayChangelog; // loop through the changelog, creating labels in scrollbox // as necessary to render text top := 8; - for i := start to Pred(clChangelog.Count) do begin + for i := start to Pred(clChangelog.Count) do + begin line := clChangelog[i]; if IsVersionLine(line) then CreateVersionLabel(line, top) @@ -136,7 +139,8 @@ procedure LoadChangelog(var changelog: TStringList); changelog := TStringList.Create; // don't attempt to load changelog if it doesn't exist - if not FileExists('changelog.txt') then begin + if not FileExists('changelog.txt') then + begin Logger.Write('GENERAL', 'Changelog', 'No changelog found'); exit; end; diff --git a/lib/mte/mteHelpers.pas b/lib/mte/mteHelpers.pas old mode 100644 new mode 100755 index 8213ef9..6bcd342 --- a/lib/mte/mteHelpers.pas +++ b/lib/mte/mteHelpers.pas @@ -7,75 +7,78 @@ interface type TCallback = procedure of object; + TAppHelpers = class class procedure GetHelp(var Msg: TMsg; var Handled: Boolean); - class function HandleHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; + class function HandleHelp(Command: Word; Data: Integer; + var CallHelp: Boolean): Boolean; end; { General functions } - function ShortenVersion(vs: string; numClauses: Integer): string; - function IfThenInt(AValue: boolean; ATrue: Integer = 1; AFalse: Integer = 0): Integer; - function TitleCase(sText: String): String; - function SentenceCase(sText: string): string; - function csvText(s: string): string; - function CopyFromTo(str: string; first, last: Integer): string; - function GetTextIn(str: string; open, close: char): string; - function FormatByteSize(const bytes: Int64): string; - function DateBuiltString(date: TDateTime): string; - function DateTimeToSQL(date: TDateTime): string; - function SQLToDateTime(date: string): TDateTime; - function RateStr(date: TDateTime): string; - function TimeStr(date: TDateTime): string; - function AppendIfMissing(str, substr: string): string; - function StrEndsWith(s1, s2: string): boolean; - function RemoveFromEnd(s1, s2: string): string; - function IntegerListSum(list: TStringList; maxIndex: integer): integer; - function Wordwrap(s: string; charCount: integer): string; - function ExtractPath(path: string; levels: integer): string; - function ContainsMatch(var sl: TStringList; const s: string): boolean; - procedure DeleteMatchingItems(item: string; var sl: TStringList); - function IsURL(s: string): boolean; - function IsDotFile(fn: string): boolean; - procedure SaveStringToFile(s: string; fn: string); - function ApplyTemplate(const template: string; var map: TStringList): string; - function VersionCompare(v1, v2: string): boolean; - procedure TryToFree(obj: TObject); - procedure FreeList(var lst: TList); - { Windows API functions } - procedure ForceForeground(hWnd: THandle); - function GetDriveList: TStringDynArray; - function DOSDrive(const sDrive: String ): Integer; - function DriveReady(const sDrive: String): Boolean; - function TryRegistryKeys(var keys: TStringList): string; - function FileNameValid(filename: string): boolean; - function DirectoryValid(dir: string): boolean; - function UpDirectory(sPath: string): string; - function DeleteToRecycleBin(const path: string; Confirm: Boolean): Boolean; - procedure ExecNewProcess(ProgramName: string; synchronous: Boolean); - procedure BrowseForFile(var ed: TEdit; filter, initDir: string); - procedure BrowseForFolder(var ed: TEdit; initDir: string); - function GetCSIDLShellFolder(CSIDLFolder: integer): string; - function GetFileSize(const aFilename: String): Int64; - function GetLastModified(const aFileName: String): TDateTime; - function SearchPathsForFile(sPaths, sFileName: string): string; - function MultFileSearch(paths, filenames, ignore: array of string; - maxDepth: integer): string; - function RecursiveFileSearch(aPath: string; filenames, ignore: array of string; - maxDepth: integer): string; - procedure CopyDirectory(src, dst: string; fIgnore, dIgnore: TStringList); - procedure GetFilesList(path: string; var fIgnore, dIgnore, list: TStringList); - procedure CopyFiles(src, dst: string; var list: TStringList); - function GetVersionMem: string; - function FileVersion(const FileName: string): String; - procedure DeleteDirectory(const path: string); - procedure PerformFileSystemTests(sBasePath: string); - { GUI Helper Functions } - procedure StringGrid_CorrectWidth(var sg: TStringGrid); - procedure ListView_CorrectWidth(var lv: TListView); - function ListView_NextMatch(ListView: TListView; sSearch: string; - iIndex: Integer): Integer; - procedure ListView_HandleMatch(ListView: TListView; iFoundIndex: Integer; - var sBuffer: string; sTempBuffer: string); +function ShortenVersion(vs: string; numClauses: Integer): string; +function IfThenInt(AValue: Boolean; ATrue: Integer = 1; + AFalse: Integer = 0): Integer; +function TitleCase(sText: String): String; +function SentenceCase(sText: string): string; +function csvText(s: string): string; +function CopyFromTo(str: string; first, last: Integer): string; +function GetTextIn(str: string; open, close: char): string; +function FormatByteSize(const bytes: Int64): string; +function DateBuiltString(date: TDateTime): string; +function DateTimeToSQL(date: TDateTime): string; +function SQLToDateTime(date: string): TDateTime; +function RateStr(date: TDateTime): string; +function TimeStr(date: TDateTime): string; +function AppendIfMissing(str, substr: string): string; +function StrEndsWith(s1, s2: string): Boolean; +function RemoveFromEnd(s1, s2: string): string; +function IntegerListSum(list: TStringList; maxIndex: Integer): Integer; +function Wordwrap(s: string; charCount: Integer): string; +function ExtractPath(path: string; levels: Integer): string; +function ContainsMatch(var sl: TStringList; const s: string): Boolean; +procedure DeleteMatchingItems(item: string; var sl: TStringList); +function IsURL(s: string): Boolean; +function IsDotFile(fn: string): Boolean; +procedure SaveStringToFile(s: string; fn: string); +function ApplyTemplate(const template: string; var map: TStringList): string; +function VersionCompare(v1, v2: string): Boolean; +procedure TryToFree(obj: TObject); +procedure FreeList(var lst: TList); +{ Windows API functions } +procedure ForceForeground(hWnd: THandle); +function GetDriveList: TStringDynArray; +function DOSDrive(const sDrive: String): Integer; +function DriveReady(const sDrive: String): Boolean; +function TryRegistryKeys(var keys: TStringList): string; +function FileNameValid(filename: string): Boolean; +function DirectoryValid(dir: string): Boolean; +function UpDirectory(sPath: string): string; +function DeleteToRecycleBin(const path: string; Confirm: Boolean): Boolean; +procedure ExecNewProcess(ProgramName: string; synchronous: Boolean); +procedure BrowseForFile(var ed: TEdit; filter, initDir: string); +procedure BrowseForFolder(var ed: TEdit; initDir: string); +function GetCSIDLShellFolder(CSIDLFolder: Integer): string; +function GetFileSize(const aFilename: String): Int64; +function GetLastModified(const aFilename: String): TDateTime; +function SearchPathsForFile(sPaths, sFileName: string): string; +function MultFileSearch(paths, filenames, ignore: array of string; + maxDepth: Integer): string; +function RecursiveFileSearch(aPath: string; filenames, ignore: array of string; + maxDepth: Integer): string; +procedure CopyDirectory(src, dst: string; fIgnore, dIgnore: TStringList); +procedure GetFilesList(path: string; var fIgnore, dIgnore, list: TStringList); +procedure CopyFiles(src, dst: string; var list: TStringList); +function GetVersionMem: string; +function FileVersion(const filename: string): String; +procedure DeleteDirectory(const path: string); +procedure PerformFileSystemTests(sBasePath: string); +{ GUI Helper Functions } +procedure StringGrid_CorrectWidth(var sg: TStringGrid); +procedure ListView_CorrectWidth(var lv: TListView); +function ListView_NextMatch(ListView: TListView; sSearch: string; + iIndex: Integer): Integer; +procedure ListView_HandleMatch(ListView: TListView; iFoundIndex: Integer; + var sBuffer: string; sTempBuffer: string); const wndBorderSide = 8; @@ -88,7 +91,7 @@ TAppHelpers = class seconds = minutes / 60.0; var - bAllowHelp: boolean; + bAllowHelp: Boolean; enFormatSettings: TFormatSettings; implementation @@ -97,30 +100,33 @@ implementation Controls, Masks, Dialogs, StrUtils, FileCtrl, ShellApi, Messages, CommCtrl, DateUtils, shlObj, IOUtils, Registry; - -{******************************************************************************} +{ ****************************************************************************** } { Application Helpers General helpers for applications } -{******************************************************************************} +{ ****************************************************************************** } class procedure TAppHelpers.GetHelp(var Msg: TMsg; var Handled: Boolean); var control: TControl; sKeyword: string; begin - if (Msg.message = WM_KEYDOWN) and (LoWord(Msg.wParam) = VK_F1) then begin + if (Msg.message = WM_KEYDOWN) and (LoWord(Msg.wParam) = VK_F1) then + begin Screen.Cursor := crHelp; Handled := true; end - else if (Msg.message = WM_LBUTTONDOWN) and (Screen.Cursor = crHelp) then begin + else if (Msg.message = WM_LBUTTONDOWN) and (Screen.Cursor = crHelp) then + begin // get control the user clicked on control := FindVCLWindow(Mouse.CursorPos); // if we found a control, jump to help keyword for that control - if Assigned(control) then begin + if Assigned(control) then + begin bAllowHelp := true; sKeyword := control.HelpKeyword; - while (sKeyword = '') and Assigned(control.Parent) do begin + while (sKeyword = '') and Assigned(control.Parent) do + begin control := control.Parent; sKeyword := control.HelpKeyword; end; @@ -139,8 +145,7 @@ class function TAppHelpers.HandleHelp(Command: Word; Data: Integer; Result := true; end; - -{******************************************************************************} +{ ****************************************************************************** } { General functions Set of functions that help with converting data types and handling strings. @@ -169,7 +174,7 @@ class function TAppHelpers.HandleHelp(Command: Word; Data: Integer; - SaveStringToFile - ApplyTemplate } -{*****************************************************************************} +{ ***************************************************************************** } function ShortenVersion(vs: string; numClauses: Integer): string; var @@ -177,7 +182,8 @@ function ShortenVersion(vs: string; numClauses: Integer): string; begin Result := ''; numDots := 0; - for i := 1 to Pred(Length(vs)) do begin + for i := 1 to Pred(Length(vs)) do + begin if vs[i] = '.' then Inc(numDots); if numDots = numClauses then @@ -188,7 +194,8 @@ function ShortenVersion(vs: string; numClauses: Integer): string; { Returns one of two integers based on a boolean argument. Like IfThen from StrUtils, but returns an Integer. } -function IfThenInt(AValue: boolean; ATrue: Integer = 1; AFalse: Integer = 0): Integer; +function IfThenInt(AValue: Boolean; ATrue: Integer = 1; + AFalse: Integer = 0): Integer; begin if AValue then Result := ATrue @@ -199,13 +206,14 @@ function IfThenInt(AValue: boolean; ATrue: Integer = 1; AFalse: Integer = 0): In { Capitalizes the first letter of each word } function TitleCase(sText: String): String; const - cDelimiters = [#9, #10, #13, ' ', ',', '.', ':', ';', '"', - '\', '/', '(', ')', '[', ']', '{', '}']; + cDelimiters = [#9, #10, #13, ' ', ',', '.', ':', ';', '"', '\', '/', '(', ')', + '[', ']', '{', '}']; var iLoop: Integer; begin Result := sText; - if (Result <> '') then begin + if (Result <> '') then + begin Result := LowerCase(Result); Result[1] := UpCase(Result[1]); @@ -221,15 +229,17 @@ function SentenceCase(sText: string): string; cTerminators = ['!', '.', '?']; var iLoop: Integer; - bTerminated: boolean; + bTerminated: Boolean; begin Result := sText; - if (Result <> '') then begin + if (Result <> '') then + begin Result := LowerCase(Result); Result[1] := UpCase(Result[1]); bTerminated := false; - for iLoop := 2 to Length(Result) do begin + for iLoop := 2 to Length(Result) do + begin if (Result[iLoop - 1] in cTerminators) then bTerminated := true; if bTerminated and (Result[iLoop] <> ' ') then @@ -241,7 +251,7 @@ function SentenceCase(sText: string): string; { Replaces newlines with a comma and space } function csvText(s: string): string; begin - result := StringReplace(Trim(s), #13, ', ', [rfReplaceAll]); + Result := StringReplace(Trim(s), #13, ', ', [rfReplaceAll]); end; { Copies a substring in a string between two indexes } @@ -253,18 +263,21 @@ function CopyFromTo(str: string; first, last: Integer): string; { Returns a substring of @str between characters @open and @close } function GetTextIn(str: string; open, close: char): string; var - i, openIndex: integer; - bOpen: boolean; + i, openIndex: Integer; + bOpen: Boolean; begin Result := ''; bOpen := false; openIndex := 0; - for i := 0 to Length(str) do begin - if not bOpen and (str[i] = open) then begin + for i := 0 to Length(str) do + begin + if not bOpen and (str[i] = open) then + begin openIndex := i; bOpen := true; end; - if bOpen and (str[i] = close) then begin + if bOpen and (str[i] = close) then + begin Result := CopyFromTo(str, openIndex + 1, i - 1); break; end; @@ -274,24 +287,21 @@ function GetTextIn(str: string; open, close: char): string; { Format file byte size } function FormatByteSize(const bytes: Int64): string; const - B = 1; //byte - KB = 1024 * B; //kilobyte - MB = 1024 * KB; //megabyte - GB = 1024 * MB; //gigabyte + B = 1; // byte + KB = 1024 * B; // kilobyte + MB = 1024 * KB; // megabyte + GB = 1024 * MB; // gigabyte begin if bytes > GB then - result := FormatFloat('#.## GB', bytes / GB) + Result := FormatFloat('#.## GB', bytes / GB) + else if bytes > MB then + Result := FormatFloat('#.## MB', bytes / MB) + else if bytes > KB then + Result := FormatFloat('#.## KB', bytes / KB) + else if bytes > 0 then + Result := FormatFloat('#.## bytes', bytes) else - if bytes > MB then - result := FormatFloat('#.## MB', bytes / MB) - else - if bytes > KB then - result := FormatFloat('#.## KB', bytes / KB) - else - if bytes > 0 then - result := FormatFloat('#.## bytes', bytes) - else - result := '0 bytes'; + Result := '0 bytes'; end; { Converts a TDateTime to a string, with 0 being the string 'Never' } @@ -299,7 +309,8 @@ function DateBuiltString(date: TDateTime): string; begin if date = 0 then Result := 'Never' - else begin + else + begin Result := DateTimeToStr(date); end; end; @@ -347,17 +358,18 @@ function TimeStr(date: TDateTime): string; Example usage: s := 'This is a sample string.'; if StrEndsWith(s, 'string.') then - AddMessage('It works!'); + AddMessage('It works!'); } -function StrEndsWith(s1, s2: string): boolean; +function StrEndsWith(s1, s2: string): Boolean; var - n1, n2: integer; + n1, n2: Integer; begin Result := false; n1 := Length(s1); n2 := Length(s2); - if n1 < n2 then exit; + if n1 < n2 then + exit; Result := (Copy(s1, n1 - n2 + 1, n2) = s2); end; @@ -394,32 +406,34 @@ function RemoveFromEnd(s1, s2: string): string; end; { Calculates the integer sum of all values in a TStringList to maxIndex } -function IntegerListSum(list: TStringList; maxIndex: integer): integer; +function IntegerListSum(list: TStringList; maxIndex: Integer): Integer; var i: Integer; begin Result := 0; for i := 0 to maxIndex do - Inc(result, StrToInt(list[i])); + Inc(Result, StrToInt(list[i])); end; { Inserts line breaks in string @s before @charCount has been exceeded } -function Wordwrap(s: string; charCount: integer): string; +function Wordwrap(s: string; charCount: Integer): string; var i, lastSpace, counter: Integer; begin counter := 0; lastSpace := 0; - for i := 1 to Length(s) - 1 do begin + for i := 1 to Length(s) - 1 do + begin Inc(counter); if (s[i] = ' ') or (s[i] = ',') then lastSpace := i; - if (s[i] = #13) or (s[i] = #10) - or (s[i + 1] = #13) or (s[i + 1] = #10) then begin + if (s[i] = #13) or (s[i] = #10) or (s[i + 1] = #13) or (s[i + 1] = #10) then + begin lastSpace := 0; counter := 0; end; - if (counter = charCount) and (lastSpace > 0) then begin + if (counter = charCount) and (lastSpace > 0) then + begin Insert(#13#10, s, lastSpace + 1); lastSpace := 0; counter := 0; @@ -438,13 +452,14 @@ function Wordwrap(s: string; charCount: integer): string; ShowMessage(ExtractPath(path, 1)); // 'C:\Program Files (x86)\' ShowMessage(ExtractPath(path, 2)); // 'C:\' } -function ExtractPath(path: string; levels: integer): string; +function ExtractPath(path: string; levels: Integer): string; var - i, n: integer; + i, n: Integer; begin n := 0; for i := Length(path) downto 1 do - if IsPathDelimiter(path, i) then begin + if IsPathDelimiter(path, i) then + begin if n = levels then break else @@ -454,13 +469,14 @@ function ExtractPath(path: string; levels: integer): string; end; { Checks to see if any mask in @sl matches the string @s } -function ContainsMatch(var sl: TStringList; const s: string): boolean; +function ContainsMatch(var sl: TStringList; const s: string): Boolean; var i: Integer; begin Result := false; for i := 0 to Pred(sl.Count) do - if MatchesMask(s, sl[i]) then begin + if MatchesMask(s, sl[i]) then + begin Result := true; break; end; @@ -471,20 +487,21 @@ procedure DeleteMatchingItems(item: string; var sl: TStringList); var i: Integer; begin - for i := Pred(sl.Count) downto 0 do begin + for i := Pred(sl.Count) downto 0 do + begin if sl[i] = item then sl.Delete(i); end; end; { Returns true if the string is an http:// or https:// url } -function IsURL(s: string): boolean; +function IsURL(s: string): Boolean; begin Result := (Pos('http://', s) = 1) or (Pos('https://', s) = 1); end; { Returns true if @fn is . or .. } -function IsDotFile(fn: string): boolean; +function IsDotFile(fn: string): Boolean; begin Result := (fn = '.') or (fn = '..'); end; @@ -509,17 +526,19 @@ function ApplyTemplate(const template: string; var map: TStringList): string; name, value: string; begin Result := template; - for i := 0 to Pred(map.Count) do begin + for i := 0 to Pred(map.Count) do + begin name := map.Names[i]; value := map.ValueFromIndex[i]; - Result := StringReplace(Result, openTag + name + closeTag, value, [rfReplaceAll]); + Result := StringReplace(Result, openTag + name + closeTag, value, + [rfReplaceAll]); end; end; -function VersionCompare(v1, v2: string): boolean; +function VersionCompare(v1, v2: string): Boolean; var sl1, sl2: TStringList; - i, c1, c2: integer; + i, c1, c2: Integer; begin Result := false; @@ -533,14 +552,17 @@ function VersionCompare(v1, v2: string): boolean; // look through each version clause and perform comparisons i := 0; - while (i < sl1.Count) and (i < sl2.Count) do begin + while (i < sl1.Count) and (i < sl2.Count) do + begin c1 := StrToInt(sl1[i]); c2 := StrToInt(sl2[i]); - if (c1 < c2) then begin + if (c1 < c2) then + begin Result := true; break; end - else if (c1 > c2) then begin + else if (c1 > c2) then + begin Result := false; break; end; @@ -554,11 +576,12 @@ function VersionCompare(v1, v2: string): boolean; procedure TryToFree(obj: TObject); begin - if Assigned(obj) then try - obj.Free; - except - on x: Exception do // nothing - end; + if Assigned(obj) then + try + obj.Free; + except + on x: Exception do // nothing + end; end; procedure FreeList(var lst: TList); @@ -566,15 +589,15 @@ procedure FreeList(var lst: TList); i: Integer; obj: TObject; begin - for i := Pred(lst.Count) downto 0 do begin + for i := Pred(lst.Count) downto 0 do + begin obj := TObject(lst[i]); TryToFree(obj); end; lst.Free; end; - -{******************************************************************************} +{ ****************************************************************************** } { Windows API functions Set of functions that help deal with the Windows File System. @@ -598,7 +621,7 @@ procedure FreeList(var lst: TList); - FileVersion - DeleteDirectory } -{******************************************************************************} +{ ****************************************************************************** } { ForceForeground: @@ -606,8 +629,10 @@ procedure FreeList(var lst: TList); } procedure ForceForeground(hWnd: THandle); begin - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE); - SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE); + SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or + SWP_NOMOVE); + SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or + SWP_NOMOVE); end; { @@ -618,7 +643,7 @@ procedure ForceForeground(hWnd: THandle); function GetDriveList: TStringDynArray; var - Buff: array[0..128] of Char; + Buff: array [0 .. 128] of char; ptr: PChar; Idx: Integer; begin @@ -644,7 +669,7 @@ function GetDriveList: TStringDynArray; Converts a drive letter into the integer drive # required by DiskSize(). } -function DOSDrive( const sDrive: String ): Integer; +function DOSDrive(const sDrive: String): Integer; begin if (Length(sDrive) < 1) then Result := -1 @@ -680,28 +705,31 @@ function TryRegistryKeys(var keys: TStringList): string; path, name: string; begin Result := ''; - with TRegistry.Create do try - RootKey := HKEY_LOCAL_MACHINE; - - // try all keys - for i := 0 to Pred(keys.Count) do begin - path := ExtractFilePath(keys[i]); - name := ExtractFileName(keys[i]); - if OpenKeyReadOnly(path) then begin - Result := ReadString(name); - break; + with TRegistry.Create do + try + RootKey := HKEY_LOCAL_MACHINE; + + // try all keys + for i := 0 to Pred(keys.Count) do + begin + path := ExtractFilePath(keys[i]); + name := ExtractFileName(keys[i]); + if OpenKeyReadOnly(path) then + begin + Result := ReadString(name); + break; + end; end; + finally + Free; end; - finally - Free; - end; end; { DirectoryValid: Returns true if the input directory path is valid. } -function DirectoryValid(dir: string): boolean; +function DirectoryValid(dir: string): Boolean; begin Result := false; if (dir = '') then @@ -734,10 +762,10 @@ function UpDirectory(sPath: string): string; FileNameValid: Returns true if the input filename is valid. } -function FileNameValid(filename: string): boolean; +function FileNameValid(filename: string): Boolean; begin - Result := (Length(Trim(filename)) > 0) and - TPath.HasValidFileNameChars(filename, false); + Result := (Length(Trim(filename)) > 0) and TPath.HasValidFileNameChars + (filename, false); end; { @@ -746,25 +774,26 @@ function FileNameValid(filename: string): boolean; } procedure ExecNewProcess(ProgramName: string; synchronous: Boolean); var - StartInfo : TStartupInfo; - ProcInfo : TProcessInformation; - CreateOK : Boolean; + StartInfo: TStartupInfo; + ProcInfo: TProcessInformation; + CreateOK: Boolean; begin { fill with known state } FillChar(StartInfo, SizeOf(TStartupInfo), #0); FillChar(ProcInfo, SizeOf(TProcessInformation), #0); StartInfo.cb := SizeOf(TStartupInfo); - CreateOK := CreateProcess(PChar(ProgramName), nil, nil, nil,False, - CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, - nil, nil, StartInfo, ProcInfo); + CreateOK := CreateProcess(PChar(ProgramName), nil, nil, nil, false, + CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, + ProcInfo); // check if successful - if CreateOK then begin + if CreateOK then + begin if synchronous then WaitForSingleObject(ProcInfo.hProcess, INFINITE); end else - ShowMessage('Unable to run '+ProgramName); + ShowMessage('Unable to run ' + ProgramName); // close handles CloseHandle(ProcInfo.hProcess); @@ -789,9 +818,9 @@ procedure BrowseForFile(var ed: TEdit; filter, initDir: string); else openDialog.InitialDir := initDir; - openDialog.Filter := filter; + openDialog.filter := filter; if openDialog.Execute then - ed.Text := openDialog.FileName; + ed.Text := openDialog.filename; end; { @@ -820,10 +849,10 @@ procedure BrowseForFolder(var ed: TEdit; initDir: string); GetCSIDLShellFolder: Gets a folder by its integer CSID. } -function GetCSIDLShellFolder(CSIDLFolder: integer): string; +function GetCSIDLShellFolder(CSIDLFolder: Integer): string; begin SetLength(Result, MAX_PATH); - SHGetSpecialFolderPath(0, PChar(Result), CSIDLFolder, True); + SHGetSpecialFolderPath(0, PChar(Result), CSIDLFolder, true); SetLength(Result, StrLen(PChar(Result))); if (Result <> '') then Result := IncludeTrailingBackslash(Result); @@ -837,27 +866,29 @@ function GetFileSize(const aFilename: String): Int64; var info: TWin32FileAttributeData; begin - result := -1; + Result := -1; - if NOT GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then - EXIT; + if NOT GetFileAttributesEx(PWideChar(aFilename), GetFileExInfoStandard, @info) + then + exit; - result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32); + Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32); end; { GetLastModified: Gets the last time a file was modified. } -function GetLastModified(const aFileName: String): TDateTime; +function GetLastModified(const aFilename: String): TDateTime; var info: TWin32FileAttributeData; FileTime: TFileTime; LocalTime, SystemTime: TSystemTime; begin - result := 0; + Result := 0; // exit if can't get attributes - if not GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then + if not GetFileAttributesEx(PWideChar(aFilename), GetFileExInfoStandard, @info) + then exit; // get last modified @@ -884,14 +915,17 @@ function SearchPathsForFile(sPaths, sFileName: string): string; begin slPaths := TStringList.Create; try - while (Pos(';', sPaths) > 0) do begin + while (Pos(';', sPaths) > 0) do + begin slPaths.Add(Copy(sPaths, 1, Pos(';', sPaths) - 1)); sPaths := Copy(sPaths, Pos(';', sPaths) + 1, Length(sPaths)); end; - for i := 0 to slPaths.Count - 1 do begin - if FindFirst(slPaths[i] + '\*', faDirectory, info) = 0 then begin + for i := 0 to slPaths.Count - 1 do + begin + if FindFirst(slPaths[i] + '\*', faDirectory, info) = 0 then + begin repeat - Result := FileSearch(sFileName, slPaths[i] + '\' + info.Name); + Result := FileSearch(sFileName, slPaths[i] + '\' + info.name); if (Result <> '') then break; until FindNext(info) <> 0; @@ -910,12 +944,14 @@ function SearchPathsForFile(sPaths, sFileName: string): string; MultFileSearch: Wraps around RecursiveFileSearch, allowing the searching of multiple paths. } -function MultFileSearch(paths, filenames, ignore: array of string; maxDepth: integer): string; +function MultFileSearch(paths, filenames, ignore: array of string; + maxDepth: Integer): string; var i: Integer; path: string; begin - for i := Low(paths) to High(paths) do begin + for i := Low(paths) to High(paths) do + begin path := RecursiveFileSearch(paths[i], filenames, ignore, maxDepth); if path <> '' then break; @@ -933,37 +969,43 @@ function MultFileSearch(paths, filenames, ignore: array of string; maxDepth: int AddMessage(p); } function RecursiveFileSearch(aPath: string; filenames, ignore: array of string; - maxDepth: integer): string; + maxDepth: Integer): string; var - skip: boolean; - i: integer; + skip: Boolean; + i: Integer; info: TSearchRec; begin Result := ''; aPath := AppendIfMissing(aPath, PathDelim); - if Result <> '' then exit; + if Result <> '' then + exit; // exit if no files in path if FindFirst(aPath + '*', faAnyFile, info) <> 0 then exit; // else loop through all files in path repeat - if IsDotFile(info.Name) then + if IsDotFile(info.name) then continue; // skip . and .. skip := false; - for i := Low(ignore) to High(ignore) do begin - skip := Lowercase(info.Name) = ignore[i]; + for i := Low(ignore) to High(ignore) do + begin + skip := LowerCase(info.name) = ignore[i]; if skip then break; end; - if not skip then begin - if ((info.attr and faDirectory) = faDirectory) and (maxDepth > 0) then begin - Result := RecursiveFileSearch(aPath+info.Name, filenames, ignore, maxDepth - 1); + if not skip then + begin + if ((info.attr and faDirectory) = faDirectory) and (maxDepth > 0) then + begin + Result := RecursiveFileSearch(aPath + info.name, filenames, ignore, + maxDepth - 1); end - else if MatchStr(info.Name, filenames) then - Result := aPath + info.Name; + else if MatchStr(info.name, filenames) then + Result := aPath + info.name; end; - if (Result <> '') then break; + if (Result <> '') then + break; until FindNext(info) <> 0; FindClose(info); end; @@ -980,7 +1022,7 @@ function RecursiveFileSearch(aPath: string; filenames, ignore: array of string; procedure CopyDirectory(src, dst: string; fIgnore, dIgnore: TStringList); var info: TSearchRec; - isDirectory: boolean; + isDirectory: Boolean; begin src := AppendIfMissing(src, PathDelim); dst := AppendIfMissing(dst, PathDelim); @@ -989,23 +1031,23 @@ procedure CopyDirectory(src, dst: string; fIgnore, dIgnore: TStringList); if (FindFirst(src + '*', faAnyFile, info) <> 0) then exit; repeat - isDirectory := (info.Attr and faDirectory = faDirectory); + isDirectory := (info.attr and faDirectory = faDirectory); // skip . and .. - if (info.Name = '.') or (info.Name = '..') then + if (info.name = '.') or (info.name = '..') then continue; // skip if ignored - if isDirectory and ContainsMatch(dIgnore, info.Name) then + if isDirectory and ContainsMatch(dIgnore, info.name) then continue - else if ContainsMatch(fIgnore, info.Name) then + else if ContainsMatch(fIgnore, info.name) then continue; // copy the file or recurse ForceDirectories(dst); if isDirectory then - CopyDirectory(src+info.Name, dst+info.Name, fIgnore, dIgnore) + CopyDirectory(src + info.name, dst + info.name, fIgnore, dIgnore) else - CopyFile(PChar(src+info.Name), PChar(dst+info.Name), false); + CopyFile(PChar(src + info.name), PChar(dst + info.name), false); until FindNext(info) <> 0; FindClose(info); @@ -1027,7 +1069,7 @@ procedure CopyDirectory(src, dst: string; fIgnore, dIgnore: TStringList); procedure GetFilesList(path: string; var fIgnore, dIgnore, list: TStringList); var info: TSearchRec; - isDirectory: boolean; + isDirectory: Boolean; begin path := AppendIfMissing(path, PathDelim); @@ -1035,24 +1077,25 @@ procedure GetFilesList(path: string; var fIgnore, dIgnore, list: TStringList); if (FindFirst(path + '*', faAnyFile, info) <> 0) then exit; repeat - isDirectory := (info.Attr and faDirectory = faDirectory); + isDirectory := (info.attr and faDirectory = faDirectory); // skip . and .. - if (info.Name = '.') or (info.Name = '..') then + if (info.name = '.') or (info.name = '..') then continue; // skip if ignored - if isDirectory then begin - if ContainsMatch(dIgnore, info.Name) then + if isDirectory then + begin + if ContainsMatch(dIgnore, info.name) then continue; end - else if ContainsMatch(fIgnore, info.Name) then + else if ContainsMatch(fIgnore, info.name) then continue; // copy the file or recurse if isDirectory then - GetFilesList(path + info.Name, fIgnore, dIgnore, list) + GetFilesList(path + info.name, fIgnore, dIgnore, list) else - list.Add(path + info.Name); + list.Add(path + info.name); until FindNext(info) <> 0; FindClose(info); @@ -1066,7 +1109,8 @@ procedure CopyFiles(src, dst: string; var list: TStringList); begin src := AppendIfMissing(src, PathDelim); dst := AppendIfMissing(dst, PathDelim); - for i := 0 to Pred(list.Count) do begin + for i := 0 to Pred(list.Count) do + begin srcFile := list[i]; dstFile := StringReplace(srcFile, src, dst, []); ForceDirectories(ExtractFilePath(dstFile)); @@ -1091,12 +1135,13 @@ function GetVersionMem: string; rs.Free; end; m.Position := 0; - if VerQueryValue(m.Memory, '\', Pointer(verblock), verlen) then begin - VersionMS := verblock.dwFileVersionMS; - VersionLS := verblock.dwFileVersionLS; + if VerQueryValue(m.Memory, '\', Pointer(verblock), verlen) then + begin + versionMS := verblock.dwFileVersionMS; + versionLS := verblock.dwFileVersionLS; Result := Format('%s.%s.%s.%s', [IntToStr(versionMS shr 16), - IntToStr(versionMS and $FFFF), IntToStr(VersionLS shr 16), - IntToStr(VersionLS and $FFFF)]); + IntToStr(versionMS and $FFFF), IntToStr(versionLS shr 16), + IntToStr(versionLS and $FFFF)]); end; finally m.Free; @@ -1104,26 +1149,25 @@ function GetVersionMem: string; end; { Get program version from disk } -function FileVersion(const FileName: string): String; +function FileVersion(const filename: string): String; var - VerInfoSize: Cardinal; - VerValueSize: Cardinal; - Dummy: Cardinal; + VerInfoSize: cardinal; + VerValueSize: cardinal; + Dummy: cardinal; PVerInfo: Pointer; - PVerValue: PVSFixedFileInfo; + PVerValue: PVSFIXEDFILEINFO; begin Result := ''; - VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy); + VerInfoSize := GetFileVersionInfoSize(PChar(filename), Dummy); GetMem(PVerInfo, VerInfoSize); try - if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then + if GetFileVersionInfo(PChar(filename), 0, VerInfoSize, PVerInfo) then if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then with PVerValue^ do - Result := Format('%d.%d.%d.%d', [ - HiWord(dwFileVersionMS), //Major - LoWord(dwFileVersionMS), //Minor - HiWord(dwFileVersionLS), //Release - LoWord(dwFileVersionLS)]); //Build + Result := Format('%d.%d.%d.%d', [HiWord(dwFileVersionMS), // Major + LoWord(dwFileVersionMS), // Minor + HiWord(dwFileVersionLS), // Release + LoWord(dwFileVersionLS)]); // Build finally FreeMem(PVerInfo, VerInfoSize); end; @@ -1135,7 +1179,8 @@ function DeleteToRecycleBin(const path: string; Confirm: Boolean): Boolean; sh: TSHFileOpStruct; begin FillChar(sh, SizeOf(sh), 0); - with sh do begin + with sh do + begin Wnd := 0; wFunc := FO_DELETE; pFrom := PChar(path + #0); @@ -1155,7 +1200,7 @@ procedure DeleteDirectory(const path: string); ShOp.wFunc := FO_DELETE; ShOp.pFrom := PChar(path + #0); ShOp.pTo := nil; - ShOp.fFlags := FOF_NOCONFIRMATION or FOF_ALLOWUNDO or FOF_NO_UI; + ShOp.fFlags := FOF_NOCONFIRMATION or FOF_NO_UI; SHFileOperation(ShOp); end; @@ -1222,14 +1267,13 @@ procedure PerformFileSystemTests(sBasePath: string); end; end; - -{******************************************************************************} +{ ****************************************************************************** } { GUI Helper Functions - ListView_CorrectWidth - ListView_FindNextMatch - ListView_HandleMatch } -{******************************************************************************} +{ ****************************************************************************** } procedure StringGrid_CorrectWidth(var sg: TStringGrid); var @@ -1253,7 +1297,8 @@ procedure ListView_CorrectWidth(var lv: TListView); w := lv.ClientWidth; // loop through columns keeping track of remaining width - for i := 0 to Pred(lv.Columns.Count) do begin + for i := 0 to Pred(lv.Columns.Count) do + begin col := lv.Columns[i]; if col.AutoSize then AutoSizedColumns.Add(col) @@ -1262,7 +1307,8 @@ procedure ListView_CorrectWidth(var lv: TListView); end; // set auotsized columns to fit client width - for i := 0 to Pred(AutoSizedColumns.Count) do begin + for i := 0 to Pred(AutoSizedColumns.Count) do + begin col := TListColumn(AutoSizedColumns[i]); col.Width := w div AutoSizedColumns.Count; end; @@ -1288,19 +1334,21 @@ function ListView_NextMatch(ListView: TListView; sSearch: string; // is an item selected if Assigned(ListView.Selected) then iStart := ListView.Selected.Index - // Else start at 0, the first item + // Else start at 0, the first item else iStart := 0; // Loop through items looking for a match - for i := iStart to Pred(ListView.Items.Count) do begin + for i := iStart to Pred(ListView.Items.Count) do + begin ListItem := ListView.Items[i]; if iIndex = 0 then sCaption := ListItem.Caption else sCaption := ListItem.SubItems[iIndex - 1]; sCompare := Copy(sCaption, 1, Length(sSearch)); - if SameText(sSearch, sCompare) then begin + if SameText(sSearch, sCompare) then + begin Result := i; break; end; @@ -1322,6 +1370,7 @@ procedure ListView_HandleMatch(ListView: TListView; iFoundIndex: Integer; end; initialization + begin bAllowHelp := false; enFormatSettings := TFormatSettings.Create('en-us'); @@ -1329,4 +1378,4 @@ initialization enFormatSettings.ThousandSeparator := ','; end; -end. \ No newline at end of file +end. diff --git a/lib/mte/mteLogger.pas b/lib/mte/mteLogger.pas old mode 100644 new mode 100755 index c99b0d3..9a0cff1 --- a/lib/mte/mteLogger.pas +++ b/lib/mte/mteLogger.pas @@ -9,26 +9,29 @@ interface TLogger = class private - FLogEvent : TLogEvent; + FLogEvent: TLogEvent; public procedure Write(const group, &label, text: string); property OnLogEvent: TLogEvent read FLogEvent write FLogEvent; end; -var Logger : TLogger; +var + Logger: TLogger; implementation procedure TLogger.Write(const group, &label, text: string); begin - if Assigned(FLogEvent) then - FLogEvent(group, &label, text); + if Assigned(FLogEvent) then + FLogEvent(group, &label, text); end; initialization - Logger := TLogger.Create; + +Logger := TLogger.Create; finalization - FreeAndNil(Logger); + +FreeAndNil(Logger); end. diff --git a/lib/mte/mteLogging.pas b/lib/mte/mteLogging.pas old mode 100644 new mode 100755 index 30f1e80..3959612 --- a/lib/mte/mteLogging.pas +++ b/lib/mte/mteLogging.pas @@ -25,7 +25,8 @@ TFilter = class(TObject) constructor Create(group: string; enabled: boolean); Overload; constructor Create(group, &label: string; enabled: boolean); Overload; end; - TLogMessage = class (TObject) + + TLogMessage = class(TObject) public time: string; appTime: string; @@ -36,11 +37,11 @@ TLogMessage = class (TObject) end; { Log methods } - procedure RebuildLog; - procedure SaveLog(var Log: TList); - function MessageEnabled(msg: TLogMessage): boolean; - procedure ShowProgressForm(parent: TForm; var pf: TProgressForm; - sCaption, sLogSubPath: string); +procedure RebuildLog; +procedure SaveLog(var Log: TList); +function MessageEnabled(msg: TLogMessage): boolean; +procedure ShowProgressForm(parent: TForm; var pf: TProgressForm; + sCaption, sLogSubPath: string); var BaseLog, Log, LabelFilters, GroupFilters: TList; @@ -74,7 +75,7 @@ constructor TLogMessage.Create(time, appTime, group, &label, text: string); self.text := text; end; -{******************************************************************************} +{ ****************************************************************************** } { Log methods Set of methods for logging @@ -84,7 +85,7 @@ constructor TLogMessage.Create(time, appTime, group, &label, text: string); - SaveLog - MessageGroupEnabled } -{******************************************************************************} +{ ****************************************************************************** } procedure RebuildLog; var @@ -92,7 +93,8 @@ procedure RebuildLog; msg: TLogMessage; begin Log.Clear; - for i := 0 to Pred(BaseLog.Count) do begin + for i := 0 to Pred(BaseLog.Count) do + begin msg := TLogMessage(BaseLog[i]); if MessageEnabled(msg) then Log.Add(msg); @@ -107,13 +109,15 @@ procedure SaveLog(var Log: TList); fdt: string; begin sl := TStringList.Create; - for i := 0 to Pred(Log.Count) do begin + for i := 0 to Pred(Log.Count) do + begin msg := TLogMessage(Log[i]); - sl.Add(Format('[%s] (%s) %s: %s', [msg.time, msg.group, msg.&label, msg.text])); + sl.Add(Format('[%s] (%s) %s: %s', [msg.time, msg.group, msg.&label, + msg.text])); end; fdt := FormatDateTime('mmddyy_hhnnss', TDateTime(Now)); - ForceDirectories(LogPath+'main\'); - sl.SaveToFile(LogPath+'main\log_'+fdt+'.txt'); + ForceDirectories(LogPath + 'main\'); + sl.SaveToFile(LogPath + 'main\log_' + fdt + '.txt'); sl.Free; end; @@ -123,9 +127,11 @@ function GetGroupFilter(msg: TLogMessage): TFilter; filter: TFilter; begin Result := nil; - for i := 0 to Pred(GroupFilters.Count) do begin + for i := 0 to Pred(GroupFilters.Count) do + begin filter := TFilter(GroupFilters[i]); - if filter.group = msg.group then begin + if filter.group = msg.group then + begin Result := filter; exit; end; @@ -138,9 +144,11 @@ function GetLabelFilter(msg: TLogMessage): TFilter; filter: TFilter; begin Result := nil; - for i := 0 to Pred(LabelFilters.Count) do begin + for i := 0 to Pred(LabelFilters.Count) do + begin filter := TFilter(LabelFilters[i]); - if (filter.&label = msg.&label) and (filter.group = msg.group) then begin + if (filter.&label = msg.&label) and (filter.group = msg.group) then + begin Result := filter; exit; end; @@ -164,14 +172,15 @@ procedure ShowProgressForm(parent: TForm; var pf: TProgressForm; sCaption, sLogSubPath: string); begin pf := TProgressForm.Create(parent); - pf.pfLogPath := LogPath + sLogSubPath + '\'; + //pf.pfLogPath := LogPath + sLogSubPath + '\'; pf.PopupParent := parent; pf.Caption := sCaption; - pf.SetMaxProgress(IntegerListSum(timeCosts, Pred(timeCosts.Count))); + pf.SetMaxProgress(IntegerListSum(TimeCosts, Pred(TimeCosts.Count))); pf.Show; end; initialization + begin BaseLog := TList.Create; Log := TList.Create; @@ -180,6 +189,7 @@ initialization end; finalization + begin FreeList(BaseLog); Log.Free; diff --git a/lib/mte/mtePluginSelectionForm.dfm b/lib/mte/mtePluginSelectionForm.dfm old mode 100644 new mode 100755 index 40e6315..e121693 --- a/lib/mte/mtePluginSelectionForm.dfm +++ b/lib/mte/mtePluginSelectionForm.dfm @@ -127,7 +127,7 @@ object PluginSelectionForm: TPluginSelectionForm Left = 136 Top = 24 Bitmap = { - 494C010103003400600011001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 + 494C010103003400040011001100FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000440000001100000001002000000000001012 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/lib/mte/mtePluginSelectionForm.pas b/lib/mte/mtePluginSelectionForm.pas old mode 100644 new mode 100755 index 424da27..0819520 --- a/lib/mte/mtePluginSelectionForm.pas +++ b/lib/mte/mtePluginSelectionForm.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, CommCtrl, Menus, ComCtrls, ImgList; + Dialogs, StdCtrls, CommCtrl, Menus, ComCtrls, ImgList, System.ImageList; type TPluginListItem = class(TObject) @@ -14,8 +14,10 @@ TPluginListItem = class(TObject) constructor Create; virtual; destructor Destroy; override; end; + TStringFunction = function(s: string): string of object; TStringListProcedure = procedure(fn: string; var sl: TStringList) of object; + TPluginSelectionForm = class(TForm) lvPlugins: TListView; btnCancel: TButton; @@ -44,13 +46,13 @@ TPluginSelectionForm = class(TForm) procedure lvPluginsChange(Sender: TObject; Item: TListItem; Change: TItemChange); procedure lvPluginsKeyPress(Sender: TObject; var Key: Char); - procedure DrawCheckbox(aCanvas: TCanvas; var x, y: Integer; state: Integer); + procedure DrawCheckbox(aCanvas: TCanvas; var X, Y: Integer; state: Integer); procedure DrawSubItems(ListView: TListView; var R: TRect; Item: TListItem); procedure DrawItem(ListView: TListView; var R: TRect; Item: TListItem); procedure lvPluginsDrawItem(Sender: TCustomListView; Item: TListItem; - Rect: TRect; State: TOwnerDrawState); - procedure lvPluginsMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); + Rect: TRect; state: TOwnerDrawState); + procedure lvPluginsMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); function GetMasterStatus(filename: string): Integer; procedure lvPluginsData(Sender: TObject; Item: TListItem); procedure FormClose(Sender: TObject; var Action: TCloseAction); @@ -119,7 +121,8 @@ procedure TPluginSelectionForm.btnOKClick(Sender: TObject); // clear checked plugins list slCheckedPlugins.Clear; // add checked plugins to slCheckedPlugins - for i := 0 to Pred(lvPlugins.Items.Count) do begin + for i := 0 to Pred(lvPlugins.Items.Count) do + begin ListItem := lvPlugins.Items[i]; if ListItem.StateIndex = cChecked then slCheckedPlugins.Add(ListItem.Caption); @@ -133,7 +136,7 @@ procedure TPluginSelectionForm.LoadFields(aListItem: TPluginListItem; i: Integer; begin // add plugin filename - aListItem.fields.Add(sPlugin); + aListItem.Fields.Add(sPlugin); // get comma separated plugin info in a TStringList sl := TStringList.Create; @@ -158,7 +161,8 @@ procedure TPluginSelectionForm.UpdateDisabled; slDisabled.Clear; sl := TStringList.Create; try - for i := 0 to Pred(lvPlugins.Items.Count) do begin + for i := 0 to Pred(lvPlugins.Items.Count) do + begin ListItem := TPluginListItem(ListItems[i]); filename := ListItem.Fields[0]; // if unchecked, skip @@ -166,7 +170,8 @@ procedure TPluginSelectionForm.UpdateDisabled; continue; // if checked, make sure its masters are checked GetPluginMasters(filename, sl); - for j := 0 to Pred(sl.Count) do begin + for j := 0 to Pred(sl.Count) do + begin index := slAllPlugins.IndexOf(sl[j]); // if master is not found, continue if (index = -1) then @@ -190,8 +195,10 @@ procedure TPluginSelectionForm.UpdateDisabled; procedure ToggleState(ListItem: TPluginListItem); begin case ListItem.StateIndex of - cChecked: ListItem.StateIndex := cUnChecked; - cUnChecked: ListItem.StateIndex := cChecked; + cChecked: + ListItem.StateIndex := cUnChecked; + cUnChecked: + ListItem.StateIndex := cChecked; end; end; @@ -204,10 +211,12 @@ procedure TPluginSelectionForm.lvPluginsChange(Sender: TObject; Item: TListItem; // update slMasters and slDependencies slMasters.Clear; slDependencies.Clear; - for i := 0 to Pred(lvPlugins.Items.Count) do begin + for i := 0 to Pred(lvPlugins.Items.Count) do + begin filename := TPluginListItem(ListItems[i]).Fields[0]; with lvPlugins.Items[i] do - if Selected then begin + if Selected then + begin GetPluginMasters(filename, slMasters); GetPluginDependencies(filename, slDependencies); end; @@ -223,14 +232,16 @@ function TPluginSelectionForm.GetMasterStatus(filename: string): Integer; begin // if file has masters that are missing from slAllPlugins, // return mstMissing - if slMissing.IndexOf(filename) > -1 then begin + if slMissing.IndexOf(filename) > -1 then + begin Result := mstMissing; exit; end; // if file has masters that are disabled, // return mstDisabled - if slDisabled.IndexOf(filename) > -1 then begin + if slDisabled.IndexOf(filename) > -1 then + begin Result := mstDisabled; exit; end; @@ -248,36 +259,42 @@ procedure TPluginSelectionForm.lvPluginsData(Sender: TObject; Item: TListItem); i: Integer; begin // get item data - aListItem := ListItems[Item.Index]; + aListItem := ListItems[Item.index]; Item.Caption := aListItem.Fields[0]; Item.StateIndex := aListItem.StateIndex; // get subitems - for i := 1 to Pred(aListItem.fields.Count) do - Item.SubItems.Add(aListItem.fields[i]); + for i := 1 to Pred(aListItem.Fields.Count) do + Item.SubItems.Add(aListItem.Fields[i]); // set font color based on master status of item lvPlugins.Canvas.Font.Style := [fsBold]; MasterStatus := GetMasterStatus(Item.Caption); case MasterStatus of - mstNone: begin - lvPlugins.Canvas.Font.Style := []; - lvPlugins.Canvas.Font.Color := clBlack; - end; - mstMaster: lvPlugins.Canvas.Font.Color := clGreen; - mstDependency: lvPlugins.Canvas.Font.Color := clMaroon; - mstBoth: lvPlugins.Canvas.Font.Color := clPurple; - mstMissing: begin - lvPlugins.Canvas.Font.Style := [fsItalic]; - lvPlugins.Canvas.Font.Color := clGray; - end; - mstDisabled: begin - lvPlugins.Canvas.Font.Style := [fsItalic]; - lvPlugins.Canvas.Font.Color := clRed; - end; + mstNone: + begin + lvPlugins.Canvas.Font.Style := []; + lvPlugins.Canvas.Font.Color := clBlack; + end; + mstMaster: + lvPlugins.Canvas.Font.Color := clGreen; + mstDependency: + lvPlugins.Canvas.Font.Color := clMaroon; + mstBoth: + lvPlugins.Canvas.Font.Color := clPurple; + mstMissing: + begin + lvPlugins.Canvas.Font.Style := [fsItalic]; + lvPlugins.Canvas.Font.Color := clGray; + end; + mstDisabled: + begin + lvPlugins.Canvas.Font.Style := [fsItalic]; + lvPlugins.Canvas.Font.Color := clRed; + end; end; end; -procedure TPluginSelectionForm.DrawCheckbox(aCanvas: TCanvas; var x, y: Integer; +procedure TPluginSelectionForm.DrawCheckbox(aCanvas: TCanvas; var X, Y: Integer; state: Integer); var icon: TIcon; @@ -286,8 +303,8 @@ procedure TPluginSelectionForm.DrawCheckbox(aCanvas: TCanvas; var x, y: Integer; exit; icon := TIcon.Create; StateImages.GetIcon(state, icon); - aCanvas.Draw(x, y, icon); - Inc(x, 17); + aCanvas.Draw(X, Y, icon); + Inc(X, 17); icon.Free; end; @@ -296,7 +313,8 @@ procedure TPluginSelectionForm.DrawSubItems(ListView: TListView; var R: TRect; var i: Integer; begin - for i := 0 to Pred(Item.SubItems.Count) do begin + for i := 0 to Pred(Item.SubItems.Count) do + begin // redefine rect to draw in the space for the column // use trailing padding to keep items lined up on columns R.Left := R.Right; @@ -330,13 +348,14 @@ procedure TPluginSelectionForm.DrawItem(ListView: TListView; var R: TRect; end; procedure TPluginSelectionForm.lvPluginsDrawItem(Sender: TCustomListView; - Item: TListItem; Rect: TRect; State: TOwnerDrawState); + Item: TListItem; Rect: TRect; state: TOwnerDrawState); var ListView: TListView; begin // draw background color ListView := TListView(Sender); - if Item.Selected then begin + if Item.Selected then + begin ListView.Canvas.Brush.Color := $FFEEDD; ListView.Canvas.FillRect(Rect); end; @@ -362,21 +381,26 @@ procedure TPluginSelectionForm.lvPluginsKeyPress(Sender: TObject; // If we are within the buffer delay append the key to a // temporary buffer and search for next item matching the // buffer in the list view items. - if fBufferDiff < fBufferDelay then begin + if fBufferDiff < fBufferDelay then + begin fLastBufferTime := Now; sTempBuffer := sBuffer + Key; iFoundIndex := ListView_NextMatch(lvPlugins, sTempBuffer, 0); // If we found a match, handle it - if iFoundIndex > -1 then begin + if iFoundIndex > -1 then + begin ListView_HandleMatch(lvPlugins, iFoundIndex, sBuffer, sTempBuffer); Key := #0; end; end - else begin + else + begin // Allow user to use space to toggle checkbox state // for all selected items - if Key = ' ' then begin - for i := 0 to Pred(lvPlugins.Items.Count) do begin + if Key = ' ' then + begin + for i := 0 to Pred(lvPlugins.Items.Count) do + begin ListItem := lvPlugins.Items[i]; if ListItem.Selected then if slMissing.IndexOf(slAllPlugins[i]) = -1 then @@ -395,16 +419,17 @@ procedure TPluginSelectionForm.lvPluginsKeyPress(Sender: TObject; lvPlugins.ClearSelection; iFoundIndex := ListView_NextMatch(lvPlugins, sTempBuffer, 0); // If we found a match, handle it - if iFoundIndex > -1 then begin + if iFoundIndex > -1 then + begin ListView_HandleMatch(lvPlugins, iFoundIndex, sBuffer, sTempBuffer); Key := #0; end; end; end; -function OnStateIcon(X, Y: Integer): Boolean; +function OnStateIcon(X, Y: Integer): boolean; begin - Result := (x >= 2) and (x <= 14); + Result := (X >= 2) and (X <= 14); end; procedure TPluginSelectionForm.lvPluginsMouseDown(Sender: TObject; @@ -414,9 +439,10 @@ procedure TPluginSelectionForm.lvPluginsMouseDown(Sender: TObject; begin // toggle checkbox state ListItem := lvPlugins.GetItemAt(X, Y); - if OnStateIcon(X, Y) then begin - if slMissing.IndexOf(slAllPlugins[ListItem.Index]) = -1 then - ToggleState(TPluginListItem(ListItems[ListItem.Index])); + if OnStateIcon(X, Y) then + begin + if slMissing.IndexOf(slAllPlugins[ListItem.index]) = -1 then + ToggleState(TPluginListItem(ListItems[ListItem.index])); // repaint to show updated checkbox state UpdateDisabled; @@ -428,7 +454,7 @@ procedure TPluginSelectionForm.lvPluginsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var pt: TPoint; - li : TListItem; + li: TListItem; hint, str: string; slTempMasters, slTempReq: TStringList; i: Integer; @@ -442,7 +468,8 @@ procedure TPluginSelectionForm.lvPluginsMouseMove(Sender: TObject; slTempMasters := TStringList.Create; try GetPluginMasters(li.Caption, slTempMasters); - if slMissing.IndexOf(li.Caption) > -1 then begin + if slMissing.IndexOf(li.Caption) > -1 then + begin str := ''; for i := 0 to Pred(slTempMasters.Count) do if slAllPlugins.IndexOf(slTempMasters[i]) = -1 then @@ -469,10 +496,11 @@ procedure TPluginSelectionForm.lvPluginsMouseMove(Sender: TObject; hint := Trim(hint); // activate hint if it differs from previously displayed hint - if (hint <> sLastHint) then begin + if (hint <> sLastHint) then + begin sLastHint := hint; - lvPlugins.ShowHint := True; - lvPlugins.Hint := hint; + lvPlugins.ShowHint := true; + lvPlugins.hint := hint; Application.ActivateHint(Mouse.CursorPos); end; end; @@ -507,7 +535,8 @@ procedure TPluginSelectionForm.FormShow(Sender: TObject); try sl.CommaText := sColumns; iColumnSize := (lvPlugins.ClientWidth - 300) div (sl.Count - 1); - for i := 0 to Pred(sl.Count) do begin + for i := 0 to Pred(sl.Count) do + begin aColumn := lvPlugins.Columns.Add; aColumn.Caption := sl[i]; aColumn.Width := IfThenInt(i = 0, 300, iColumnSize); @@ -519,7 +548,8 @@ procedure TPluginSelectionForm.FormShow(Sender: TObject); end; // add plugin items to list - for i := 0 to Pred(slAllPlugins.Count) do begin + for i := 0 to Pred(slAllPlugins.Count) do + begin sPlugin := slAllPlugins[i]; aListItem := TPluginListItem.Create; // check ListItem if it's in the CheckedPlugins list @@ -534,12 +564,14 @@ procedure TPluginSelectionForm.FormShow(Sender: TObject); // are missing sl := TStringList.Create; try - for i := 0 to Pred(slAllPlugins.Count) do begin + for i := 0 to Pred(slAllPlugins.Count) do + begin sPlugin := slAllPlugins[i]; aListItem := TPluginListItem(ListItems[i]); GetPluginMasters(sPlugin, sl); for j := 0 to Pred(sl.Count) do - if slAllPlugins.IndexOf(sl[j]) = -1 then begin + if slAllPlugins.IndexOf(sl[j]) = -1 then + begin slMissing.Add(sPlugin); aListItem.StateIndex := cUnChecked; break; @@ -561,7 +593,7 @@ procedure TPluginSelectionForm.FormShow(Sender: TObject); procedure TPluginSelectionForm.PluginsPopupMenuPopup(Sender: TObject); var - bHasMasters, bHasDependencies: Boolean; + bHasMasters, bHasDependencies: boolean; begin bHasMasters := slMasters.Count > 0; bHasDependencies := slDependencies.Count > 0; @@ -612,7 +644,8 @@ procedure TPluginSelectionForm.CheckMastersItemClick(Sender: TObject); i, index: Integer; begin // loop through masters of selected plugins - for i := 0 to Pred(slMasters.Count) do begin + for i := 0 to Pred(slMasters.Count) do + begin index := slAllPlugins.IndexOf(slMasters[i]); // if the masters isn't loaded, skip it if index = -1 then @@ -631,7 +664,8 @@ procedure TPluginSelectionForm.UncheckMastersItemClick(Sender: TObject); i, index: Integer; begin // loop through masters of selected plugins - for i := 0 to Pred(slMasters.Count) do begin + for i := 0 to Pred(slMasters.Count) do + begin index := slAllPlugins.IndexOf(slMasters[i]); // if the masters isn't loaded, skip it if index = -1 then @@ -650,7 +684,8 @@ procedure TPluginSelectionForm.CheckDependenciesItemClick(Sender: TObject); i, index: Integer; begin // loop through dependencies of selected plugins - for i := 0 to Pred(slDependencies.Count) do begin + for i := 0 to Pred(slDependencies.Count) do + begin index := slAllPlugins.IndexOf(slDependencies[i]); // check it TPluginListItem(ListItems[index]).StateIndex := cChecked; @@ -666,7 +701,8 @@ procedure TPluginSelectionForm.UncheckDependenciesItemClick(Sender: TObject); i, index: Integer; begin // loop through dependencies of selected plugins - for i := 0 to Pred(slDependencies.Count) do begin + for i := 0 to Pred(slDependencies.Count) do + begin index := slAllPlugins.IndexOf(slDependencies[i]); // uncheck it TPluginListItem(ListItems[index]).StateIndex := cUnChecked; diff --git a/lib/mte/mteProgressForm.dfm b/lib/mte/mteProgressForm.dfm old mode 100644 new mode 100755 index 878b1e7..d309dbd --- a/lib/mte/mteProgressForm.dfm +++ b/lib/mte/mteProgressForm.dfm @@ -39,6 +39,7 @@ object ProgressForm: TProgressForm ReadOnly = True ScrollBars = ssVertical TabOrder = 0 + WordWrap = False end object DetailsButton: TButton Left = 428 diff --git a/lib/mte/mteProgressForm.pas b/lib/mte/mteProgressForm.pas old mode 100644 new mode 100755 index 1970cd2..a574a6c --- a/lib/mte/mteProgressForm.pas +++ b/lib/mte/mteProgressForm.pas @@ -3,10 +3,12 @@ interface uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Windows, Math, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, // mte components - W7Taskbar, mteTracker; + W7Taskbar, mteTracker, + // third party + LoggerPro; type TProgressForm = class(TForm) @@ -18,7 +20,6 @@ TProgressForm = class(TForm) procedure UpdateProgress(const i: Integer); procedure StatusMessage(const s: string); procedure Write(const s: string); - procedure SaveLog; procedure SetProgress(const i: Integer); procedure SetMaxProgress(const i: Integer); function GetProgress: Integer; @@ -31,28 +32,38 @@ TProgressForm = class(TForm) procedure FormShow(Sender: TObject); private { Private declarations } + FLog: ILogWriter; public - bDetailsVisible: boolean; - pfLogPath: string; + bDetailsVisible: Boolean; end; implementation +uses + {$IFDEF DEBUG} + // Only useful for us in debug builds? + LoggerPro.OutputDebugStringAppender, + {$ENDIF} + LoggerPro.VCLMemoAppender, + LoggerPro.FileAppender; + var - lastHeight: integer; + lastHeight: Integer; {$R *.dfm} procedure TProgressForm.ToggleDetails(Sender: TObject); begin bDetailsVisible := not bDetailsVisible; - if bDetailsVisible then begin + if bDetailsVisible then + begin self.Height := lastHeight; DetailsMemo.Visible := true; DetailsButton.Caption := 'Hide details'; DetailsMemo.Height := self.Height - 135; end - else begin + else + begin DetailsMemo.Visible := false; DetailsButton.Caption := 'Show details'; lastHeight := self.Height; @@ -80,8 +91,9 @@ procedure TProgressForm.FormClose(Sender: TObject; var Action: TCloseAction); procedure TProgressForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := (fsModal in FormState); - //Tracker.Write('CanClose = '+BoolToStr(CanClose, true)); - if not (CanClose or Tracker.Cancel) then begin + // Tracker.Write('CanClose = '+BoolToStr(CanClose, true)); + if not(CanClose or Tracker.Cancel) then + begin Tracker.Write('Cancelling...'); SetTaskbarProgressState(tbpsError); Tracker.Cancel := true; @@ -101,16 +113,26 @@ procedure TProgressForm.FormCreate(Sender: TObject); Tracker.OnStatusEvent := StatusMessage; Tracker.OnGetEvent := GetProgress; Tracker.OnGetMaxEvent := GetMaxProgress; + FLog := BuildLogWriter([ + {$IFDEF DEBUG} + // Only useful for us in debug builds? + TLoggerProOutputDebugStringAppender.Create(), + {$ENDIF} + TLoggerProFileAppender.Create(4, Floor(High(Integer) / 1024)), + TVCLMemoLogAppender.Create(DetailsMemo) + ]); end; procedure TProgressForm.FormShow(Sender: TObject); begin - if (fsModal in FormState) then begin + if (fsModal in FormState) then + begin CancelButton.Caption := 'Close'; if not bDetailsVisible then ToggleDetails(nil); end - else if not bDetailsVisible then begin + else if not bDetailsVisible then + begin bDetailsVisible := false; DetailsMemo.Visible := false; DetailsButton.Caption := 'Show details'; @@ -146,19 +168,6 @@ procedure TProgressForm.UpdateProgress(const i: Integer); SetTaskbarProgressValue(ProgressBar.Position, ProgressBar.Max); end; -procedure TProgressForm.SaveLog; -var - fdt: string; -begin - try - ForceDirectories(pfLogPath); - fdt := FormatDateTime('mmddyy_hhnnss', TDateTime(Now)); - DetailsMemo.Lines.SaveToFile(pfLogPath + 'log_'+fdt+'.txt'); - except on Exception do - // nothing to do - end; -end; - procedure TProgressForm.StatusMessage(const s: string); begin ProgressLabel.Caption := s; @@ -167,9 +176,8 @@ procedure TProgressForm.StatusMessage(const s: string); procedure TProgressForm.Write(const s: string); begin if Pos(' ', s) <> 1 then - ProgressLabel.Caption := s; - DetailsMemo.SelLength := 0; - DetailsMemo.Lines.Add(s); + StatusMessage(s); + FLog.Info(s, Tracker.Tag); end; end. diff --git a/lib/mte/mteTaskHandler.pas b/lib/mte/mteTaskHandler.pas old mode 100644 new mode 100755 index f79b50e..8ff3cf2 --- a/lib/mte/mteTaskHandler.pas +++ b/lib/mte/mteTaskHandler.pas @@ -9,17 +9,20 @@ interface type TProcedure = procedure of object; - TTask = class (TObject) + + TTask = class(TObject) private - FExecute : TProcedure; + FExecute: TProcedure; public name: string; rate: real; lastExecuted: TDateTime; - constructor Create(name: string; rate: real; FExecute: TProcedure); Overload; + constructor Create(name: string; rate: real; FExecute: TProcedure); + Overload; property OnExecute: TProcedure read FExecute write FExecute; procedure Execute; end; + TTaskHandler = class(TObject) public TaskList: TList; @@ -48,9 +51,11 @@ procedure TTaskHandler.RemoveTask(taskName: string); if not Assigned(TaskList) then exit; - for i := Pred(TaskList.Count) downto 0 do begin + for i := Pred(TaskList.Count) downto 0 do + begin task := TTask(TaskList[i]); - if task.name = taskName then begin + if task.name = taskName then + begin TaskList.Delete(i); break; end; @@ -68,9 +73,11 @@ procedure TTaskHandler.ExecTasks; bExecutingTasks := true; // loop through task list, executing tasks that are ready to be executed - for i := Pred(TaskList.Count) downto 0 do begin + for i := Pred(TaskList.Count) downto 0 do + begin task := TTask(TaskList[i]); - if (Now - task.lastExecuted >= task.rate) then begin + if (Now - task.lastExecuted >= task.rate) then + begin if bLogTasks and (task.rate > 60.0 * seconds) then Logger.Write('TASK', 'Execute', task.name); task.lastExecuted := Now; @@ -87,12 +94,11 @@ constructor TTaskHandler.Create; TaskList := TList.Create; end; - -{******************************************************************************} +{ ****************************************************************************** } { Task methods Object methods for TTask } -{******************************************************************************} +{ ****************************************************************************** } constructor TTask.Create(name: string; rate: real; FExecute: TProcedure); begin @@ -106,9 +112,8 @@ constructor TTask.Create(name: string; rate: real; FExecute: TProcedure); procedure TTask.Execute; begin - if Assigned(FExecute) then - FExecute; + if Assigned(FExecute) then + FExecute; end; end. - diff --git a/lib/mte/mteTracker.pas b/lib/mte/mteTracker.pas old mode 100644 new mode 100755 index c893018..499b1d9 --- a/lib/mte/mteTracker.pas +++ b/lib/mte/mteTracker.pas @@ -20,6 +20,7 @@ TProgressTracker = class FStatusEvent : TLogEvent; public Cancel: boolean; + Tag: string; procedure SetMaxProgress(const i: integer); property OnSetMaxEvent: TUpdateEvent read FMaxEvent write FMaxEvent; procedure SetProgress(const i: integer); diff --git a/lib/xedit b/lib/xedit new file mode 160000 index 0000000..a352b0d --- /dev/null +++ b/lib/xedit @@ -0,0 +1 @@ +Subproject commit a352b0d50350b637f803286c0b6ab36a61581eb1 diff --git a/lib/xedit/lz4/lz4.pas b/lib/xedit/lz4/lz4.pas deleted file mode 100644 index 171a9fa..0000000 --- a/lib/xedit/lz4/lz4.pas +++ /dev/null @@ -1,1079 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) -unit lz4; -{$POINTERMATH ON} - -interface - -uses Windows, lz4Common; - -const - LZ4_VERSION_MAJOR = 1; - LZ4_VERSION_MINOR = 5; - LZ4_VERSION_RELEASE = 0; - LZ4_MEMORY_USAGE = 14; - LZ4_STREAMSIZE_U64 = (1 shl (LZ4_MEMORY_USAGE - 3)) + 4; - LZ4_STREAMSIZE = LZ4_STREAMSIZE_U64 * sizeof(int64); - LZ4_MAX_INPUT_SIZE = $7E000000; - LZ4_UNALIGNED_ACCESS = 1; - LZ4_STREAMDECODESIZE_U64 = 4; - -type - PLZ4_stream_t = ^LZ4_stream_t; - - LZ4_stream_t = record - table: array [0 .. LZ4_STREAMSIZE_U64 - 1] of int64; - end; - - PLZ4_streamDecode_t = ^LZ4_streamDecode_t; - - LZ4_streamDecode_t = record - table: array [0 .. LZ4_STREAMDECODESIZE_U64 - 1] of int64; - end; - -function LZ4_versionNumber: integer; -function LZ4_compressBound(iSize: cardinal): cardinal; -function LZ4_create(inputBuffer: pAnsiChar): pointer; -function LZ4_createStream: PLZ4_stream_t; -procedure LZ4_freeStream(LZ4_streamPtr: PLZ4_stream_t); -function LZ4_createStreamDecode: PLZ4_streamDecode_t; -procedure LZ4_freeStreamDecode(LZ4_stream: PLZ4_streamDecode_t); -function LZ4_compress(source: pAnsiChar; dest: pAnsiChar; sourceSize: integer): integer; -function LZ4_decompress_safe(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxDecompressedSize: integer): integer; -function LZ4_compress_continue(LZ4_stream: pointer; const ASource: pointer; ADestination: pointer; AInputSize: integer): integer; -function LZ4_saveDict(LZ4_streamPtr: PLZ4_stream_t; safeBuffer: pointer; dictSize: integer): integer; -function LZ4_decompress_safe_continue(LZ4_streamDecode: PLZ4_streamDecode_t; source: pointer; dest: pointer; compressedSize: integer; - maxDecompressedSize: integer): integer; -function LZ4_compress_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer): integer; -function LZ4_compress_withState(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -function LZ4_compress_limitedOutput_withState(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -function LZ4_compress_limitedOutput_continue(LZ4_stream: PLZ4_stream_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -procedure LZ4_resetStream(LZ4_stream: PLZ4_stream_t); -function LZ4_loadDict(LZ4_dict: PLZ4_stream_t; dictionary: pAnsiChar; dictSize: integer): integer; -// debug function -function LZ4_compress_forceExtDict(LZ4_dict: PLZ4_stream_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -function LZ4_decompress_fast(source: pAnsiChar; dest: pAnsiChar; originalSize: integer): integer; -function LZ4_decompress_fast_withPrefix64k(source: pAnsiChar; dest: pAnsiChar; originalSize: integer): integer; -function LZ4_decompress_fast_usingDict(source: pAnsiChar; dest: pAnsiChar; originalSize: integer; const dictStart: pAnsiChar; - dictSize: integer): integer; -function LZ4_decompress_safe_withPrefix64k(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer): integer; -function LZ4_decompress_safe_usingDict(const source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer; - const dictStart: pAnsiChar; dictSize: integer): integer; -function LZ4_decompress_safe_partial(const source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; targetOutputSize: integer; - maxDecompressedSize: integer): integer; -function LZ4_decompress_safe_forceExtDict(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer; - const dictStart: pAnsiChar; dictSize: integer): integer; - -// replaced with move(source^, dest^, count) -// procedure memmove(dest, source: pointer; count: integer); cdecl; external 'msvcrt.dll' name 'memmove'; - -implementation - -const - LZ4_HASHLOG = LZ4_MEMORY_USAGE - 2; - HASHTABLESIZE = 1 shl LZ4_MEMORY_USAGE; - HASH_SIZE_U32 = 1 shl LZ4_HASHLOG; - -type - limitedOutput_directive = (notLimited = 0, limitedOutput = 1); - tableType_t = (byPtr, byU32, byU16); - dict_directive = (noDict = 0, withPrefix64k, usingExtDict); - dictIssue_directive = (noDictIssue = 0, dictSmall); - endCondition_directive = (endOnOutputSize = 0, endOnInputSize = 1); - earlyEnd_directive = (full = 0, partial = 1); - - PLZ4_stream_t_internal = ^LZ4_stream_t_internal; - - LZ4_stream_t_internal = record - hashTable: array [0 .. HASH_SIZE_U32 - 1] of cardinal; - currentOffset: cardinal; - initCheck: cardinal; - dictionary: pByte; - bufferStart: pByte; - dictSize: cardinal; - end; - - PLZ4_streamDecode_t_internal = ^LZ4_streamDecode_t_internal; - - LZ4_streamDecode_t_internal = record - externalDict: pByte; - extDictSize: size_t; - prefixEnd: pByte; - prefixSize: size_t; - end; - -var - LZ4_64Klimit: integer = 65536 + _MFLIMIT - 1; - LZ4_skipTrigger: cardinal = 6; - LZ4_minLength: integer = (_MFLIMIT + 1); - -function LZ4_versionNumber: integer; -begin - result := LZ4_VERSION_MAJOR * 100 * 100 + LZ4_VERSION_MINOR * 100 + LZ4_VERSION_RELEASE; -end; - -function LZ4_compressBound(iSize: cardinal): cardinal; -begin - if (iSize) > cardinal(LZ4_MAX_INPUT_SIZE) then - result := 0 - else - result := iSize + (iSize div 255 + 16) -end; - -procedure LZ4_copy8(const dstPtr: pointer; const srcPtr: pointer); inline; -begin -{$IFDEF WIN64} - pUint64(dstPtr)^ := pUint64(srcPtr)^; -{$ELSE} - pCardinal(dstPtr)[0] := pCardinal(srcPtr)[0]; - pCardinal(dstPtr)[1] := pCardinal(srcPtr)[1]; -{$ENDIF} -end; - -function LZ4_hashSequence(sequence: cardinal; tableType: tableType_t): cardinal; inline; -const - SHL1 = (MINMATCH * 8) - (LZ4_HASHLOG + 1); - SHL2 = ((MINMATCH * 8) - LZ4_HASHLOG); -begin - if (tableType = byU16) then - result := (sequence * 2654435761) shr SHL1 - else - result := (sequence * 2654435761) shr SHL2; -end; - -function LZ4_hashPosition(const p: pByte; tableType: tableType_t): cardinal; inline; -begin - result := LZ4_hashSequence(pCardinal(p)^, tableType); -end; - -procedure LZ4_putPositionOnHash(const p: pByte; h: cardinal; tableBase: pointer; tableType: tableType_t; const srcBase: pByte); inline; -begin - case tableType of - byPtr: ppByte(tableBase)[h] := p; - byU32: pCardinal(tableBase)[h] := cardinal(p - srcBase); - byU16: pWord(tableBase)[h] := word(p - srcBase); - end; -end; - -function LZ4_getPositionOnHash(h: cardinal; tableBase: pointer; tableType: tableType_t; const srcBase: pByte): pByte; inline; -begin - if (tableType = byPtr) then - result := ppByte(tableBase)[h] - else if (tableType = byU32) then - result := pCardinal(tableBase)[h] + srcBase - else - result := pWord(tableBase)[h] + srcBase; -end; - -function LZ4_getPosition(const p: pByte; tableBase: pointer; tableType: tableType_t; const srcBase: pByte): pByte; inline; -var - h: cardinal; -begin - h := LZ4_hashPosition(p, tableType); - result := LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); -end; - -procedure LZ4_putPosition(const p: pByte; tableBase: pointer; tableType: tableType_t; const srcBase: pByte); inline; -var - h: cardinal; -begin - h := LZ4_hashPosition(p, tableType); - LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); -end; - -function LZ4_compress_generic(ctx: pointer; const source: pointer; dest: pointer; inputSize: integer; maxOutputSize: integer; - outputLimited: limitedOutput_directive; tableType: tableType_t; dict: dict_directive; dictIssue: dictIssue_directive): integer; inline; -var - lowRefLimit: pByte; - match: pByte; - refDelta: size_t; - ip: pByte; - - dictPtr: PLZ4_stream_t_internal; - base: pByte; - lowLimit: pByte; - dictionary: pByte; - dictEnd: pByte; - dictDelta: size_t; - anchor: pByte; - iend: pByte; - mflimit: pByte; - matchlimit: pByte; - op: pByte; - olimit: pByte; - forwardH: cardinal; - lastRun: integer; - token: pByte; - forwardIp: pByte; - step: cardinal; - searchMatchNb: cardinal; - h: cardinal; - litLength: cardinal; - len: integer; - matchLength: cardinal; - limit: pByte; - more: cardinal; - booleanValue: boolean; -label - _last_literals, _next_match; -begin - match := nil; - dictPtr := ctx; - ip := pByte(source); - lowRefLimit := ip - dictPtr.dictSize; - dictionary := dictPtr.dictionary; - dictEnd := dictionary + dictPtr.dictSize; - dictDelta := dictEnd - pByte(source); - anchor := pByte(source); - iend := ip + inputSize; - mflimit := iend - _MFLIMIT; - matchlimit := iend - LASTLITERALS; - - op := pByte(dest); - olimit := op + maxOutputSize; - refDelta := 0; - - if cardinal(inputSize) > cardinal(LZ4_MAX_INPUT_SIZE) then - exit(0); - - case dict of - withPrefix64k: - begin - base := pByte(source) - dictPtr.currentOffset; - lowLimit := pByte(source) - dictPtr.dictSize; - end; - usingExtDict: - begin - base := pByte(source) - dictPtr.currentOffset; - lowLimit := pByte(source); - end; - else - begin - base := pByte(source); - lowLimit := pByte(source); - end; - end; - - if ((tableType = byU16) and (inputSize >= LZ4_64Klimit)) then - exit(0); - if (inputSize < LZ4_minLength) then - goto _last_literals; - - LZ4_putPosition(ip, ctx, tableType, base); - inc(ip); - forwardH := LZ4_hashPosition(ip, tableType); - - while true do - begin - forwardIp := ip; - step := 1; - searchMatchNb := (1 shl LZ4_skipTrigger); - while true do - begin - h := forwardH; - ip := forwardIp; - inc(forwardIp, step); - step := searchMatchNb shr LZ4_skipTrigger; - inc(searchMatchNb); - - if forwardIp > mflimit then - goto _last_literals; - - match := LZ4_getPositionOnHash(h, ctx, tableType, base); - if (dict = usingExtDict) then - begin - if match < pByte(source) then - begin - refDelta := dictDelta; - lowLimit := dictionary; - end - else - begin - refDelta := 0; - lowLimit := pByte(source); - end; - end; - forwardH := LZ4_hashPosition(forwardIp, tableType); - LZ4_putPositionOnHash(ip, h, ctx, tableType, base); - if (dictIssue = dictSmall) and (match < lowRefLimit) then - continue; - if not(tableType = byU16) and (match + MAX_DISTANCE < ip) then - continue; - if (pCardinal(match + refDelta)^ <> pCardinal(ip)^) then - continue; - break; - end; - - while (ip > anchor) and (match + refDelta > lowLimit) and (ip[-1] = match[refDelta - 1]) do - begin - dec(ip); - dec(match); - end; - litLength := cardinal(ip - anchor); - token := op; - inc(op); - if (outputLimited <> notLimited) and (op + litLength + (2 + 1 + LASTLITERALS) + (litLength div 255) > olimit) then - exit(0); - if (litLength >= RUN_MASK) then - begin - len := integer(litLength - RUN_MASK); - token^ := (RUN_MASK shl ML_BITS); - while len >= 255 do - begin - op^ := 255; - inc(op); - dec(len, 255); - end; - op^ := BYTE(len); - inc(op); - end - else - token^ := BYTE(litLength shl ML_BITS); - LZ4_wildCopy(op, anchor, op + litLength); - inc(op, litLength); - _next_match: - pWord(op)^ := word(ip - match); - inc(op, 2); - - if (dict = usingExtDict) and (lowLimit = dictionary) then - begin - inc(match, refDelta); - limit := ip + (dictEnd - match); - if (limit > matchlimit) then - limit := matchlimit; - matchLength := LZ4_count(ip + MINMATCH, match + MINMATCH, limit); - inc(ip, MINMATCH + matchLength); - if (ip = limit) then - begin - more := LZ4_count(ip, pByte(source), matchlimit); - inc(matchLength, more); - inc(ip, more); - end; - end - else - begin - matchLength := LZ4_count(ip + MINMATCH, match + MINMATCH, matchlimit); - inc(ip, MINMATCH + matchLength); - end; - if (outputLimited <> notLimited) and (op + (1 + LASTLITERALS) + (matchLength shr 8) > olimit) then - exit(0); - if (matchLength >= ML_MASK) then - begin - inc(token^, ML_MASK); - dec(matchLength, ML_MASK); - while matchLength >= 510 do - begin - pWord(op)^ := $FFFF; - inc(op, 2); - // op^ := 255; - // inc(op); - // op^ := 255; - // inc(op); - dec(matchLength, 510); - end; - if (matchLength >= 255) then - begin - dec(matchLength, 255); - op^ := 255; - inc(op); - end; - op^ := BYTE(matchLength); - inc(op); - end - else - inc(token^, BYTE(matchLength)); - - anchor := ip; - if (ip > mflimit) then - break; - LZ4_putPosition(ip - 2, ctx, tableType, base); - match := LZ4_getPosition(ip, ctx, tableType, base); - if (dict = usingExtDict) then - begin - if match < pByte(source) then - begin - refDelta := dictDelta; - lowLimit := dictionary; - end - else - begin - refDelta := 0; - lowLimit := pByte(source); - end; - end; - LZ4_putPosition(ip, ctx, tableType, base); - - if dictIssue = dictSmall then - booleanValue := match >= lowRefLimit - else - booleanValue := true; - if (booleanValue and (match + MAX_DISTANCE >= ip) - and (pCardinal(match + refDelta)^ = pCardinal(ip)^)) then - begin - token := op; - inc(op); - token^ := 0; - goto _next_match; - end; - inc(ip); - forwardH := LZ4_hashPosition(ip, tableType); - end; - -_last_literals: - lastRun := integer(iend - anchor); - if (outputLimited <> notLimited) and ((op - pByte(dest)) + lastRun + 1 + ((lastRun + 255 - RUN_MASK) div 255) > - maxOutputSize) - then - exit(0); - if lastRun >= integer(RUN_MASK) then - begin - op^ := (RUN_MASK shl ML_BITS); - inc(op); - dec(lastRun, RUN_MASK); - while lastRun >= 255 do - begin - op^ := 255; - inc(op); - dec(lastRun, 255); - end; - op^ := BYTE(lastRun); - inc(op); - end - else - begin - op^ := BYTE(lastRun shl ML_BITS); - inc(op); - end; - move(anchor^, op^, iend - anchor); - inc(op, iend - anchor); - - result := integer(op - pByte(dest)); -end; - -function LZ4_compress(source: pAnsiChar; dest: pAnsiChar; sourceSize: integer): integer; -var - ctx: array [0 .. LZ4_STREAMSIZE_U64 - 1] of uint64; -begin - fillchar(ctx, sizeof(ctx), 0); - if sourceSize < LZ4_64Klimit then - result := LZ4_compress_generic(@ctx, source, dest, sourceSize, 0, notLimited, byU16, noDict, noDictIssue) - else - begin -{$IFDEF WIN64} - result := LZ4_compress_generic(@ctx, source, dest, sourceSize, 0, notLimited, byU32, noDict, - noDictIssue) -{$ELSE} - result := LZ4_compress_generic(@ctx, source, dest, sourceSize, 0, notLimited, byPtr, noDict, noDictIssue); -{$ENDIF} - end; -end; - -function LZ4_decompress_generic(const source: pointer; const dest: pointer; inputSize: integer; outputSize: integer; - endOnInput: integer; partialDecoding: integer; targetOutputSize: integer; dict: integer; - const lowPrefix: pByte; const dictStart: pByte; const dictSize: size_t): integer; inline; -var - ip: pByte; - iend: pByte; - op: pByte; - oend: pByte; - cpy: pByte; - oexit: pByte; - lowLimit: pByte; - dictEnd: pByte; - safeDecode: boolean; - checkOffset: boolean; - token: cardinal; - length: size_t; - match: pByte; - s: cardinal; - booleantest: boolean; - copySize: size_t; - endOfMatch: pByte; - copyFrom: pByte; - dec64: size_t; -const - dec32table: array [0 .. 7] of size_t = (4, 1, 2, 1, 4, 4, 4, 4); - dec64table: array [0 .. 7] of size_t = (0, 0, 0, size_t(-1), 0, 1, 2, 3); -label - _output_error; -begin - ip := pByte(source); - iend := ip + inputSize; - op := pByte(dest); - oend := op + outputSize; - oexit := op + targetOutputSize; - lowLimit := lowPrefix - dictSize; - dictEnd := pByte(dictStart) + dictSize; - safeDecode := (endOnInput = integer(endOnInputSize)); - checkOffset := ((safeDecode) and (dictSize < 65536)); - - if (partialDecoding <> 0) and (oexit > oend - _MFLIMIT) then - oexit := oend - _MFLIMIT; - if (endOnInput <> 0) and (outputSize = 0) then - begin - if (inputSize = 1) and (ip^ = 0) then - exit(0) - else - exit(-1); - end; - if (endOnInput = 0) and (outputSize = 0) then - begin - if ip^ = 0 then - exit(1) - else - exit(-1); - end; - - while true do - begin - token := ip^; - inc(ip); - length := token shr ML_BITS; - if length = RUN_MASK then - begin - while true do - begin - s := ip^; - inc(ip); - inc(length, s); - if endOnInput <> 0 then - begin - if not(ip < iend - RUN_MASK) then - break; - end; - if s <> 255 then - break; - end; - if safeDecode and (size_t(op + length) < size_t(op)) then - goto _output_error; - if safeDecode and (size_t(ip + length) < size_t(ip)) then - goto _output_error; - end; - cpy := op + length; - if partialDecoding <> 0 then - booleantest := cpy > oexit - else - booleantest := cpy > oend - _MFLIMIT; - - if ((endOnInput <> 0) and ((booleantest) or (ip + length > iend - (2 + 1 + LASTLITERALS)))) - or ((endOnInput = 0) and (cpy > oend - COPYLENGTH)) then - begin - if partialDecoding <> 0 then - begin - if (cpy > oend) then - goto _output_error; - if ((endOnInput <> 0) and (ip + length > iend)) then - goto _output_error; - end - else - begin - if ((endOnInput = 0) and (cpy <> oend)) then - goto _output_error; - if ((endOnInput <> 0) and ((ip + length <> iend) or (cpy > oend))) then - goto _output_error; - end; - move(ip^, op^, length); - inc(ip, length); - inc(op, length); - break; - end; - LZ4_wildCopy(op, ip, cpy); - inc(ip, length); - op := cpy; - match := cpy - LZ4_read16(ip); // LZ4_readLE16 = LZ4_read16 for unaligned - inc(ip, 2); - - if checkOffset and (match < lowLimit) then - goto _output_error; - - length := token and ML_MASK; - if length = ML_MASK then - begin - while true do - begin - if ((endOnInput <> 0) and (ip > iend - LASTLITERALS)) then - goto _output_error; - s := ip^; - inc(ip); - inc(length, s); - if s <> 255 then - break; - end; - if safeDecode and (size_t(op + length) < size_t(op)) then - goto _output_error; - end; - inc(length, MINMATCH); - if (dict = integer(usingExtDict)) and (match < lowPrefix) then - begin - if op + length > oend - LASTLITERALS then - goto _output_error; - if (length <= size_t(lowPrefix - match)) then - begin - match := dictEnd - (lowPrefix - match); - move(match^, op^, length); - inc(op, length); - end - else - begin - copySize := size_t(lowPrefix - match); - move((dictEnd - copySize)^, op^, copySize); - inc(op, copySize); - copySize := length - copySize; - if copySize > size_t(op - lowPrefix) then - begin - endOfMatch := op + copySize; - copyFrom := lowPrefix; - while (op < endOfMatch) do - begin - op^ := copyFrom^; - inc(op); - inc(copyFrom); - end; - end - else - begin - move(lowPrefix^, op^, copySize); - inc(op, copySize); - end; - end; - continue; - end; - cpy := op + length; - if (op - match) < 8 then - begin - dec64 := dec64table[op - match]; - op[0] := match[0]; - op[1] := match[1]; - op[2] := match[2]; - op[3] := match[3]; - inc(match, dec32table[op - match]); - pCardinal(op + 4)^ := pCardinal(match)^; - inc(op, 8); - dec(match, dec64); - end - else - begin -{$IFDEF WIN64} - pUint64(op)^ := pUint64(match)^; -{$ELSE} - pCardinal(op)[0] := pCardinal(match)[0]; - pCardinal(op)[1] := pCardinal(match)[1]; -{$ENDIF} - inc(op, 8); - inc(match, 8); - end; - - if cpy > oend - 12 then - begin - if (cpy > oend - LASTLITERALS) then - goto _output_error; - if (op < oend - 8) then - begin - LZ4_wildCopy(op, match, oend - 8); - inc(match, (oend - 8) - op); - op := oend - 8; - end; - while (op < cpy) do - begin - op^ := match^; - inc(op); - inc(match); - end; - end - else - LZ4_wildCopy(op, match, cpy); - op := cpy; - end; - if (endOnInput <> 0) then - result := integer(op - pByte(dest)) - else - result := integer(ip - pByte(source)); - exit; -_output_error: - result := -(ip - pByte(source)) - 1; -end; - -function LZ4_decompress_safe(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxDecompressedSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, integer(endOnInputSize), integer(full), 0, - integer(noDict), pByte(dest), nil, 0); -end; - -function LZ4_createStream: PLZ4_stream_t; -begin - result := allocmem(8 * LZ4_STREAMSIZE_U64); -end; - -procedure LZ4_freeStream(LZ4_streamPtr: PLZ4_stream_t); -begin - freemem(LZ4_streamPtr); -end; - -function LZ4_createStreamDecode: PLZ4_streamDecode_t; -begin - result := allocmem(sizeof(uint64) * LZ4_STREAMDECODESIZE_U64); -end; - -procedure LZ4_freeStreamDecode(LZ4_stream: PLZ4_streamDecode_t); -begin - freemem(LZ4_stream); -end; - -procedure LZ4_renormDictT(LZ4_dict: PLZ4_stream_t_internal; src: pByte); -var - delta: cardinal; - dictEnd: pByte; - i: integer; -begin - if (LZ4_dict.currentOffset > $80000000) or - (size_t(LZ4_dict.currentOffset) > size_t(src)) then - begin - delta := LZ4_dict.currentOffset - 65536; - dictEnd := LZ4_dict.dictionary + LZ4_dict.dictSize; - for i := 0 to HASH_SIZE_U32 - 1 do - begin - if (LZ4_dict.hashTable[i] < delta) then - LZ4_dict.hashTable[i] := 0 - else - dec(LZ4_dict.hashTable[i], delta); - end; - LZ4_dict.currentOffset := 65536; - if (LZ4_dict.dictSize > 65536) then - LZ4_dict.dictSize := 65536; - LZ4_dict.dictionary := dictEnd - LZ4_dict.dictSize; - end; -end; - -function LZ4_compress_continue_generic(LZ4_stream: pointer; source: pointer; dest: pointer; inputSize: integer; maxOutputSize: integer; - limit: limitedOutput_directive): integer; inline; -var - streamPtr: PLZ4_stream_t_internal; - dictEnd: pByte; - smallest: pByte; - sourceEnd: pByte; - res: integer; -begin - streamPtr := PLZ4_stream_t_internal(LZ4_stream); - dictEnd := streamPtr.dictionary + streamPtr.dictSize; - smallest := pByte(source); - if (streamPtr.initCheck <> 0) then - exit(0); - if (streamPtr.dictSize > 0) and (smallest > dictEnd) then - smallest := dictEnd; - LZ4_renormDictT(streamPtr, smallest); - sourceEnd := pByte(source) + inputSize; - if (sourceEnd > streamPtr.dictionary) and (sourceEnd < dictEnd) then - begin - streamPtr.dictSize := cardinal(dictEnd - sourceEnd); - if (streamPtr.dictSize > 65536) then - streamPtr.dictSize := 65536; - if (streamPtr.dictSize < 4) then - streamPtr.dictSize := 0; - streamPtr.dictionary := dictEnd - streamPtr.dictSize; - end; - if dictEnd = pByte(source) then - begin - if (streamPtr.dictSize < 65536) and (streamPtr.dictSize < streamPtr.currentOffset) then - res := LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limit, byU32, withPrefix64k, dictSmall) - else - res := LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limit, byU32, withPrefix64k, noDictIssue); - inc(streamPtr.dictSize, cardinal(inputSize)); - inc(streamPtr.currentOffset, cardinal(inputSize)); - exit(res); - end; - if (streamPtr.dictSize < 65536) and (streamPtr.dictSize < streamPtr.currentOffset) then - res := LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limit, byU32, usingExtDict, dictSmall) - else - res := LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limit, byU32, usingExtDict, noDictIssue); - streamPtr.dictionary := pByte(source); - streamPtr.dictSize := cardinal(inputSize); - inc(streamPtr.currentOffset, cardinal(inputSize)); - result := res; -end; - -function LZ4_compress_continue(LZ4_stream: pointer; const ASource: pointer; ADestination: pointer; AInputSize: integer): integer; -begin - result := LZ4_compress_continue_generic(LZ4_stream, ASource, ADestination, AInputSize, 0, notLimited); -end; - -function LZ4_saveDict(LZ4_streamPtr: PLZ4_stream_t; safeBuffer: pointer; dictSize: integer): integer; -var - dict: PLZ4_stream_t_internal; - previousDictEnd: pByte; -begin - dict := PLZ4_stream_t_internal(LZ4_streamPtr); - previousDictEnd := dict.dictionary + dict.dictSize; - if cardinal(dictSize) > 65536 then - dictSize := 65536; - if cardinal(dictSize) > dict.dictSize then - dictSize := dict.dictSize; - move((previousDictEnd - dictSize)^, safeBuffer^, dictSize); - // memmove(safeBuffer, (previousDictEnd - dictSize), dictSize); - dict.dictionary := pByte(safeBuffer); - dict.dictSize := cardinal(dictSize); - result := dictSize; -end; - -function LZ4_decompress_safe_continue(LZ4_streamDecode: PLZ4_streamDecode_t; source: pointer; dest: pointer; compressedSize: integer; - maxDecompressedSize: integer): integer; -var - lz4sd: PLZ4_streamDecode_t_internal; - res: integer; -begin - lz4sd := PLZ4_streamDecode_t_internal(LZ4_streamDecode); - if lz4sd.prefixEnd = pByte(dest) then - begin - res := LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, - integer(endOnInputSize), integer(full), 0, - integer(usingExtDict), lz4sd.prefixEnd - lz4sd.prefixSize, lz4sd.externalDict, lz4sd.extDictSize); - if (res <= 0) then - exit(res); - inc(lz4sd.prefixSize, res); - inc(lz4sd.prefixEnd, res); - end - else - begin - lz4sd.extDictSize := lz4sd.prefixSize; - lz4sd.externalDict := lz4sd.prefixEnd - lz4sd.extDictSize; - res := LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, - integer(endOnInputSize), integer(full), 0, - integer(usingExtDict), pByte(dest), lz4sd.externalDict, lz4sd.extDictSize); - if (res <= 0) then - exit(res); - lz4sd.prefixSize := res; - lz4sd.prefixEnd := pByte(dest) + res; - end; - result := res; -end; - -procedure LZ4_init(lz4ds: PLZ4_stream_t_internal; base: pByte); -begin - fillchar(lz4ds^, LZ4_STREAMSIZE, 0); - lz4ds.bufferStart := base; -end; - -function LZ4_create(inputBuffer: pAnsiChar): pointer; -var - lz4ds: pointer; -begin - lz4ds := allocmem(8 * LZ4_STREAMSIZE_U64); - LZ4_init(PLZ4_stream_t_internal(lz4ds), pByte(inputBuffer)); - result := lz4ds; -end; - -function LZ4_compress_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer): integer; -var - ctx: array [0 .. LZ4_STREAMSIZE_U64 - 1] of uint64; -begin - fillchar(ctx, sizeof(ctx), 0); - if inputSize < LZ4_64Klimit then - result := LZ4_compress_generic(@ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue) - else - begin -{$IFDEF WIN64} - result := LZ4_compress_generic(@ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, noDict, noDictIssue); -{$ELSE} - result := LZ4_compress_generic(@ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byPtr, noDict, noDictIssue); -{$ENDIF} - end; -end; - -function LZ4_compress_withState(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -begin - if ((size_t(state) and 3) <> 0) then - exit(0); // Error : state is not aligned on 4-bytes boundary - fillchar(state^, LZ4_STREAMSIZE, 0); - if inputSize < LZ4_64Klimit then - result := LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, byU16, noDict, noDictIssue) - else - begin -{$IFDEF WIN64} - result := LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, byU32, noDict, noDictIssue); -{$ELSE} - result := LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, byPtr, noDict, noDictIssue); -{$ENDIF} - end; -end; - -function LZ4_compress_limitedOutput_withState(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -begin - if ((size_t(state) and 3) <> 0) then - exit(0); // Error : state is not aligned on 4-bytes boundary - fillchar(state^, LZ4_STREAMSIZE, 0); - if inputSize < LZ4_64Klimit then - result := LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue) - else - begin -{$IFDEF WIN64} - result := LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, noDict, noDictIssue); -{$ELSE} - result := LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, byPtr, noDict, noDictIssue); -{$ENDIF} - end; -end; - -function LZ4_compress_limitedOutput_continue(LZ4_stream: PLZ4_stream_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -begin - result := LZ4_compress_continue_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput); -end; - -function LZ4_compress_forceExtDict(LZ4_dict: PLZ4_stream_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -var - streamPtr: PLZ4_stream_t_internal; - dictEnd: pByte; - smallest: pByte; -begin - streamPtr := PLZ4_stream_t_internal(LZ4_dict); - dictEnd := streamPtr.dictionary + streamPtr.dictSize; - smallest := dictEnd; - if smallest > pByte(source) then - smallest := pByte(source); - LZ4_renormDictT(PLZ4_stream_t_internal(LZ4_dict), smallest); - result := LZ4_compress_generic(LZ4_dict, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue); - streamPtr.dictionary := pByte(source); - streamPtr.dictSize := cardinal(inputSize); - inc(streamPtr.currentOffset, cardinal(inputSize)); -end; - -procedure LZ4_resetStream(LZ4_stream: PLZ4_stream_t); -begin - fillchar(LZ4_stream^, sizeof(LZ4_stream_t), 0); -end; - -function LZ4_loadDict(LZ4_dict: PLZ4_stream_t; dictionary: pAnsiChar; dictSize: integer): integer; -var - dict: PLZ4_stream_t_internal; - p: pByte; - dictEnd: pByte; - base: pByte; -begin - dict := PLZ4_stream_t_internal(LZ4_dict); - p := pByte(dictionary); - dictEnd := p + dictSize; - if (dict.initCheck <> 0) then - LZ4_resetStream(LZ4_dict); // Uninitialized structure detected - if dictSize < MINMATCH then - begin - dict.dictionary := Nil; - dict.dictSize := 0; - exit(0); - end; - if (p <= dictEnd - 65536) then - p := dictEnd - 65536; - base := p - dict.currentOffset; - dict.dictionary := p; - dict.dictSize := cardinal(dictEnd - p); - inc(dict.currentOffset, dict.dictSize); - while (p <= dictEnd - MINMATCH) do - begin - LZ4_putPosition(p, dict, byU32, base); - inc(p, 3); - end; - - result := dict.dictSize; -end; - -function LZ4_decompress_fast(source: pAnsiChar; dest: pAnsiChar; originalSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, 0, originalSize, integer(endOnOutputSize), integer(full), 0, integer(withPrefix64k), - pByte(dest - 65536), Nil, 65536); -end; - -function LZ4_decompress_fast_withPrefix64k(source: pAnsiChar; dest: pAnsiChar; originalSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, 0, originalSize, integer(endOnOutputSize), integer(full), 0, integer(withPrefix64k), - pByte(dest) - 65536, Nil, 65536); -end; - -function LZ4_decompress_usingDict_generic(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer; - safe: integer; dictStart: pAnsiChar; dictSize: integer): integer; inline; -begin - if dictSize = 0 then - exit(LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, integer(full), 0, integer(noDict), - pByte(dest), Nil, 0)); - if (dictStart + dictSize = dest) then - begin - if dictSize >= integer(65536 - 1) then - exit(LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, integer(full), 0, integer(withPrefix64k), - pByte(dest) - 65536, Nil, 0)); - exit(LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, integer(full), 0, integer(noDict), - pByte(dest) - dictSize, Nil, 0)); - end; - result := LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, integer(full), 0, integer(usingExtDict), - pByte(dest), pByte(dictStart), dictSize); -end; - -function LZ4_decompress_fast_usingDict(source: pAnsiChar; dest: pAnsiChar; originalSize: integer; const dictStart: pAnsiChar; - dictSize: integer): integer; -begin - result := LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize); -end; - -function LZ4_decompress_safe_withPrefix64k(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, integer(endOnInputSize), integer(full), 0, - integer(withPrefix64k), pByte(dest) - 65536, Nil, 65536); -end; - -function LZ4_decompress_safe_usingDict(const source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer; - const dictStart: pAnsiChar; dictSize: integer): integer; -begin - result := LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize); -end; - -function LZ4_decompress_safe_partial(const source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; targetOutputSize: integer; - maxDecompressedSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, integer(endOnInputSize), integer(partial), - targetOutputSize, integer(noDict), pByte(dest), Nil, 0); -end; - -function LZ4_decompress_safe_forceExtDict(source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxOutputSize: integer; - const dictStart: pAnsiChar; dictSize: integer): integer; -begin - result := LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, integer(endOnInputSize), integer(full), 0, - integer(usingExtDict), pByte(dest), pByte(dictStart), dictSize); -end; - -end. diff --git a/lib/xedit/lz4/lz4Common.pas b/lib/xedit/lz4/lz4Common.pas deleted file mode 100644 index cf2c7a2..0000000 --- a/lib/xedit/lz4/lz4Common.pas +++ /dev/null @@ -1,250 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) - -unit lz4common; -{$POINTERMATH ON} - -interface - -uses Windows; - -type - ppByte = ^pByte; - {$IFDEF WIN32} - size_t = Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - size_t = UInt64; - {$ENDIF WIN64} - psize_t = ^size_t; - -const - MINMATCH = 4; - COPYLENGTH = 8; - LASTLITERALS = 5; - _MFLIMIT = COPYLENGTH + MINMATCH; - MAXD_LOG = 16; - MAX_DISTANCE = (1 shl MAXD_LOG) - 1; - STEPSIZE = sizeof(size_t); - ML_BITS = 4; - ML_MASK = (1 shl ML_BITS) - 1; - RUN_BITS = 8 - ML_BITS; - RUN_MASK = (1 shl RUN_BITS) - 1; - -function LZ4_read32(const memPtr: pointer): cardinal; -function LZ4_read64(const memPtr: pointer): uint64; inline; -function LZ4_count(pIn: pByte; pMatch: pByte; const pInLimit: pByte): cardinal; -function LZ4_read_ARCH(const p: pointer): size_t; inline; -function LZ4_read16(const memPtr: pointer): word; inline; -procedure LZ4_writeLE16(memPtr: pointer; value: word); inline; -procedure LZ4_wildCopy(dstPtr: pointer; const srcPtr: pointer; dstEnd: pointer); - -implementation - -function LZ4_read32(const memPtr: pointer): cardinal; -begin - result := pCardinal(memPtr)^; -end; - -{$IFDEF WIN64} - - -function LZ4_NbCommonBytesx64(value: size_t): cardinal; -asm - bsf rax, rcx // value comes in rcx register - shr eax, 3 -end; -{$ENDIF} - - -function LZ4_count(pIn: pByte; pMatch: pByte; const pInLimit: pByte): cardinal; -var - pStart: pByte; - diff: size_t; - incValue: cardinal; - - calcedPByte: pByte; -begin - pStart := pIn; - calcedPByte := pInLimit - (STEPSIZE - 1); - - while pIn < calcedPByte do - begin - diff := LZ4_read_ARCH(pMatch) xor LZ4_read_ARCH(pIn); - if (diff = 0) then - begin - inc(pIn, STEPSIZE); - inc(pMatch, STEPSIZE); - continue; - end; -{$IFDEF WIN32} - asm - bsf eax, diff - shr eax, 3 - mov incValue, eax - end; -{$ELSE} - incValue := LZ4_NbCommonBytesx64(diff); // x64 mode does not allow asm inline -{$ENDIF} - inc(pIn, incValue); - exit(cardinal(pIn - pStart)); - end; -{$IFDEF WIN64} - if (pIn < (pInLimit - 3)) and (pCardinal(pMatch)^ = pCardinal(pIn)^) then - begin - inc(pIn, 4); - inc(pMatch, 4); - end; -{$ENDIF} - if ((pIn < (pInLimit - 1)) and (pWord(pMatch)^ = pWord(pIn)^)) then - begin - inc(pIn, 2); - inc(pMatch, 2); - end; - if ((pIn < pInLimit) and (pMatch^ = pIn^)) then - inc(pIn); - result := cardinal(pIn - pStart); -end; - -function LZ4_read_ARCH(const p: pointer): size_t; inline; -begin -{$IFDEF WIN64} - result := size_t(pUint64(p)^) -{$ELSE} - result := size_t(pCardinal(p)^); -{$ENDIF} -end; - -function LZ4_read16(const memPtr: pointer): word; inline; -begin - result := pWord(memPtr)^; -end; - -function LZ4_read64(const memPtr: pointer): uint64; inline; -begin - result := pUint64(memPtr)^; -end; - -{$IFDEF WILDCOPY_ASM} -{$IFDEF WIN32} - - -procedure LZ4_wildCopy; // (dstPtr: pointer; const srcPtr: pointer; dstEnd: pointer); -asm - push edi - push esi - mov edi, eax - mov esi, edx - // copyCount := (((e - d) - 1) div 8) * 8 + 8; - sub ecx, eax // (e - d) - dec ecx // e - d) - 1) - shr ecx, 3 // ((e - d) - 1) div 8) - shl ecx, 3 // ((e - d) - 1) div 8) * 8 - add ecx, 8 // ((e - d) - 1) div 8) * 8 + 8 - - // if copyCount <= 0 then - // copyCount := 8; - mov eax, 8 - cmp ecx, 0 - cmovbe ecx, eax - shr ecx, 2 - rep movsd - pop esi - pop edi -end; - -{$ELSE} - - -procedure LZ4_wildCopy; // (dstPtr: pointer; const srcPtr: pointer; dstEnd: pointer); -asm - mov r10, rdi - mov r11, rsi - mov rdi, rcx - mov rsi, rdx - // copyCount := (((e - d) - 1) div 8) * 8 + 8; - sub r8, rcx // (dstEnd - dest) - mov rax, 8 - dec r8 // e - d) - 1) - shr r8, 3 // ((e - d) - 1) div 8) - shl r8, 3 // ((e - d) - 1) div 8) * 8 - add r8, rax // ((e - d) - 1) div 8) * 8 + 8 - cmp r8, 0 - cmovbe r8, rax - mov rcx, r8 - shr rcx, 3 - rep movsq - mov rdi, r10 - mov rsi, r11 -end; -{$ENDIF} -{$ELSE} - - -procedure LZ4_wildCopy(dstPtr: pointer; const srcPtr: pointer; dstEnd: pointer); inline; -var - d: pByte; - s: pByte; - e: pByte; -begin - d := dstPtr; - s := srcPtr; - e := dstEnd; - repeat -{$IFDEF WIN32} - pCardinal(d)[0] := pCardinal(s)[0]; - pCardinal(d)[1] := pCardinal(s)[1]; -{$ELSE} - pUint64(d)^ := pUint64(s)^; -{$ENDIF} - inc(d, 8); - inc(s, 8); - until not(d < e); -end; - -{$ENDIF} - - -procedure LZ4_writeLE16(memPtr: pointer; value: word); inline; -begin - pWord(memPtr)^ := value; - -end; - -end. diff --git a/lib/xedit/lz4/lz4HC.pas b/lib/xedit/lz4/lz4HC.pas deleted file mode 100644 index e91e0a6..0000000 --- a/lib/xedit/lz4/lz4HC.pas +++ /dev/null @@ -1,804 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) - -unit lz4HC; -{$POINTERMATH ON} - -interface - -uses Windows, lz4Common; - -const - LZ4_STREAMHCSIZE_U64 = 32774; - -type - PLZ4_streamHC_t = ^LZ4_streamHC_t; - - LZ4_streamHC_t = record - table: array [0 .. LZ4_STREAMHCSIZE_U64 - 1] of uint64; - end; - -function LZ4_createStreamHC: PLZ4_streamHC_t; -procedure LZ4_freeStreamHC(LZ4_streamHCPtr: PLZ4_streamHC_t); -function LZ4_compressHC2(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; compressionLevel: integer): integer; -function LZ4_compressHC(source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -function LZ4_compressHC_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer): integer; -function LZ4_compressHC2_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer; - compressionLevel: integer): integer; -function LZ4_compressHC_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -function LZ4_compressHC2_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - compressionLevel: integer): integer; -function LZ4_compressHC_limitedOutput_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -function LZ4_compressHC2_limitedOutput_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer; compressionLevel: integer): integer; -function LZ4_createHC(inputBuffer: pAnsiChar): pointer; -function LZ4_compressHC_continue(LZ4_streamHCPtr: PLZ4_streamHC_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -function LZ4_loadDictHC(LZ4_streamHCPtr: PLZ4_streamHC_t; dictionary: pAnsiChar; dictSize: integer): integer; -function LZ4_compressHC_limitedOutput_continue(LZ4_streamHCPtr: PLZ4_streamHC_t; const source: pAnsiChar; dest: pAnsiChar; - inputSize: integer; maxOutputSize: integer): integer; -procedure LZ4_resetStreamHC(LZ4_streamHCPtr: PLZ4_streamHC_t; compressionLevel: integer); -function LZ4_saveDictHC(LZ4_streamHCPtr: PLZ4_streamHC_t; safeBuffer: pAnsiChar; dictSize: integer): integer; - -implementation - -const - DICTIONARY_LOGSIZE = 16; - MAXD = (1 shl DICTIONARY_LOGSIZE); - HASH_LOG = (DICTIONARY_LOGSIZE - 1); - HASHTABLESIZE = (1 shl HASH_LOG); - OPTIMAL_ML = integer((ML_MASK - 1) + MINMATCH); - - g_maxCompressionLevel: integer = 16; - LZ4HC_compressionLevel_default: integer = 8; - -type - PLZ4HC_Data_Structure = ^LZ4HC_Data_Structure; - - LZ4HC_Data_Structure = record - hashTable: array [0 .. HASHTABLESIZE - 1] of cardinal; - chainTable: array [0 .. MAXD - 1] of word; - _end: pByte; - base: pByte; - dictBase: pByte; - inputBuffer: pByte; - dictLimit: cardinal; - lowLimit: cardinal; - nextToUpdate: cardinal; - compressionLevel: cardinal; - end; - - limitedOutput_directive = (noLimit = 0, limitedOutput = 1); - -function LZ4_createStreamHC: PLZ4_streamHC_t; -begin - result := allocmem(sizeof(LZ4_streamHC_t)); -end; - -procedure LZ4_freeStreamHC(LZ4_streamHCPtr: PLZ4_streamHC_t); -begin - freemem(LZ4_streamHCPtr); -end; - -procedure LZ4HC_init(hc4: PLZ4HC_Data_Structure; const start: pByte); -begin - fillchar(hc4.hashTable, sizeof(hc4.hashTable), 0); - fillchar(hc4.chainTable, sizeof(hc4.chainTable), 255); - hc4.nextToUpdate := 65536; - hc4.base := start - 65536; - hc4.inputBuffer := start; - hc4._end := start; - hc4.dictBase := start - 65536; - hc4.dictLimit := 65536; - hc4.lowLimit := 65536; -end; - -function HASH_FUNCTION(i: cardinal): cardinal; inline; -begin - result := (i * 2654435761) shr ((MINMATCH * 8) - HASH_LOG); -end; - -function LZ4HC_hashPtr(const ptr: pointer): cardinal; inline; -begin - result := HASH_FUNCTION(pCardinal(ptr)^); -end; - -procedure LZ4HC_Insert(hc4: PLZ4HC_Data_Structure; const ip: pByte); inline; -var - chainTable: pWord; - hashTable: pCardinal; - base: pByte; - target: cardinal; - idx: cardinal; - h: cardinal; - delta: size_t; -begin - chainTable := @hc4.chainTable; - hashTable := @hc4.hashTable; - base := hc4.base; - target := cardinal(ip - base); - idx := hc4.nextToUpdate; - - while idx < target do - begin - h := LZ4HC_hashPtr(base + idx); - delta := idx - hashTable[h]; - if (delta > MAX_DISTANCE) then - delta := MAX_DISTANCE; - chainTable[idx and $FFFF] := word(delta); - hashTable[h] := idx; - inc(idx); - end; - hc4.nextToUpdate := target; -end; - -function LZ4HC_InsertAndFindBestMatch(hc4: PLZ4HC_Data_Structure; const ip: pByte; const iLimit: pByte; - const matchpos: ppByte; const maxNbAttempts: integer): integer; inline; -var - chainTable: pWord; - hashTable: pCardinal; - base: pByte; - dictBase: pByte; - dictLimit: cardinal; - lowLimit: cardinal; - matchIndex: cardinal; - match: pByte; - nbAttempts: integer; - ml: size_t; - mlt: size_t; - vLimit: pByte; -begin - chainTable := @hc4.chainTable; - hashTable := @hc4.hashTable; - base := hc4.base; - dictBase := hc4.dictBase; - dictLimit := hc4.dictLimit; - if hc4.lowLimit + 65536 > cardinal(ip - base) then - lowLimit := hc4.lowLimit - else - lowLimit := cardinal(ip - base) - 65535; - nbAttempts := maxNbAttempts; - ml := 0; - LZ4HC_Insert(hc4, ip); - matchIndex := hashTable[LZ4HC_hashPtr(ip)]; - while (matchIndex >= lowLimit) and (nbAttempts > 0) do - begin - dec(nbAttempts); - if matchIndex >= dictLimit then - begin - match := base + matchIndex; - if ((match + ml)^ = (ip + ml)^) and (pCardinal(match)^ = pCardinal(ip)^) then - begin - mlt := LZ4_count(ip + MINMATCH, match + MINMATCH, iLimit) + MINMATCH; - if mlt > ml then - begin - ml := mlt; - matchpos^ := match; - end; - end; - end - else - begin - match := dictBase + matchIndex; - if pCardinal(match)^ = pCardinal(ip)^ then - begin - vLimit := ip + (dictLimit - matchIndex); - if (vLimit > iLimit) then - vLimit := iLimit; - mlt := LZ4_count(ip + MINMATCH, match + MINMATCH, vLimit) + MINMATCH; - if ((ip + mlt = vLimit) and (vLimit < iLimit)) then - inc(mlt, LZ4_count(ip + mlt, base + dictLimit, iLimit)); - if (mlt > ml) then - begin - ml := mlt; - matchpos^ := base + matchIndex; - end; // virtual matchpos - end; - end; - dec(matchIndex, chainTable[matchIndex and $FFFF]); - end; - result := integer(ml); -end; - -function LZ4HC_InsertAndGetWiderMatch(hc4: PLZ4HC_Data_Structure; const ip: pByte; const iLowLimit: pByte; - const iHighLimit: pByte; longest: integer; const matchpos: ppByte; const startpos: ppByte; const maxNbAttempts: integer): integer; inline; -var - chainTable: pWord; - hashTable: pCardinal; - base: pByte; - dictLimit: cardinal; - lowLimit: cardinal; - dictBase: pByte; - match: pByte; - matchIndex: cardinal; - nbAttempts: integer; - delta: integer; - startt: pByte; - tmpMatch: pByte; - matchEnd: pByte; - mlt: size_t; - back: integer; - vLimit: pByte; -begin - chainTable := @hc4.chainTable; - hashTable := @hc4.hashTable; - base := hc4.base; - dictLimit := hc4.dictLimit; - if (hc4.lowLimit + 65536 > cardinal(ip - base)) then - lowLimit := hc4.lowLimit - else - lowLimit := cardinal(ip - base) - 65535; - dictBase := hc4.dictBase; - nbAttempts := maxNbAttempts; - delta := integer(ip - iLowLimit); - LZ4HC_Insert(hc4, ip); - matchIndex := hashTable[LZ4HC_hashPtr(ip)]; - while (matchIndex >= lowLimit) and (nbAttempts > 0) do - begin - dec(nbAttempts); - if matchIndex >= dictLimit then - begin - match := base + matchIndex; - if ((iLowLimit + longest)^ = (match - delta + longest)^) then - if pCardinal(match)^ = pCardinal(ip)^ then - begin - startt := ip; - tmpMatch := match; - matchEnd := ip + MINMATCH + LZ4_count(ip + MINMATCH, match + MINMATCH, iHighLimit); - while (startt > iLowLimit) and (tmpMatch > iLowLimit) and (startt[-1] = tmpMatch[-1]) do - begin - dec(startt); - dec(tmpMatch); - end; - if (matchEnd - startt) > longest then - begin - longest := integer(matchEnd - startt); - matchpos^ := tmpMatch; - startpos^ := startt; - end; - end; - end - else - begin - match := dictBase + matchIndex; - if pCardinal(match)^ = pCardinal(ip)^ then - begin - back := 0; - vLimit := ip + (dictLimit - matchIndex); - if vLimit > iHighLimit then - vLimit := iHighLimit; - mlt := LZ4_count(ip + MINMATCH, match + MINMATCH, vLimit) + MINMATCH; - if (ip + mlt = vLimit) and (vLimit < iHighLimit) then - inc(mlt, LZ4_count(ip + mlt, base + dictLimit, iHighLimit)); - while ((ip + back > iLowLimit) and (matchIndex + cardinal(back) > lowLimit) and (ip[back - 1] = match[back - 1])) do - dec(back); - dec(mlt, back); - if integer(mlt) > longest then - begin - longest := integer(mlt); - matchpos^ := base + matchIndex + back; - startpos^ := ip + back; - end; - end; - end; - dec(matchIndex, chainTable[matchIndex and $FFFF]); - end; - result := longest; -end; - -function LZ4HC_encodeSequence(const ip: ppByte; op: ppByte; const anchor: ppByte; matchLength: integer; - const match: pByte; limitedOutputBuffer: limitedOutput_directive; oend: pByte): integer; inline; -var - length: integer; - token: pByte; - len: integer; -begin - length := integer(ip^ - anchor^); - token := op^; - inc(op^); - if (limitedOutputBuffer <> noLimit) and ((op^ + (length shr 8) + length + (2 + 1 + LASTLITERALS)) > oend) then - exit(1); - - if length >= integer(RUN_MASK) then - begin - token^ := (RUN_MASK shl ML_BITS); - len := length - RUN_MASK; - while len > 254 do - begin - op^^ := 255; - inc(op^); - dec(len, 255) - end; - op^^ := byte(len); - inc(op^); - end - else - token^ := byte(length shl ML_BITS); - - LZ4_wildCopy(op^, anchor^, op^ + length); - - inc(op^, length); - pWord(op^)^ := word(ip^ - match); // ? - inc(op^, 2); - - length := integer(matchLength - MINMATCH); - if (limitedOutputBuffer <> noLimit) and (op^ + (length shr 8) + (1 + LASTLITERALS) > oend) then - exit(1); - if length >= integer(ML_MASK) then - begin - inc(token^, ML_MASK); - dec(length, ML_MASK); - while length > 509 do - begin - op^^ := 255; - inc(op^); - op^^ := 255; - inc(op^); - dec(length, 510); - end; - if (length > 254) then - begin - dec(length, 255); - op^^ := 255; - inc(op^); - end; - op^^ := byte(length); - inc(op^); - end - else - inc(token^, byte(length)); - inc(ip^, matchLength); - anchor^ := ip^; - result := 0; -end; - -function LZ4HC_compress_generic(ctxvoid: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer; compressionLevel: integer; limit: limitedOutput_directive): integer; -var - ctx: PLZ4HC_Data_Structure; - ip: pByte; - anchor: pByte; - iend: pByte; - mflimit: pByte; - matchlimit: pByte; - op: pByte; - oend: pByte; - maxNbAttempts: cardinal; - ml, ml2, ml3, ml0: integer; - ref: pByte; - start2: pByte; - ref2: pByte; - start3: pByte; - ref3: pByte; - start0: pByte; - ref0: pByte; - correction: integer; - new_ml: integer; - lastRun: integer; -label - _Search2, _Search3; -begin - ctx := ctxvoid; - ip := pByte(source); - anchor := ip; - iend := ip + inputSize; - mflimit := iend - _MFLIMIT; - matchlimit := (iend - LASTLITERALS); - op := pByte(dest); - oend := op + maxOutputSize; - ref := nil; - start2 := nil; - ref2 := nil; - start3 := nil; - ref3 := nil; - - // init - if compressionLevel > g_maxCompressionLevel then - compressionLevel := g_maxCompressionLevel; - if (compressionLevel < 1) then - compressionLevel := LZ4HC_compressionLevel_default; - maxNbAttempts := 1 shl (compressionLevel - 1); - inc(ctx._end, inputSize); - inc(ip); - - // Main Loop - while ip < mflimit do - begin - ml := LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, (@ref), maxNbAttempts); - if (ml = 0) then - begin - inc(ip); - continue; - end; - - // saved, in case we would skip too much - start0 := ip; - ref0 := ref; - ml0 := ml; - _Search2: - - if ip + ml < mflimit then - ml2 := LZ4HC_InsertAndGetWiderMatch(ctx, ip + ml - 2, ip + 1, matchlimit, ml, @ref2, @start2, maxNbAttempts) - else - ml2 := ml; - - if (ml2 = ml) then // No better match - begin - if LZ4HC_encodeSequence(@ip, @op, @anchor, ml, ref, limit, oend) > 0 then - exit(0); - continue; - end; - - if start0 < ip then - begin - if start2 < ip + ml0 then // empirical - begin - ip := start0; - ref := ref0; - ml := ml0; - end; - end; - - // Here, start0==ip - if ((start2 - ip) < 3) then // First Match too small : removed - begin - ml := ml2; - ip := start2; - ref := ref2; - goto _Search2; - end; - - _Search3: - - if (start2 - ip) < OPTIMAL_ML then - begin - new_ml := ml; - if new_ml > OPTIMAL_ML then - new_ml := OPTIMAL_ML; - if ip + new_ml > start2 + ml2 - MINMATCH then - new_ml := integer(start2 - ip) + ml2 - MINMATCH; - correction := new_ml - integer(start2 - ip); - if (correction > 0) then - begin - inc(start2, correction); - inc(ref2, correction); - dec(ml2, correction); - end; - end; - // Now, we have start2 = ip+new_ml, with new_ml = min(ml, OPTIMAL_ML=18) - - if start2 + ml2 < mflimit then - ml3 := LZ4HC_InsertAndGetWiderMatch(ctx, start2 + ml2 - 3, start2, matchlimit, ml2, @ref3, @start3, maxNbAttempts) - else - ml3 := ml2; - - if (ml3 = ml2) then // No better match : 2 sequences to encode - begin - // ip & ref are known; Now for ml - if start2 < ip + ml then - ml := integer(start2 - ip); - // Now, encode 2 sequences - if LZ4HC_encodeSequence(@ip, @op, @anchor, ml, ref, limit, oend) <> 0 then - exit(0); - ip := start2; - if LZ4HC_encodeSequence(@ip, @op, @anchor, ml2, ref2, limit, oend) <> 0 then - exit(0); - continue; - end; - - if start3 < ip + ml + 3 then // Not enough space for match 2 : remove it - begin - if start3 >= (ip + ml) then // can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 - begin - if start2 < ip + ml then - begin - correction := integer(ip + ml - start2); - inc(start2, correction); - inc(ref2, correction); - dec(ml2, correction); - if ml2 < MINMATCH then - begin - start2 := start3; - ref2 := ref3; - ml2 := ml3; - end; - end; - if LZ4HC_encodeSequence(@ip, @op, @anchor, ml, ref, limit, oend) <> 0 then - exit(0); - ip := start3; - ref := ref3; - ml := ml3; - - start0 := start2; - ref0 := ref2; - ml0 := ml2; - goto _Search2; - end; - start2 := start3; - ref2 := ref3; - ml2 := ml3; - goto _Search3; - end; - - (* - * OK, now we have 3 ascending matches; let's write at least the first one - * ip & ref are known; Now for ml - *) - if start2 < ip + ml then - begin - if (start2 - ip) < integer(ML_MASK) then - begin - if ml > OPTIMAL_ML then - ml := OPTIMAL_ML; - if ip + ml > start2 + ml2 - MINMATCH then - ml := integer(start2 - ip) + ml2 - MINMATCH; - correction := ml - integer(start2 - ip); - if correction > 0 then - begin - inc(start2, correction); - inc(ref2, correction); - dec(ml2, correction); - end; - end - else - ml := integer(start2 - ip); - end; - if LZ4HC_encodeSequence(@ip, @op, @anchor, ml, ref, limit, oend) <> 0 then - exit(0); - - ip := start2; - ref := ref2; - ml := ml2; - - start2 := start3; - ref2 := ref3; - ml2 := ml3; - - goto _Search3; - end; - - lastRun := integer(iend - anchor); - if (limit <> noLimit) and ((op - pByte(dest)) + lastRun + 1 + ((lastRun + 255 - RUN_MASK) div 255) > maxOutputSize) then - exit(0); - if lastRun >= integer(RUN_MASK) then - begin - op^ := RUN_MASK shl ML_BITS; - inc(op); - dec(lastRun, RUN_MASK); - while lastRun > 254 do - begin - op^ := 255; - inc(op); - dec(lastRun, 255); - end; - op^ := byte(lastRun); - inc(op); - end - else - begin - op^ := byte(lastRun shl ML_BITS); - inc(op); - end; - move(anchor^, op^, iend - anchor); - inc(op, iend - anchor); - result := integer(op - pByte(dest)); -end; - -function LZ4_compressHC2(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; compressionLevel: integer): integer; -var - ctx: LZ4HC_Data_Structure; -begin - fillchar(ctx, sizeof(LZ4HC_Data_Structure), 0); - LZ4HC_init(@ctx, pByte(source)); - result := LZ4HC_compress_generic(@ctx, source, dest, inputSize, 0, compressionLevel, noLimit); -end; - -function LZ4_compressHC(source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -begin - result := LZ4_compressHC2(source, dest, inputSize, 0); -end; - -function LZ4_compressHC_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer): integer; -begin - result := LZ4_compressHC2_limitedOutput(source, dest, inputSize, maxOutputSize, 0); -end; - -function LZ4_compressHC2_limitedOutput(const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; maxOutputSize: integer; - compressionLevel: integer): integer; -var - ctx: LZ4HC_Data_Structure; -begin - fillchar(ctx, sizeof(LZ4HC_Data_Structure), 0); - LZ4HC_init(@ctx, pByte(source)); - result := LZ4HC_compress_generic(@ctx, source, dest, inputSize, maxOutputSize, compressionLevel, limitedOutput); -end; - -function LZ4_compressHC_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -begin - result := LZ4_compressHC2_withStateHC(state, source, dest, inputSize, 0); -end; - -function LZ4_compressHC2_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - compressionLevel: integer): integer; -begin - if (size_t(state) and (sizeof(pointer) - 1)) <> 0 then - exit(0); // Error : : state is not aligned for pointers (32 or 64 bits) */ - LZ4HC_init(PLZ4HC_Data_Structure(state), pByte(source)); - result := LZ4HC_compress_generic(state, source, dest, inputSize, 0, compressionLevel, noLimit); -end; - -function LZ4_compressHC_limitedOutput_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer): integer; -begin - result := LZ4_compressHC2_limitedOutput_withStateHC(state, source, dest, inputSize, maxOutputSize, 0); -end; - -function LZ4_compressHC2_limitedOutput_withStateHC(state: pointer; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer; - maxOutputSize: integer; compressionLevel: integer): integer; -begin - if (size_t(state) and (sizeof(pointer) - 1)) <> 0 then - exit(0); // Error : : state is not aligned for pointers (32 or 64 bits) */ - LZ4HC_init(PLZ4HC_Data_Structure(state), pByte(source)); - result := LZ4HC_compress_generic(state, source, dest, inputSize, maxOutputSize, compressionLevel, limitedOutput); -end; - -function LZ4_createHC(inputBuffer: pAnsiChar): pointer; -var - hc4: pointer; -begin - hc4 := allocmem(sizeof(LZ4HC_Data_Structure)); - LZ4HC_init(PLZ4HC_Data_Structure(hc4), pByte(inputBuffer)); - result := hc4; -end; - -procedure LZ4HC_setExternalDict(ctxPtr: PLZ4HC_Data_Structure; const newBlock: pByte); -begin - if ctxPtr._end >= ctxPtr.base + 4 then - LZ4HC_Insert(ctxPtr, ctxPtr._end - 3); // Referencing remaining dictionary content - // Only one memory segment for extDict, so any previous extDict is lost at this stage - ctxPtr.lowLimit := ctxPtr.dictLimit; - ctxPtr.dictLimit := cardinal(ctxPtr._end - ctxPtr.base); - ctxPtr.dictBase := ctxPtr.base; - ctxPtr.base := newBlock - ctxPtr.dictLimit; - ctxPtr._end := newBlock; - ctxPtr.nextToUpdate := ctxPtr.dictLimit; // match referencing will resume from there -end; - -function LZ4_compressHC_continue_generic(ctxPtr: PLZ4HC_Data_Structure; - const source: pAnsiChar; dest: pAnsiChar; - inputSize: integer; maxOutputSize: integer; limit: limitedOutput_directive): integer; -var - dictSize: size_t; - sourceEnd: pByte; - dictBegin: pByte; - dictEnd: pByte; -begin - // auto-init if forgotten - if (ctxPtr.base = Nil) then - LZ4HC_init(ctxPtr, pByte(source)); - - // Check overflow - if size_t(ctxPtr._end - ctxPtr.base) > 2147483648 then - begin - dictSize := size_t(ctxPtr._end - ctxPtr.base) - ctxPtr.dictLimit; - if (dictSize > 65536) then - dictSize := 65536; - LZ4_loadDictHC(PLZ4_streamHC_t(ctxPtr), pAnsiChar(ctxPtr._end) - dictSize, integer(dictSize)); - end; - - // Check if blocks follow each other - if (pByte(source) <> ctxPtr._end) then - LZ4HC_setExternalDict(ctxPtr, pByte(source)); - - // Check overlapping input/dictionary space - sourceEnd := pByte(source) + inputSize; - dictBegin := ctxPtr.dictBase + ctxPtr.lowLimit; - dictEnd := ctxPtr.dictBase + ctxPtr.dictLimit; - if (sourceEnd > dictBegin) and (pByte(source) < dictEnd) then - begin - if sourceEnd > dictEnd then - sourceEnd := dictEnd; - ctxPtr.lowLimit := cardinal(sourceEnd - ctxPtr.dictBase); - if ctxPtr.dictLimit - ctxPtr.lowLimit < 4 then - ctxPtr.lowLimit := ctxPtr.dictLimit; - end; - result := LZ4HC_compress_generic(ctxPtr, source, dest, inputSize, maxOutputSize, ctxPtr.compressionLevel, limit); -end; - -function LZ4_compressHC_continue(LZ4_streamHCPtr: PLZ4_streamHC_t; const source: pAnsiChar; dest: pAnsiChar; inputSize: integer): integer; -begin - result := LZ4_compressHC_continue_generic(PLZ4HC_Data_Structure(LZ4_streamHCPtr), source, dest, inputSize, 0, noLimit); -end; - -function LZ4_loadDictHC(LZ4_streamHCPtr: PLZ4_streamHC_t; dictionary: pAnsiChar; dictSize: integer): integer; -var - ctxPtr: PLZ4HC_Data_Structure; -begin - ctxPtr := PLZ4HC_Data_Structure(LZ4_streamHCPtr); - if dictSize > 65536 then - begin - inc(dictionary, dictSize - 65536); - dictSize := 65536; - end; - LZ4HC_init(ctxPtr, pByte(dictionary)); - if (dictSize >= 4) then - LZ4HC_Insert(ctxPtr, pByte(dictionary) + (dictSize - 3)); - ctxPtr._end := pByte(dictionary) + dictSize; - result := dictSize; -end; - -function LZ4_compressHC_limitedOutput_continue(LZ4_streamHCPtr: PLZ4_streamHC_t; const source: pAnsiChar; dest: pAnsiChar; - inputSize: integer; maxOutputSize: integer): integer; -begin - result := LZ4_compressHC_continue_generic(PLZ4HC_Data_Structure(LZ4_streamHCPtr), source, dest, inputSize, maxOutputSize, - limitedOutput); -end; - -procedure LZ4_resetStreamHC(LZ4_streamHCPtr: PLZ4_streamHC_t; compressionLevel: integer); -begin - PLZ4HC_Data_Structure(LZ4_streamHCPtr).base := Nil; - PLZ4HC_Data_Structure(LZ4_streamHCPtr).compressionLevel := cardinal(compressionLevel); -end; - -function LZ4_saveDictHC(LZ4_streamHCPtr: PLZ4_streamHC_t; safeBuffer: pAnsiChar; dictSize: integer): integer; -var - streamPtr: PLZ4HC_Data_Structure; - prefixSize: integer; - endIndex: cardinal; -begin - streamPtr := PLZ4HC_Data_Structure(LZ4_streamHCPtr); - prefixSize := integer((streamPtr._end - (streamPtr.base + streamPtr.dictLimit))); - if dictSize > 65536 then - dictSize := 65536; - if dictSize < 4 then - dictSize := 0; - if (dictSize > prefixSize) then - dictSize := prefixSize; - move((streamPtr._end - dictSize)^, safeBuffer^, dictSize); - endIndex := cardinal(streamPtr._end - streamPtr.base); - streamPtr._end := pByte(safeBuffer) + dictSize; - streamPtr.base := streamPtr._end - endIndex; - streamPtr.dictLimit := endIndex - cardinal(dictSize); - streamPtr.lowLimit := endIndex - cardinal(dictSize); - if streamPtr.nextToUpdate < streamPtr.dictLimit then - streamPtr.nextToUpdate := streamPtr.dictLimit; - result:=dictSize; -end; - -end. diff --git a/lib/xedit/lz4/lz4frame.pas b/lib/xedit/lz4/lz4frame.pas deleted file mode 100644 index 4ae433e..0000000 --- a/lib/xedit/lz4/lz4frame.pas +++ /dev/null @@ -1,1299 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) -unit lz4frame; -{$POINTERMATH ON} - -interface - -uses Windows, xxHash, lz4frame_static, lz4, lz4HC, lz4common; - -const - LZ4F_VERSION = 100; - LZ4F_MAGICNUMBER = $184D2204; - _1BIT = $01; - _2BITS = $03; - _3BITS = $07; - _4BITS = $0F; - _8BITS = $FF; - LZ4F_BLOCKUNCOMPRESSED_FLAG: cardinal = $80000000; - -type - LZ4F_errorCode_t = size_t; - PLZ4F_decompressionContext_t = pointer; - PLZ4F_compressionContext_t = pointer; - blockSizeID_t = (LZ4F_default = 0, max64KB = 4, max256KB = 5, max1MB = 6, max4MB = 7); - blockMode_t = (blockLinked = 0, blockIndependent); - contentChecksum_t = (noContentChecksum = 0, contentChecksumEnabled); - LZ4F_lastBlockStatus = (notDone, fromTmpBuffer, fromSrcBuffer); - - PLZ4F_frameInfo_t = ^LZ4F_frameInfo_t; - - LZ4F_frameInfo_t = record - blockSizeID: blockSizeID_t; - blockMode: blockMode_t; - contentChecksumFlag: contentChecksum_t; - reserved: array [0 .. 4] of cardinal; - end; - - PLZ4F_preferences_t = ^LZ4F_preferences_t; - - LZ4F_preferences_t = record - frameInfo: LZ4F_frameInfo_t; - compressionLevel: cardinal; - autoFlush: cardinal; - reserved: array [0 .. 3] of cardinal; - end; - - PLZ4F_compressOptions_t = ^LZ4F_compressOptions_t; - - LZ4F_compressOptions_t = record - stableSrc: cardinal; - reserved: array [0 .. 2] of cardinal; - end; - - PLZ4F_cctx_internal_t = ^LZ4F_cctx_internal_t; - - LZ4F_cctx_internal_t = record - prefs: LZ4F_preferences_t; - version: cardinal; - cStage: cardinal; - maxBlockSize: size_t; - maxBufferSize: size_t; - tmpBuff: pByte; - tmpIn: pByte; - tmpInSize: size_t; - xxh: XXH32_state_t; - lz4CtxPtr: pointer; - lz4CtxLevel: cardinal; - end; - - PLZ4F_dctx_internal_t = ^LZ4F_dctx_internal_t; - - LZ4F_dctx_internal_t = record - frameInfo: LZ4F_frameInfo_t; - version: cardinal; - dStage: cardinal; - maxBlockSize: size_t; - maxBufferSize: size_t; - srcExpect: pByte; - tmpIn: pByte; - tmpInSize: size_t; - tmpInTarget: size_t; - tmpOutBuffer: pByte; - dict: pByte; - dictSize: size_t; - tmpOut: pByte; - tmpOutSize: size_t; - tmpOutStart: size_t; - xxh: XXH32_state_t; - header: array [0 .. 7] of byte; - end; - - PLZ4F_decompressOptions_t = ^LZ4F_decompressOptions_t; - - LZ4F_decompressOptions_t = record - stableDst: cardinal; - reserved: array [0 .. 2] of cardinal; - end; - -const - LZ4F_BLOCKSIZEID_DEFAULT = max64KB; - LZ4F_MAXHEADERFRAME_SIZE = 7; - -function LZ4F_createDecompressionContext(var LZ4F_decompressionContextPtr: PLZ4F_compressionContext_t; versionNumber: cardinal) - : LZ4F_errorCode_t; -function LZ4F_isError(code: LZ4F_errorCode_t): boolean; -function LZ4F_compressFrame(dstBuffer: pointer; dstMaxSize: size_t; const srcBuffer: pointer; srcSize: size_t; - const preferencesPtr: PLZ4F_preferences_t): size_t; -function LZ4F_compressBound(srcSize: size_t; const preferencesPtr: PLZ4F_preferences_t): size_t; -function LZ4F_compressFrameBound(srcSize: size_t; const preferencesPtr: PLZ4F_preferences_t): size_t; -function LZ4F_compressBegin(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - preferencesPtr: PLZ4F_preferences_t): size_t; -function LZ4F_compressUpdate(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - const srcBuffer: pointer; srcSize: size_t; compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -function LZ4F_compressEnd(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - const compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -function LZ4F_flush(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -function LZ4F_decompress(decompressionContext: PLZ4F_decompressionContext_t; - dstBuffer: pointer; dstSizePtr: psize_t; const srcBuffer: pointer; srcSizePtr: psize_t; - decompressOptionsPtr: PLZ4F_decompressOptions_t): size_t; -function LZ4F_createCompressionContext(var LZ4F_compressionContextPtr: PLZ4F_compressionContext_t; version: cardinal): LZ4F_errorCode_t; -function LZ4F_freeCompressionContext(LZ4F_compressionContext: PLZ4F_compressionContext_t): LZ4F_errorCode_t; -function LZ4F_getFrameInfo(decompressionContext: PLZ4F_decompressionContext_t; frameInfoPtr: PLZ4F_frameInfo_t; const srcBuffer: pointer; - srcSizePtr: psize_t): LZ4F_errorCode_t; -function LZ4F_freeDecompressionContext(LZ4F_decompressionContext: PLZ4F_decompressionContext_t): LZ4F_errorCode_t; -function LZ4F_getErrorName(code : LZ4F_errorCode_t ): pAnsiChar; - -implementation - -var - minHClevel: cardinal = 3; - -type - dStage_t = (dstage_getHeader = 0, dstage_storeHeader, dstage_decodeHeader, - dstage_getCBlockSize, dstage_storeCBlockSize, dstage_decodeCBlockSize, - dstage_copyDirect, - dstage_getCBlock, dstage_storeCBlock, dstage_decodeCBlock, - dstage_decodeCBlock_intoDst, dstage_decodeCBlock_intoTmp, dstage_flushOut, - dstage_getSuffix, dstage_storeSuffix, dstage_checkSuffix); - -function LZ4F_getBlockSize(blockSizeID: cardinal): size_t; forward; - -function LZ4F_createDecompressionContext(var LZ4F_decompressionContextPtr: PLZ4F_compressionContext_t; versionNumber: cardinal) - : LZ4F_errorCode_t; -var - dctxPtr: PLZ4F_dctx_internal_t; -begin - dctxPtr := allocmem(sizeof(LZ4F_dctx_internal_t)); - if dctxPtr = nil then - exit(LZ4F_errorCode_t(-integer(ERROR_GENERIC))); - dctxPtr.version := versionNumber; - LZ4F_decompressionContextPtr := dctxPtr; - result := LZ4F_errorCode_t(OK_NoError); -end; - -function LZ4F_isError(code: LZ4F_errorCode_t): boolean; -begin - result := code > LZ4F_errorCode_t(-integer(ERROR_maxCode)); -end; - -function LZ4F_getErrorName(code : LZ4F_errorCode_t ): pAnsiChar; -begin - result:= 'Unspecified error code'; - if LZ4F_isError(code) then exit (pAnsiChar(LZ4F_errorStrings[-integer(code)])); -end; - -function LZ4F_compressFrameBound(srcSize: size_t; const preferencesPtr: PLZ4F_preferences_t): size_t; -var - prefs: LZ4F_preferences_t; - headerSize: size_t; - streamSize: size_t; - proposedBSID: blockSizeID_t; - maxBlockSize: size_t; -begin - fillchar(prefs, sizeof(LZ4F_preferences_t), 0); - if (preferencesPtr <> Nil) then - prefs := preferencesPtr^; - proposedBSID := max64KB; - maxBlockSize := 65536; - while (prefs.frameInfo.blockSizeID > proposedBSID) do - begin - if srcSize <= maxBlockSize then - begin - prefs.frameInfo.blockSizeID := proposedBSID; - break; - end; - inc(proposedBSID); - maxBlockSize := maxBlockSize shl 2; - end; - prefs.autoFlush := 1; - headerSize := 7; // basic header size (no option) including magic number - streamSize := LZ4F_compressBound(srcSize, @prefs); - result := headerSize + streamSize; -end; - -function LZ4F_compressFrame(dstBuffer: pointer; dstMaxSize: size_t; const srcBuffer: pointer; srcSize: size_t; - const preferencesPtr: PLZ4F_preferences_t): size_t; -var - cctxI: LZ4F_cctx_internal_t; - prefs: LZ4F_preferences_t; - options: LZ4F_compressOptions_t; - errorCode: LZ4F_errorCode_t; - dstStart: pByte; - dstPtr: pByte; - dstEnd: pByte; - proposedBSID: blockSizeID_t; - maxBlockSize: size_t; -begin - fillchar(cctxI, sizeof(LZ4F_cctx_internal_t), 0); - fillchar(prefs, sizeof(LZ4F_preferences_t), 0); - fillchar(options, sizeof(LZ4F_compressOptions_t), 0); - dstStart := pByte(dstBuffer); - dstPtr := dstStart; - dstEnd := dstStart + dstMaxSize; - cctxI.version := LZ4F_VERSION; - cctxI.maxBufferSize := 5 * 1048576; - if (preferencesPtr <> Nil) then - prefs := preferencesPtr^; - proposedBSID := max64KB; - maxBlockSize := 65536; - while (prefs.frameInfo.blockSizeID > proposedBSID) do - begin - if (srcSize <= maxBlockSize) then - begin - prefs.frameInfo.blockSizeID := proposedBSID; - break; - end; - inc(proposedBSID); - maxBlockSize := maxBlockSize shl 2; - end; - prefs.autoFlush := 1; - if (srcSize <= LZ4F_getBlockSize(cardinal(prefs.frameInfo.blockSizeID))) then - prefs.frameInfo.blockMode := blockIndependent; // no need for linked blocks - - options.stableSrc := 1; - - if (dstMaxSize < LZ4F_compressFrameBound(srcSize, @prefs)) then - exit(size_t(-integer(ERROR_dstMaxSize_tooSmall))); - - errorCode := LZ4F_compressBegin(@cctxI, dstBuffer, dstMaxSize, @prefs); // write header - if (LZ4F_isError(errorCode)) then - exit(errorCode); - inc(dstPtr, errorCode); // header size - - dec(dstMaxSize, errorCode); - errorCode := LZ4F_compressUpdate(@cctxI, dstPtr, dstMaxSize, srcBuffer, srcSize, @options); - if (LZ4F_isError(errorCode)) then - exit(errorCode); - inc(dstPtr, errorCode); - errorCode := LZ4F_compressEnd(@cctxI, dstPtr, dstEnd - dstPtr, @options); // flush last block, and generate suffix - if LZ4F_isError(errorCode) then - exit(errorCode); - inc(dstPtr, errorCode); - - freemem(cctxI.lz4CtxPtr); - - result := dstPtr - dstStart; -end; - -function LZ4F_getBlockSize(blockSizeID: cardinal): size_t; -const - blockSizes: array [0 .. 3] of size_t = (65536, 4 * 65536, 16 * 65536, 64 * 65536); -begin - if (blockSizeID = 0) then - blockSizeID := cardinal(LZ4F_BLOCKSIZEID_DEFAULT); - dec(blockSizeID, 4); - if (blockSizeID > 3) then - exit(size_t(-integer(ERROR_maxBlockSize_invalid))); - result := blockSizes[blockSizeID]; -end; - -function LZ4F_compressBound(srcSize: size_t; const preferencesPtr: PLZ4F_preferences_t): size_t; -var - prefsNull: LZ4F_preferences_t; - prefsPtr: PLZ4F_preferences_t; - bid: blockSizeID_t; - blockSize: size_t; - nbBlocks: cardinal; - lastBlockSize: size_t; - blockInfo: size_t; - frameEnd: size_t; -begin - fillchar(prefsNull, sizeof(LZ4F_preferences_t), 0); - if preferencesPtr = Nil then - prefsPtr := @prefsNull - else - prefsPtr := preferencesPtr; - bid := prefsPtr.frameInfo.blockSizeID; - blockSize := LZ4F_getBlockSize(cardinal(bid)); - nbBlocks := cardinal(srcSize div blockSize) + 1; - if prefsPtr.autoFlush <> 0 then - lastBlockSize := srcSize mod blockSize - else - lastBlockSize := blockSize; - blockInfo := 4; // default, without block CRC option - frameEnd := 4 + (cardinal(prefsPtr.frameInfo.contentChecksumFlag) * 4); - result := (blockInfo * nbBlocks) + (blockSize * (nbBlocks - 1)) + lastBlockSize + frameEnd; -end; - -procedure LZ4F_writeLE32(dstPtr: pByte; value32: cardinal); -begin - dstPtr[0] := byte(value32); - dstPtr[1] := byte(value32 shr 8); - dstPtr[2] := byte(value32 shr 16); - dstPtr[3] := byte(value32 shr 24); -end; - -function LZ4F_headerChecksum(const header: pByte; length: size_t): byte; -var - xxh: cardinal; -begin - xxh := XXH32(header, cardinal(length), 0); - result := byte(xxh shr 8); -end; - -function LZ4F_compressBegin(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - preferencesPtr: PLZ4F_preferences_t): size_t; -var - prefNull: LZ4F_preferences_t; - cctxPtr: PLZ4F_cctx_internal_t; - dstStart: pByte; - dstPtr: pByte; - headerStart: pByte; - requiredBuffSize: size_t; - targetCtxLevel: cardinal; -begin - fillchar(prefNull, sizeof(LZ4F_preferences_t), 0); - cctxPtr := PLZ4F_cctx_internal_t(compressionContext); - dstStart := pByte(dstBuffer); - dstPtr := dstStart; - if (dstMaxSize < LZ4F_MAXHEADERFRAME_SIZE) then - exit(size_t(-integer(ERROR_dstMaxSize_tooSmall))); - if (cctxPtr.cStage <> 0) then - exit(size_t(-integer(ERROR_GENERIC))); - if (preferencesPtr = Nil) then - preferencesPtr := @prefNull; - cctxPtr.prefs := preferencesPtr^; - // ctx Management - if cctxPtr.prefs.compressionLevel < minHClevel then - targetCtxLevel := 1 - else - targetCtxLevel := 2; - if cctxPtr.lz4CtxLevel < targetCtxLevel then - begin - freemem(cctxPtr.lz4CtxPtr); - if (cctxPtr.prefs.compressionLevel < minHClevel) then - cctxPtr.lz4CtxPtr := LZ4_createStream() - else - cctxPtr.lz4CtxPtr := LZ4_createStreamHC(); - cctxPtr.lz4CtxLevel := targetCtxLevel; - end; - // Buffer Management - if cardinal(cctxPtr.prefs.frameInfo.blockSizeID) = 0 then - cctxPtr.prefs.frameInfo.blockSizeID := LZ4F_BLOCKSIZEID_DEFAULT; - cctxPtr.maxBlockSize := LZ4F_getBlockSize(cardinal(cctxPtr.prefs.frameInfo.blockSizeID)); - - requiredBuffSize := cctxPtr.maxBlockSize + (cardinal(cctxPtr.prefs.frameInfo.blockMode = blockLinked) * 131072); - if preferencesPtr.autoFlush <> 0 then - requiredBuffSize := cardinal(cctxPtr.prefs.frameInfo.blockMode = blockLinked) * 65536; // just needs dict - - if (cctxPtr.maxBufferSize < requiredBuffSize) then - begin - cctxPtr.maxBufferSize := requiredBuffSize; - freemem(cctxPtr.tmpBuff); - cctxPtr.tmpBuff := allocmem(requiredBuffSize); - if (cctxPtr.tmpBuff = Nil) then - exit(size_t(-integer(ERROR_allocation_failed))); - end; - cctxPtr.tmpIn := cctxPtr.tmpBuff; - cctxPtr.tmpInSize := 0; - XXH32_reset(@cctxPtr.xxh, 0); - if cctxPtr.prefs.compressionLevel < minHClevel then - LZ4_resetStream(PLZ4_stream_t(cctxPtr.lz4CtxPtr)) - else - LZ4_resetStreamHC(cctxPtr.lz4CtxPtr, cctxPtr.prefs.compressionLevel); - - // Magic Number - LZ4F_writeLE32(dstPtr, LZ4F_MAGICNUMBER); - inc(dstPtr, 4); - headerStart := dstPtr; - // FLG Byte - dstPtr^ := ((1 and _2BITS) shl 6) // Version('01') - + ((cardinal(cctxPtr.prefs.frameInfo.blockMode) and _1BIT) shl 5) // Block mode - + byte((cardinal(cctxPtr.prefs.frameInfo.contentChecksumFlag) and _1BIT) shl 2); // Stream checksum - - inc(dstPtr); - - // BD Byte - dstPtr^ := byte((cardinal(cctxPtr.prefs.frameInfo.blockSizeID) and _3BITS) shl 4); - inc(dstPtr); - - // *CRC Byte - dstPtr^ := LZ4F_headerChecksum(headerStart, 2); - inc(dstPtr); - cctxPtr.cStage := 1; // header written, wait for data block - result := dstPtr - dstStart; -end; - -type - compressFunc_t = function(ctx: pointer; const src: pAnsiChar; dst: pAnsiChar; srcSize: integer; dstSize: integer; - level: integer): integer; - -function LZ4F_localLZ4_compress_limitedOutput_withState(ctx: pointer; const src: pAnsiChar; dst: pAnsiChar; srcSize: integer; - dstSize: integer; level: integer): integer; -begin - result := LZ4_compress_limitedOutput_withState(ctx, src, dst, srcSize, dstSize); -end; - -function LZ4F_localLZ4_compress_limitedOutput_continue(ctx: pointer; const src: pAnsiChar; dst: pAnsiChar; srcSize: integer; - dstSize: integer; level: integer): integer; -begin - result := LZ4_compress_limitedOutput_continue(PLZ4_stream_t(ctx), src, dst, srcSize, dstSize); -end; - -function LZ4F_localLZ4_compressHC_limitedOutput_continue(ctx: pointer; const src: pAnsiChar; dst: pAnsiChar; srcSize: integer; - dstSize: integer; level: integer): integer; -begin - result := LZ4_compressHC_limitedOutput_continue(PLZ4_streamHC_t(ctx), src, dst, srcSize, dstSize); -end; - -function LZ4F_localSaveDict(cctxPtr: PLZ4F_cctx_internal_t): integer; -begin - if cctxPtr.prefs.compressionLevel < minHClevel then - result := LZ4_saveDict(PLZ4_stream_t(cctxPtr.lz4CtxPtr), pAnsiChar(cctxPtr.tmpBuff), 65536) - else - result := LZ4_saveDictHC(PLZ4_streamHC_t(cctxPtr.lz4CtxPtr), pAnsiChar(cctxPtr.tmpBuff), 65536); -end; - -function LZ4F_selectCompression(blockMode: blockMode_t; level: cardinal): compressFunc_t; -begin - if level < minHClevel then - begin - if (blockMode = blockIndependent) then - exit(@LZ4F_localLZ4_compress_limitedOutput_withState); - exit(@LZ4F_localLZ4_compress_limitedOutput_continue); - end; - if (blockMode = blockIndependent) then - exit(@LZ4_compressHC2_limitedOutput_withStateHC); - exit(@LZ4F_localLZ4_compressHC_limitedOutput_continue); -end; - -function LZ4F_compressBlock(dst: pointer; const src: pointer; srcSize: size_t; compress: compressFunc_t; lz4ctx: pointer; - level: integer): integer; -var - cSizePtr: pByte; - cSize: cardinal; -begin - cSizePtr := dst; - cSize := cardinal(compress(lz4ctx, src, pAnsiChar(cSizePtr + 4), integer(srcSize), integer(srcSize - 1), level)); - LZ4F_writeLE32(cSizePtr, cSize); - if (cSize = 0) then // compression failed - begin - cSize := srcSize; - LZ4F_writeLE32(cSizePtr, cSize + LZ4F_BLOCKUNCOMPRESSED_FLAG); - move(src^, (cSizePtr + 4)^, srcSize); - end; - result := cSize + 4; -end; - -function LZ4F_compressUpdate(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - const srcBuffer: pointer; srcSize: size_t; compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -var - cOptionsNull: LZ4F_compressOptions_t; - cctxPtr: PLZ4F_cctx_internal_t; - blockSize: size_t; - srcPtr: pByte; - srcEnd: pByte; - dstStart: pByte; - dstPtr: pByte; - lastBlockCompressed: LZ4F_lastBlockStatus; - compress: compressFunc_t; - sizeToCopy: size_t; - realDictSize: integer; -begin - fillchar(cOptionsNull, sizeof(LZ4F_compressOptions_t), 0); - cctxPtr := PLZ4F_cctx_internal_t(compressionContext); - blockSize := cctxPtr.maxBlockSize; - srcPtr := srcBuffer; - srcEnd := srcPtr + srcSize; - dstStart := dstBuffer; - dstPtr := dstStart; - lastBlockCompressed := notDone; - if cctxPtr.cStage <> 1 then - exit(size_t(-integer(ERROR_GENERIC))); - if dstMaxSize < LZ4F_compressBound(srcSize, @(cctxPtr.prefs)) then - exit(size_t(-integer(ERROR_dstMaxSize_tooSmall))); - if compressOptionsPtr = Nil then - compressOptionsPtr := @cOptionsNull; - // select compression function - compress := LZ4F_selectCompression(cctxPtr.prefs.frameInfo.blockMode, cctxPtr.prefs.compressionLevel); - // complete tmp buffer - if cctxPtr.tmpInSize > 0 then // some data already within tmp buffer - begin - sizeToCopy := blockSize - cctxPtr.tmpInSize; - if sizeToCopy > srcSize then - begin - // add src to tmpIn buffer - move(srcBuffer^, (cctxPtr.tmpIn + cctxPtr.tmpInSize)^, srcSize); - srcPtr := srcEnd; - inc(cctxPtr.tmpInSize, srcSize); - // still needs some CRC - end - else - begin - // complete tmpIn block and then compress it - lastBlockCompressed := fromTmpBuffer; - move(srcBuffer^, (cctxPtr.tmpIn + cctxPtr.tmpInSize)^, sizeToCopy); - inc(srcPtr, sizeToCopy); - inc(dstPtr, LZ4F_compressBlock(dstPtr, cctxPtr.tmpIn, blockSize, compress, cctxPtr.lz4CtxPtr, cctxPtr.prefs.compressionLevel)); - - if (cctxPtr.prefs.frameInfo.blockMode = blockLinked) then - inc(cctxPtr.tmpIn, blockSize); - cctxPtr.tmpInSize := 0; - end; - end; - while size_t(srcEnd - srcPtr) >= blockSize do - begin - // compress full block - lastBlockCompressed := fromSrcBuffer; - inc(dstPtr, LZ4F_compressBlock(dstPtr, srcPtr, blockSize, compress, cctxPtr.lz4CtxPtr, cctxPtr.prefs.compressionLevel)); - inc(srcPtr, blockSize); - end; - if ((cctxPtr.prefs.autoFlush <> 0) and (srcPtr < srcEnd)) then - begin - // compress remaining input < blockSize - lastBlockCompressed := fromSrcBuffer; - inc(dstPtr, LZ4F_compressBlock(dstPtr, srcPtr, srcEnd - srcPtr, compress, cctxPtr.lz4CtxPtr, cctxPtr.prefs.compressionLevel)); - srcPtr := srcEnd; - end; - - // preserve dictionary if necessary - if ((cctxPtr.prefs.frameInfo.blockMode = blockLinked) and (lastBlockCompressed = fromSrcBuffer)) then - begin - if compressOptionsPtr.stableSrc <> 0 then - cctxPtr.tmpIn := cctxPtr.tmpBuff - else - begin - realDictSize := LZ4F_localSaveDict(cctxPtr); - if (realDictSize = 0) then - exit(size_t(-integer(ERROR_GENERIC))); - cctxPtr.tmpIn := cctxPtr.tmpBuff + realDictSize; - end; - end; - // keep tmpIn within limits - if ((cctxPtr.tmpIn + blockSize) > (cctxPtr.tmpBuff + cctxPtr.maxBufferSize)) - // necessarily blockLinked && lastBlockCompressed==fromTmpBuffer - and (cctxPtr.prefs.autoFlush = 0) then - begin - LZ4F_localSaveDict(cctxPtr); - cctxPtr.tmpIn := cctxPtr.tmpBuff + 65536; - end; - // some input data left, necessarily < blockSize - if srcPtr < srcEnd then - begin - // fill tmp buffer - sizeToCopy := srcEnd - srcPtr; - move(srcPtr^, (cctxPtr.tmpIn)^, sizeToCopy); - cctxPtr.tmpInSize := sizeToCopy; - end; - if (cctxPtr.prefs.frameInfo.contentChecksumFlag = contentChecksumEnabled) then - XXH32_update(@(cctxPtr.xxh), srcBuffer, cardinal(srcSize)); - result := dstPtr - dstStart; -end; - -function LZ4F_flush(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -var - cOptionsNull: LZ4F_compressOptions_t; - cctxPtr: PLZ4F_cctx_internal_t; - dstStart: pByte; - dstPtr: pByte; - compress: compressFunc_t; -begin - fillchar(cOptionsNull, sizeof(LZ4F_compressOptions_t), 0); - cctxPtr := PLZ4F_cctx_internal_t(compressionContext); - dstStart := pByte(dstBuffer); - dstPtr := dstStart; - if cctxPtr.tmpInSize = 0 then - exit(0); // nothing to flush - if cctxPtr.cStage <> 1 then - exit(size_t(-integer(ERROR_GENERIC))); - if (dstMaxSize < (cctxPtr.tmpInSize + 16)) then - exit(size_t(-integer(ERROR_dstMaxSize_tooSmall))); - (* Not used - if (compressOptionsPtr = Nil) then - compressOptionsPtr := @cOptionsNull; - *) - // select compression function - compress := LZ4F_selectCompression(cctxPtr.prefs.frameInfo.blockMode, cctxPtr.prefs.compressionLevel); - // compress tmp buffer - inc(dstPtr, LZ4F_compressBlock(dstPtr, cctxPtr.tmpIn, cctxPtr.tmpInSize, compress, cctxPtr.lz4CtxPtr, cctxPtr.prefs.compressionLevel)); - if (cctxPtr.prefs.frameInfo.blockMode = blockLinked) then - inc(cctxPtr.tmpIn, cctxPtr.tmpInSize); - cctxPtr.tmpInSize := 0; - // keep tmpIn within limits - if ((cctxPtr.tmpIn + cctxPtr.maxBlockSize) > (cctxPtr.tmpBuff + cctxPtr.maxBufferSize)) then // necessarily blockLinked - begin - LZ4F_localSaveDict(cctxPtr); - cctxPtr.tmpIn := cctxPtr.tmpBuff + 65536; - end; - result := dstPtr - dstStart; -end; - -function LZ4F_compressEnd(compressionContext: PLZ4F_compressionContext_t; dstBuffer: pointer; dstMaxSize: size_t; - const compressOptionsPtr: PLZ4F_compressOptions_t): size_t; -var - cctxPtr: PLZ4F_cctx_internal_t; - dstStart: pByte; - dstPtr: pByte; - errorCode: size_t; - xxh: cardinal; -begin - cctxPtr := PLZ4F_cctx_internal_t(compressionContext); - dstStart := pByte(dstBuffer); - dstPtr := dstStart; - errorCode := LZ4F_flush(compressionContext, dstBuffer, dstMaxSize, compressOptionsPtr); - if LZ4F_isError(errorCode) then - exit(errorCode); - inc(dstPtr, errorCode); - LZ4F_writeLE32(dstPtr, 0); - inc(dstPtr, 4); // endMark - if cctxPtr.prefs.frameInfo.contentChecksumFlag = contentChecksumEnabled then - begin - xxh := XXH32_digest(@(cctxPtr.xxh)); - LZ4F_writeLE32(dstPtr, xxh); - inc(dstPtr, 4); // content Checksum - end; - cctxPtr.cStage := 0; // state is now re-usable (with identical preferences) - - result := dstPtr - dstStart; -end; - -function LZ4F_readLE32(const srcPtr: pByte): cardinal; -var - value32: cardinal; -begin - value32 := srcPtr[0]; - inc(value32, (srcPtr[1] shl 8)); - inc(value32, (srcPtr[2] shl 16)); - inc(value32, (srcPtr[3] shl 24)); - result := value32; -end; - -function LZ4F_decodeHeader(dctxPtr: PLZ4F_dctx_internal_t; srcPtr: pByte; srcSize: size_t): size_t; -var - FLG, BD, HC: byte; - version, blockMode, blockChecksumFlag, contentSizeFlag, contentChecksumFlag, dictFlag, blockSizeID: cardinal; - bufferNeeded: size_t; -begin - // need to decode header to get frameInfo - if srcSize < 7 then - exit(size_t(-integer(ERROR_GENERIC))); // minimal header size - // control magic number - if (LZ4F_readLE32(srcPtr) <> LZ4F_MAGICNUMBER) then - exit(size_t(-integer(ERROR_GENERIC))); - inc(srcPtr, 4); - // Flags - FLG := srcPtr[0]; - version := (FLG shr 6) and _2BITS; - blockMode := (FLG shr 5) and _1BIT; - blockChecksumFlag := (FLG shr 4) and _1BIT; - contentSizeFlag := (FLG shr 3) and _1BIT; - contentChecksumFlag := (FLG shr 2) and _1BIT; - dictFlag := (FLG shr 0) and _1BIT; - BD := srcPtr[1]; - blockSizeID := (BD shr 4) and _3BITS; - // check - HC := LZ4F_headerChecksum(srcPtr, 2); - if (HC <> srcPtr[2]) then - exit(size_t(-integer(ERROR_GENERIC))); // Bad header checksum error - - // validate - if version <> 1 then - exit(size_t(-integer(ERROR_GENERIC))); // Version Number, only supported value - if blockChecksumFlag <> 0 then - exit(size_t(-integer(ERROR_GENERIC))); // Only supported value for the time being - if contentSizeFlag <> 0 then - exit(size_t(-integer(ERROR_GENERIC))); // Only supported value for the time being - if ((FLG shr 1) and _1BIT) <> 0 then - exit(size_t(-integer(ERROR_GENERIC))); - /// Reserved bit - if dictFlag <> 0 then - exit(size_t(-integer(ERROR_GENERIC))); // Only supported value for the time being - if (BD shr 7) and _1BIT <> 0 then - exit(size_t(-integer(ERROR_GENERIC))); - /// Reserved bit - if blockSizeID < 4 then - exit(size_t(-integer(ERROR_GENERIC))); // Only supported values for the time being - if (((BD shr 0) and _4BITS) <> 0) then - exit(size_t(-integer(ERROR_GENERIC))); // Reserved bits - // save - dctxPtr.frameInfo.blockMode := blockMode_t(blockMode); - dctxPtr.frameInfo.contentChecksumFlag := contentChecksum_t(contentChecksumFlag); - dctxPtr.frameInfo.blockSizeID := blockSizeID_t(blockSizeID); - dctxPtr.maxBlockSize := LZ4F_getBlockSize(blockSizeID); - - // init - if (contentChecksumFlag <> 0) then - XXH32_reset(@(dctxPtr.xxh), 0); - - // alloc - bufferNeeded := dctxPtr.maxBlockSize + size_t (integer(dctxPtr.frameInfo.blockMode = blockLinked) * 131072); - - if bufferNeeded > dctxPtr.maxBufferSize then // tmp buffers too small - begin - freemem(dctxPtr.tmpIn); - freemem(dctxPtr.tmpOutBuffer); - dctxPtr.maxBufferSize := bufferNeeded; - dctxPtr.tmpIn := allocmem(dctxPtr.maxBlockSize); - if dctxPtr.tmpIn = Nil then - exit(size_t(-integer(ERROR_GENERIC))); - dctxPtr.tmpOutBuffer := allocmem(dctxPtr.maxBufferSize); - if dctxPtr.tmpOutBuffer = Nil then - exit(size_t(-integer(ERROR_GENERIC))); - end; - dctxPtr.tmpInSize := 0; - dctxPtr.tmpInTarget := 0; - dctxPtr.dict := dctxPtr.tmpOutBuffer; - dctxPtr.dictSize := 0; - dctxPtr.tmpOut := dctxPtr.tmpOutBuffer; - dctxPtr.tmpOutStart := 0; - dctxPtr.tmpOutSize := 0; - - result := 7; -end; - -procedure LZ4F_updateDict(dctxPtr: PLZ4F_dctx_internal_t; const dstPtr: pByte; dstSize: size_t; const dstPtr0: pByte; withinTmp: cardinal); -var - preserveSize: size_t; - copySize: size_t; - oldDictEnd: pByte; -begin - if dctxPtr.dictSize = 0 then - dctxPtr.dict := pByte(dstPtr); // priority to dictionary continuity - - if dctxPtr.dict + dctxPtr.dictSize = dstPtr then // dictionary continuity - begin - inc(dctxPtr.dictSize, dstSize); - exit; - end; - - if size_t(dstPtr - dstPtr0) + dstSize >= 65536 then // dstBuffer large enough to become dictionary - begin - dctxPtr.dict := pByte(dstPtr0); - dctxPtr.dictSize := size_t(dstPtr - dstPtr0) + dstSize; - exit; - end; - - if ((withinTmp <> 0) and (dctxPtr.dict = dctxPtr.tmpOutBuffer)) then - begin - // assumption : dctxPtr->dict + dctxPtr->dictSize == dctxPtr->tmpOut + dctxPtr->tmpOutStart - inc(dctxPtr.dictSize, dstSize); - exit; - end; - - if withinTmp <> 0 then // copy relevant dict portion in front of tmpOut within tmpOutBuffer - begin - preserveSize := dctxPtr.tmpOut - dctxPtr.tmpOutBuffer; - copySize := 65536 - dctxPtr.tmpOutSize; - oldDictEnd := dctxPtr.dict + dctxPtr.dictSize - dctxPtr.tmpOutStart; - if dctxPtr.tmpOutSize > 65536 then - copySize := 0; - if copySize > preserveSize then - copySize := preserveSize; - - move((oldDictEnd - copySize)^, (dctxPtr.tmpOutBuffer + preserveSize - copySize)^, copySize); - - dctxPtr.dict := dctxPtr.tmpOutBuffer; - dctxPtr.dictSize := preserveSize + dctxPtr.tmpOutStart + dstSize; - exit; - end; - - if dctxPtr.dict = dctxPtr.tmpOutBuffer then // copy dst into tmp to complete dict - begin - if dctxPtr.dictSize + dstSize > dctxPtr.maxBufferSize then // tmp buffer not large enough - begin - preserveSize := 65536 - dstSize; // note : dstSize < 64 KB - move((dctxPtr.dict + dctxPtr.dictSize - preserveSize)^, (dctxPtr.dict)^, preserveSize); - dctxPtr.dictSize := preserveSize; - end; - move(dstPtr^, (dctxPtr.dict + dctxPtr.dictSize)^, dstSize); - inc(dctxPtr.dictSize, dstSize); - exit; - end; - // join dict & dest into tmp - - preserveSize := 65536 - dstSize; // note : dstSize < 64 KB - if preserveSize > dctxPtr.dictSize then - preserveSize := dctxPtr.dictSize; - move((dctxPtr.dict + dctxPtr.dictSize - preserveSize)^, dctxPtr.tmpOutBuffer^, preserveSize); - move(dstPtr^, (dctxPtr.tmpOutBuffer + preserveSize)^, dstSize); - dctxPtr.dict := dctxPtr.tmpOutBuffer; - dctxPtr.dictSize := preserveSize + dstSize; -end; - -function LZ4F_decompress_safe(const source: pAnsiChar; dest: pAnsiChar; compressedSize: integer; maxDecompressedSize: integer; - const dictStart: pAnsiChar; dictSize: integer): integer; -begin - result := LZ4_decompress_safe(source, dest, compressedSize, maxDecompressedSize); -end; - -function LZ4F_decompress(decompressionContext: PLZ4F_decompressionContext_t; - dstBuffer: pointer; dstSizePtr: psize_t; - const srcBuffer: pointer; srcSizePtr: psize_t; - decompressOptionsPtr: PLZ4F_decompressOptions_t): size_t; -type - Tdecoder = function(const c1: pAnsiChar; c2: pAnsiChar; c3: integer; c4: integer; const c5: pAnsiChar; c6: integer): integer; -var - dctxPtr: PLZ4F_dctx_internal_t; - optionsNull: LZ4F_decompressOptions_t; - srcStart: pByte; - srcEnd: pByte; - srcPtr: pByte; - dstStart: pByte; - dstEnd: pByte; - dstPtr: pByte; - selectedIn: pByte; - doAnotherStage: cardinal; - nextSrcSizeHint: size_t; - sizeToCopy: size_t; - errorCode: LZ4F_errorCode_t; - nextCBlockSize: size_t; - decodedSize: integer; - decoder: Tdecoder; - reservedDictSpace: size_t; - suffixSize: size_t; - readCRC: cardinal; - resultCRC: cardinal; - preserveSize: size_t; - copySize: size_t; - oldDictEnd: pByte; - newDictSize: size_t; -begin - dctxPtr := PLZ4F_dctx_internal_t(decompressionContext); - fillchar(optionsNull, sizeof(LZ4F_decompressOptions_t), 0); - srcStart := pByte(srcBuffer); - srcEnd := srcStart + srcSizePtr^; - srcPtr := srcStart; - dstStart := pByte(dstBuffer); - dstEnd := dstStart + dstSizePtr^; - dstPtr := dstStart; - selectedIn := Nil; - doAnotherStage := 1; - nextSrcSizeHint := 1; - - if decompressOptionsPtr = Nil then - decompressOptionsPtr := @optionsNull; - - srcSizePtr^ := 0; - dstSizePtr^ := 0; - - // expect to continue decoding src buffer where it left previously - if dctxPtr.srcExpect <> Nil then - begin - if (srcStart <> dctxPtr.srcExpect) then - exit(size_t(-integer(ERROR_GENERIC))); - end; - - // programmed as a state machine - - while (doAnotherStage <> 0) do - begin - case dctxPtr.dStage of - cardinal(dstage_getHeader): - begin - if srcEnd - srcPtr >= 7 then - begin - selectedIn := srcPtr; - inc(srcPtr, 7); - dctxPtr.dStage := cardinal(dstage_decodeHeader); - end - else - begin - dctxPtr.tmpInSize := 0; - dctxPtr.dStage := cardinal(dstage_storeHeader); - end; - end; - cardinal(dstage_storeHeader): - begin - sizeToCopy := 7 - dctxPtr.tmpInSize; - if sizeToCopy > size_t(srcEnd - srcPtr) then - sizeToCopy := srcEnd - srcPtr; - move(srcPtr^, (pByte(@dctxPtr.header) + dctxPtr.tmpInSize)^, sizeToCopy); - inc(dctxPtr.tmpInSize, sizeToCopy); - inc(srcPtr, sizeToCopy); - if (dctxPtr.tmpInSize < 7) then - begin - nextSrcSizeHint := (7 - dctxPtr.tmpInSize) + 4; - doAnotherStage := 0; // no enough src, wait to get some more - end - else - begin - selectedIn := @dctxPtr.header; - dctxPtr.dStage := cardinal(dstage_decodeHeader); - end; - end; - cardinal(dstage_decodeHeader): - begin - errorCode := LZ4F_decodeHeader(dctxPtr, selectedIn, 7); - if LZ4F_isError(errorCode) then - exit(errorCode); - dctxPtr.dStage := cardinal(dstage_getCBlockSize); - end; - cardinal(dstage_getCBlockSize): - begin - if (srcEnd - srcPtr) >= 4 then - begin - selectedIn := srcPtr; - inc(srcPtr, 4); - dctxPtr.dStage := cardinal(dstage_decodeCBlockSize); - end - else - begin - // not enough input to read cBlockSize field - dctxPtr.tmpInSize := 0; - dctxPtr.dStage := cardinal(dstage_storeCBlockSize); - end; - end; - cardinal(dstage_storeCBlockSize): - begin - sizeToCopy := 4 - dctxPtr.tmpInSize; - if sizeToCopy > size_t(srcEnd - srcPtr) then - sizeToCopy := srcEnd - srcPtr; - move(srcPtr^, (dctxPtr.tmpIn + dctxPtr.tmpInSize)^, sizeToCopy); - inc(srcPtr, sizeToCopy); - inc(dctxPtr.tmpInSize, sizeToCopy); - if dctxPtr.tmpInSize < 4 then // not enough input to get full cBlockSize; wait for more - begin - nextSrcSizeHint := 4 - dctxPtr.tmpInSize; - doAnotherStage := 0; - end - else - begin - selectedIn := dctxPtr.tmpIn; - dctxPtr.dStage := cardinal(dstage_decodeCBlockSize); - end; - end; - cardinal(dstage_decodeCBlockSize): - begin - nextCBlockSize := LZ4F_readLE32(selectedIn) and $7FFFFFFF; - if (nextCBlockSize = 0) then - dctxPtr.dStage := cardinal(dstage_getSuffix) - else - begin - if (nextCBlockSize > dctxPtr.maxBlockSize) then - exit(size_t(-integer(ERROR_GENERIC))); // invalid cBlockSize - dctxPtr.tmpInTarget := nextCBlockSize; - if (LZ4F_readLE32(selectedIn) and LZ4F_BLOCKUNCOMPRESSED_FLAG) <> 0 then - dctxPtr.dStage := cardinal(dstage_copyDirect) - else - begin - dctxPtr.dStage := cardinal(dstage_getCBlock); - if dstPtr = dstEnd then - begin - nextSrcSizeHint := nextCBlockSize + 4; - doAnotherStage := 0; - end; - end; - end; - end; - cardinal(dstage_copyDirect): // uncompressed block - begin - sizeToCopy := dctxPtr.tmpInTarget; - if size_t(srcEnd - srcPtr) < sizeToCopy then - sizeToCopy := srcEnd - srcPtr; // not enough input to read full block - if size_t(dstEnd - dstPtr) < sizeToCopy then - sizeToCopy := dstEnd - dstPtr; - move(srcPtr^, dstPtr^, sizeToCopy); - if (dctxPtr.frameInfo.contentChecksumFlag <> noContentChecksum) then - XXH32_update(@(dctxPtr.xxh), srcPtr, cardinal(sizeToCopy)); - // dictionary management - if (dctxPtr.frameInfo.blockMode = blockLinked) then - LZ4F_updateDict(dctxPtr, dstPtr, sizeToCopy, dstStart, 0); - inc(srcPtr, sizeToCopy); - inc(dstPtr, sizeToCopy); - if sizeToCopy = dctxPtr.tmpInTarget then // all copied - dctxPtr.dStage := cardinal(dstage_getCBlockSize) - else - begin - dec(dctxPtr.tmpInTarget, sizeToCopy); // still need to copy more - nextSrcSizeHint := dctxPtr.tmpInTarget + 4; - doAnotherStage := 0; - end; - end; - cardinal(dstage_getCBlock): - begin - if size_t(srcEnd - srcPtr) < dctxPtr.tmpInTarget then - begin - dctxPtr.tmpInSize := 0; - dctxPtr.dStage := cardinal(dstage_storeCBlock); - end - else - begin - selectedIn := srcPtr; - inc(srcPtr, dctxPtr.tmpInTarget); - dctxPtr.dStage := cardinal(dstage_decodeCBlock); - end; - end; - cardinal(dstage_storeCBlock): - begin - sizeToCopy := dctxPtr.tmpInTarget - dctxPtr.tmpInSize; - if sizeToCopy > size_t(srcEnd - srcPtr) then - sizeToCopy := srcEnd - srcPtr; - - move(srcPtr^, (dctxPtr.tmpIn + dctxPtr.tmpInSize)^, sizeToCopy); - inc(dctxPtr.tmpInSize, sizeToCopy); - inc(srcPtr, sizeToCopy); - if (dctxPtr.tmpInSize < dctxPtr.tmpInTarget) then // need more input - begin - nextSrcSizeHint := (dctxPtr.tmpInTarget - dctxPtr.tmpInSize) + 4; - doAnotherStage := 0; - end - else - begin - selectedIn := dctxPtr.tmpIn; - dctxPtr.dStage := cardinal(dstage_decodeCBlock); - end; - end; - cardinal(dstage_decodeCBlock): - begin - if (size_t(dstEnd - dstPtr) < dctxPtr.maxBlockSize) then // not enough place into dst : decode into tmpOut - dctxPtr.dStage := cardinal(dstage_decodeCBlock_intoTmp) - else - dctxPtr.dStage := cardinal(dstage_decodeCBlock_intoDst); - end; - - cardinal(dstage_decodeCBlock_intoDst): - begin - if (dctxPtr.frameInfo.blockMode = blockLinked) then - decoder := LZ4_decompress_safe_usingDict - else - decoder := LZ4F_decompress_safe; - - decodedSize := decoder(pAnsiChar(selectedIn), pAnsiChar(dstPtr), integer(dctxPtr.tmpInTarget), - integer(dctxPtr.maxBlockSize), pAnsiChar(dctxPtr.dict), integer(dctxPtr.dictSize)); - if (decodedSize < 0) then - exit(size_t(-integer(ERROR_GENERIC))); // decompression failed - if (dctxPtr.frameInfo.contentChecksumFlag <> noContentChecksum) then - XXH32_update(@(dctxPtr.xxh), dstPtr, decodedSize); - // dictionary management - if (dctxPtr.frameInfo.blockMode = blockLinked) then - LZ4F_updateDict(dctxPtr, dstPtr, decodedSize, dstStart, 0); - - inc(dstPtr, decodedSize); - dctxPtr.dStage := cardinal(dstage_getCBlockSize); - end; - cardinal(dstage_decodeCBlock_intoTmp): - begin - if (dctxPtr.frameInfo.blockMode = blockLinked) then - decoder := LZ4_decompress_safe_usingDict - else - decoder := LZ4F_decompress_safe; - // ensure enough place for tmpOut - if dctxPtr.frameInfo.blockMode = blockLinked then - begin - if (dctxPtr.dict = dctxPtr.tmpOutBuffer) then - begin - if (dctxPtr.dictSize > 131072) then - begin - move((dctxPtr.dict + dctxPtr.dictSize - 65536)^, dctxPtr.dict^, 65536); - dctxPtr.dictSize := 65536; - end; - dctxPtr.tmpOut := dctxPtr.dict + dctxPtr.dictSize; - end - else // dict not within tmp - begin - reservedDictSpace := dctxPtr.dictSize; - if (reservedDictSpace > 65536) then - reservedDictSpace := 65536; - dctxPtr.tmpOut := dctxPtr.tmpOutBuffer + reservedDictSpace; - end; - end; - // Decode - decodedSize := decoder(pAnsiChar(selectedIn), pAnsiChar(dctxPtr.tmpOut), integer(dctxPtr.tmpInTarget), - integer(dctxPtr.maxBlockSize), pAnsiChar(dctxPtr.dict), integer(dctxPtr.dictSize)); - if decodedSize < 0 then - exit(size_t(-integer(ERROR_decompressionFailed))); // decompression failed - if (dctxPtr.frameInfo.contentChecksumFlag <> noContentChecksum) then - XXH32_update(@(dctxPtr.xxh), dctxPtr.tmpOut, decodedSize); - dctxPtr.tmpOutSize := decodedSize; - dctxPtr.tmpOutStart := 0; - dctxPtr.dStage := cardinal(dstage_flushOut); - end; - cardinal(dstage_flushOut): // flush decoded data from tmpOut to dstBuffer - begin - sizeToCopy := dctxPtr.tmpOutSize - dctxPtr.tmpOutStart; - if (sizeToCopy > size_t(dstEnd - dstPtr)) then - sizeToCopy := dstEnd - dstPtr; - move((dctxPtr.tmpOut + dctxPtr.tmpOutStart)^, dstPtr^, sizeToCopy); - // dictionary management - if (dctxPtr.frameInfo.blockMode = blockLinked) then - LZ4F_updateDict(dctxPtr, dstPtr, sizeToCopy, dstStart, 1); - - inc(dctxPtr.tmpOutStart, sizeToCopy); - inc(dstPtr, sizeToCopy); - // end of flush ? - if (dctxPtr.tmpOutStart = dctxPtr.tmpOutSize) then - dctxPtr.dStage := cardinal(dstage_getCBlockSize) - else - begin - nextSrcSizeHint := 4; - doAnotherStage := 0; // still some data to flush - end; - end; - cardinal(dstage_getSuffix): - begin - suffixSize := cardinal(dctxPtr.frameInfo.contentChecksumFlag) * 4; - if (suffixSize = 0) then // frame completed - begin - nextSrcSizeHint := 0; - dctxPtr.dStage := cardinal(dstage_getHeader); - doAnotherStage := 0; - end - else - begin - if ((srcEnd - srcPtr) >= 4) then // CRC present - begin - selectedIn := srcPtr; - inc(srcPtr, 4); - dctxPtr.dStage := cardinal(dstage_checkSuffix); - end - else - begin - dctxPtr.tmpInSize := 0; - dctxPtr.dStage := cardinal(dstage_storeSuffix); - end; - end; - end; - cardinal(dstage_storeSuffix): - begin - sizeToCopy := 4 - dctxPtr.tmpInSize; - if (sizeToCopy > size_t(srcEnd - srcPtr)) then - sizeToCopy := srcEnd - srcPtr; - move(srcPtr^, (dctxPtr.tmpIn + dctxPtr.tmpInSize)^, sizeToCopy); - inc(srcPtr, sizeToCopy); - inc(dctxPtr.tmpInSize, sizeToCopy); - if (dctxPtr.tmpInSize < 4) then // not enough input to read complete suffix - begin - nextSrcSizeHint := 4 - dctxPtr.tmpInSize; - doAnotherStage := 0; - end - else - begin - selectedIn := dctxPtr.tmpIn; - dctxPtr.dStage := cardinal(dstage_checkSuffix); - end; - end; - cardinal(dstage_checkSuffix): - begin - readCRC := LZ4F_readLE32(selectedIn); - resultCRC := XXH32_digest(@(dctxPtr.xxh)); - if (readCRC <> resultCRC) then - exit(size_t(-integer(ERROR_checksum_invalid))); - nextSrcSizeHint := 0; - dctxPtr.dStage := cardinal(dstage_getHeader); - doAnotherStage := 0; - end; - end; - end; - // preserve dictionary within tmp if necessary - if (dctxPtr.frameInfo.blockMode = blockLinked) - and (dctxPtr.dict <> dctxPtr.tmpOutBuffer) - and (decompressOptionsPtr.stableDst = 0) - and (cardinal(dctxPtr.dStage - 1) < cardinal(cardinal(dstage_getSuffix) - 1)) then - begin - if dctxPtr.dStage = cardinal(dstage_flushOut) then - begin - preserveSize := dctxPtr.tmpOut - dctxPtr.tmpOutBuffer; - copySize := 65536 - dctxPtr.tmpOutSize; - oldDictEnd := dctxPtr.dict + dctxPtr.dictSize - dctxPtr.tmpOutStart; - if dctxPtr.tmpOutSize > 65536 then - copySize := 0; - if copySize > preserveSize then - copySize := preserveSize; - move((oldDictEnd - copySize)^, (dctxPtr.tmpOutBuffer + preserveSize - copySize)^, copySize); - - dctxPtr.dict := dctxPtr.tmpOutBuffer; - dctxPtr.dictSize := preserveSize + dctxPtr.tmpOutStart; - end - else - begin - newDictSize := dctxPtr.dictSize; - oldDictEnd := dctxPtr.dict + dctxPtr.dictSize; - if newDictSize > 65536 then - newDictSize := 65536; - - move((oldDictEnd - newDictSize)^, (dctxPtr.tmpOutBuffer)^, newDictSize); - - dctxPtr.dict := dctxPtr.tmpOutBuffer; - dctxPtr.dictSize := newDictSize; - dctxPtr.tmpOut := dctxPtr.tmpOutBuffer + newDictSize; - end; - end; - if (srcPtr < srcEnd) then // function must be called again with following source data - dctxPtr.srcExpect := srcPtr - else - dctxPtr.srcExpect := Nil; - srcSizePtr^ := (srcPtr - srcStart); - dstSizePtr^ := (dstPtr - dstStart); - result := nextSrcSizeHint; -end; - -function LZ4F_createCompressionContext(var LZ4F_compressionContextPtr: PLZ4F_compressionContext_t; version: cardinal): LZ4F_errorCode_t; -var - cctxPtr: PLZ4F_cctx_internal_t; -begin - cctxPtr := allocmem(sizeof(LZ4F_cctx_internal_t)); - if cctxPtr = Nil then - exit(LZ4F_errorCode_t(-integer(ERROR_allocation_failed))); - - cctxPtr.version := version; - cctxPtr.cStage := 0; // Next stage : write header - - LZ4F_compressionContextPtr := PLZ4F_compressionContext_t(cctxPtr); - result := cardinal(OK_NoError); -end; - -function LZ4F_freeCompressionContext(LZ4F_compressionContext: PLZ4F_compressionContext_t): LZ4F_errorCode_t; -var - cctxPtr: PLZ4F_cctx_internal_t; -begin - cctxPtr := PLZ4F_cctx_internal_t(LZ4F_compressionContext); - freemem(cctxPtr.lz4CtxPtr); - freemem(cctxPtr.tmpBuff); - freemem(LZ4F_compressionContext); - result := cardinal(OK_NoError); -end; - -function LZ4F_getFrameInfo(decompressionContext: PLZ4F_decompressionContext_t; frameInfoPtr: PLZ4F_frameInfo_t; const srcBuffer: pointer; - srcSizePtr: psize_t): LZ4F_errorCode_t; -var - dctxPtr: PLZ4F_dctx_internal_t; - errorCode: LZ4F_errorCode_t; -begin - dctxPtr := PLZ4F_dctx_internal_t(decompressionContext); - if dctxPtr.dStage = cardinal(dstage_getHeader) then - begin - errorCode := LZ4F_decodeHeader(dctxPtr, srcBuffer, srcSizePtr^); - if LZ4F_isError(errorCode) then - exit(errorCode); - srcSizePtr^ := errorCode; - frameInfoPtr^ := dctxPtr.frameInfo; - dctxPtr.srcExpect := Nil; - dctxPtr.dStage := cardinal(dstage_getCBlockSize); - exit(4); - end; - srcSizePtr^ := 0; - frameInfoPtr^ := dctxPtr.frameInfo; - result := 0; -end; - -function LZ4F_freeDecompressionContext(LZ4F_decompressionContext: PLZ4F_decompressionContext_t): LZ4F_errorCode_t; -var - dctxPtr: PLZ4F_dctx_internal_t; -begin - dctxPtr := PLZ4F_dctx_internal_t(LZ4F_decompressionContext); - freemem(dctxPtr.tmpIn); - freemem(dctxPtr.tmpOutBuffer); - freemem(dctxPtr); - result := cardinal(OK_NoError); -end; - -end. diff --git a/lib/xedit/lz4/lz4frame_static.pas b/lib/xedit/lz4/lz4frame_static.pas deleted file mode 100644 index 1259560..0000000 --- a/lib/xedit/lz4/lz4frame_static.pas +++ /dev/null @@ -1,81 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) - -unit lz4frame_static; -{$POINTERMATH ON} - -interface - -uses Windows; - -type - LZ4F_LIST_ERRORS = ( - OK_NoError = 0, - ERROR_GENERIC, - ERROR_maxBlockSize_invalid, - ERROR_blockMode_invalid, - ERROR_contentChecksumFlag_invalid, - ERROR_compressionLevel_invalid, - ERROR_allocation_failed, - ERROR_srcSize_tooLarge, - ERROR_dstMaxSize_tooSmall, - ERROR_decompressionFailed, - ERROR_checksum_invalid, - ERROR_maxCode); - -const - LZ4F_errorStrings : array[0..11] of AnsiString = - ( - 'OK_NoError', - 'ERROR_GENERIC', - 'ERROR_maxBlockSize_invalid', - 'ERROR_blockMode_invalid', - 'ERROR_contentChecksumFlag_invalid', - 'ERROR_compressionLevel_invalid', - 'ERROR_allocation_failed', - 'ERROR_srcSize_tooLarge', - 'ERROR_dstMaxSize_tooSmall', - 'ERROR_decompressionFailed', - 'ERROR_checksum_invalid', - 'ERROR_maxCode' - ); - -implementation - -end. diff --git a/lib/xedit/lz4/lz4io.pas b/lib/xedit/lz4/lz4io.pas deleted file mode 100644 index fcbd8f3..0000000 --- a/lib/xedit/lz4/lz4io.pas +++ /dev/null @@ -1,488 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) - - -unit lz4io; -{$POINTERMATH ON} - -interface - -uses Windows, Classes, SysUtils, Math, lz4frame_static, xxHash, lz4, lz4common, lz4frame, lz4HC; - - -const - LZ4_BLOCKSIZEID_DEFAULT = 7; - ENDOFSTREAM = uint64(-1); - LZ4S_MAGICNUMBER = $184D2204; - LZ4S_SKIPPABLE0 = $184D2A50; - LZ4S_SKIPPABLEMASK = $FFFFFFF0; - LEGACY_MAGICNUMBER = $184C2102; - MAGICNUMBER_SIZE = 4; - LEGACY_BLOCKSIZE = 8388608; - MIN_STREAM_BUFSIZE = 196608; - -var - lz4_overwrite_file: boolean = true; - globalblockSizeID: integer = LZ4_BLOCKSIZEID_DEFAULT; - blockIndependence: integer = 1; - streamChecksum: integer = 1; - -function LZ4IO_compressFilename_Legacy(input_filename: string; output_filename: string; compressionLevel: integer): integer; -function LZ4IO_compressFilename(input_filename: string; output_filename: string; compressionLevel: integer): integer; -function LZ4IO_decompressFilename(input_filename: string; output_filename: string): integer; -procedure lz4DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; - const OutBuf: Pointer; BufSize: Integer); - -implementation - -const - minBlockSizeID: integer = 4; - maxBlockSizeID: integer = 7; - -function reportError(err: string): integer; -begin - //LZ4Client.Memo.Lines.Add(err); - result := 0; -end; - -procedure LZ4IO_writeLE32(p: pointer; value32: cardinal); -var - dstPtr: pByte; -begin - dstPtr := p; - dstPtr[0] := byte(value32); - dstPtr[1] := byte(value32 shr 8); - dstPtr[2] := byte(value32 shr 16); - dstPtr[3] := byte(value32 shr 24); -end; - -function LZ4IO_compressFilename_Legacy(input_filename: string; output_filename: string; compressionLevel: integer): integer; -type - TCompressionFunction = - function(c1: pAnsiChar; c2: pAnsiChar; c3: integer): integer; -var - compressionFunction: TCompressionFunction; - filesize: uint64; - compressedfilesize: uint64; - in_buff: pAnsiChar; - out_buff: pAnsiChar; - fileIn: TFileSTream; - fileOut: TFileSTream; - sizeCheck: size_t; - outSize, inSize: cardinal; -begin - filesize := 0; - compressedfilesize := MAGICNUMBER_SIZE; - - if (compressionLevel < 3) then - compressionFunction := LZ4_compress - else - compressionFunction := LZ4_compressHC; - fileIn := TFileSTream.Create(input_filename, fmOpenRead); - fileOut := TFileSTream.Create(output_filename, fmCreate); - - in_buff := allocmem(LEGACY_BLOCKSIZE); - out_buff := allocmem(LZ4_compressBound(LEGACY_BLOCKSIZE)); - try - if (in_buff = nil) or (out_buff = nil) then - exit(reportError('Allocation error : not enough memory')); - LZ4IO_writeLE32(out_buff, LEGACY_MAGICNUMBER); - sizeCheck := fileOut.Write(out_buff^, MAGICNUMBER_SIZE); - if sizeCheck <> MAGICNUMBER_SIZE then - exit(reportError('Write error : cannot write header')); - while true do - begin - inSize := fileIn.Read(in_buff^, LEGACY_BLOCKSIZE); - if inSize <= 0 then - break; - inc(filesize, inSize); - outSize := compressionFunction(in_buff, out_buff + 4, inSize); - inc(compressedfilesize, outSize + 4); - LZ4IO_writeLE32(out_buff, outSize); - sizeCheck := fileOut.Write(out_buff^, outSize + 4); - if sizeCheck <> size_t(outSize + 4) then - exit(reportError('Write error : cannot write compressed block')); - end; - finally - if in_buff <> nil then - freemem(in_buff); - if out_buff <> nil then - freemem(out_buff); - fileIn.Free; - fileOut.Free; - result := 0; - end; -end; - -function LZ4IO_setBlockSizeID(bsid: integer): integer; -const - blockSizeTable: array [0 .. 3] of integer = (65536, 262144, 1048576, 4194304); -begin - if (bsid < minBlockSizeID) or (bsid > maxBlockSizeID) then - exit(-1); - globalblockSizeID := bsid; - result := blockSizeTable[globalblockSizeID - minBlockSizeID]; -end; - -function LZ4IO_compressFilename(input_filename: string; output_filename: string; compressionLevel: integer): integer; -var - filesize: uint64; - errorCode: LZ4F_errorCode_t; - ctx: PLZ4F_compressionContext_t; - blockSize: integer; - fileIn: TFileSTream; - fileOut: TFileSTream; - prefs: LZ4F_preferences_t; - in_buff: pAnsiChar; - out_buff: pAnsiChar; - outBuffSize: size_t; - headerSize: size_t; - sizeCheck: size_t; - readSize: size_t; - outSize: size_t; -begin - result := 0; - filesize := 0; - errorCode := LZ4F_createCompressionContext(ctx, LZ4F_VERSION); - if (LZ4F_isError(errorCode)) then - exit(reportError(format('Allocation error : can''t create LZ4F context: %s', [LZ4F_getErrorName(errorCode)]))); - fileIn := TFileSTream.Create(input_filename, fmOpenRead); - fileOut := TFileSTream.Create(output_filename, fmCreate); - blockSize := 1 shl (8 + 2 * globalblockSizeID); - fillchar(prefs, sizeof(LZ4F_preferences_t), 0); - - prefs.autoFlush := 1; - prefs.compressionLevel := compressionLevel; - prefs.frameInfo.blockMode := blockMode_t(blockIndependence); - prefs.frameInfo.blockSizeID := blockSizeID_t(globalblockSizeID); - prefs.frameInfo.contentChecksumFlag := contentChecksum_t(streamChecksum); - - // Allocate Memory - in_buff := allocmem(blockSize); - outBuffSize := LZ4F_compressBound(blockSize, @prefs); - out_buff := allocmem(outBuffSize); - try - if (in_buff = nil) or (out_buff = nil) then - exit(reportError('Allocation error : not enough memory')); - // Write Archive Header - headerSize := LZ4F_compressBegin(ctx, out_buff, outBuffSize, @prefs); - if (LZ4F_isError(headerSize)) then - exit(reportError(format('File header generation failed: %s', [LZ4F_getErrorName(errorCode)]))); - sizeCheck := fileOut.Write(out_buff^, headerSize); - if sizeCheck <> headerSize then - exit(reportError('Write error : cannot write header')); - - readSize := fileIn.Read(in_buff^, blockSize); - inc(filesize, readSize); - while readSize > 0 do - begin - outSize := LZ4F_compressUpdate(ctx, out_buff, outBuffSize, in_buff, readSize, Nil); - if (LZ4F_isError(outSize)) then - exit(reportError(format('Compression failed: %s', [LZ4F_getErrorName(errorCode)]))); - sizeCheck := fileOut.Write(out_buff^, outSize); - if sizeCheck <> outSize then - exit(reportError('Write error : cannot write compressed block')); - readSize := fileIn.Read(in_buff^, blockSize); - inc(filesize, readSize); - end; - // End of Stream mark - headerSize := LZ4F_compressEnd(ctx, out_buff, outBuffSize, Nil); - if LZ4F_isError(headerSize) then - exit(reportError(format('End of file generation failed: %s', [LZ4F_getErrorName(errorCode)]))); - sizeCheck := fileOut.Write(out_buff^, headerSize); - if sizeCheck <> headerSize then - exit(reportError('Write error : cannot write end of stream')); - errorCode := LZ4F_freeCompressionContext(ctx); - if LZ4F_isError(errorCode) then - exit(reportError(format('Error : can''t free LZ4F context resource: %s', [LZ4F_getErrorName(errorCode)]))); - finally - if in_buff <> nil then - freemem(in_buff); - if out_buff <> nil then - freemem(out_buff); - fileIn.Free;; - fileOut.Free; - end; -end; - -function LZ4IO_readLE32(s: pointer): cardinal; -var - srcPtr: pByte; - value32: cardinal; -begin - srcPtr := s; - value32 := srcPtr[0]; - inc(value32, (srcPtr[1] shl 8)); - inc(value32, (srcPtr[2] shl 16)); - inc(value32, (srcPtr[3] shl 24)); - result := value32; -end; - -function LZ4S_isSkippableMagicNumber(magic: cardinal): boolean; -begin - result := (magic and LZ4S_SKIPPABLEMASK) = LZ4S_SKIPPABLE0; -end; - -function decodeLZ4S(finput, foutput: TSTream): uint64; -const - HEADERMAX = 20; -var - filesize: uint64; - inBuff: pAnsiChar; - outBuff: pAnsiChar; - headerBuff: array [0 .. HEADERMAX - 1] of ansiChar; - sizeCheck, nextToRead, outBuffSize, inBuffSize: size_t; - ctx: PLZ4F_decompressionContext_t; - errorCode: LZ4F_errorCode_t; - frameInfo: LZ4F_frameInfo_t; - decodedBytes: size_t; -begin - filesize := 0; - errorCode := LZ4F_createDecompressionContext(ctx, LZ4F_VERSION); - if LZ4F_isError(errorCode) then - exit(reportError(format('Allocation error : can''t create context: %s', [LZ4F_getErrorName(errorCode)]))); - LZ4IO_writeLE32(@headerBuff, LZ4S_MAGICNUMBER); - outBuffSize := 0; - inBuffSize := 0; - sizeCheck := MAGICNUMBER_SIZE; - nextToRead := LZ4F_decompress(ctx, Nil, @outBuffSize, @headerBuff, @sizeCheck, Nil); - if LZ4F_isError(nextToRead) then - exit(reportError(format('Decompression error: %s', [LZ4F_getErrorName(errorCode)]))); - if nextToRead > HEADERMAX then - exit(reportError(format('Header too large (%d>%d)', [integer(nextToRead), HEADERMAX]))); - sizeCheck := finput.Read(headerBuff, nextToRead); - if sizeCheck <> nextToRead then - exit(reportError('Read error')); - nextToRead := LZ4F_decompress(ctx, Nil, @outBuffSize, @headerBuff, @sizeCheck, Nil); - errorCode := LZ4F_getFrameInfo(ctx, @frameInfo, Nil, @inBuffSize); - if LZ4F_isError(errorCode) then - exit(reportError(format('can''t decode frame header: %s', [LZ4F_getErrorName(errorCode)]))); - outBuffSize := LZ4IO_setBlockSizeID(integer(frameInfo.blockSizeID)); - inBuffSize := outBuffSize + 4; - inBuff := allocmem(inBuffSize); - outBuff := allocmem(outBuffSize); - try - if (inBuff = nil) or (outBuff = nil) then - exit(reportError('Allocation error : not enough memory')); - while (nextToRead <> 0) do - begin - decodedBytes := outBuffSize; - sizeCheck := finput.Read(inBuff^, nextToRead); - if sizeCheck <> nextToRead then - exit(reportError('Read error')); - errorCode := LZ4F_decompress(ctx, outBuff, @decodedBytes, inBuff, @sizeCheck, Nil); - if LZ4F_isError(errorCode) then - exit(reportError(format('Decompression error: %s', [LZ4F_getErrorName(errorCode)]))); - if sizeCheck <> nextToRead then - exit(reportError('Synchronization error')); - nextToRead := errorCode; - inc(filesize, decodedBytes); - sizeCheck := foutput.Write(outBuff^, decodedBytes); - if sizeCheck <> decodedBytes then - exit(reportError('Write error : cannot write decoded block')); - end; - errorCode := LZ4F_freeDecompressionContext(ctx); - if LZ4F_isError(errorCode) then - exit(reportError(format('Error : can''t free LZ4F context resource: %s', [LZ4F_getErrorName(errorCode)]))); - finally - if inBuff <> nil then - freemem(inBuff); - if outBuff <> nil then - freemem(outBuff); - result := filesize; - end; -end; - -function decodeLegacyStream(finput, foutput: TSTream): uint64; -var - filesize: uint64; - in_buff: pAnsiChar; - out_buff: pAnsiChar; - decodeSize: integer; - sizeCheck: size_t; - blockSize: cardinal; -begin - filesize := 0; - in_buff := allocmem(LZ4_compressBound(LEGACY_BLOCKSIZE)); - out_buff := allocmem(LEGACY_BLOCKSIZE); - try - if (in_buff = nil) or (out_buff = nil) then - exit(reportError('Allocation error : not enough memory')); - while true do - begin - sizeCheck := finput.Read(in_buff^, 4); - if sizeCheck = 0 then - break; - blockSize := LZ4IO_readLE32(in_buff); - if blockSize > LZ4_compressBound(LEGACY_BLOCKSIZE) then - begin - finput.Seek(-4, soFromCurrent); - break; - end; - sizeCheck := finput.Read(in_buff^, blockSize); - if sizeCheck <> blockSize then - exit(reportError('Error reading input file')); - decodeSize := LZ4_decompress_safe(in_buff, out_buff, blockSize, LEGACY_BLOCKSIZE); - if (decodeSize < 0) then - exit(reportError('Decoding Failed ! Corrupted input detected')); - inc(filesize, decodeSize); - sizeCheck := foutput.Write(out_buff^, decodeSize); - if sizeCheck <> size_t(decodeSize) then - exit(reportError('Write error : cannot write decoded block into output')); - end; - finally - if in_buff <> nil then - freemem(in_buff); - if out_buff <> nil then - freemem(out_buff); - result := filesize; - end; -end; - -function selectDecoder(finput, foutput: TSTream): uint64; -var - nbReadBytes: size_t; - U32Store: array [0 .. MAGICNUMBER_SIZE - 1] of byte; - magicNumber, Size: cardinal; - newPos: uint64; -begin - nbReadBytes := finput.Read(U32Store, MAGICNUMBER_SIZE); - if nbReadBytes = 0 then - exit(ENDOFSTREAM); - if nbReadBytes <> MAGICNUMBER_SIZE then - exit(reportError('Unrecognized header : Magic Number unreadable')); - magicNumber := LZ4IO_readLE32(@U32Store); - if LZ4S_isSkippableMagicNumber(magicNumber) then - magicNumber := LZ4S_SKIPPABLE0; - - case magicNumber of - LZ4S_MAGICNUMBER: result := decodeLZ4S(finput, foutput); - LEGACY_MAGICNUMBER: - begin - result := decodeLegacyStream(finput, foutput); - end; - LZ4S_SKIPPABLE0: - begin - nbReadBytes := finput.Read(U32Store, 4); - if (nbReadBytes <> 4) then - exit(reportError('Stream error : skippable size unreadable')); - Size := LZ4IO_readLE32(@U32Store); - newPos := finput.Seek(Size, soFromCurrent); - if newPos <> finput.Position then - exit(reportError('Stream error : cannot skip skippable area')); - result := selectDecoder(finput, foutput); - end; - else - begin - if finput.Position = MAGICNUMBER_SIZE then - exit(reportError('Unrecognized header : file cannot be decoded')); - reportError('Stream followed by unrecognized data'); - result := ENDOFSTREAM; - end; - end; -end; - -function LZ4IO_decompressFilename(input_filename: string; output_filename: string): integer; -var - fileIn: TFileSTream; - fileOut: TFileSTream; - decodedSize: int64; - filesize: int64; -begin - result := 0; - filesize := 0; - fileIn := TFileSTream.Create(input_filename, fmOpenRead); - fileOut := TFileSTream.Create(output_filename, fmCreate); - repeat - decodedSize := selectDecoder(fileIn, fileOut); - if decodedSize <> ENDOFSTREAM then - inc(filesize, decodedSize); - until decodedSize = ENDOFSTREAM; - fileIn.Free;; - fileOut.Free; -end; - -type - TPreallocatedMemoryStream = class(TCustomMemoryStream) - public - constructor Create(Ptr: Pointer; Size: Int64); - function Write(const Buffer; Count: Longint): Longint; override; - end; - -constructor TPreallocatedMemoryStream.Create(Ptr: Pointer; Size: Int64); -begin - inherited Create; - SetPointer(Ptr, Size); -end; - -function TPreallocatedMemoryStream.Write(const Buffer; Count: Integer): Longint; -begin - Result := Min(Count, Size-Position); - System.Move(Buffer, Pointer(PByte(Memory) + Position)^, Result); - Seek(Result, soCurrent); -end; - -procedure lz4DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; - const OutBuf: Pointer; BufSize: Integer); -var - stin, stout: TPreallocatedMemoryStream; - decodedSize: int64; - decompressedSize: int64; -begin - stin := TPreallocatedMemoryStream.Create(InBuf, InBytes); - stout := TPreallocatedMemoryStream.Create(OutBuf, BufSize); - try - decompressedSize := 0; - repeat - decodedSize := selectDecoder(stin, stout); - if decodedSize <> ENDOFSTREAM then - Inc(decompressedSize, decodedSize); - until decodedSize = ENDOFSTREAM; - - if decompressedSize <> BufSize then - Exception.Create('lz4 decompression size mismatch'); - - //Move(stout.Memory^, OutBuf^, BufSize); - finally - stin.Free; - stout.Free; - end; -end; - -end. diff --git a/lib/xedit/lz4/xxHash.pas b/lib/xedit/lz4/xxHash.pas deleted file mode 100644 index 2f17485..0000000 --- a/lib/xedit/lz4/xxHash.pas +++ /dev/null @@ -1,637 +0,0 @@ -(* - LZ4Delphi - Copyright (C) 2015, Jose Pascoa (atelierwebgm@gmail.com) - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - ************************************************************************* - LZ4 - Fast LZ compression algorithm - xxHash - Fast Hash algorithm - LZ4 source repository : http://code.google.com/p/lz4/ - xxHash source repository : http://code.google.com/p/xxhash/ - Copyright (c) 2011-2014, Yann Collet - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ****************************************************************************** -*) - -unit xxHash; -{$POINTERMATH ON} - -interface - -uses Windows, lz4common; - -const - PRIME32_1: cardinal = 2654435761; - PRIME32_2: cardinal = 2246822519; - PRIME32_3: cardinal = 3266489917; - PRIME32_4: cardinal = 668265263; - PRIME32_5: cardinal = 374761393; - PRIME64_1: uint64 = 11400714785074694791; - PRIME64_2: uint64 = 14029467366897019727; - PRIME64_3: uint64 = 1609587929392839161; - PRIME64_4: uint64 = 9650029242287828579; - PRIME64_5: uint64 = 2870177450012600261; - -type - XXH_errorcode = (XXH_OK = 0, XXH_ERROR); - XXH_endianess = (XXH_bigEndian = 0, XXH_littleEndian = 1); - XXH_alignment = (XXH_aligned, XXH_unaligned); - - PXXH32_state_t = ^XXH32_state_t; - - XXH32_state_t = record - ll: array [0 .. 5] of int64; - end; - - PXXH_istate32_t = ^XXH_istate32_t; - - XXH_istate32_t = record - total_len: uint64; - seed: cardinal; - v1: cardinal; - v2: cardinal; - v3: cardinal; - v4: cardinal; - mem32: array [0 .. 3] of cardinal; - memsize: cardinal; - end; - - PXXH64_state_t = ^XXH64_state_t; - - XXH64_state_t = record - ll: array [0 .. 10] of int64; - end; - - PXXH_istate64_t = ^XXH_istate64_t; - - XXH_istate64_t = record - total_len: uint64; - seed: uint64; - v1: uint64; - v2: uint64; - v3: uint64; - v4: uint64; - mem64: array [0 .. 3] of uint64; - memsize: cardinal; - end; - -function XXH32(input: pointer; len: size_t; seed: cardinal): cardinal; - -function XXH32_reset(statePtr: PXXH32_state_t; seed: cardinal): XXH_errorcode; -function XXH32_update(statePtr: PXXH32_state_t; Ainput: pointer; ALength: size_t): XXH_errorcode; -function XXH32_digest(statePtr: PXXH32_state_t): cardinal; -function XXH32_createState: PXXH32_state_t; -procedure XXH32_freeState(statePtr: PXXH32_state_t); -// Obsolet in recent release -function XXH32_init(seed: cardinal): PXXH32_state_t; - -function XXH64_reset(statePtr: PXXH64_state_t; seed: uint64): XXH_errorcode; -function XXH64_update(statePtr: PXXH64_state_t; Ainput: pointer; ALength: size_t): XXH_errorcode; -function XXH64_digest(statePtr: PXXH64_state_t): uint64; -function XXH64_createState: PXXH64_state_t; -procedure XXH64_freeState(statePtr: PXXH64_state_t); -// Obsolet in recent release -function XXH64_init(seed: uint64): PXXH64_state_t; - -implementation - -type - PU32_S = ^U32_S; - - U32_S = packed record - v: cardinal; - end; - - PU64_S = ^U64_S; - - U64_S = packed record - v: uint64; - end; - -function XXH_rotl32(x, r: cardinal): cardinal; -asm - mov eax, x - mov ecx, r - rol eax, cl -end; - -(* Alternative -function XXH_rotl32(x, r: cardinal): cardinal; inline; -var - temp: cardinal; -begin - temp := x; - result := (x shl r) or (temp shr (32 - r)); -end; -*) -{$IFDEF CPUX64} - -function XXH_rotl64(x: uint64; r: cardinal): uint64; -asm - mov rax, x - mov ecx, r - rol rax, cl -end; -{$ELSE} - -function XXH_rotl64(x: uint64; r: cardinal): uint64; inline -var - temp: uint64; -begin - temp := x; - result := (x shl r) or (temp shr (64 - r)); -end; - -{$ENDIF} - -function A32(x: pointer): cardinal; inline; -begin - result := PU32_S(x).v; -end; - -function A64(x: pointer): uint64; inline; -begin - result := PU64_S(x).v; -end; - -function XXH_readLE32_align(ptr: pointer; endian: XXH_endianess; align: XXH_alignment): cardinal; inline; -begin - if align = XXH_unaligned then - result := A32(ptr) - else - result := pcardinal(ptr)^; -end; - -function XXH_readLE32(ptr: pointer): cardinal; inline; -begin - result := XXH_readLE32_align(ptr, XXH_littleEndian, XXH_unaligned); -end; - -function XXH_readLE64_align(ptr: pointer; endian: XXH_endianess; align: XXH_alignment): uint64; inline; -begin - if align = XXH_unaligned then - result := A64(ptr) - else - result := puint64(ptr)^; -end; - -function XXH_readLE64(ptr: pointer): uint64; inline; -begin - result := XXH_readLE64_align(ptr, XXH_littleEndian, XXH_unaligned); -end; - -function XXH32_reset(statePtr: PXXH32_state_t; seed: cardinal): XXH_errorcode; -var - state: PXXH_istate32_t; -begin - state := PXXH_istate32_t(statePtr); - state.seed := seed; - state.v1 := seed + PRIME32_1 + PRIME32_2; - state.v2 := seed + PRIME32_2; - state.v3 := seed + 0; - state.v4 := seed - PRIME32_1; - state.total_len := 0; - state.memsize := 0; - result := XXH_OK; -end; - -function XXH64_reset(statePtr: PXXH64_state_t; seed: uint64): XXH_errorcode; -var - state: PXXH_istate64_t; -begin - state := PXXH_istate64_t(statePtr); - state.seed := seed; - state.v1 := seed + PRIME64_1 + PRIME64_2; - state.v2 := seed + PRIME64_2; - state.v3 := seed + 0; - state.v4 := seed - PRIME64_1; - state.total_len := 0; - state.memsize := 0; - result := XXH_OK; -end; - -function XXH32_update(statePtr: PXXH32_state_t; Ainput: pointer; ALength: size_t): XXH_errorcode; -var - state: PXXH_istate32_t; - p: pByte; - bEnd: pByte; - p32: pcardinal; - limit: pByte; - v1, v2, v3, v4: cardinal; -begin - state := PXXH_istate32_t(statePtr); - p := Ainput; - bEnd := p + ALength; - inc(state.total_len, ALength); - - if (state.memsize + ALength < 16) then - begin - move(Ainput^, (pByte(@state.mem32) + state.memsize)^, ALength); - inc(state.memsize, cardinal(ALength)); - exit(XXH_OK); - end; - if state.memsize > 0 then - begin - move(Ainput^, (pByte(@state.mem32) + state.memsize)^, 16 - state.memsize); - p32 := @state.mem32; - inc(state.v1, XXH_readLE32(p32) * PRIME32_2); - state.v1 := XXH_rotl32(state.v1, 13); - state.v1 := state.v1 * PRIME32_1; - inc(p32); - inc(state.v2, XXH_readLE32(p32) * PRIME32_2); - state.v2 := XXH_rotl32(state.v2, 13); - state.v2 := state.v2 * PRIME32_1; - inc(p32); - inc(state.v3, XXH_readLE32(p32) * PRIME32_2); - state.v3 := XXH_rotl32(state.v3, 13); - state.v3 := state.v3 * PRIME32_1; - inc(p32); - inc(state.v4, XXH_readLE32(p32) * PRIME32_2); - state.v4 := XXH_rotl32(state.v4, 13); - state.v4 := state.v4 * PRIME32_1; -// inc(p32); - inc(p, 16 - state.memsize); - state.memsize := 0; - end; - - if p <= (bEnd - 16) then - begin - limit := bEnd - 16; - v1 := state.v1; - v2 := state.v2; - v3 := state.v3; - v4 := state.v4; - repeat - inc(v1, XXH_readLE32(p) * PRIME32_2); - v1 := XXH_rotl32(v1, 13); - v1 := v1 * PRIME32_1; - inc(p, 4); - inc(v2, XXH_readLE32(p) * PRIME32_2); - v2 := XXH_rotl32(v2, 13); - v2 := v2 * PRIME32_1; - inc(p, 4); - inc(v3, XXH_readLE32(p) * PRIME32_2); - v3 := XXH_rotl32(v3, 13); - v3 := v3 * PRIME32_1; - inc(p, 4); - inc(v4, XXH_readLE32(p) * PRIME32_2); - v4 := XXH_rotl32(v4, 13); - v4 := v4 * PRIME32_1; - inc(p, 4); - until p > limit; - state.v1 := v1; - state.v2 := v2; - state.v3 := v3; - state.v4 := v4; - end; - - if p < bEnd then - begin - move(p^, state.mem32, bEnd - p); - state.memsize := integer(bEnd - p); - end; - result := XXH_OK; -end; - -function XXH64_update(statePtr: PXXH64_state_t; Ainput: pointer; ALength: size_t): XXH_errorcode; -var - state: PXXH_istate64_t; - p: pByte; - bEnd: pByte; - p64: puint64; - limit: pByte; - v1, v2, v3, v4: uint64; -begin - state := PXXH_istate64_t(statePtr); - p := Ainput; - bEnd := p + ALength; - inc(state.total_len, ALength); - - if (state.memsize + ALength < 32) then - begin - move(Ainput^, (pByte(@state.mem64) + state.memsize)^, ALength); - inc(state.memsize, cardinal(ALength)); - exit(XXH_OK); - end; - - if state.memsize > 0 then - begin - move(Ainput^, (pByte(@state.mem64) + state.memsize)^, 32 - state.memsize); - p64 := @state.mem64; - inc(state.v1, XXH_readLE64(p64) * PRIME64_2); - state.v1 := XXH_rotl64(state.v1, 31); - state.v1 := state.v1 * PRIME64_1; - inc(p64); - inc(state.v2, XXH_readLE64(p64) * PRIME64_2); - state.v2 := XXH_rotl64(state.v2, 31); - state.v2 := state.v2 * PRIME64_1; - inc(p64); - inc(state.v3, XXH_readLE64(p64) * PRIME64_2); - state.v3 := XXH_rotl64(state.v3, 31); - state.v3 := state.v3 * PRIME64_1; - inc(p64); - inc(state.v4, XXH_readLE64(p64) * PRIME64_2); - state.v4 := XXH_rotl64(state.v4, 31); - state.v4 := state.v4 * PRIME64_1; - inc(p, 32 - state.memsize); - state.memsize := 0; - end; - - if (p + 32) <= bEnd then - begin - limit := bEnd - 32; - v1 := state.v1; - v2 := state.v2; - v3 := state.v3; - v4 := state.v4; - repeat - inc(v1, XXH_readLE64(p) * PRIME64_2); - v1 := XXH_rotl64(v1, 31); - v1 := v1 * PRIME64_1; - inc(p, 8); - inc(v2, XXH_readLE64(p) * PRIME64_2); - v2 := XXH_rotl64(v2, 31); - v2 := v2 * PRIME64_1; - inc(p, 8); - inc(v3, XXH_readLE64(p) * PRIME64_2); - v3 := XXH_rotl64(v3, 31); - v3 := v3 * PRIME64_1; - inc(p, 8); - inc(v4, XXH_readLE64(p) * PRIME64_2); - v4 := XXH_rotl64(v4, 31); - v4 := v4 * PRIME64_1; - inc(p, 8); - until p > limit; - state.v1 := v1; - state.v2 := v2; - state.v3 := v3; - state.v4 := v4; - end; - - if p < bEnd then - begin - move(p^, state.mem64, bEnd - p); - state.memsize := integer(bEnd - p); - end; - result := XXH_OK; -end; - -function XXH32_digest(statePtr: PXXH32_state_t): cardinal; -var - state: PXXH_istate32_t; - p: pByte; - bEnd: pByte; - h32: cardinal; -begin - state := PXXH_istate32_t(statePtr); - p := @state.mem32; - bEnd := pByte(@state.mem32) + state.memsize; - - if (state.total_len >= 16) then - h32 := XXH_rotl32(state.v1, 1) + XXH_rotl32(state.v2, 7) + XXH_rotl32(state.v3, 12) + XXH_rotl32(state.v4, 18) - else - h32 := state.seed + PRIME32_5; - - inc(h32, state.total_len); - - while (p + 4) <= bEnd do - begin - inc(h32, XXH_readLE32(p) * PRIME32_3); - h32 := XXH_rotl32(h32, 17) * PRIME32_4; - inc(p, 4); - end; - - while p < bEnd do - begin - inc(h32, p^ * PRIME32_5); - h32 := XXH_rotl32(h32, 11) * PRIME32_1; - inc(p); - end; - h32 := h32 xor (h32 shr 15); - h32 := h32 * PRIME32_2; - h32 := h32 xor (h32 shr 13); - h32 := h32 * PRIME32_3; - h32 := h32 xor (h32 shr 16); - result := h32; -end; - -function XXH64_digest(statePtr: PXXH64_state_t): uint64; -var - state: PXXH_istate64_t; - p: pByte; - bEnd: pByte; - h64: uint64; - v1, v2, v3, v4: uint64; - k1: uint64; -begin - state := PXXH_istate64_t(statePtr); - p := @state.mem64; - bEnd := pByte(@state.mem64) + state.memsize; - - if state.total_len >= 32 then - begin - v1 := state.v1; - v2 := state.v2; - v3 := state.v3; - v4 := state.v4; - h64 := XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - v1 := v1 * PRIME64_2; - v1 := XXH_rotl64(v1, 31); - v1 := v1 * PRIME64_1; - h64 := h64 xor v1; - h64 := h64 * PRIME64_1 + PRIME64_4; - - v2 := v2 * PRIME64_2; - v2 := XXH_rotl64(v2, 31); - v2 := v2 * PRIME64_1; - h64 := h64 xor v2; - h64 := h64 * PRIME64_1 + PRIME64_4; - - v3 := v3 * PRIME64_2; - v3 := XXH_rotl64(v3, 31); - v3 := v3 * PRIME64_1; - h64 := h64 xor v3; - h64 := h64 * PRIME64_1 + PRIME64_4; - - v4 := v4 * PRIME64_2; - v4 := XXH_rotl64(v4, 31); - v4 := v4 * PRIME64_1; - h64 := h64 xor v4; - h64 := h64 * PRIME64_1 + PRIME64_4; - end - else - h64 := state.seed + PRIME64_5; - inc(h64, state.total_len); - - while (p + 8) <= bEnd do - begin - k1 := XXH_readLE64(p); - k1 := k1 * PRIME64_2; - k1 := XXH_rotl64(k1, 31); - k1 := k1 * PRIME64_1; - h64 := h64 xor k1; - h64 := XXH_rotl64(h64, 27) * PRIME64_1 + PRIME64_4; - inc(p, 8); - end; - if (p + 4) <= bEnd then - begin - h64 := h64 xor (uint64(XXH_readLE32(p)) * PRIME64_1); - h64 := XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - inc(p, 4); - end; - - while (p < bEnd) do - begin - h64 := h64 xor (p^ * PRIME64_5); - h64 := XXH_rotl64(h64, 11) * PRIME64_1; - inc(p); - end; - - h64 := h64 xor (h64 shr 33); - h64 := h64 * PRIME64_2; - h64 := h64 xor (h64 shr 29); - h64 := h64 * PRIME64_3; - h64 := h64 xor (h64 shr 32); - - result := h64; -end; - -function XXH32_createState: PXXH32_state_t; -begin - result := allocmem(sizeof(XXH32_state_t)); -end; - -function XXH64_createState: PXXH64_state_t; -begin - result := allocmem(sizeof(XXH64_state_t)); -end; - -procedure XXH32_freeState(statePtr: PXXH32_state_t); -begin - freemem(statePtr); -end; - -procedure XXH64_freeState(statePtr: PXXH64_state_t); -begin - freemem(statePtr); -end; - -function XXH32_init(seed: cardinal): PXXH32_state_t; -begin - result := XXH32_createState; - XXH32_reset(result, seed); -end; - -function XXH64_init(seed: uint64): PXXH64_state_t; -begin - result := XXH64_createState; - XXH64_reset(result, seed); -end; - -function XXH32_endian_align(input: pointer; len: size_t; seed: cardinal; endian: XXH_endianess; align: XXH_alignment): cardinal; - function XXH_get32bits(p: pByte): cardinal; - begin - result := XXH_readLE32_align(p, endian, align); - end; - -var - p: pByte; - bEnd: pByte; - h32: cardinal; - limit: pByte; - v1, v2, v3, v4: cardinal; -begin - p := input; - bEnd := p + len; - if (len >= 16) then - begin - limit := bEnd - 16; - v1 := seed + PRIME32_1 + PRIME32_2; - v2 := seed + PRIME32_2; - v3 := seed + 0; - v4 := seed - PRIME32_1; - while true do - begin - inc(v1, XXH_get32bits(p) * PRIME32_2); - v1 := XXH_rotl32(v1, 13); - v1 := v1 * PRIME32_1; - inc(p, 4); - - inc(v2, XXH_get32bits(p) * PRIME32_2); - v2 := XXH_rotl32(v2, 13); - v2 := v2 * PRIME32_1; - inc(p, 4); - - inc(v3, XXH_get32bits(p) * PRIME32_2); - v3 := XXH_rotl32(v3, 13); - v3 := v3 * PRIME32_1; - inc(p, 4); - - inc(v4, XXH_get32bits(p) * PRIME32_2); - v4 := XXH_rotl32(v4, 13); - v4 := v4 * PRIME32_1; - inc(p, 4); - if p > limit then - break; - end; - h32 := XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); - end - else - h32 := seed + PRIME32_5; - - inc(h32, cardinal(len)); - while (p + 4 <= bEnd) do - begin - inc(h32, XXH_get32bits(p) * PRIME32_3); - h32 := XXH_rotl32(h32, 17) * PRIME32_4; - inc(p, 4); - end; - - while (p < bEnd) do - begin - inc(h32, p^ * PRIME32_5); - h32 := XXH_rotl32(h32, 11) * PRIME32_1; - inc(p); - end; - - h32 := h32 xor (h32 shr 15); - h32 := h32 * PRIME32_2; - h32 := h32 xor (h32 shr 13); - h32 := h32 * PRIME32_3; - h32 := h32 xor (h32 shr 16); - - result := h32; -end; - -function XXH32(input: pointer; len: size_t; seed: cardinal): cardinal; -begin - result := XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); -end; - -end. - diff --git a/lib/xedit/wbBSA.pas b/lib/xedit/wbBSA.pas deleted file mode 100644 index 7a2e5af..0000000 --- a/lib/xedit/wbBSA.pas +++ /dev/null @@ -1,974 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbBSA; - -{$I wbDefines.inc} - -interface - -uses - Classes, SysUtils, IOUtils, - wbInterface, - ImagingDds; - -function wbCreateContainerHandler: IwbContainerHandler; - -implementation - -uses - wbStreams, - zlibEx, - lz4io; - -const - { https://github.com/Ethatron/bsaopt/blob/master/io/bsa.C } - BSAHEADER_VERSION_OB = $67; // Oblivion - BSAHEADER_VERSION_SK = $68; // Fallout3, Skyrim - BSAHEADER_VERSION_SSE = $69; // Skyrim Special Edition - BSAARCHIVE_COMPRESSFILES = $0004; // Whether the files are compressed in archive (invert file's compression flag) - BSAARCHIVE_PREFIXFULLFILENAMES = $0100; // Whether the name is prefixed to the data? - BSAFILE_COMPRESS = $40000000; // Whether the file is compressed - { https://github.com/jonwd7/bae/blob/master/src/bsa.h } - BA2HEADER_VERSION_FO4 = $01; // Fallout 4 - -type - TwbContainerHandler = class(TInterfacedObject, IwbContainerHandler) - private - chContainers: array of IwbResourceContainer; - protected - procedure AddContainer(const aContainer: IwbResourceContainer); - - {---IwbContainerHandler---} - procedure AddFolder(const aPath: string); - procedure AddBSA(const aFileName: string); - procedure AddBA2(const aFileName: string); - - function OpenResource(const aFileName: string): TDynResources; - function OpenResourceData(const aContainerName, aFileName: string): TBytes; - function ContainerExists(aContainerName: string): Boolean; - procedure ContainerList(const aList: TStrings); - procedure ContainerResourceList(const aContainerName: string; const aList: TStrings; - const aFolder: string = ''); - function ResourceExists(const aFileName: string): Boolean; - function ResolveHash(const aHash: Int64): TDynStrings; - function ResourceCount(const aFileName: string; aContainers: TStrings = nil): Integer; - procedure ResourceCopy(const aContainerName, aFileName, aPathOut: string); - end; - - TwbBSAFileRec = record - Name : string; - Hash : Int64; - Size : Cardinal; - Offset : Cardinal; - end; - - TwbBSAFolderRec = record - Name : string; - Hash : Int64; - Files : array of TwbBSAFileRec; - Map : TStringList; - end; - - IwbBSAFileInternal = interface(IwbBSAFile) - ['{A360B348-8F6B-4FC1-A869-9D5B833DCA5F}'] - function GetData(aOffset, aSize: Cardinal): TBytes; - end; - - TwbBSAFile = class(TInterfacedObject, IwbResourceContainer, IwbBSAFile, IwbBSAFileInternal) - private - bfStream : TwbReadOnlyCachedFileStream; - bfFileName : string; - bfVersion : Cardinal; - bfOffset : Cardinal; - bfFlags : Cardinal; - bfFileFlags : Cardinal; - bfFolders : array of TwbBSAFolderRec; - bfFolderMap : TStringList; - - procedure ReadDirectory; - protected - {---IwbResourceContainer---} - function GetName: string; - function OpenResource(const aFileName: string): IwbResource; - function ResourceExists(const aFileName: string): Boolean; - procedure ResourceList(const aList: TStrings; const aFolder: string = ''); - procedure ResolveHash(const aHash: Int64; var Results: TDynStrings); - - {---IwbBSAFile---} - function GetFileName: string; - - {---IwbBSAFileInternal---} - function GetData(aOffset, aSize: Cardinal):TBytes; - public - constructor Create(const aFileName: string); - destructor Destroy; override; - end; - - TwbBSAResource = class(TInterfacedObject, IwbResource) - brFile : IwbBSAFileInternal; - brOffset : Cardinal; - brSize : Cardinal; - protected - {---IwbResource---} - function GetContainer: IwbResourceContainer; - function GetData: TBytes; - public - constructor Create(aFile: TwbBSAFile; aSize, aOffset: Cardinal); - end; - - - TwbBA2TexChunkRec = record - Size : Cardinal; - PackedSize : Cardinal; - Offset : Int64; - StartMip : Word; - EndMip : Word; - end; - - TwbBA2FileRec = record - Name : string; - NameHash : Cardinal; - DirHash : Cardinal; - Size : Cardinal; - PackedSize : Cardinal; - Offset : Int64; - Height : Word; - Width : Word; - NumMips : Byte; - DXGIFormat : Byte; - CubeMaps : Word; - TexChunks : array of TwbBA2TexChunkRec; - end; - - IwbBA2FileInternal = interface(IwbBA2File) - ['{87D66150-746E-4B37-B295-45C4221CDCBE}'] - procedure ReadData(var Buffer; Offset: Int64; Count: Longint); - end; - - TwbBA2File = class(TInterfacedObject, IwbResourceContainer, IwbBA2File, IwbBA2FileInternal) - private - bfStream : TwbReadOnlyCachedFileStream; - bfFileName : string; - bfVersion : Cardinal; - bfType : TwbSignature; - bfFiles : array of TwbBA2FileRec; - bfFolderMap : TStringList; - - procedure ReadDirectory; - protected - {---IwbResourceContainer---} - function GetName: string; - function OpenResource(const aFileName: string): IwbResource; - function ResourceExists(const aFileName: string): Boolean; - procedure ResourceList(const aList: TStrings; const aFolder: string = ''); - procedure ResolveHash(const aHash: Int64; var Results: TDynStrings); - - {---IwbBA2File---} - function GetFileName: string; - - {---IwbBA2FileInternal---} - procedure ReadData(var Buffer; Offset: Int64; Count: Longint); - public - constructor Create(const aFileName: string); - destructor Destroy; override; - end; - - TwbBA2Resource = class(TInterfacedObject, IwbResource) - brFile : IwbBA2FileInternal; - brFileRec : TwbBA2FileRec; - protected - {---IwbResource---} - function GetContainer: IwbResourceContainer; - function GetData: TBytes; - public - constructor Create(aFile: TwbBA2File; var aFileRec: TwbBA2FileRec); - end; - - - IwbFolderInternal = interface(IwbFolder) - ['{6DF2B964-5AF7-4732-BD28-CD7600407A83}'] - end; - - TwbFolder = class(TInterfacedObject, IwbResourceContainer, IwbFolder, IwbFolderInternal) - private - fPath : string; - protected - {---IwbResourceContainer---} - function GetName: string; - function OpenResource(const aFileName: string): IwbResource; - function ResourceExists(const aFileName: string): Boolean; - procedure ResourceList(const aList: TStrings; const aFolder: string = ''); - procedure ResolveHash(const aHash: Int64; var Results: TDynStrings); - - {---IwbFolder---} - function GetPathName: string; - public - constructor Create(const aPath: string); - destructor Destroy; override; - end; - - TwbFolderResource = class(TInterfacedObject, IwbResource) - frFolder : IwbFolderInternal; - frFileName : string; - protected - {---IwbResource---} - function GetContainer: IwbResourceContainer; - function GetData: TBytes; - public - constructor Create(aFolder: IwbFolderInternal; const aFileName: string); - destructor Destroy; override; - end; - - -function wbCreateContainerHandler: IwbContainerHandler; -begin - Result := TwbContainerHandler.Create; -end; - -{ TwbContainerHandler } - -procedure TwbContainerHandler.AddContainer(const aContainer: IwbResourceContainer); -begin - SetLength(chContainers, Succ(Length(chContainers))); - chContainers[High(chContainers)] := aContainer; -end; - -function TwbContainerHandler.ContainerExists(aContainerName: string): Boolean; -var - i: Integer; -begin - Result := True; - for i := Low(chContainers) to High(chContainers) do - if SameText(chContainers[i].Name, aContainerName) then - Exit; - Result := False; -end; - -procedure TwbContainerHandler.AddBSA(const aFileName: string); -begin - if not ContainerExists(aFileName) then - AddContainer(TwbBSAFile.Create(aFileName)); -end; - -procedure TwbContainerHandler.AddBA2(const aFileName: string); -begin - if not ContainerExists(aFileName) then - AddContainer(TwbBA2File.Create(aFileName)); -end; - -procedure TwbContainerHandler.AddFolder(const aPath: string); -begin - if not ContainerExists(aPath) then - AddContainer(TwbFolder.Create(aPath)); -end; - -function TwbContainerHandler.OpenResource(const aFileName: string): TDynResources; -var - i, j: Integer; -begin - SetLength(Result, Length(chContainers)); - j := 0; - for i := Low(chContainers) to High(chContainers) do begin - Result[j] := chContainers[i].OpenResource(aFileName); - if Assigned(Result[j]) then - Inc(j); - end; - SetLength(Result, j); -end; - -function TwbContainerHandler.OpenResourceData(const aContainerName, aFileName: string): TBytes; -var - Res : TDynResources; - i : Integer; -begin - Res := OpenResource(aFileName); - - if Length(Res) = 0 then - Exit; - - for i := High(Res) downto Low(Res) do - if (aContainerName = '') or SameText(Res[i].Container.Name, aContainerName) then begin - Result := Res[i].GetData; - Break; - end; -end; - -procedure TwbContainerHandler.ContainerList(const aList: TStrings); -var - i: Integer; -begin - if not Assigned(aList) then - Exit; - - for i := Low(chContainers) to High(chContainers) do - aList.Add(chContainers[i].Name); -end; - -procedure TwbContainerHandler.ContainerResourceList(const aContainerName: string; const aList: TStrings; - const aFolder: string = ''); -var - i: Integer; -begin - for i := Low(chContainers) to High(chContainers) do - if SameText(chContainers[i].Name, aContainerName) then begin - chContainers[i].ResourceList(aList, aFolder); - Break; - end; -end; - -function TwbContainerHandler.ResourceExists(const aFileName: string): Boolean; -var - i: Integer; -begin - Result := False; - for i := Low(chContainers) to High(chContainers) do - if chContainers[i].ResourceExists(aFileName) then begin - Result := True; - Exit; - end; -end; - -function TwbContainerHandler.ResolveHash(const aHash: Int64): TDynStrings; -var - i: Integer; -begin - Result := nil; - for i := Low(chContainers) to High(chContainers) do - chContainers[i].ResolveHash(aHash, Result); -end; - -function TwbContainerHandler.ResourceCount(const aFileName: string; aContainers: TStrings = nil): Integer; -var - i: Integer; -begin - Result := 0; - for i := Low(chContainers) to High(chContainers) do - if chContainers[i].ResourceExists(aFileName) then begin - Inc(Result); - if Assigned(aContainers) then - aContainers.Add(chContainers[i].Name); - end; -end; - -procedure TwbContainerHandler.ResourceCopy(const aContainerName, aFileName, aPathOut: string); -var - fn, dir : string; - aData : TBytes; - res : TDynResources; - i, residx : integer; -begin - if aPathOut = '' then - raise Exception.Create('Destination path is not specified'); - - res := OpenResource(aFileName); - - if Length(res) = 0 then - raise Exception.Create('Resource doesn''t exist'); - - residx := High(res); - for i := High(res) to Low(res) do - if (aContainerName = '') or SameText(res[i].Container.Name, aContainerName) then begin - residx := i; - Break; - end; - - // file name is provided instead of path - if TPath.HasExtension(aPathOut) then - fn := aPathOut - // destination path is provided - else - fn := IncludeTrailingPathDelimiter(aPathOut) + aFileName; - - // create distination directory - dir := ExtractFilePath(fn); - if not DirectoryExists(dir) then - if not ForceDirectories(dir) then - raise Exception.Create('Unable to create destination directory ' + dir); - - // direct copy if file is loose, with overwriting - if ExtractFileExt(res[residx].Container.Name) = '' then begin - TFile.Copy(res[residx].Container.Name + aFileName, fn, True); - end - // otherwise extract from BSA - else begin - aData := res[residx].GetData; - // exception handled outside - with TFileStream.Create(fn, fmCreate) do try - WriteBuffer(aData[0], Length(aData)); - finally - Free; - end; - end; -end; - - -{ TwbBSAFile } - -constructor TwbBSAFile.Create(const aFileName: string); -begin - bfFileName := aFileName; - bfStream := TwbReadOnlyCachedFileStream.Create(aFileName); - ReadDirectory; -end; - -destructor TwbBSAFile.Destroy; -var - i: Integer; -begin - FreeAndNil(bfStream); - for i := Low(bfFolders) to High(bfFolders) do with bfFolders[i] do - FreeAndNil(Map); - FreeAndNil(bfFolderMap); - inherited; -end; - -function TwbBSAFile.GetData(aOffset, aSize: Cardinal): TBytes; -var - IsCompressed : Boolean; - Buffer : TBytes; -begin - IsCompressed := (aSize and BSAFILE_COMPRESS) <> 0; - if IsCompressed then - aSize := aSize and not BSAFILE_COMPRESS; - if (bfFlags and BSAARCHIVE_COMPRESSFILES) <> 0 then - IsCompressed := not IsCompressed; - bfStream.Position := aOffset; - if (bfVersion >= BSAHEADER_VERSION_SK) and ((bfFlags and BSAARCHIVE_PREFIXFULLFILENAMES) <> 0) then - // size - file name length (no terminator) - string length prefix - aSize := aSize - Length(bfStream.ReadStringLen(False)) - 1; - if IsCompressed then begin - SetLength(Result, bfStream.ReadCardinal); - aSize := aSize - 4; - if (Length(Result) > 0) and (aSize > 0) then begin - SetLength(Buffer, aSize); - bfStream.ReadBuffer(Buffer[0], Length(Buffer)); - if bfVersion = BSAHEADER_VERSION_SSE then - lz4DecompressToUserBuf(@Buffer[0], Length(Buffer), @Result[0], Length(Result)) - else - DecompressToUserBuf(@Buffer[0], Length(Buffer), @Result[0], Length(Result)); - end; - end else begin - SetLength(Result, aSize); - if aSize > 0 then - bfStream.ReadBuffer(Result[0], aSize); - end; -end; - -function TwbBSAFile.GetFileName: string; -begin - Result := bfFileName; -end; - -function TwbBSAFile.GetName: string; -begin - Result := GetFileName; -end; - -function TwbBSAFile.OpenResource(const aFileName: string): IwbResource; -var - lPath, lName: string; - i, j: Integer; -begin - Result := nil; - lPath := ExtractFilePath(aFileName); - SetLength(lPath, Pred(Length(lPath))); - lName := ExtractFileName(aFileName); - if bfFolderMap.Find(lPath, i) then - with bfFolders[Integer(bfFolderMap.Objects[i])] do - if Map.Find(lName, j) then - with Files[Integer(Map.Objects[j])] do - Result := TwbBSAResource.Create(Self, Size, Offset); -end; - -function TwbBSAFile.ResourceExists(const aFileName: string): Boolean; -var - lPath, lName: string; - i: Integer; -begin - Result := False; - lPath := ExtractFilePath(aFileName); - SetLength(lPath, Pred(Length(lPath))); - lName := ExtractFileName(aFileName); - if bfFolderMap.Find(lPath, i) then - Result := bfFolders[Integer(bfFolderMap.Objects[i])].Map.IndexOf(lName) <> -1; -end; - -procedure TwbBSAFile.ResourceList(const aList: TStrings; const aFolder: string = ''); -var - i, j: Integer; - Folder: string; -begin - if not Assigned(aList) then - Exit; - Folder := ExcludeTrailingPathDelimiter(aFolder); - for i := Low(bfFolders) to High(bfFolders) do with bfFolders[i] do - if (aFolder = '') or SameText(Folder, Name) then - for j := Low(Files) to High(Files) do - aList.Add(Name + '\' + Files[j].Name); -end; - -procedure TwbBSAFile.ReadDirectory; -var - i, j : Integer; - OldPos : Int64; - NewPos : Int64; -// FileCount : Cardinal; -// totalFolderNameLength : Cardinal; - totalFileNameLength : Cardinal; -begin - if bfStream.ReadSignature <> 'BSA' then - raise Exception.Create(bfFileName + ' is not a valid BSA file'); - bfVersion := bfStream.ReadCardinal; - if not (bfVersion in [BSAHEADER_VERSION_OB, BSAHEADER_VERSION_SK, BSAHEADER_VERSION_SSE]) then - raise Exception.Create(bfFileName + ' has unknown version: ' + IntToStr(bfVersion) ); - bfOffset := bfStream.ReadCardinal; - if bfOffset <> $24 then - raise Exception.Create(bfFileName + ' has unexpected Offset: ' + IntToStr(bfOffset) ); - bfFlags := bfStream.ReadCardinal; - SetLength(bfFolders, bfStream.ReadCardinal); - {FileCount := } bfStream.ReadCardinal; //skip file count - {totalFolderNameLength := } bfStream.ReadCardinal; //skip totalFolderNameLength - totalFileNameLength := bfStream.ReadCardinal; //skip totalFileNameLength - bfFileFlags := bfStream.ReadCardinal; - OldPos := bfStream.Position; - for i := Low(bfFolders) to High(bfFolders) do with bfFolders[i] do begin - bfStream.Position := OldPos; - Hash := bfStream.ReadInt64; // skip hash - SetLength(Files, bfStream.ReadCardinal); - if bfVersion = BSAHEADER_VERSION_SSE then begin - bfStream.ReadCardinal; // skip unk32 - NewPos := bfStream.ReadInt64; - end else - NewPos := bfStream.ReadCardinal; - OldPos := bfStream.Position; - bfStream.Position := NewPos - totalFileNameLength; - Name := bfStream.ReadStringLen; - for j := Low(Files) to High(Files) do with Files[j] do begin - Hash := bfStream.ReadInt64; // skip hash - Size := bfStream.ReadCardinal; - Offset := bfStream.ReadCardinal; - end; - end; - bfFolderMap := TwbFastStringList.Create; - for i := Low(bfFolders) to High(bfFolders) do with bfFolders[i] do begin - bfFolderMap.AddObject(Name, TObject(i)); - Map := TwbFastStringList.Create; - for j := Low(Files) to High(Files) do with Files[j] do begin - Name := bfStream.ReadStringTerm; - Map.AddObject(Name, TObject(j)); - end; - Map.Sorted := True; - end; - bfFolderMap.Sorted := True; -end; - -procedure TwbBSAFile.ResolveHash(const aHash: Int64; var Results: TDynStrings); -var - i, j: Integer; -begin - for i := Low(bfFolders) to High(bfFolders) do with bfFolders[i] do begin - if Hash = aHash then begin - SetLength(Results, Succ(Length(Results))); - Results[High(Results)] := Name; - end; - for j := Low(Files) to High(Files) do with Files[j] do begin - if Hash = aHash then begin - SetLength(Results, Succ(Length(Results))); - Results[High(Results)] := Name; - end; - end; - end; -end; - -{ TwbBSAResource } - -constructor TwbBSAResource.Create(aFile: TwbBSAFile; aSize, aOffset: Cardinal); -begin - brFile := aFile; - brOffset := aOffset; - brSize := aSize; -end; - -function TwbBSAResource.GetContainer: IwbResourceContainer; -begin - Result := brFile; -end; - -function TwbBSAResource.GetData: TBytes; -begin - Result := brFile.GetData(brOffset, brSize); -end; - - -{ TwbBA2File } - -constructor TwbBA2File.Create(const aFileName: string); -begin - bfFileName := aFileName; - bfStream := TwbReadOnlyCachedFileStream.Create(aFileName); - ReadDirectory; -end; - -destructor TwbBA2File.Destroy; -var - i: integer; -begin - FreeAndNil(bfStream); - for i := 0 to Pred(bfFolderMap.Count) do - TStringList(bfFolderMap.Objects[i]).Free; - FreeAndNil(bfFolderMap); - inherited; -end; - -procedure TwbBA2File.ReadDirectory; -var - i, j : Integer; - OldPos : Int64; - FileCount : Cardinal; - FileTablePosition: Int64; - NumChunks: Byte; - folder: string; -begin - if bfStream.ReadSignature <> 'BTDX' then - raise Exception.Create(bfFileName + ' is not a valid BA2 file'); - bfVersion := bfStream.ReadCardinal; - if bfVersion <> BA2HEADER_VERSION_FO4 then - raise Exception.Create(bfFileName + ' has unknown version: ' + IntToStr(bfVersion) ); - bfType := bfStream.ReadSignature; - if (bfType <> 'GNRL') and (bfType <> 'DX10') then - raise Exception.Create(bfFileName + ' has unknown type: ' + String(bfType)); - FileCount := bfStream.ReadCardinal; - FileTablePosition := bfStream.ReadInt64; - OldPos := bfStream.Position; - bfStream.Position := FileTablePosition; - SetLength(bfFiles, FileCount); - for i := Low(bfFiles) to High(bfFiles) do begin - bfFiles[i].Name := bfStream.ReadStringLen16; - end; - bfStream.Position := OldPos; - - if bfType = 'GNRL' then begin - for i := Low(bfFiles) to High(bfFiles) do begin - bfFiles[i].NameHash := bfStream.ReadCardinal; - bfStream.ReadCardinal; // skip ext - bfFiles[i].DirHash := bfStream.ReadCardinal; - bfStream.ReadCardinal; // skip unk0C - bfFiles[i].Offset := bfStream.ReadInt64; - bfFiles[i].PackedSize := bfStream.ReadCardinal; - bfFiles[i].Size := bfStream.ReadCardinal; - bfStream.ReadCardinal; // skip BAADF00D - end; - end - else if bfType = 'DX10' then begin - for i := Low(bfFiles) to High(bfFiles) do begin - bfFiles[i].NameHash := bfStream.ReadCardinal; - bfStream.ReadCardinal; // skip ext - bfFiles[i].DirHash := bfStream.ReadCardinal; - bfStream.ReadByte; // skip unk0C - NumChunks := bfStream.ReadByte; - bfStream.ReadWord; // skip chunkHeaderSize - bfFiles[i].Height := bfStream.ReadWord; - bfFiles[i].Width := bfStream.ReadWord; - bfFiles[i].NumMips := bfStream.ReadByte; - bfFiles[i].DXGIFormat := bfStream.ReadByte; - bfFiles[i].CubeMaps := bfStream.ReadWord; - SetLength(bfFiles[i].TexChunks, NumChunks); - for j := Low(bfFiles[i].TexChunks) to High(bfFiles[i].TexChunks) do - with bfFiles[i].TexChunks[j] do begin - Offset := bfStream.ReadInt64; - PackedSize := bfStream.ReadCardinal; - Size := bfStream.ReadCardinal; - StartMip := bfStream.ReadWord; - EndMip := bfStream.ReadWord; - bfStream.ReadCardinal; // skip BAADF00D - end; - end; - end; - - bfFolderMap := TwbFastStringList.Create; - bfFolderMap.Sorted := True; - for i := Low(bfFiles) to High(bfFiles) do begin - folder := LowerCase(ExtractFilePath(bfFiles[i].Name)); - SetLength(folder, Pred(Length(folder))); - j := bfFolderMap.IndexOf(folder); - if not bfFolderMap.Find(folder, j) then begin - bfFolderMap.AddObject(folder, TwbFastStringList.Create); - if not bfFolderMap.Find(folder, j) then - raise Exception.Create('Indexing error'); - end; - TStringList(bfFolderMap.Objects[j]).AddObject(LowerCase(ExtractFileName(bfFiles[i].Name)), TObject(i)); - end; - for i := 0 to Pred(bfFolderMap.Count) do - TStringList(bfFolderMap.Objects[i]).Sorted := True; -end; - -function TwbBA2File.GetFileName: string; -begin - Result := bfFileName; -end; - -function TwbBA2File.GetName: string; -begin - Result := GetFileName; -end; - -procedure TwbBA2File.ReadData(var Buffer; Offset: Int64; Count: Longint); -begin - bfStream.Position := Offset; - bfStream.ReadBuffer(Buffer, Count); -end; - -function TwbBA2File.OpenResource(const aFileName: string): IwbResource; -var - lPath, lName: string; - i, j: Integer; -begin - lPath := LowerCase(ExtractFilePath(aFileName)); - SetLength(lPath, Pred(Length(lPath))); - lName := LowerCase(ExtractFileName(aFileName)); - if bfFolderMap.Find(lPath, i) then with TStringList(bfFolderMap.Objects[i]) do - if Find(lName, j) then - Result := TwbBA2Resource.Create(Self, bfFiles[Integer(Objects[j])]); -end; - -procedure TwbBA2File.ResolveHash(const aHash: Int64; var Results: TDynStrings); -begin - // ... -end; - -function TwbBA2File.ResourceExists(const aFileName: string): Boolean; -var - lPath, lName: string; - i: Integer; -begin - Result := False; - lPath := LowerCase(ExtractFilePath(aFileName)); - SetLength(lPath, Pred(Length(lPath))); - lName := LowerCase(ExtractFileName(aFileName)); - if bfFolderMap.Find(lPath, i) then - Result := TStringList(bfFolderMap.Objects[i]).IndexOf(lName) <> -1; -end; - -procedure TwbBA2File.ResourceList(const aList: TStrings; const aFolder: string = ''); -var - i: Integer; -begin - if not Assigned(aList) then - Exit; - for i := Low(bfFiles) to High(bfFiles) do - aList.Add(LowerCase(bfFiles[i].Name)); -end; - - -{ TwbBA2Resource } - -constructor TwbBA2Resource.Create(aFile: TwbBA2File; var aFileRec: TwbBA2FileRec); -begin - brFile := aFile; - brFileRec := aFileRec; -end; - -function TwbBA2Resource.GetContainer: IwbResourceContainer; -begin - Result := brFile; -end; - -function TwbBA2Resource.GetData: TBytes; -const - FOURCC_BC7 = LongWord(Byte('B') or (Byte('C') shl 8) or (Byte('7') shl 16) or - (Byte(0) shl 24)); -var - Buffer : TBytes; - Hdr: ^TDDSFileHeader; - TexSize, i: integer; -begin - // GNRL resource - if (brFileRec.Size <> 0) and (Length(brFileRec.TexChunks) = 0) then begin - if brFileRec.PackedSize <> 0 then begin - SetLength(Buffer, brFileRec.PackedSize); - brFile.ReadData(Buffer[0], brFileRec.Offset, Length(Buffer)); - SetLength(Result, brFileRec.Size); - DecompressToUserBuf(@Buffer[0], Length(Buffer), @Result[0], Length(Result)); - end - else begin - SetLength(Result, brFileRec.Size); - brFile.ReadData(Result[0], brFileRec.Offset, Length(Result)); - end; - end - // DX10 texture - else if Length(brFileRec.TexChunks) <> 0 then begin - // calculate texture size including header - TexSize := SizeOf(TDDSFileHeader); - for i := Low(brFileRec.TexChunks) to High(brFileRec.TexChunks) do - Inc(TexSize, brFileRec.TexChunks[i].Size); - SetLength(Result, TexSize); - // fill DDS header - Hdr := @Result[0]; - hdr.Magic := DDSMagic; - hdr.Desc.Size := SizeOf(hdr.Desc); - hdr.Desc.Width := brFileRec.Width; - hdr.Desc.Height := brFileRec.Height; - hdr.Desc.Flags := DDS_SAVE_FLAGS or DDSD_MIPMAPCOUNT; - hdr.Desc.Caps.Caps1 := DDSCAPS_TEXTURE or DDSCAPS_MIPMAP; - hdr.Desc.MipMaps := brFileRec.NumMips; - if brFileRec.CubeMaps = 2049 then - hdr.Desc.Caps.Caps2 := DDSCAPS2_POSITIVEX or DDSCAPS2_NEGATIVEX - or DDSCAPS2_POSITIVEY or DDSCAPS2_NEGATIVEY - or DDSCAPS2_POSITIVEZ or DDSCAPS2_NEGATIVEZ - or DDSCAPS2_CUBEMAP; - hdr.Desc.PixelFormat.Size := SizeOf(hdr.Desc.PixelFormat); - case TDXGIFormat(brFileRec.DXGIFormat) of - DXGI_FORMAT_BC1_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_FOURCC; - hdr.Desc.PixelFormat.FourCC := FOURCC_DXT1; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height div 4; - end; - DXGI_FORMAT_BC2_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_FOURCC; - hdr.Desc.PixelFormat.FourCC := FOURCC_DXT3; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height; - end; - DXGI_FORMAT_BC3_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_FOURCC; - hdr.Desc.PixelFormat.FourCC := FOURCC_DXT5; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height; - end; - DXGI_FORMAT_BC5_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_FOURCC; - hdr.Desc.PixelFormat.FourCC := FOURCC_ATI2; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height; - end; - DXGI_FORMAT_BC7_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_FOURCC; - hdr.Desc.PixelFormat.FourCC := FOURCC_BC7; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height; - end; - DXGI_FORMAT_B8G8R8A8_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_RGB; - hdr.Desc.PixelFormat.BitCount := 32; - hdr.Desc.PixelFormat.RedMask := $00FF0000; - hdr.Desc.PixelFormat.GreenMask := $0000FF00; - hdr.Desc.PixelFormat.BlueMask := $000000FF; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height * 4; - end; - DXGI_FORMAT_R8_UNORM: begin - hdr.Desc.PixelFormat.Flags := DDPF_RGB; - hdr.Desc.PixelFormat.BitCount := 8; - hdr.Desc.PixelFormat.RedMask := $FF; - hdr.Desc.PitchOrLinearSize := brFileRec.Width * brFileRec.Height; - end; - end; - // append chunks - TexSize := SizeOf(TDDSFileHeader); - for i := Low(brFileRec.TexChunks) to High(brFileRec.TexChunks) do with brFileRec.TexChunks[i] do begin - // compressed chunk - if PackedSize <> 0 then begin - SetLength(Buffer, PackedSize); - brFile.ReadData(Buffer[0], Offset, Length(Buffer)); - DecompressToUserBuf(@Buffer[0], Length(Buffer), @Result[TexSize], Size); - end - // uncompressed chunk - else - brFile.ReadData(Result[TexSize], Offset, Size); - Inc(TexSize, Size); - end; - end; -end; - - -{ TwbFolder } - -constructor TwbFolder.Create(const aPath: string); -begin - fPath := IncludeTrailingPathDelimiter(aPath); -end; - -destructor TwbFolder.Destroy; -begin - - inherited; -end; - -function TwbFolder.GetPathName: string; -begin - Result := fPath; -end; - -function TwbFolder.GetName: string; -begin - Result := GetPathName; -end; - -function TwbFolder.OpenResource(const aFileName: string): IwbResource; -var - s: string; -begin - s := fPath + aFileName; - if FileExists(s) then - Result := TwbFolderResource.Create(Self, s); -end; - -function TwbFolder.ResourceExists(const aFileName: string): Boolean; -begin - Result := FileExists(fPath + aFileName); -end; - -procedure TwbFolder.ResourceList(const aList: TStrings; const aFolder: string = ''); -var - FileName: string; -begin - if not Assigned(aList) then - Exit; - if TDirectory.Exists(fPath + aFolder) then - for FileName in TDirectory.GetFiles(fPath + aFolder, '*.*', TSearchOption.soAllDirectories) do - aList.Add(LowerCase(Copy(FileName, Length(fPath) + 1, Length(FileName)))); -end; - -procedure TwbFolder.ResolveHash(const aHash: Int64; var Results: TDynStrings); -begin - //... -end; - -{ TwbFolderResource } - -constructor TwbFolderResource.Create(aFolder: IwbFolderInternal; const aFileName: string); -begin - frFolder := aFolder; - frFileName := aFileName; -end; - -destructor TwbFolderResource.Destroy; -begin - - inherited; -end; - -function TwbFolderResource.GetContainer: IwbResourceContainer; -begin - Result := frFolder; -end; - -function TwbFolderResource.GetData: TBytes; -begin - with TFileStream.Create(frFileName, fmOpenRead or fmShareDenyWrite) do try - SetLength(Result, Size); - if Length(Result) > 0 then - ReadBuffer(Result[0], Length(Result)); - finally - Free; - end; -end; - -end. diff --git a/lib/xedit/wbDefines.inc b/lib/xedit/wbDefines.inc deleted file mode 100644 index 492fe49..0000000 --- a/lib/xedit/wbDefines.inc +++ /dev/null @@ -1,15 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -{.$DEFINE USE_CODESITE} \ No newline at end of file diff --git a/lib/xedit/wbDefinitionsFNV.pas b/lib/xedit/wbDefinitionsFNV.pas deleted file mode 100644 index 913580b..0000000 --- a/lib/xedit/wbDefinitionsFNV.pas +++ /dev/null @@ -1,11803 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbDefinitionsFNV; - -{$I wbDefines.inc} - -interface - -uses - wbInterface; - -var - wbAggroRadiusFlags: IwbFlagsDef; - wbPKDTFlags: IwbFlagsDef; - wbRecordFlagsFlags: IwbFlagsDef; - wbServiceFlags: IwbFlagsDef; - wbTemplateFlags: IwbFlagsDef; - - wbAgressionEnum: IwbEnumDef; - wbAlignmentEnum: IwbEnumDef; - wbArchtypeEnum: IwbEnumDef; - wbAssistanceEnum: IwbEnumDef; - wbAttackAnimationEnum: IwbEnumDef; - wbAxisEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbBodyLocationEnum: IwbEnumDef; - wbBodyPartIndexEnum: IwbEnumDef; - wbConfidenceEnum: IwbEnumDef; - wbCreatureTypeEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbCriticalStageEnum: IwbEnumDef; - wbEquipTypeEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFunctionsEnum: IwbEnumDef; - wbHeadPartIndexEnum: IwbEnumDef; - wbImpactMaterialTypeEnum: IwbEnumDef; - wbMenuModeEnum: IwbEnumDef; - wbMiscStatEnum: IwbEnumDef; - wbModEffectEnum: IwbEnumDef; - wbMoodEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbObjectTypeEnum: IwbEnumDef; - wbPKDTType: IwbEnumDef; - wbPlayerActionEnum: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbReloadAnimEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoundLevelEnum: IwbEnumDef; - wbSpecializationEnum: IwbEnumDef; - wbVatsValueFunctionEnum: IwbEnumDef; - wbWeaponAnimTypeEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - -function wbCreaLevelDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - -procedure DefineFNV; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants, - wbHelpers; - -const - _00_IAD: TwbSignature = #$00'IAD'; - _40_IAD: TwbSignature = #$40'IAD'; - _01_IAD: TwbSignature = #$01'IAD'; - _41_IAD: TwbSignature = #$41'IAD'; - _02_IAD: TwbSignature = #$02'IAD'; - _42_IAD: TwbSignature = #$42'IAD'; - _03_IAD: TwbSignature = #$03'IAD'; - _43_IAD: TwbSignature = #$43'IAD'; - _04_IAD: TwbSignature = #$04'IAD'; - _44_IAD: TwbSignature = #$44'IAD'; - _05_IAD: TwbSignature = #$05'IAD'; - _45_IAD: TwbSignature = #$45'IAD'; - _06_IAD: TwbSignature = #$06'IAD'; - _46_IAD: TwbSignature = #$46'IAD'; - _07_IAD: TwbSignature = #$07'IAD'; - _47_IAD: TwbSignature = #$47'IAD'; - _08_IAD: TwbSignature = #$08'IAD'; - _48_IAD: TwbSignature = #$48'IAD'; - _09_IAD: TwbSignature = #$09'IAD'; - _49_IAD: TwbSignature = #$49'IAD'; - _0A_IAD: TwbSignature = #$0A'IAD'; - _4A_IAD: TwbSignature = #$4A'IAD'; - _0B_IAD: TwbSignature = #$0B'IAD'; - _4B_IAD: TwbSignature = #$4B'IAD'; - _0C_IAD: TwbSignature = #$0C'IAD'; - _4C_IAD: TwbSignature = #$4C'IAD'; - _0D_IAD: TwbSignature = #$0D'IAD'; - _4D_IAD: TwbSignature = #$4D'IAD'; - _0E_IAD: TwbSignature = #$0E'IAD'; - _4E_IAD: TwbSignature = #$4E'IAD'; - _0F_IAD: TwbSignature = #$0F'IAD'; - _4F_IAD: TwbSignature = #$4F'IAD'; - _10_IAD: TwbSignature = #$10'IAD'; - _50_IAD: TwbSignature = #$50'IAD'; - _11_IAD: TwbSignature = #$11'IAD'; - _51_IAD: TwbSignature = #$51'IAD'; - _12_IAD: TwbSignature = #$12'IAD'; - _52_IAD: TwbSignature = #$52'IAD'; - _13_IAD: TwbSignature = #$13'IAD'; - _53_IAD: TwbSignature = #$53'IAD'; - _14_IAD: TwbSignature = #$14'IAD'; - _54_IAD: TwbSignature = #$54'IAD'; - - _0_IAD : TwbSignature = #0'IAD'; - _1_IAD : TwbSignature = #1'IAD'; - _2_IAD : TwbSignature = #2'IAD'; - _3_IAD : TwbSignature = #3'IAD'; - _4_IAD : TwbSignature = #4'IAD'; - _5_IAD : TwbSignature = #5'IAD'; - ACBS : TwbSignature = 'ACBS'; - ACHR : TwbSignature = 'ACHR'; - ACRE : TwbSignature = 'ACRE'; - ACTI : TwbSignature = 'ACTI'; - ADDN : TwbSignature = 'ADDN'; - AIDT : TwbSignature = 'AIDT'; - ALCH : TwbSignature = 'ALCH'; - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - ARMA : TwbSignature = 'ARMA'; - ARMO : TwbSignature = 'ARMO'; - ASPC : TwbSignature = 'ASPC'; - ATTR : TwbSignature = 'ATTR'; - ATXT : TwbSignature = 'ATXT'; - AVIF : TwbSignature = 'AVIF'; - BIPL : TwbSignature = 'BIPL'; - BMCT : TwbSignature = 'BMCT'; - BMDT : TwbSignature = 'BMDT'; - BNAM : TwbSignature = 'BNAM'; - BOOK : TwbSignature = 'BOOK'; - BPND : TwbSignature = 'BPND'; - BPNI : TwbSignature = 'BPNI'; - BPNN : TwbSignature = 'BPNN'; - BPNT : TwbSignature = 'BPNT'; - BPTD : TwbSignature = 'BPTD'; - BPTN : TwbSignature = 'BPTN'; - BTXT : TwbSignature = 'BTXT'; - CAMS : TwbSignature = 'CAMS'; - CELL : TwbSignature = 'CELL'; - CLAS : TwbSignature = 'CLAS'; - CLMT : TwbSignature = 'CLMT'; - CNAM : TwbSignature = 'CNAM'; - MMRK : TwbSignature = 'MMRK'; - CNTO : TwbSignature = 'CNTO'; - COBJ : TwbSignature = 'COBJ'; - COED : TwbSignature = 'COED'; - CONT : TwbSignature = 'CONT'; - CPTH : TwbSignature = 'CPTH'; - CRDT : TwbSignature = 'CRDT'; - CREA : TwbSignature = 'CREA'; - CSAD : TwbSignature = 'CSAD'; - CSCR : TwbSignature = 'CSCR'; - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSSD : TwbSignature = 'CSSD'; - CSTD : TwbSignature = 'CSTD'; - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - DATA : TwbSignature = 'DATA'; - DAT2 : TwbSignature = 'DAT2'; - DEBR : TwbSignature = 'DEBR'; - DELE : TwbSignature = 'DELE'; - DESC : TwbSignature = 'DESC'; - DEST : TwbSignature = 'DEST'; - DIAL : TwbSignature = 'DIAL'; - DMDL : TwbSignature = 'DMDL'; - DMDT : TwbSignature = 'DMDT'; - DNAM : TwbSignature = 'DNAM'; - DOBJ : TwbSignature = 'DOBJ'; - DODT : TwbSignature = 'DODT'; - DOOR : TwbSignature = 'DOOR'; - DSTD : TwbSignature = 'DSTD'; - DSTF : TwbSignature = 'DSTF'; - EAMT : TwbSignature = 'EAMT'; - ECZN : TwbSignature = 'ECZN'; - EDID : TwbSignature = 'EDID'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - EFSD : TwbSignature = 'EFSD'; - EFSH : TwbSignature = 'EFSH'; - EITM : TwbSignature = 'EITM'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - EPF2 : TwbSignature = 'EPF2'; - EPF3 : TwbSignature = 'EPF3'; - EPFD : TwbSignature = 'EPFD'; - EPFT : TwbSignature = 'EPFT'; - ESCE : TwbSignature = 'ESCE'; - ETYP : TwbSignature = 'ETYP'; - EXPL : TwbSignature = 'EXPL'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FGGA : TwbSignature = 'FGGA'; - FGGS : TwbSignature = 'FGGS'; - FGTS : TwbSignature = 'FGTS'; - FLST : TwbSignature = 'FLST'; - FLTV : TwbSignature = 'FLTV'; - FNAM : TwbSignature = 'FNAM'; - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - GLOB : TwbSignature = 'GLOB'; - RDID : TwbSignature = 'RDID'; - RDSI : TwbSignature = 'RDSI'; - RDSB : TwbSignature = 'RDSB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - HAIR : TwbSignature = 'HAIR'; - HCLR : TwbSignature = 'HCLR'; - HDPT : TwbSignature = 'HDPT'; - HEDR : TwbSignature = 'HEDR'; - HNAM : TwbSignature = 'HNAM'; - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLA : TwbSignature = 'IDLA'; - IDLB : TwbSignature = 'IDLB'; - IDLC : TwbSignature = 'IDLC'; - IDLE : TwbSignature = 'IDLE'; - IDLF : TwbSignature = 'IDLF'; - IDLM : TwbSignature = 'IDLM'; - IDLT : TwbSignature = 'IDLT'; - IMAD : TwbSignature = 'IMAD'; - IMGS : TwbSignature = 'IMGS'; - INAM : TwbSignature = 'INAM'; - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - IPCT : TwbSignature = 'IPCT'; - IPDS : TwbSignature = 'IPDS'; - ITXT : TwbSignature = 'ITXT'; - JNAM : TwbSignature = 'JNAM'; - KEYM : TwbSignature = 'KEYM'; - KFFZ : TwbSignature = 'KFFZ'; - KNAM : TwbSignature = 'KNAM'; - LAND : TwbSignature = 'LAND'; - LGTM : TwbSignature = 'LGTM'; - LIGH : TwbSignature = 'LIGH'; - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LTEX : TwbSignature = 'LTEX'; - LTMP : TwbSignature = 'LTMP'; - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLG : TwbSignature = 'LVLG'; - LVLI : TwbSignature = 'LVLI'; - LVLN : TwbSignature = 'LVLN'; - LVLO : TwbSignature = 'LVLO'; - MAST : TwbSignature = 'MAST'; - MESG : TwbSignature = 'MESG'; - MGEF : TwbSignature = 'MGEF'; - MICN : TwbSignature = 'MICN'; - MICO : TwbSignature = 'MICO'; - MIC2 : TwbSignature = 'MIC2'; - MISC : TwbSignature = 'MISC'; - MNAM : TwbSignature = 'MNAM'; - MO2B : TwbSignature = 'MO2B'; - MO2S : TwbSignature = 'MO2S'; - MO2T : TwbSignature = 'MO2T'; - MO3B : TwbSignature = 'MO3B'; - MO3S : TwbSignature = 'MO3S'; - MO3T : TwbSignature = 'MO3T'; - MO4B : TwbSignature = 'MO4B'; - MO4S : TwbSignature = 'MO4S'; - MO4T : TwbSignature = 'MO4T'; - MOD2 : TwbSignature = 'MOD2'; - VANM : TwbSignature = 'VANM'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MODB : TwbSignature = 'MODB'; - MODD : TwbSignature = 'MODD'; - MODL : TwbSignature = 'MODL'; - MODS : TwbSignature = 'MODS'; - MODT : TwbSignature = 'MODT'; - MOSD : TwbSignature = 'MOSD'; - MSTT : TwbSignature = 'MSTT'; - MUSC : TwbSignature = 'MUSC'; - IMPS : TwbSignature = 'IMPS'; - IMPF : TwbSignature = 'IMPF'; - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM3 : TwbSignature = 'NAM3'; - NAM4 : TwbSignature = 'NAM4'; - NAM5 : TwbSignature = 'NAM5'; - NAM6 : TwbSignature = 'NAM6'; - NAM7 : TwbSignature = 'NAM7'; - NAM8 : TwbSignature = 'NAM8'; - NAM9 : TwbSignature = 'NAM9'; - NAME : TwbSignature = 'NAME'; - NAVI : TwbSignature = 'NAVI'; - NAVM : TwbSignature = 'NAVM'; - NEXT : TwbSignature = 'NEXT'; - NIFT : TwbSignature = 'NIFT'; - NIFZ : TwbSignature = 'NIFZ'; - NNAM : TwbSignature = 'NNAM'; - XSRF : TwbSignature = 'XSRF'; - XSRD : TwbSignature = 'XSRD'; - MWD1 : TwbSignature = 'MWD1'; - MWD2 : TwbSignature = 'MWD2'; - MWD3 : TwbSignature = 'MWD3'; - MWD4 : TwbSignature = 'MWD4'; - MWD5 : TwbSignature = 'MWD5'; - MWD6 : TwbSignature = 'MWD6'; - MWD7 : TwbSignature = 'MWD7'; - WNM1 : TwbSignature = 'WNM1'; - WNM2 : TwbSignature = 'WNM2'; - WNM3 : TwbSignature = 'WNM3'; - WNM4 : TwbSignature = 'WNM4'; - WNM5 : TwbSignature = 'WNM5'; - WNM6 : TwbSignature = 'WNM6'; - WNM7 : TwbSignature = 'WNM7'; - WMI1 : TwbSignature = 'WMI1'; - WMI2 : TwbSignature = 'WMI2'; - WMI3 : TwbSignature = 'WMI3'; - WMS1 : TwbSignature = 'WMS1'; - WMS2 : TwbSignature = 'WMS2'; - NOTE : TwbSignature = 'NOTE'; - NPC_ : TwbSignature = 'NPC_'; - NULL : TwbSignature = 'NULL'; - NVCA : TwbSignature = 'NVCA'; - NVCI : TwbSignature = 'NVCI'; - NVDP : TwbSignature = 'NVDP'; - NVER : TwbSignature = 'NVER'; - NVEX : TwbSignature = 'NVEX'; - NVGD : TwbSignature = 'NVGD'; - NVMI : TwbSignature = 'NVMI'; - NVTR : TwbSignature = 'NVTR'; - NVVX : TwbSignature = 'NVVX'; - OBND : TwbSignature = 'OBND'; - OFST : TwbSignature = 'OFST'; - ONAM : TwbSignature = 'ONAM'; - PACK : TwbSignature = 'PACK'; - PBEA : TwbSignature = 'PBEA'; - PERK : TwbSignature = 'PERK'; - PFIG : TwbSignature = 'PFIG'; - PFPC : TwbSignature = 'PFPC'; - PGAG : TwbSignature = 'PGAG'; - PGRE : TwbSignature = 'PGRE'; - PMIS : TwbSignature = 'PMIS'; - TRGT : TwbSignature = 'TRGT'; - PGRI : TwbSignature = 'PGRI'; - PGRL : TwbSignature = 'PGRL'; - PGRP : TwbSignature = 'PGRP'; - PGRR : TwbSignature = 'PGRR'; - PKAM : TwbSignature = 'PKAM'; - PKDD : TwbSignature = 'PKDD'; - PKDT : TwbSignature = 'PKDT'; - PKE2 : TwbSignature = 'PKE2'; - PKED : TwbSignature = 'PKED'; - PKFD : TwbSignature = 'PKFD'; - PKID : TwbSignature = 'PKID'; - PKPT : TwbSignature = 'PKPT'; - PKW3 : TwbSignature = 'PKW3'; - PLD2 : TwbSignature = 'PLD2'; - PLDT : TwbSignature = 'PLDT'; - PLYR : TwbSignature = 'PLYR'; - PNAM : TwbSignature = 'PNAM'; - TDUM : TwbSignature = 'TDUM'; - POBA : TwbSignature = 'POBA'; - POCA : TwbSignature = 'POCA'; - POEA : TwbSignature = 'POEA'; - PRKC : TwbSignature = 'PRKC'; - PRKE : TwbSignature = 'PRKE'; - PRKF : TwbSignature = 'PRKF'; - PROJ : TwbSignature = 'PROJ'; - PSDT : TwbSignature = 'PSDT'; - PTD2 : TwbSignature = 'PTD2'; - PTDT : TwbSignature = 'PTDT'; - PUID : TwbSignature = 'PUID'; - PWAT : TwbSignature = 'PWAT'; - QNAM : TwbSignature = 'QNAM'; - RCIL : TwbSignature = 'RCIL'; - RCQY : TwbSignature = 'RCQY'; - RCOD : TwbSignature = 'RCOD'; - QOBJ : TwbSignature = 'QOBJ'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QSTI : TwbSignature = 'QSTI'; - TPIC : TwbSignature = 'TPIC'; - QSTR : TwbSignature = 'QSTR'; - INFC : TwbSignature = 'INFC'; - INFX : TwbSignature = 'INFX'; - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RADS : TwbSignature = 'RADS'; - RAFB : TwbSignature = 'RAFB'; - RAFD : TwbSignature = 'RAFD'; - RAGA : TwbSignature = 'RAGA'; - RAPS : TwbSignature = 'RAPS'; - RCLR : TwbSignature = 'RCLR'; - RDAT : TwbSignature = 'RDAT'; - RDMD : TwbSignature = 'RDMD'; - RDMO : TwbSignature = 'RDMO'; - RDMP : TwbSignature = 'RDMP'; - RDGS : TwbSignature = 'RDGS'; - RDOT : TwbSignature = 'RDOT'; - RDSD : TwbSignature = 'RDSD'; - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - REGN : TwbSignature = 'REGN'; - REPL : TwbSignature = 'REPL'; - RGDL : TwbSignature = 'RGDL'; - RNAM : TwbSignature = 'RNAM'; - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - SCDA : TwbSignature = 'SCDA'; - SCHR : TwbSignature = 'SCHR'; - SCOL : TwbSignature = 'SCOL'; - SCPT : TwbSignature = 'SCPT'; - SCRI : TwbSignature = 'SCRI'; - SCRN : TwbSignature = 'SCRN'; - SCRO : TwbSignature = 'SCRO'; - SCRV : TwbSignature = 'SCRV'; - SCTX : TwbSignature = 'SCTX'; - SCVR : TwbSignature = 'SCVR'; - SLCP : TwbSignature = 'SLCP'; - SLSD : TwbSignature = 'SLSD'; - SNAM : TwbSignature = 'SNAM'; - SNDD : TwbSignature = 'SNDD'; - SNDX : TwbSignature = 'SNDX'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPEL : TwbSignature = 'SPEL'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - STAT : TwbSignature = 'STAT'; - BRUS : TwbSignature = 'BRUS'; - TACT : TwbSignature = 'TACT'; - TCLF : TwbSignature = 'TCLF'; - TCFU : TwbSignature = 'TCFU'; - TCLT : TwbSignature = 'TCLT'; - TERM : TwbSignature = 'TERM'; - TES4 : TwbSignature = 'TES4'; - TNAM : TwbSignature = 'TNAM'; - TPLT : TwbSignature = 'TPLT'; - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - TX00 : TwbSignature = 'TX00'; - TX01 : TwbSignature = 'TX01'; - INTV : TwbSignature = 'INTV'; - TX02 : TwbSignature = 'TX02'; - TX03 : TwbSignature = 'TX03'; - TX04 : TwbSignature = 'TX04'; - TX05 : TwbSignature = 'TX05'; - TXST : TwbSignature = 'TXST'; - UNAM : TwbSignature = 'UNAM'; - VATS : TwbSignature = 'VATS'; - VCLR : TwbSignature = 'VCLR'; - VHGT : TwbSignature = 'VHGT'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VTCK : TwbSignature = 'VTCK'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - VTYP : TwbSignature = 'VTYP'; - WATR : TwbSignature = 'WATR'; - WEAP : TwbSignature = 'WEAP'; - WLST : TwbSignature = 'WLST'; - WNAM : TwbSignature = 'WNAM'; - XATO : TwbSignature = 'XATO'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - XACT : TwbSignature = 'XACT'; - XAMC : TwbSignature = 'XAMC'; - XAMT : TwbSignature = 'XAMT'; - XAPD : TwbSignature = 'XAPD'; - XAPR : TwbSignature = 'XAPR'; - XCAS : TwbSignature = 'XCAS'; - XCCM : TwbSignature = 'XCCM'; - XCET : TwbSignature = 'XCET'; - XCHG : TwbSignature = 'XCHG'; - XCIM : TwbSignature = 'XCIM'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLP : TwbSignature = 'XCLP'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMO : TwbSignature = 'XCMO'; - XCMT : TwbSignature = 'XCMT'; - XCNT : TwbSignature = 'XCNT'; - XCWT : TwbSignature = 'XCWT'; - XEMI : TwbSignature = 'XEMI'; - XESP : TwbSignature = 'XESP'; - XEZN : TwbSignature = 'XEZN'; - XGLB : TwbSignature = 'XGLB'; - XHLP : TwbSignature = 'XHLP'; - XDCR : TwbSignature = 'XDCR'; - XHLT : TwbSignature = 'XHLT'; - XIBS : TwbSignature = 'XIBS'; - XLCM : TwbSignature = 'XLCM'; - XLKR : TwbSignature = 'XLKR'; - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XLRM : TwbSignature = 'XLRM'; - XLTW : TwbSignature = 'XLTW'; - XMBO : TwbSignature = 'XMBO'; - XMBP : TwbSignature = 'XMBP'; - XMBR : TwbSignature = 'XMBR'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XNAM : TwbSignature = 'XNAM'; - XNDP : TwbSignature = 'XNDP'; - XOCP : TwbSignature = 'XOCP'; - XORD : TwbSignature = 'XORD'; - XOWN : TwbSignature = 'XOWN'; - XPOD : TwbSignature = 'XPOD'; - XPTL : TwbSignature = 'XPTL'; - XPPA : TwbSignature = 'XPPA'; - XPRD : TwbSignature = 'XPRD'; - XPRM : TwbSignature = 'XPRM'; - XPWR : TwbSignature = 'XPWR'; - XRAD : TwbSignature = 'XRAD'; - XRDO : TwbSignature = 'XRDO'; - XRDS : TwbSignature = 'XRDS'; - XRGB : TwbSignature = 'XRGB'; - XRGD : TwbSignature = 'XRGD'; - XRMR : TwbSignature = 'XRMR'; - XRNK : TwbSignature = 'XRNK'; - XRTM : TwbSignature = 'XRTM'; - XSCL : TwbSignature = 'XSCL'; - XSED : TwbSignature = 'XSED'; - XTEL : TwbSignature = 'XTEL'; - XTRG : TwbSignature = 'XTRG'; - XTRI : TwbSignature = 'XTRI'; - XXXX : TwbSignature = 'XXXX'; - YNAM : TwbSignature = 'YNAM'; - ZNAM : TwbSignature = 'ZNAM'; - IMOD : TwbSignature = 'IMOD'; - REPU : TwbSignature = 'REPU'; - RCPE : TwbSignature = 'RCPE'; - RCCT : TwbSignature = 'RCCT'; - CHIP : TwbSignature = 'CHIP'; - CSNO : TwbSignature = 'CSNO'; - LSCT : TwbSignature = 'LSCT'; - MSET : TwbSignature = 'MSET'; - ALOC : TwbSignature = 'ALOC'; - CHAL : TwbSignature = 'CHAL'; - AMEF : TwbSignature = 'AMEF'; - CCRD : TwbSignature = 'CCRD'; - CARD : TwbSignature = 'CARD'; - CMNY : TwbSignature = 'CMNY'; - CDCK : TwbSignature = 'CDCK'; - DEHY : TwbSignature = 'DEHY'; - HUNG : TwbSignature = 'HUNG'; - SLPD : TwbSignature = 'SLPD'; - -var - wbPKDTSpecificFlagsUnused : Boolean; - wbEDID: IwbSubRecordDef; - wbEDIDReq: IwbSubRecordDef; - wbBMDT: IwbSubRecordDef; - wbYNAM: IwbSubRecordDef; - wbZNAM: IwbSubRecordDef; - wbCOED: IwbSubRecordDef; - wbXLCM: IwbSubRecordDef; - wbEITM: IwbSubRecordDef; - wbREPL: IwbSubRecordDef; - wbBIPL: IwbSubRecordDef; - wbOBND: IwbSubRecordDef; - wbOBNDReq: IwbSubRecordDef; - wbDEST: IwbSubRecordStructDef; - wbDESTActor: IwbSubRecordStructDef; - wbDODT: IwbSubRecordDef; - wbXOWN: IwbSubRecordDef; - wbXGLB: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbXRGB: IwbSubRecordDef; - wbSLSD: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordStructDef; - wbCNTOs: IwbSubRecordArrayDef; - wbAIDT: IwbSubRecordDef; - wbCSDT: IwbSubRecordStructDef; - wbCSDTs: IwbSubRecordArrayDef; - wbFULL: IwbSubRecordDef; - wbFULLActor: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbXNAM: IwbSubRecordDef; - wbXNAMs: IwbSubRecordArrayDef; - wbDESC: IwbSubRecordDef; - wbDESCReq: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot : IwbSubRecordDef; - wbPosRot : IwbStructDef; - wbMODD: IwbSubRecordDef; - wbMOSD: IwbSubRecordDef; - wbMODL: IwbSubRecordStructDef; - wbMODS: IwbSubRecordDef; - wbMO2S: IwbSubRecordDef; - wbMO3S: IwbSubRecordDef; - wbMO4S: IwbSubRecordDef; - wbMODLActor: IwbSubRecordStructDef; - wbMODLReq: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordDef; - wbSCHRReq: IwbSubRecordDef; - wbCTDAs: IwbSubRecordArrayDef; - wbCTDAsReq: IwbSubRecordArrayDef; - wbSCROs: IwbSubRecordArrayDef; - wbPGRP: IwbSubRecordDef; - wbEmbeddedScript: IwbSubRecordStructDef; - wbEmbeddedScriptPerk: IwbSubRecordStructDef; - wbEmbeddedScriptReq: IwbSubRecordStructDef; - wbSCRI: IwbSubRecordDef; - wbSCRIActor: IwbSubRecordDef; - wbFaceGen: IwbSubRecordStructDef; - wbFaceGenNPC: IwbSubRecordStructDef; - wbENAM: IwbSubRecordDef; - wbFGGS: IwbSubRecordDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordStructDef; - wbICONReq: IwbSubRecordStructDef; - wbActorValue: IwbIntegerDef; - wbETYP: IwbSubRecordDef; - wbETYPReq: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEffects: IwbSubRecordArrayDef; - wbEffectsReq: IwbSubRecordArrayDef; - wbBPNDStruct: IwbSubRecordDef; - wbTimeInterpolator: IwbStructDef; - wbColorInterpolator: IwbStructDef; - -function wbNVTREdgeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Index : Integer; - Flags : Cardinal; - IsExternal : Boolean; - Container : IwbContainerElementRef; -begin - Result := ''; - IsExternal := False; - if Supports(aElement, IwbContainerElementRef, Container) then begin - Index := StrToIntDef(Copy(Container.Name, 11, 1), -1); - if (Index >= 0) and (Index <= 2) then begin - Flags := Container.ElementNativeValues['..\..\Flags']; - IsExternal := Flags and (Cardinal(1) shl Index) <> 0; - end; - end; - - if IsExternal then begin - case aType of - ctToStr: begin - Result := IntToStr(aInt); - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := Result + ' (Triangle #' + - Container.ElementValues['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Triangle'] + ' in ' + - Container.ElementValues['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Navigation Mesh'] + ')' - else - Result := Result + ' '; - end; - ctToSortKey: - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := - Container.ElementSortKeys['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Navigation Mesh', True] + '|' + - Container.ElementSortKeys['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Triangle', True]; - ctCheck: - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := '' - else - Result := 'NVEX\Connection #' + IntToStr(aInt) + ' is missing'; - end - end else - case aType of - ctToStr: Result := IntToStr(aInt); - end; -end; - -function wbNVTREdgeToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToInt64(aString); -end; - - -function wbEPFDActorValueToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsCardinal := aInt; - AsFloat := PSingle(@AsCardinal)^; - aInt := Round(AsFloat); - case aType of - ctToStr: Result := wbActorValueEnum.ToString(aInt, aElement); - ctToSortKey: Result := wbActorValueEnum.ToSortKey(aInt, aElement); - ctCheck: Result := wbActorValueEnum.Check(aInt, aElement); - ctToEditValue: Result := wbActorValueEnum.ToEditValue(aInt, aElement); - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := wbActorValueEnum.EditInfo[aInt, aElement]; - end; -end; - -function wbEPFDActorValueToInt(const aString: string; const aElement: IwbElement): Int64; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsFloat := wbActorValueEnum.FromEditValue(aString, aElement); - PSingle(@AsCardinal)^ := AsFloat; - Result := AsCardinal; -end; - -function wbCTDAParam2VariableNameToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - //Container2 : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - Variables : TStringList; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - MainRecord := nil; - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; -{ if Param1.NativeValue = 0 then - if Supports(Container.Container, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[i], IwbContainerElementRef, Container2) then - if SameText(Container2.ElementValues['Function'], 'GetIsID') then begin - Param1 := Container2.ElementByName['Parameter #1']; - if Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Break; - end;} - - if not Assigned(MainRecord) then - Exit; - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - Script := Script.HighestOverrideOrSelf[aElement._File.LoadOrder]; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - Variables := TStringList.Create; - else - Variables := nil; - end; - try - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if Assigned(Variables) then - Variables.AddObject(s, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := s; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - Variables.Sort; - Result := Variables.CommaText; - end; - end; - finally - FreeAndNil(Variables); - end; -end; - -function wbCTDAParam2VariableNameToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - Result := StrToInt64Def(aString, Low(Cardinal)); - if Result <> Low(Cardinal) then - Exit; - - if not Assigned(aElement) then - raise Exception.Create('aElement not specified'); - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - raise Exception.Create('Container not assigned'); - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - raise Exception.Create('Could not find "Parameter #1"'); - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - raise Exception.Create('"Parameter #1" does not reference a valid main record'); - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not contain a SCRI subrecord'); - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not have a valid script'); - - Script := Script.HighestOverrideOrSelf[aElement._File.LoadOrder]; - - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if SameText(s, Trim(aString)) then begin - Result := j; - Exit; - end; - end; - end; - - raise Exception.Create('Variable "'+aString+'" was not found in "'+MainRecord.ShortName+'"'); -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbPerkDATAQuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Quest']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestObjectiveToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Objectives : IwbContainerElementRef; - Objective : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Objectives'], IwbContainerElementRef, Objectives) then begin - for i := 0 to Pred(Objectives.ElementCount) do - if Supports(Objectives.Elements[i], IwbContainerElementRef, Objective) then begin - j := Objective.ElementNativeValues['QOBJ']; - s := Trim(Objective.ElementValues['NNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -function wbCTDAParam2QuestObjectiveToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ) - else - Result := ''; -end; - -function wbAlocTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( aInt / 256 ) - else - Result := ''; -end; - -function wbREFRNavmeshTriangleToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Navmesh : IwbElement; - MainRecord : IwbMainRecord; - Triangles : IwbContainerElementRef; -begin - case aType of - ctToStr: Result := IntToStr(aInt); - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Navmesh := Container.Elements[0]; - - if not Assigned(Navmesh) then - Exit; - - if not Supports(Navmesh.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> NAVM then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not wbSimpleRecords and (aType = ctCheck) and Supports(MainRecord.ElementByPath['NVTR'], IwbContainerElementRef, Triangles) then - if aInt >= Triangles.ElementCount then - Result := ''; -end; - -function wbStringToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToIntDef(aString, 0); -end; - - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaTypeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - case aType of - ctEditType: - Result := 'CheckComboBox'; - ctEditInfo: - Result := 'Equal,Greater,Lesser,Or,"Use Global","Run on Target"'; - ctToEditValue: begin - Result := '000000'; - case aInt and $F0 of - $00 : Result[1] := '1'; - $40 : Result[2] := '1'; - $60 : begin - Result[1] := '1'; - Result[2] := '1'; - end; - $80 : Result[3] := '1'; - $A0 : begin - Result[1] := '1'; - Result[3] := '1'; - end; - end; - if (aInt and $01) <> 0 then - Result[4] := '1'; - if (aInt and $02) <> 0 then - Result[6] := '1'; - if (aInt and $04) <> 0 then - Result[5] := '1'; - end; - ctToStr: begin - case aInt and $F0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.ToString(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $F0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.Check(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbCtdaTypeToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; -begin - s := aString + '000000'; -// Result := 0; - if s[1] = '1' then begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $00; - end else begin - Result := $60; - end; - end else begin - if s[3] = '1' then begin - Result := $A0; - end else begin - Result := $00; - end; - end; - end else begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $20; - end else begin - Result := $40; - end; - end else begin - if s[3] = '1' then begin - Result := $80; - end else begin - Result := $20; - end; - end; - end; - if s[4] = '1' then - Result := Result or $01; - if s[6] = '1' then - Result := Result or $02; - if s[5] = '1' then - Result := Result or $04; -end; - -procedure wbHeadPartsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainerElementRef, Container) then - if (Container.Elements[0].NativeValue = 1) and (Container.ElementCount > 2) then - Container.RemoveElement(1); - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGDNAMAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : Integer; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := Integer(aOldValue) and 1; - NewValue := Integer(aNewValue) and 1; - if NewValue = OldValue then - Exit; - if NewValue = 1 then - Container.RemoveElement('TNAM') - else - Container.Add('TNAM', True); - end; -end; - -procedure wbGMSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - if (Length(OldValue) < 1) or (Length(OldValue) < 1) or (OldValue[1] <> NewValue[1]) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - end; - end; -end; - -procedure wbFLSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - OldOrdered, NewOrdered : Boolean; - Container : IwbContainerElementRef; -const - OrderedList = 'OrderedList'; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - - if Length(OldValue) > Length(OrderedList) then - Delete(OldValue, 1, Length(OldValue)-Length(OrderedList)); - if Length(NewValue) > Length(OrderedList) then - Delete(NewValue, 1, Length(NewValue)-Length(OrderedList)); - - OldOrdered := SameText(OldValue, OrderedList); - NewOrdered := SameText(NewValue, OrderedList); - - if OldOrdered <> NewOrdered then - Container.RemoveElement('FormIDs'); - end; -end; - -procedure wbCtdaTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - OldValue := aOldValue and $04; - NewValue := aNewValue and $04; - if OldValue <> NewValue then - Container.ElementNativeValues['..\Comparison Value'] := 0; - - if aNewValue and $02 then begin - Container.ElementNativeValues['..\Run On'] := 1; - if Integer(Container.ElementNativeValues['..\Run On']) = 1 then - aElement.NativeValue := Byte(aNewValue) and not $02; - end; -end; - -function wbMODTCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Strings: TDynStrings; - i: Integer; -begin - Result := ''; - if wbLoaderDone and (aType in [ctToStr, ctToSortKey] ) then begin - Strings := wbContainerHandler.ResolveHash(aInt); - for i := Low(Strings) to High(Strings) do - Result := Result + Strings[i] + ', '; - SetLength(Result, Length(Result) -2 ); - end; -end; - - -function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not $C0 of - 0: Result := 'Idle'; - 1: Result := 'Movement'; - 2: Result := 'Left Arm'; - 3: Result := 'Left Hand'; - 4: Result := 'Weapon'; - 5: Result := 'Weapon Up'; - 6: Result := 'Weapon Down'; - 7: Result := 'Special Idle'; - 20: Result := 'Whole Body'; - 21: Result := 'Upper Body'; - else - Result := ''; - end; - - if (aInt and $80) = 0 then - Result := Result + ', Must return a file'; - if (aInt and $40) = 1 then - Result := Result + ', Unknown Flag'; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - end; - ctCheck: begin - case aInt and not $C0 of - 0..7, 20, 21: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbGLOBFNAM(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt of - Ord('s'): Result := 'Short'; - Ord('l'): Result := 'Long'; - Ord('f'): Result := 'Float'; - else - Result := ''; - end; - end; - ctToSortKey: Result := Chr(aInt); - ctCheck: begin - case aInt of - Ord('s'), Ord('l'), Ord('f'): Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; - Cell: IwbMainRecord; - Position: TwbVector; - Grid: TwbGridCell; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - - // grid position of persistent reference in exterior persistent cell (interior cells are not persistent) - if Supports(aMainRecord.Container, IwbGroupRecord, Container) then - Cell := IwbGroupRecord(Container).ChildrenOf; - if Assigned(Cell) and Cell.IsPersistent and (Cell.Signature = 'CELL') then - if aMainRecord.GetPosition(Position) then begin - Grid := wbPositionToGridCell(Position); - Result := Result + ' at ' + IntToStr(Grid.x) + ',' + IntToStr(Grid.y); - end; - end; - end; -end; - -function wbINFOAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := Trim(aMainRecord.ElementValues['Responses\Response\NAM1']); - if Result <> '' then - Result := '''' + Result + ''''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; - - s := Trim(aMainRecord.ElementValues['QSTI']); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'for ' + s; - end; -end; - -function wbNAVMAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec : IwbRecord; - Element : IwbElement; - s : string; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['DATA']; - if Assigned(Rec) then begin - Element := Rec.ElementByName['Cell']; - if Assigned(Element) then - Element := Element.LinksTo; - if Assigned(Element) then - s := Trim(Element.Name); - if s <> '' then - Result := 'for ' + s; - end; -end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - if not aMainRecord.IsPersistent then begin - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -function wbWthrDataClassification(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not 192 of - 0: Result := 'None'; - 1: Result := 'Pleasant'; - 2: Result := 'Cloudy'; - 4: Result := 'Rainy'; - 8: Result := 'Snow'; - else - Result := ''; - end; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2) - end; - ctCheck: begin - case aInt and not 192 of - 0, 1, 2, 4, 8: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbNOTETNAMDecide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rDATA: IwbRecord; -begin - Result := 0; - rDATA := aElement.Container.RecordBySignature[DATA]; - if Assigned(rDATA) then - if rDATA.NativeValue = 3 then //Voice - Result := 1; -end; - -function wbNOTESNAMDecide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rDATA: IwbRecord; -begin - Result := 0; - rDATA := aElement.Container.RecordBySignature[DATA]; - if Assigned(rDATA) then - if rDATA.NativeValue = 3 then //Voice - Result := 1; -end; - -function wbIPDSDATACount(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) then - Result := (Cardinal(aBasePtr) - Cardinal(aBasePtr)) div 4 - else - Result := 12; -end; - -function wbNAVINAVMGetCount1(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - DataContainer : IwbDataContainer; -begin - Result := 0; - - if Supports(aElement, IwbDataContainer, DataContainer) then begin - if DataContainer.ElementType = etArray then - if not Supports(DataContainer.Container, IwbDataContainer, DataContainer) then - Exit; - Assert(DataContainer.Name = 'Data'); - Result := PWord(Cardinal(DataContainer.DataBasePtr) + 3*3*4)^; - end; -end; - -function wbNAVINAVMGetCount2(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - DataContainer : IwbDataContainer; -begin - Result := 0; - - if Supports(aElement, IwbDataContainer, DataContainer) then begin - if DataContainer.ElementType = etArray then - if not Supports(DataContainer.Container, IwbDataContainer, DataContainer) then - Exit; - Assert(DataContainer.Name = 'Data'); - Result := PWord(Cardinal(DataContainer.DataBasePtr) + 3*3*4 + 2)^; - end; -end; - -procedure wbCTDARunOnAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - if aOldValue <> aNewValue then - if aNewValue <> 2 then - aElement.Container.ElementNativeValues['Reference'] := 0; -end; - -procedure wbPERKPRKETypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -// rDATA : IwbRecord; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - if Supports(Container.Container, IwbContainerElementRef, Container) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - Container.RemoveElement('Perk Conditions'); - Container.RemoveElement('Entry Point Function Parameters'); - if aNewValue = 2 then begin - Container.Add('EPFT', True); - Container.ElementNativeValues['DATA\Entry Point\Function'] := 2; - end; - end; - end; -end; - -function wbMGEFFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Archtype : Variant; - DataContainer : IwbDataContainer; - Element : IwbElement; -const - OffsetArchtype = 56; - -begin - Result := 1; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - VarClear(ArchType); - Element := Container.ElementByName['Archtype']; - if Assigned(Element) then - ArchType := Element.NativeValue - else if Supports(Container, IwbDataContainer, DataContainer) and - DataContainer.IsValidOffset(aBasePtr, aEndPtr, OffsetArchtype) then - begin // we are part of a proper structure - aBasePtr := Pointer(Cardinal(aBasePtr) + OffsetArchtype); - ArchType := PCardinal(aBasePtr)^; - end; - - if not VarIsEmpty(ArchType) then - case Integer(ArchType) of - 01: Result := 2;//Script - 18: Result := 3;//Bound Item - 19: Result := 4;//Summon Creature - else - Result := 0; - end; -end; - -procedure wbMGEFFAssocItemAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0) then begin - Element := Container.ElementByName['Archtype']; - if Assigned(Element) and Element.NativeValue = 0 then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - end; -end; - -procedure wbMGEFArchtypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if (aNewValue < $FF) and (aOldValue < $FF) then begin - Container.ElementNativeValues['..\Assoc. Item'] := 0; - case Integer(aNewValue) of - 11: Container.ElementNativeValues['..\Actor Value'] := 48;//Invisibility - 12: Container.ElementNativeValues['..\Actor Value'] := 49;//Chameleon - 24: Container.ElementNativeValues['..\Actor Value'] := 47;//Paralysis - 36: Container.ElementNativeValues['..\Actor Value'] := 51;//Turbo - else - Container.ElementNativeValues['..\Actor Value'] := -1; - end; - end; -end; - -procedure wbCounterEffectsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterByPathAfterSet('DATA - Data\Counter effect count', aElement); -end; - -procedure wbMGEFAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerByPathAfterSet('DATA - Data\Counter effect count', 'Counter Effects', aElement); -end; - -function wbCTDAReferenceDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementNativeValues['Run On']) = 2 then - Result := 1; -end; - -function wbNAVINVMIDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - case Integer(Container.ElementNativeValues['Type']) of - $00: Result :=1; - $20: Result :=2; - $30: Result :=3; - end; -end; - -function wbIMGSSkinDimmerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize in [132, 148] then - Result := 1; -end; - -function wbCOEDOwnerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - LinksTo : IwbElement; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - LinksTo := Container.ElementByName['Owner'].LinksTo; - - if Supports(LinksTo, IwbMainRecord, MainRecord) then - if MainRecord.Signature = 'NPC_' then - Result := 1 - else if MainRecord.Signature = 'FACT' then - Result := 2; -end; - -function wbCreaLevelDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - i := Container.ElementByName['Flags'].NativeValue; - if i and $00000080 <> 0 then - Result := 1; -end; - - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; - 'f': Result := 2; - end; - end; -end; - -function wbFLSTLNAMIsSorted(const aContainer: IwbContainer): Boolean; -var - rEDID : IwbRecord; - s : string; - _File : IwbFile; - MainRecord : IwbMainRecord; -const - OrderedList = 'OrderedList'; -begin - Result := wbSortFLST; {>>> Should not be sorted according to Arthmoor and JustinOther, left as sorted for compatibility <<<} - rEDID := aContainer.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > Length(OrderedList) then - Delete(s, 1, Length(s)-Length(OrderedList)); - if SameText(s, OrderedList) then - Result := False; - end; - if Result then begin - MainRecord := aContainer.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - MainRecord := MainRecord.MasterOrSelf; - if not Assigned(MainRecord) then - Exit; - _File := MainRecord._File; - if not Assigned(_File) then - Exit; - if not SameText(_File.FileName, 'WeaponModKits.esp') then - Exit; - case (MainRecord.FormID and $FFFFFF) of - $0130EB, $0130ED, $01522D, $01522E, $0158D5, $0158D6, $0158D7, $0158D8, $0158D9, $0158DA, $0158DC, $0158DD, $018E20: - Result := False; - end; - end; -end; - -function wbPerkDATADecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rPRKE: IwbRecord; - eType: IwbElement; -begin - Result := 0; - rPRKE := aElement.Container.RecordBySignature[PRKE]; - if Assigned(rPRKE) then begin - eType := rPRKE.ElementByName['Type']; - if Assigned(eType) then begin - Result := eType.NativeValue; - end; - end; -end; - -function wbEPFDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['EPFT']; - if Result = 2 then - if Integer(Container.ElementNativeValues['..\DATA\Entry Point\Function']) = 5 then - Result := 5; -end; - -type - TCTDAFunctionParamType = ( - ptNone, - ptInteger, - ptVariableName, //Integer - ptSex, //Enum: Male, Female - ptActorValue, //Enum: wbActorValue - ptCrimeType, //?? Enum - ptAxis, //?? Char - ptQuestStage, //?? Integer - ptMiscStat, //?? Enum - ptAlignment, //?? Enum - ptEquipType, //?? Enum - ptFormType, //?? Enum - ptCriticalStage, //?? Enum - - ptObjectReference, //REFR, ACHR, ACRE, PGRE - ptInventoryObject, //ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, ARMA - ptActor, //ACHR, ACRE - ptVoiceType, //VTYP - ptIdleForm, //IDLE - ptFormList, //FLST - ptNote, //NOTE - ptQuest, //QUST - ptFaction, //FACT - ptWeapon, //WEAP - ptCell, //CELL - ptClass, //CLAS - ptRace, //RACE - ptActorBase, //NPC_, CREA - ptGlobal, //GLOB - ptWeather, //WTHR - ptPackage, //PACK - ptEncounterZone, //ECZN - ptPerk, //PERK - ptOwner, //FACT, NPC_ - ptFurniture, //FURN - ptMagicItem, //SPEL - ptMagicEffect, //MGEF - ptWorldspace, //WRLD - ptVATSValueFunction, - ptVATSValueParam, - ptCreatureType, - ptMenuMode, - ptPlayerAction, - ptBodyLocation, - ptReferencableObject, //TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM - ptQuestObjective, //?? Integer - ptReputation, //REPU - ptRegion, //REGN - ptChallenge, //CHAL - ptCasino, //CSNO - ptAnyForm // Any form - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - end; - -const - wbCTDAFunctions : array[0..288] of TCTDAFunction = ( - (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), - (Index: 5; Name: 'GetLocked'), - (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), - (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), - (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), - (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), - (Index: 12; Name: 'GetSecondsPassed'), - (Index: 14; Name: 'GetActorValue'; ParamType1: ptActorValue), - (Index: 18; Name: 'GetCurrentTime'), - (Index: 24; Name: 'GetScale'), - (Index: 25; Name: 'IsMoving'), - (Index: 26; Name: 'IsTurning'), - (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), - (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), - (Index: 35; Name: 'GetDisabled'), - (Index: 36; Name: 'MenuMode'; ParamType1: ptMenuMode), - (Index: 39; Name: 'GetDisease'), - (Index: 40; Name: 'GetVampire'), - (Index: 41; Name: 'GetClothingValue'), - (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), - (Index: 43; Name: 'SameRace'; ParamType1: ptActor), - (Index: 44; Name: 'SameSex'; ParamType1: ptActor), - (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), - (Index: 46; Name: 'GetDead'), - (Index: 47; Name: 'GetItemCount'; ParamType1: ptInventoryObject), - (Index: 48; Name: 'GetGold'), - (Index: 49; Name: 'GetSleeping'), - (Index: 50; Name: 'GetTalkedToPC'), - (Index: 53; Name: 'GetScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), - (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), - (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), - (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), - (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), - (Index: 61; Name: 'GetAlarmed'), - (Index: 62; Name: 'IsRaining'), - (Index: 63; Name: 'GetAttacked'), - (Index: 64; Name: 'GetIsCreature'), - (Index: 65; Name: 'GetLockLevel'), - (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), - (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), - (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), - (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), - (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), - (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), - (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), - (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), - (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), - (Index: 75; Name: 'IsSnowing'), - (Index: 76; Name: 'GetDisposition'; ParamType1: ptActor), - (Index: 77; Name: 'GetRandomPercent'), - (Index: 79; Name: 'GetQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), - (Index: 80; Name: 'GetLevel'), - (Index: 81; Name: 'GetArmorRating'), - (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), - (Index: 91; Name: 'GetIsAlerted'), - (Index: 98; Name: 'GetPlayerControlsDisabled'; ParamType1: ptInteger; ParamType2: ptInteger{; ParamType3: ptInteger; ParamType4: ptInteger; ParamType5: ptInteger; ParamType6: ptInteger; ParamType7: ptInteger}), - (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), - (Index: 101; Name: 'IsWeaponOut'), - (Index: 102; Name: 'IsTorchOut'), - (Index: 103; Name: 'IsShieldOut'), - (Index: 106; Name: 'IsFacingUp'), - (Index: 107; Name: 'GetKnockedState'), - (Index: 108; Name: 'GetWeaponAnimType'), - (Index: 109; Name: 'IsWeaponSkillType'; ParamType1: ptActorValue), - (Index: 110; Name: 'GetCurrentAIPackage'), - (Index: 111; Name: 'IsWaiting'), - (Index: 112; Name: 'IsIdlePlaying'), - (Index: 116; Name: 'GetMinorCrimeCount'), - (Index: 117; Name: 'GetMajorCrimeCount'), - (Index: 118; Name: 'GetActorAggroRadiusViolated'), - (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), - (Index: 123; Name: 'IsGreetingPlayer'), - (Index: 125; Name: 'IsGuard'), - (Index: 127; Name: 'HasBeenEaten'), - (Index: 128; Name: 'GetFatiguePercentage'), - (Index: 129; Name: 'GetPCIsClass'; ParamType1: ptClass), - (Index: 130; Name: 'GetPCIsRace'; ParamType1: ptRace), - (Index: 131; Name: 'GetPCIsSex'; ParamType1: ptSex), - (Index: 132; Name: 'GetPCInFaction'; ParamType1: ptFaction), - (Index: 133; Name: 'SameFactionAsPC'), - (Index: 134; Name: 'SameRaceAsPC'), - (Index: 135; Name: 'SameSexAsPC'), - (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), - (Index: 141; Name: 'IsTalking'), - (Index: 142; Name: 'GetWalkSpeed'), - (Index: 143; Name: 'GetCurrentAIProcedure'), - (Index: 144; Name: 'GetTrespassWarningLevel'), - (Index: 145; Name: 'IsTrespassing'), - (Index: 146; Name: 'IsInMyOwnedCell'), - (Index: 147; Name: 'GetWindSpeed'), - (Index: 148; Name: 'GetCurrentWeatherPercent'), - (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), - (Index: 150; Name: 'IsContinuingPackagePCNear'), - (Index: 153; Name: 'CanHaveFlames'), - (Index: 154; Name: 'HasFlames'), - (Index: 157; Name: 'GetOpenState'), - (Index: 159; Name: 'GetSitting'), - (Index: 160; Name: 'GetFurnitureMarkerID'), - (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), - (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), - (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), - (Index: 170; Name: 'GetDayOfWeek'), - (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), - (Index: 175; Name: 'IsPCSleeping'), - (Index: 176; Name: 'IsPCAMurderer'), - (Index: 180; Name: 'GetDetectionLevel'; ParamType1: ptActor), - (Index: 182; Name: 'GetEquipped'; ParamType1: ptInventoryObject), - (Index: 185; Name: 'IsSwimming'), - (Index: 190; Name: 'GetAmountSoldStolen'), - (Index: 192; Name: 'GetIgnoreCrime'), - (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), - (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), - (Index: 197; Name: 'GetPCEnemyofFaction'; ParamType1: ptFaction), - (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), - (Index: 203; Name: 'GetDestroyed'), - (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), - (Index: 215; Name: 'GetDefaultOpen'), - (Index: 219; Name: 'GetAnimAction'), - (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), - (Index: 224; Name: 'GetVATSMode'), - (Index: 225; Name: 'GetPersuasionNumber'), - (Index: 226; Name: 'GetSandman'), - (Index: 227; Name: 'GetCannibal'), - (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), - (Index: 229; Name: 'GetClassDefaultMatch'), - (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), - (Index: 235; Name: 'GetVatsTargetHeight'), - (Index: 237; Name: 'GetIsGhost'), - (Index: 242; Name: 'GetUnconscious'), - (Index: 244; Name: 'GetRestrained'), - (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), - (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), - (Index: 254; Name: 'GetIsPlayableRace'), - (Index: 255; Name: 'GetOffersServicesNow'), - (Index: 258; Name: 'GetUsedItemLevel'), - (Index: 259; Name: 'GetUsedItemActivate'), - (Index: 264; Name: 'GetBarterGold'), - (Index: 265; Name: 'IsTimePassing'), - (Index: 266; Name: 'IsPleasant'), - (Index: 267; Name: 'IsCloudy'), - (Index: 274; Name: 'GetArmorRatingUpperBody'), - (Index: 277; Name: 'GetBaseActorValue'; ParamType1: ptActorValue), - (Index: 278; Name: 'IsOwner'; ParamType1: ptOwner), - (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwner), - (Index: 282; Name: 'IsHorseStolen'), - (Index: 285; Name: 'IsLeftUp'), - (Index: 286; Name: 'IsSneaking'), - (Index: 287; Name: 'IsRunning'), - (Index: 288; Name: 'GetFriendHit'), - (Index: 289; Name: 'IsInCombat'), - (Index: 300; Name: 'IsInInterior'), - (Index: 304; Name: 'IsWaterObject'), - (Index: 306; Name: 'IsActorUsingATorch'), - (Index: 309; Name: 'IsXBox'), - (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldSpace), - (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptMiscStat), - (Index: 313; Name: 'IsActorEvil'), - (Index: 314; Name: 'IsActorAVictim'), - (Index: 315; Name: 'GetTotalPersuasionNumber'), - (Index: 318; Name: 'GetIdleDoneOnce'), - (Index: 320; Name: 'GetNoRumors'), - (Index: 323; Name: 'WhichServiceMenu'), - (Index: 327; Name: 'IsRidingHorse'), - (Index: 332; Name: 'IsInDangerousWater'), - (Index: 338; Name: 'GetIgnoreFriendlyHits'), - (Index: 339; Name: 'IsPlayersLastRiddenHorse'), - (Index: 353; Name: 'IsActor'), - (Index: 354; Name: 'IsEssential'), - (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), - (Index: 361; Name: 'GetTimeDead'), - (Index: 362; Name: 'GetPlayerHasLastRiddenHorse'), - (Index: 365; Name: 'IsChild'), - (Index: 367; Name: 'GetLastPlayerAction'), - (Index: 368; Name: 'IsPlayerActionActive'; ParamType1: ptPlayerAction), - (Index: 370; Name: 'IsTalkingActivatorActor'; ParamType1: ptActor), - (Index: 372; Name: 'IsInList'; ParamType1: ptFormList), - (Index: 382; Name: 'GetHasNote'; ParamType1: ptNote), - (Index: 391; Name: 'GetHitLocation'), - (Index: 392; Name: 'IsPC1stPerson'), - (Index: 397; Name: 'GetCauseofDeath'), - (Index: 398; Name: 'IsLimbGone'; ParamType1: ptBodyLocation), - (Index: 399; Name: 'IsWeaponInList'; ParamType1: ptFormList), - (Index: 403; Name: 'HasFriendDisposition'), - (Index: 408; Name: 'GetVATSValue'; ParamType1: ptVATSValueFunction; ParamType2: ptVATSValueParam), - (Index: 409; Name: 'IsKiller'; ParamType1: ptActor), - (Index: 410; Name: 'IsKillerObject'; ParamType1: ptFormList), - (Index: 411; Name: 'GetFactionCombatReaction'; ParamType1: ptFaction; ParamType2: ptFaction), - (Index: 415; Name: 'Exists'; ParamType1: ptObjectReference), - (Index: 416; Name: 'GetGroupMemberCount'), - (Index: 417; Name: 'GetGroupTargetCount'), - (Index: 420; Name: 'GetObjectiveCompleted'; ParamType1: ptQuest; ParamType2: ptQuestObjective), - (Index: 421; Name: 'GetObjectiveDisplayed'; ParamType1: ptQuest; ParamType2: ptQuestObjective), - (Index: 427; Name: 'GetIsVoiceType'; ParamType1: ptVoiceType), - (Index: 428; Name: 'GetPlantedExplosive'), - (Index: 430; Name: 'IsActorTalkingThroughActivator'), - (Index: 431; Name: 'GetHealthPercentage'), - (Index: 433; Name: 'GetIsObjectType'; ParamType1: ptFormType), - (Index: 435; Name: 'GetDialogueEmotion'), - (Index: 436; Name: 'GetDialogueEmotionValue'), - (Index: 438; Name: 'GetIsCreatureType'; ParamType1: ptCreatureType), - (Index: 446; Name: 'GetInZone'; ParamType1: ptEncounterZone), - (Index: 449; Name: 'HasPerk'; ParamType1: ptPerk; ParamType2: ptInteger {boolean Alt}), // PlayerCharacter has 2 lists of perks - (Index: 450; Name: 'GetFactionRelation'; ParamType1: ptActor), - (Index: 451; Name: 'IsLastIdlePlayed'; ParamType1: ptIdleForm), - (Index: 454; Name: 'GetPlayerTeammate'), - (Index: 455; Name: 'GetPlayerTeammateCount'), - (Index: 459; Name: 'GetActorCrimePlayerEnemy'), - (Index: 460; Name: 'GetActorFactionPlayerEnemy'), - (Index: 462; Name: 'IsPlayerTagSkill'; ParamType1: ptActorValue), - (Index: 464; Name: 'IsPlayerGrabbedRef'; ParamType1: ptObjectReference), - (Index: 471; Name: 'GetDestructionStage'), - (Index: 474; Name: 'GetIsAlignment'; ParamType1: ptAlignment), - (Index: 478; Name: 'GetThreatRatio'; ParamType1: ptActor), - (Index: 480; Name: 'GetIsUsedItemEquipType'; ParamType1: ptEquipType), - (Index: 489; Name: 'GetConcussed'), - (Index: 492; Name: 'GetMapMarkerVisible'), - (Index: 495; Name: 'GetPermanentActorValue'; ParamType1: ptActorValue), - (Index: 496; Name: 'GetKillingBlowLimb'), - (Index: 500; Name: 'GetWeaponHealthPerc'), - (Index: 503; Name: 'GetRadiationLevel'), - (Index: 510; Name: 'GetLastHitCritical'), - (Index: 515; Name: 'IsCombatTarget'; ParamType1: ptActor), - (Index: 518; Name: 'GetVATSRightAreaFree'; ParamType1: ptObjectReference), - (Index: 519; Name: 'GetVATSLeftAreaFree'; ParamType1: ptObjectReference), - (Index: 520; Name: 'GetVATSBackAreaFree'; ParamType1: ptObjectReference), - (Index: 521; Name: 'GetVATSFrontAreaFree'; ParamType1: ptObjectReference), - (Index: 522; Name: 'GetIsLockBroken'), - (Index: 523; Name: 'IsPS3'), - (Index: 524; Name: 'IsWin32'), - (Index: 525; Name: 'GetVATSRightTargetVisible'; ParamType1: ptObjectReference), - (Index: 526; Name: 'GetVATSLeftTargetVisible'; ParamType1: ptObjectReference), - (Index: 527; Name: 'GetVATSBackTargetVisible'; ParamType1: ptObjectReference), - (Index: 528; Name: 'GetVATSFrontTargetVisible'; ParamType1: ptObjectReference), - (Index: 531; Name: 'IsInCriticalStage'; ParamType1: ptCriticalStage), - (Index: 533; Name: 'GetXPForNextLevel'), - (Index: 546; Name: 'GetQuestCompleted'; ParamType1: ptQuest), - (Index: 550; Name: 'IsGoreDisabled'), - (Index: 555; Name: 'GetSpellUsageNum'; ParamType1: ptMagicItem), - (Index: 557; Name: 'GetActorsInHigh'), - (Index: 558; Name: 'HasLoaded3D'), - (Index: 573; Name: 'GetReputation'; ParamType1: ptReputation; ParamType2: ptInteger), - (Index: 574; Name: 'GetReputationPct'; ParamType1: ptReputation; ParamType2: ptInteger), - (Index: 575; Name: 'GetReputationThreshold'; ParamType1: ptReputation; ParamType2: ptInteger), - (Index: 586; Name: 'IsHardcore'), - (Index: 601; Name: 'GetForceHitReaction'), - (Index: 607; Name: 'ChallengeLocked'; ParamType1: ptChallenge), - (Index: 610; Name: 'GetCasinoWinningStage'; ParamType1: ptCasino), - (Index: 612; Name: 'PlayerInRegion'; ParamType1: ptRegion), - (Index: 614; Name: 'GetChallengeCompleted'; ParamType1: ptChallenge), - (Index: 619; Name: 'IsAlwaysHardcore'), - - // Added by NVSE - (Index: 1024; Name: 'GetNVSEVersion'; ), - (Index: 1025; Name: 'GetNVSERevision'; ), - (Index: 1026; Name: 'GetNVSEBeta'; ), - (Index: 1028; Name: 'GetWeight'; ParamType1: ptInventoryObject; ), - (Index: 1076; Name: 'GetWeaponHasScope'; ParamType1: ptInventoryObject; ), - (Index: 1089; Name: 'ListGetFormIndex'; ParamType1: ptFormList; ParamType2: ptFormType;), - (Index: 1107; Name: 'IsKeyPressed'; ParamType1: ptInteger; ParamType2: ptInteger;), - (Index: 1131; Name: 'IsControlPressed'; ParamType1: ptInteger; ), - (Index: 1271; Name: 'HasOwnership'; ParamType1: ptObjectReference; ), - (Index: 1272; Name: 'IsOwned'; ParamType1: ptActor ), - (Index: 1274; Name: 'GetDialogueTarget'; ParamType1: ptActor; ), - (Index: 1275; Name: 'GetDialogueSubject'; ParamType1: ptActor; ), - (Index: 1276; Name: 'GetDialogueSpeaker'; ParamType1: ptActor; ), - (Index: 1278; Name: 'GetAgeClass'; ParamType1: ptActorBase; ), - (Index: 1286; Name: 'GetTokenValue'; ParamType1: ptFormType; ), - (Index: 1288; Name: 'GetTokenRef'; ParamType1: ptFormType; ), - (Index: 1291; Name: 'GetPaired'; ParamType1: ptInventoryObject; ParamType2: ptActorBase;), - (Index: 1292; Name: 'GetRespawn'; ParamType1: ptACtorBase; ), - (Index: 1294; Name: 'GetPermanent'; ParamType1: ptObjectReference; ), - (Index: 1297; Name: 'IsRefInList'; ParamType1: ptFormList; ParamType2: ptFormType;), - (Index: 1301; Name: 'GetPackageCount'; ParamType1: ptObjectReference; ), - (Index: 1440; Name: 'IsPlayerSwimming'; ), - (Index: 1441; Name: 'GetTFC'; ), - (Index: 1475; Name: 'GetPerkRank'; ParamType1: ptPerk; ParamType2: ptActor;), - (Index: 1476; Name: 'GetAltPerkRank'; ParamType1: ptPerk; ParamType2: ptActor;), - (Index: 1541; Name: 'GetActorFIKstatus'; ), - - // Added by nvse_plugin_ExtendedActorVariable - (Index: 4352; Name: 'GetExtendedActorVariable'; ParamType1: ptInventoryObject; ), - (Index: 4353; Name: 'GetBaseExtendedActorVariable'; ParamType1: ptInventoryObject; ), - (Index: 4355; Name: 'GetModExtendedActorVariable'; ParamType1: ptInventoryObject; ), - - // Added by nvse_extender - (Index: 4420; Name: 'NX_GetEVFl'; ParamType1: ptNone; ), // Actually ptString, but it cannot be used in GECK - (Index: 4426; Name: 'NX_GetQVEVFl'; ParamType1: ptQuest; ParamType2: ptInteger;), - - // Added by lutana_nvse - (Index: 4708; Name: 'GetArmorClass'; ParamType1: ptAnyForm; ), - (Index: 4709; Name: 'IsRaceInList'; ParamType1: ptFormList; ), - (Index: 4822; Name: 'GetReferenceFlag'; ParamType1: ptInteger; ), - - // Added by JIP NVSE Plugin - (Index: 5637; Name: 'GetIsPoisoned'; ), - (Index: 5708; Name: 'IsEquippedWeaponSilenced'; ), - (Index: 5709; Name: 'IsEquippedWeaponScoped'; ), - (Index: 5953; Name: 'GetPCInRegion'; ParamType1: ptRegion; ), - (Index: 5962; Name: 'GetPCDetectionState'; ) - ); - -var - wbCTDAFunctionEditInfo: string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType1)); -end; - -function wbCTDAParam2VATSValueParam(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - Result := Container.ElementByName['Parameter #1'].NativeValue; -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType2)); -end; - -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -type - TPERKEntryPointConditionType = ( - epcDefault, - epcItem, - epcWeapon, - epcWeaponTarget, - epcTarget, - epcAttacker, - epcAttackerAttackee, - epcAttackerAttackerWeapon - ); - - TPERKEntryPointFunctionType = ( - epfFloat, - epfLeveledItem, - epfScript, - epfUnknown - ); - - TPERKEntryPointFunctionParamType = ( - epfpNone, - epfpFloat, - epfpFloatFloat, - epfpLeveledItem, - epfpScript - ); - - PPERKEntryPoint = ^TPERKEntryPoint; - TPERKEntryPoint = record - Name : string; - Condition : TPERKEntryPointConditionType; - FunctionType : TPERKEntryPointFunctionType; - end; - - PPERKCondition = ^TPERKCondition; - TPERKCondition = record - Count : Integer; - Caption1 : string; - Caption2 : string; - Caption3 : string; - end; - - PPERKFunction = ^TPERKFunction; - TPERKFunction = record - Name : string; - FunctionType : TPERKEntryPointFunctionType; - ParamType : TPERKEntryPointFunctionParamType; - end; - -const - wbPERKCondition : array[TPERKEntryPointConditionType] of TPERKCondition = ( - (Count: 1; Caption1: 'Perk Owner'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Item'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Weapon'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Weapon'; Caption3: 'Target'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Target'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Attacker'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Attacker'; Caption3: 'Attackee'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Attacker'; Caption3: 'Attacker Weapon') - ); - - wbPERKFunctions : array[0..9] of TPERKFunction = ( - (Name: ''; FunctionType: epfUnknown; ParamType: epfpNone), - (Name: 'Set Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Add Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Multiply Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Add Range To Value'; FunctionType: epfFloat; ParamType: epfpFloatFloat), - (Name: 'Add Actor Value Mult'; FunctionType: epfFloat; ParamType: epfpFloatFloat), - (Name: 'Absolute Value'; FunctionType: epfFloat; ParamType: epfpNone), - (Name: 'Negative Absolute Value'; FunctionType: epfFloat; ParamType: epfpNone), - (Name: 'Add Leveled List'; FunctionType: epfLeveledItem; ParamType: epfpLeveledItem), - (Name: 'Add Activate Choice'; FunctionType: epfScript; ParamType: epfpScript) - ); - - wbPERKEntryPoints : array[0..73] of TPERKEntryPoint = ( - (Name: 'Calculate Weapon Damage'; Condition: epcWeaponTarget), - (Name: 'Calculate My Critical Hit Chance'; Condition: epcWeaponTarget), - (Name: 'Calculate My Critical Hit Damage'; Condition: epcWeaponTarget), - (Name: 'Calculate Weapon Attack AP Cost'; Condition: epcWeapon), - (Name: 'Calculate Mine Explode Chance'; Condition: epcItem), - (Name: 'Adjust Range Penalty'; Condition: epcWeapon), - (Name: 'Adjust Limb Damage'; Condition: epcAttackerAttackerWeapon), - (Name: 'Calculate Weapon Range'; Condition: epcWeapon), - (Name: 'Calculate To Hit Chance'; Condition: epcWeaponTarget), - (Name: 'Adjust Experience Points'), - (Name: 'Adjust Gained Skill Points'), - (Name: 'Adjust Book Skill Points'), - (Name: 'Modify Recovered Health'), - (Name: 'Calculate Inventory AP Cost'), - (Name: 'Get Disposition'; Condition: epcTarget), - (Name: 'Get Should Attack'; Condition: epcAttacker), - (Name: 'Get Should Assist'; Condition: epcAttackerAttackee), - (Name: 'Calculate Buy Price'; Condition: epcItem), - (Name: 'Get Bad Karma'), - (Name: 'Get Good Karma'), - (Name: 'Ignore Locked Terminal'), - (Name: 'Add Leveled List On Death'; Condition: epcTarget; FunctionType: epfLeveledItem), - (Name: 'Get Max Carry Weight'), - (Name: 'Modify Addiction Chance'), - (Name: 'Modify Addiction Duration'), - (Name: 'Modify Positive Chem Duration'), - (Name: 'Adjust Drinking Radiation'), - (Name: 'Activate'; Condition: epcTarget; FunctionType: epfScript), - (Name: 'Mysterious Stranger'), - (Name: 'Has Paralyzing Palm'), - (Name: 'Hacking Science Bonus'), - (Name: 'Ignore Running During Detection'), - (Name: 'Ignore Broken Lock'), - (Name: 'Has Concentrated Fire'), - (Name: 'Calculate Gun Spread'; Condition: epcWeapon), - (Name: 'Player Kill AP Reward'; Condition: epcWeaponTarget), -{36}(Name: 'Modify Enemy Critical Hit Chance'; Condition: epcWeaponTarget), -{37}(Name: 'Reload Speed'; Condition: epcWeapon), -{38}(Name: 'Equip Speed'; Condition: epcWeapon), -{39}(Name: 'Action Point Regen'; Condition: epcWeapon), -{40}(Name: 'Action Point Cost'; Condition: epcWeapon), -{41}(Name: 'Miss Fortune'; Condition: epcDefault), -{42}(Name: 'Modify Run Speed'; Condition: epcDefault), -{43}(Name: 'Modify Attack Speed'; Condition: epcWeapon), -{44}(Name: 'Modify Radiation Consumed'; Condition: epcDefault), -{45}(Name: 'Has Pip Hacker'; Condition: epcDefault), -{46}(Name: 'Has Meltdown'; Condition: epcDefault), -{47}(Name: 'See Enemy Health'; Condition: epcDefault), -{48}(Name: 'Has Jury Rigging'; Condition: epcDefault), -{49}(Name: 'Modify Threat Range'; Condition: epcWeapon), -{50}(Name: 'Modify Thread'; Condition: epcWeapon), -{51}(Name: 'Has Fast Travel Always'; Condition: epcDefault), -{52}(Name: 'Knockdown Chance'; Condition: epcWeapon), -{53}(Name: 'Modify Weapon Strength Req'; Condition: epcWeapon), -{54}(Name: 'Modify Aiming Move Speed'; Condition: epcWeapon), -{55}(Name: 'Modify Light Items'; Condition: epcDefault), -{56}(Name: 'Modify Damage Threshold (defender)'; Condition: epcWeaponTarget), -{57}(Name: 'Modify Chance for Ammo Item'; Condition: epcWeapon), -{58}(Name: 'Modify Damage Threshold (attacker)'; Condition: epcWeaponTarget), -{59}(Name: 'Modify Throwing Velocity'; Condition: epcWeapon), -{60}(Name: 'Chance for Item on Fire'; Condition: epcWeapon), -{61}(Name: 'Has Unarmed Forward Power Attack'; Condition: epcDefault), -{62}(Name: 'Has Unarmed Back Power Attack'; Condition: epcWeaponTarget), -{63}(Name: 'Has Unarmed Crouched Power Attack'; Condition: epcDefault), -{64}(Name: 'Has Unarmed Counter Attack'; Condition: epcWeaponTarget), -{65}(Name: 'Has Unarmed Left Power Attack'; Condition: epcDefault), -{66}(Name: 'Has Unarmed Right Power Attack'; Condition: epcDefault), -{67}(Name: 'VATS HelperChance'; Condition: epcDefault), -{68}(Name: 'Modify Item Damage'; Condition: epcDefault), -{69}(Name: 'Has Improved Detection'; Condition: epcDefault), -{70}(Name: 'Has Improved Spotting'; Condition: epcDefault), -{71}(Name: 'Has Improved Item Detection'; Condition: epcDefault), -{72}(Name: 'Adjust Explosion Radius'; Condition: epcWeapon), -{73}(Name: 'Reserved'; Condition: epcWeapon) - ); - - wbPERKFunctionParams: array[TPERKEntryPointFunctionParamType] of string = ( - 'None', - 'Float', - 'Float, Float', - 'Leveled Item', - 'Script' - ); - -procedure wbPERKEntryPointAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldEntryPoint : PPERKEntryPoint; - NewEntryPoint : PPERKEntryPoint; - OldCondition : PPERKCondition; - NewCondition : PPERKCondition; - OldFunction : PPERKFunction; - EntryPoint : IwbContainerElementRef; - Effect : IwbContainerElementRef; - PerkConditions : IwbContainerElementRef; - PerkCondition : IwbContainerElementRef; - Container : IwbContainerElementRef; - i : Integer; -begin - if aOldValue <> aNewValue then begin - OldEntryPoint := @wbPERKEntryPoints[Integer(aOldValue)]; - NewEntryPoint := @wbPERKEntryPoints[Integer(aNewValue)]; - OldCondition := @wbPERKCondition[OldEntryPoint.Condition]; - NewCondition := @wbPERKCondition[NewEntryPoint.Condition]; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, EntryPoint) then - Exit; - i := EntryPoint.ElementNativeValues['Function']; - if (i >= Low(wbPERKFunctions)) and (i <= High(wbPERKFunctions)) then - OldFunction := @wbPERKFunctions[i] - else - OldFunction := nil; - if not Assigned(OldFunction) or (OldFunction.FunctionType <> NewEntryPoint.FunctionType) then - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - with wbPERKFunctions[i] do - if FunctionType = NewEntryPoint.FunctionType then begin - EntryPoint.ElementNativeValues['Function'] := i; - Break; - end; - EntryPoint.ElementNativeValues['Perk Condition Tab Count'] := NewCondition.Count; - - if not Supports(EntryPoint.Container, IwbContainerElementRef, Container) then - Exit; - if not Supports(Container.Container, IwbContainerElementRef, Effect) then - Exit; - - if not Supports(Effect.ElementByName['Perk Conditions'], IwbContainerElementRef, PerkConditions) then - Exit; - - for i := Pred(PerkConditions.ElementCount) downto 0 do - if Supports(PerkConditions.Elements[i], IwbContainerElementRef, PerkCondition) then - if Integer(PerkCondition.ElementNativeValues['PRKC']) >= NewCondition.Count then - PerkCondition.Remove - else - case Integer(PerkCondition.ElementNativeValues['PRKC']) of - 2: if OldCondition.Caption2 <> NewCondition.Caption2 then - PerkCondition.Remove; - 3: if OldCondition.Caption3 <> NewCondition.Caption3 then - PerkCondition.Remove; - end; - end; -end; - -function wbPRKCToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - EntryPointVar := Container.ElementNativeValues['..\..\..\DATA\Entry Point\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - Exit; - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKEntryPoints[EntryPoint] do begin - with wbPERKCondition[Condition] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: with TStringList.Create do try - if Caption1 <> '' then - Add(Caption1); - if Caption2 <> '' then - Add(Caption2); - if Caption3 <> '' then - Add(Caption3); - Sort; - Result := CommaText; - finally - Free; - end; - else - if (aInt < 0) or (aInt >= Count) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: case Integer(aInt) of - 0: Result := Caption1; - 1: Result := Caption2; - 2: Result := Caption3; - end; - ctCheck: Result := ''; - end; - end; - end; - end; -end; - -function wbPRKCToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - s : string; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then begin - Result := 0; - Exit; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Entry Point'); - EntryPointVar := Container.ElementNativeValues['..\..\..\DATA\Entry Point\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - raise Exception.Create('Could not resolve Entry Point'); - - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then - raise Exception.Create('Unknown Entry Point #'+IntToStr(EntryPoint)); - - with wbPERKEntryPoints[EntryPoint] do - with wbPERKCondition[Condition] do - if SameText(aString, Caption1) then - Result := 0 - else if SameText(aString, Caption2) then - Result := 1 - else if SameText(aString, Caption3) then - Result := 2 - else - raise Exception.Create('"'+s+'" is not valid for this Entry Point'); -end; - -function wbNeverShow(const aElement: IwbElement): Boolean; -begin - Result := wbHideNeverShow; -end; - -function GetREGNType(aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := -1; - if not Assigned(aElement) then - Exit; - while aElement.Name <> 'Region Data Entry' do begin - aElement := aElement.Container; - if not Assigned(aElement) then - Exit; - end; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['RDAT\Type']; -end; - -function wbREGNObjectsDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 2; -end; - -function wbREGNWeatherDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 3; -end; - -function wbREGNMapDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 4; -end; - -function wbREGNLandDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 5; -end; - -function wbREGNGrassDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 6; -end; - -function wbREGNSoundDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 7; -end; - -function wbREGNImposterDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 8; -end; - -function wbMESGTNAMDontShow(const aElement: IwbElement): Boolean; -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - Result := False; - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['DNAM']) and 1 <> 0 then - Result := True; -end; - -function wbEPFDDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [1..3]) then - Result := True; -end; - -function wbTES4ONAMDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := False; - if not Assigned(aElement) then - Exit; - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - if not MainRecord.IsESM then - Result := True; -end; - - -function wbEPF2DontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [4]) then - Result := True; -end; - -function wbPERKPRKCDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Effect' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['PRKE\Type']) <> 2 then - Result := True; -end; - -function wbPerkDATAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - i : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - EntryPointVar := Container.ElementNativeValues['..\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - Exit; - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKEntryPoints[EntryPoint] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: with TStringList.Create do try - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - if wbPERKFunctions[i].FunctionType = FunctionType then - if (wbPERKFunctions[i].Name <> '') then - Add(wbPERKFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - else - if (aInt < Low(wbPERKFunctions)) or (aInt > High(wbPERKFunctions)) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: begin - Result := wbPERKFunctions[Integer(aInt)].Name; - if (aType = ctToStr) and (wbPERKFunctions[Integer(aInt)].FunctionType <> FunctionType) then - Result := Result + ' '; - end; - ctCheck: - if wbPERKFunctions[Integer(aInt)].FunctionType <> FunctionType then - Result := '' - else - Result := ''; - end; - end; - end; -end; - -function wbPerkDATAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - s : string; - i : Integer; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then - raise Exception.Create('"" is not a valid value for this field'); - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Entry Point'); - EntryPointVar := Container.ElementNativeValues['..\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - raise Exception.Create('Could not resolve Entry Point'); - - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then - raise Exception.Create('Unknown Entry Point #'+IntToStr(EntryPoint)); - - with wbPERKEntryPoints[EntryPoint] do - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - if wbPERKFunctions[i].FunctionType = FunctionType then - if SameText(s, wbPERKFunctions[i].Name) then begin - Result := i; - Exit; - end; - - raise Exception.Create('"'+s+'" is not valid for this Entry Point'); -end; - -procedure wbPerkDATAFunctionAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - NewFunction : Integer; - Container : IwbContainerElementRef; - OldParamType: Integer; - NewParamType: Integer; -begin - NewFunction := aNewValue; - if (NewFunction < Low(wbPERKFunctions)) or (NewFunction > High(wbPERKFunctions)) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - OldParamType := Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT']; - NewParamType := Ord(wbPERKFunctions[NewFunction].ParamType); - if (OldParamType = NewParamType) and not VarSameValue(aOldValue, aNewValue) and (NewFunction in [4,5]) then - Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT'] := 0; - Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT'] := NewParamType; -end; - -function wbPerkEPFTToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - FunctionTypeVar : Variant; - FunctionType : Integer; -// i : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - FunctionTypeVar := Container.ElementNativeValues['..\..\DATA\Entry Point\Function']; - if VarIsNull(FunctionTypeVar) or VarIsClear(FunctionTypeVar) then - Exit; - FunctionType := FunctionTypeVar; - if (FunctionType < Low(wbPERKFunctions)) or (FunctionType > High(wbPERKFunctions)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKFunctions[FunctionType] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := '"' + wbPERKFunctionParams[ParamType] + '"'; - else - if (aInt < Ord(Low(wbPERKFunctionParams))) or (aInt > Ord(High(wbPERKFunctionParams))) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: begin - Result := wbPERKFunctionParams[TPERKEntryPointFunctionParamType(aInt)]; - if (aType = ctToStr) and (TPERKEntryPointFunctionParamType(aInt) <> ParamType) then - Result := Result + ' '; - end; - ctCheck: - if TPERKEntryPointFunctionParamType(aInt) <> ParamType then - Result := Result + ' ' - else - Result := ''; - end; - end; - end; -end; - -function wbPerkEPFTToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - FunctionTypeVar : Variant; - FunctionType : Integer; - s : string; -// i : Integer; - j : TPERKEntryPointFunctionParamType; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then - raise Exception.Create('"" is not a valid value for this field'); - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Function'); - FunctionTypeVar := Container.ElementNativeValues['..\..\DATA\Entry Point\Function']; - if VarIsNull(FunctionTypeVar) or VarIsClear(FunctionTypeVar) then - raise Exception.Create('Could not resolve Function'); - - FunctionType := FunctionTypeVar; - if (FunctionType < Low(wbPERKFunctions)) or (FunctionType > High(wbPERKFunctions)) then - raise Exception.Create('Unknown Function #'+IntToStr(FunctionType)); - - with wbPERKFunctions[FunctionType] do begin - for j := Low(wbPERKFunctionParams) to High(wbPERKFunctionParams) do - if SameText(s, wbPERKFunctionParams[j]) then begin - if j <> ParamType then - raise Exception.Create('"'+s+'" is not a valid Parameter Type for Function "'+Name+'"'); - Result := Ord(j); - Exit; - end; - end; - - raise Exception.Create('"'+s+'" is not a valid Parameter Type'); -end; - -procedure wbPerkEPFTAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - i: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - i := aNewValue; - if (i < Ord(Low(wbPERKFunctionParams))) or (i> Ord(High(wbPERKFunctionParams))) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Container.RemoveElement('EPFD'); - Container.RemoveElement('EPF2'); - Container.RemoveElement('EPF3'); - Container.RemoveElement('Embedded Script'); - case TPERKEntryPointFunctionParamType(i) of - epfpFloat, epfpFloatFloat, epfpLeveledItem: - Container.Add('EPFD', True); - epfpScript: begin - Container.Add('EPF2', True); - Container.Add('EPF3', True); - Container.Add('SCHR', True); - end; - end; -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if not wbRemoveOffsetData then - Exit; - - if Supports(aElement, IwbContainer, Container) then begin - if wbBeginInternalEdit then try - Container.RemoveElement(OFST); - finally - wbEndInternalEdit; - end else begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; - end; -end; - -function wbActorTemplateUseTraits(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000001) <> 0; - end; -end; - -function wbActorTemplateUseStats(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000002) <> 0; - end; -end; - -function wbActorAutoCalcDontShow(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseStatsAutoCalc(const aElement: IwbElement): Boolean; -begin - if not wbActorTemplateHide then - Result := False - else - Result := wbActorTemplateUseStats(aElement) or wbActorAutoCalcDontShow(aElement); -end; - -function wbActorTemplateUseFactions(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000004) <> 0; - end; -end; - -function wbActorTemplateUseActorEffectList(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000008) <> 0; - end; -end; - -function wbActorTemplateUseAIData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseAIPackages(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000020) <> 0; - end; -end; - -function wbActorTemplateUseModelAnimation(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000040) <> 0; - end; -end; - -function wbActorTemplateUseBaseData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000080) <> 0; - end; -end; - -function wbActorTemplateUseInventory(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000100) <> 0; - end; -end; - -function wbActorTemplateUseScript(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000200) <> 0; - end; -end; - -procedure wbCTDAAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - //Size : Cardinal; - TypeFlags : Cardinal; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - TypeFlags := Container.ElementNativeValues['Type']; - if (TypeFlags and $02) <> 0 then begin - if Container.DataSize = 20 then - Container.DataSize := 28; - Container.ElementNativeValues['Type'] := TypeFlags and not $02; - Container.ElementEditValues['Run On'] := 'Target'; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMGEFAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - OldActorValue : Integer; - NewActorValue : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - OldActorValue := Container.ElementNativeValues['DATA - Data\Actor Value']; - NewActorValue := OldActorValue; - case Integer(Container.ElementNativeValues['DATA - Data\Archtype']) of - 01, //Script - 02, //Dispel - 03, //Cure Disease - 13, //Light - 16, //Lock - 17, //Open - 18, //Bound Item - 19, //Summon Creature - 30, //Cure Paralysis - 31, //Cure Addiction - 32, //Cure Poison - 33, //Concussion - 35: //Limb Condition - NewActorValue := -1; - 11: //Invisibility - NewActorValue := 48; //Invisibility - 12: //Chameleon - NewActorValue := 49; //Chameleon - 24: //Paralysis - NewActorValue := 47; //Paralysis - 36: //Turbo - NewActorValue := 51; //Turbo - end; - if OldActorValue <> NewActorValue then - Container.ElementNativeValues['DATA - Data\Actor Value'] := NewActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbPACKAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// OldContainer : IwbContainerElementRef; - NewContainer : IwbContainerElementRef; -// NewContainer2 : IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - case Integer(Container.ElementNativeValues['PKDT - General\Type']) of - 0: begin {Find} - Container.Add('PTDT'); - end; - 1: begin {Follow} - Container.Add('PKFD'); - end; - 2: begin {Escort} - end; - 3: begin {Eat} - Container.Add('PTDT'); - Container.Add('PKED'); - end; - 4: begin {Sleep} - if not Container.ElementExists['Locations'] then - if Supports(Container.Add('Locations'), IwbContainerElementRef, NewContainer) then - NewContainer.ElementEditValues['PLDT - Location 1\Type'] := 'Near editor location'; - end; - 5: begin {Wander} - end; - 6: begin {Travel} - end; - 7: begin {Accompany} - end; - 8: begin {Use Item At} - end; - 9: begin {Ambush} - end; - 10: begin {Flee Not Combat} - end; - 12: begin {Sandbox} - end; - 13: begin {Patrol} - if not Container.ElementExists['Locations'] then - if Supports(Container.Add('Locations'), IwbContainerElementRef, NewContainer) then - NewContainer.ElementEditValues['PLDT - Location 1\Type'] := 'Near linked reference'; - Container.Add('PKPT'); - end; - 14: begin {Guard} - end; - 15: begin {Dialogue} - end; - 16: begin {Use Weapon} - end; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbNPCAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// BaseRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementNativeValues['NAM5'] > 255 then - Container.ElementNativeValues['NAM5'] := 255; - finally - wbEndInternalEdit; - end; -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('RCLR'); - - if Container.ElementExists['Ammo'] then begin - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) and (BaseRecord.Signature <> 'WEAP') then - Container.RemoveElement('Ammo'); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbINFOAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if (Integer(Container.ElementNativeValues['DATA\Flags 1']) and $80) = 0 then - Container.RemoveElement('DNAM'); - - Container.RemoveElement('SNDD'); - - if Container.ElementNativeValues['DATA\Type'] = 3 {Persuasion} then - Container.ElementNativeValues['DATA\Type'] := 0 {Topic}; - finally - wbEndInternalEdit; - end; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; -// Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// i : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if (not Container.ElementExists['XCLW']) and ((Integer(Container.ElementNativeValues['DATA']) and $02) <> 0) then begin - Container.Add('XCLW', True); - Container.ElementEditValues['XCLW'] := 'Default'; - end; - - if (not Container.ElementExists['XNAM']) and ((Integer(Container.ElementNativeValues['DATA']) and $02) <> 0) then - Container.Add('XNAM', True); - -// if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin -// for i:= Pred(Container2.ElementCount) downto 0 do -// if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then -// Container2.RemoveElement(i); -// if Container2.ElementCount < 1 then -// Container2.Remove; -// end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbEmbeddedScriptAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if Container.ElementEditValues['SCHR\Type'] = 'Quest' then - Container.ElementEditValues['SCHR\Type'] := 'Object'; - finally - wbEndInternalEdit; - end; -end; - - -procedure wbSOUNAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; - OldCntr: IwbContainerElementRef; - NewCntr: IwbContainerElementRef; - NewCntr2: IwbContainerElementRef; - i: Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['SNDD'] then - Exit; - - if not Supports(Container.RemoveElement('SNDX - Sound Data'), IwbContainerElementRef, OldCntr) then - Exit; - if not Supports(Container.Add('SNDD', True), IwbContainerElementRef, NewCntr) then - Exit; - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr.ElementCount)) do - NewCntr.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - - if not Supports(NewCntr.ElementByName['Attenuation Curve'], IwbContainerElementRef, NewCntr2) then - Assert(False); - Assert(NewCntr2.ElementCount = 5); - - if Supports(Container.RemoveElement('ANAM'), IwbContainerElementRef, OldCntr) then begin - Assert(OldCntr.ElementCount = 5); - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr2.ElementCount)) do - NewCntr2.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - end else begin - NewCntr2.Elements[0].NativeValue := 100; - NewCntr2.Elements[1].NativeValue := 50; - NewCntr2.Elements[2].NativeValue := 20; - NewCntr2.Elements[3].NativeValue := 5; - NewCntr2.Elements[4].NativeValue := 0; - end; - - if not Supports(NewCntr.ElementByName['Reverb Attenuation Control'], IwbContainerElementRef, NewCntr2) then - Assert(False); - - if Supports(Container.RemoveElement('GNAM'), IwbContainerElementRef, OldCntr) then - NewCntr2.Assign(Low(Integer), OldCntr, False) - else - NewCntr2.NativeValue := 80; - - if not Supports(NewCntr.ElementByName['Priority'], IwbContainerElementRef, NewCntr2) then - Assert(False); - - if Supports(Container.RemoveElement('HNAM'), IwbContainerElementRef, OldCntr) then - NewCntr2.Assign(Low(Integer), OldCntr, False) - else - NewCntr2.NativeValue := 128; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbWATRAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -// AnimationMultiplier : Extended; -// AnimationAttackMultiplier : Extended; - OldCntr: IwbContainerElementRef; - NewCntr: IwbContainerElementRef; - i: Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['DNAM'] then - Exit; - - if not Supports(Container.RemoveElement('DATA - Visual Data'), IwbContainerElementRef, OldCntr) then - Exit; - if not Supports(Container.Add('DNAM', True), IwbContainerElementRef, NewCntr) then - Exit; - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr.ElementCount)) do - if OldCntr.Elements[i].Name = 'Damage (Old Format)' then - Container.ElementNativeValues['DATA - Damage'] := OldCntr.Elements[i].NativeValue - else - NewCntr.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - - NewCntr.ElementNativeValues['Noise Properties - Noise Layer One - Amplitude Scale'] := 1.0; - NewCntr.ElementNativeValues['Noise Properties - Noise Layer Two - Amplitude Scale'] := 0.5; - NewCntr.ElementNativeValues['Noise Properties - Noise Layer Three - Amplitude Scale'] := 0.25; - finally - wbEndInternalEdit; - end; -end; - - -procedure wbWEAPAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DNAM'] then - Exit; - - if Container.ElementNativeValues['DNAM\Animation Multiplier'] = 0.0 then - Container.ElementNativeValues['DNAM\Animation Multiplier'] := 1.0; - if Container.ElementNativeValues['DNAM\Animation Attack Multiplier'] = 0.0 then - Container.ElementNativeValues['DNAM\Animation Attack Multiplier'] := 1.0; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - IsMessageBox : Boolean; - HasTimeDelay : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - IsMessageBox := (Integer(Container.ElementNativeValues['DNAM']) and 1) = 1; - HasTimeDelay := Container.ElementExists['TNAM']; - - if IsMessageBox = HasTimeDelay then - if IsMessageBox then - Container.RemoveElement('TNAM') - else begin - if not Container.ElementExists['DNAM'] then - Container.Add('DNAM', True); - Container.ElementNativeValues['DNAM'] := Integer(Container.ElementNativeValues['DNAM']) or 1; - end; - - finally - wbEndInternalEdit; - end; -end; - - -procedure wbEFSHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; - FullParticleBirthRatio : Extended; - PersistantParticleBirthRatio : Extended; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DATA'] then - Exit; - - FullParticleBirthRatio := Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio']; - PersistantParticleBirthRatio := Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Birth Ratio']; - - if ((FullParticleBirthRatio <> 0) and (FullParticleBirthRatio <= 1)) then begin - FullParticleBirthRatio := FullParticleBirthRatio * 78.0; - Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio'] := FullParticleBirthRatio; - end; - - if ((PersistantParticleBirthRatio <> 0) and (PersistantParticleBirthRatio <= 1)) then begin - PersistantParticleBirthRatio := PersistantParticleBirthRatio * 78.0; - Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Birth Ratio'] := PersistantParticleBirthRatio; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbFACTAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Container.ElementExists['CNAM'] then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('CNAM'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['FNAM'] then begin - Container.Add('FNAM', True); - Container.ElementNativeValues['FNAM'] := 1.0; - end; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - MainRecord := Container.ContainingMainRecord; - if not Assigned(MainRecord) or MainRecord.IsDeleted then - Exit; - - Element := Container.ElementByPath['..\EFID']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Actor Value']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container: IwbContainer; - a, b: Single; - NeedsFlip: Boolean; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[0].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].Value); - case CompareValue(a, b) of - EqualsValue: begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[1].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].Value); - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbPxDTLocationDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - Result := Container.ElementByName['Type'].NativeValue; -end; - -function wbPKDTFalloutBehaviorFlagsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 8 then - Result := 1; -end; - -function wbPKDTSpecificFlagsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 8 then - Exit; - Result := Container.ElementByName['Type'].NativeValue + 1; -end; - -procedure wbIDLAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - if wbBeginInternalEdit then try -// if not wbCounterAfterSet('IDLC - Animation Count', aElement) then - if Supports(aElement.Container, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - if Assigned(Element) and Supports(aElement, IwbContainer, SelfAsContainer) and - (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbAnimationsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - if wbBeginInternalEdit then try -// if not wbCounterContainerAfterSet('IDLC - Animation Count', 'IDLA - Animations', aElement) then - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - Elems := Container.ElementByName['IDLA - Animations']; - if Assigned(Element) and not Assigned(Elems) then - if Element.GetNativeValue<>0 then - Element.SetNativeValue(0); - end; - finally - wbEndInternalEdit; - end; -end; - -function wbOffsetDataColsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbDataContainer; - Element : IwbElement; - fResult : Extended; -begin - Result := 0; - - if Supports(aElement.Container, IwbDataContainer, Container) and (Container.Name = 'OFST - Offset Data') and - Supports(Container.Container, IwbDataContainer, Container) then begin - Element := Container.ElementByPath['Object Bounds\NAM0 - Min\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 0 - else - Result := Trunc(fResult); - Element := Container.ElementByPath['Object Bounds\NAM9 - Max\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 1 - else - Result := Trunc(fResult) - Result + 1; - end; - end; - end; -end; - -procedure DefineFNVa; -begin - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags([ - {0x00000001}'ESM', - {0x00000002}'', - {0x00000004}'', // Plugin selected (Editor) - {0x00000008}'Form initialized (Runtime only)', // Form cannot be saved (Runtime)/Plugin active (Editor) - {0x00000010}'', // Plugin cannot be active or selected (Editor) - {0x00000020}'Deleted', - {0x00000040}'Border Region / Has Tree LOD / Constant / Hidden From Local Map / Plugin Endian', - {0x00000080}'Turn Off Fire', - {0x00000100}'Inaccessible', - {0x00000200}'Casts shadows / On Local Map / Motion Blur', - {0x00000400}'Quest item / Persistent reference', - {0x00000800}'Initially disabled', - {0x00001000}'Ignored', - {0x00002000}'No Voice Filter', - {0x00004000}'Cannot Save (Runtime only)', - {0x00008000}'Visible when distant', - {0x00010000}'Random Anim Start / High Priority LOD', - {0x00020000}'Dangerous / Off limits (Interior cell) / Radio Station (Talking Activator)', - {0x00040000}'Compressed', - {0x00080000}'Can''t wait / Platform Specific Texture / Dead', - {0x00100000}'Unknown 21', - {0x00200000}'Load Started (Runtime Only)', // set when beginning to load the form from save - {0x00400000}'Unknown 23', - {0x00800000}'Unknown 24', // Runtime might use it for "Not dead" on non actors. - {0x01000000}'Destructible (Runtime only)', - {0x02000000}'Obstacle / No AI Acquire', - {0x03000000}'NavMesh Generation - Filter', - {0x08000000}'NavMesh Generation - Bounding Box', - {0x10000000}'Non-Pipboy / Reflected by Auto Water', - {0x20000000}'Child Can Use / Refracted by Auto Water', - {0x40000000}'NavMesh Generation - Ground', - {0x80000000}'Multibound' - ])); - -(* wbInteger('Record Flags 2', itU32, wbFlags([ - {0x00000001}'Unknown 1', - {0x00000002}'Unknown 2', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'Unknown 5', - {0x00000020}'Unknown 6', - {0x00000040}'Unknown 7', - {0x00000080}'Unknown 8', - {0x00000100}'Unknown 9', - {0x00000200}'Unknown 10', - {0x00000400}'Unknown 11', - {0x00000800}'Unknown 12', - {0x00001000}'Unknown 13', - {0x00002000}'Unknown 14', - {0x00004000}'Unknown 15', - {0x00008000}'Unknown 16', - {0x00010000}'Unknown 17', - {0x00020000}'Unknown 18', - {0x00040000}'Unknown 19', - {0x00080000}'Unknown 20', - {0x00100000}'Unknown 21', - {0x00200000}'Unknown 22', - {0x00400000}'Unknown 23', - {0x00800000}'Unknown 24', - {0x01000000}'Unknown 25', - {0x02000000}'Unknown 26', - {0x03000000}'Unknown 27', - {0x08000000}'Unknown 28', - {0x10000000}'Unknown 29', - {0x20000000}'Unknown 30', - {0x40000000}'Unknown 31', - {0x80000000}'Unknown 32' - ])); (**) - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbInteger('Version Control Master FormID', itU32, nil, cpIgnore), - wbInteger('Form Version', itU16, nil, cpIgnore), - wbInteger('Version Control Info 2', itU16, nil, cpIgnore) // limited to values from 0 to 0xF - ]); - - wbSizeOfMainRecordStruct := 24; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - wbXRGB := wbByteArray(XRGB, 'Ragdoll Biped Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - wbSoundLevelEnum := wbEnum([ - 'Loud', - 'Normal', - 'Silent' - ]); - - wbWeaponAnimTypeEnum := wbEnum([ - {00} 'Hand to Hand', - {01} 'Melee (1 Hand)', - {02} 'Melee (2 Hand)', - {03} 'Pistol - Balistic (1 Hand)', - {04} 'Pistol - Energy (1 Hand)', - {05} 'Rifle - Balistic (2 Hand)', - {06} 'Rifle - Automatic (2 Hand)', - {07} 'Rifle - Energy (2 Hand)', - {08} 'Handle (2 Hand)', - {09} 'Launcher (2 Hand)', - {10} 'Grenade Throw (1 Hand)', - {11} 'Land Mine (1 Hand)', - {12} 'Mine Drop (1 Hand)', - {13} 'Thrown (1 Hand)' - ]); - - wbReloadAnimEnum := wbEnum([ - 'ReloadA', - 'ReloadB', - 'ReloadC', - 'ReloadD', - 'ReloadE', - 'ReloadF', - 'ReloadG', - 'ReloadH', - 'ReloadI', - 'ReloadJ', - 'ReloadK', - 'ReloadL', - 'ReloadM', - 'ReloadN', - 'ReloadO', - 'ReloadP', - 'ReloadQ', - 'ReloadR', - 'ReloadS', -// 'ReloadT', -// 'ReloadU', -// 'ReloadV', - 'ReloadW', - 'ReloadX', - 'ReloadY', - 'ReloadZ' - ],[255, 'None']); // 255 seen in DLC, though Geck converts to 0 - - wbEDID := wbString(EDID, 'Editor ID', 0, cpNormal); // not cpBenign according to Arthmoor - wbEDIDReq := wbString(EDID, 'Editor ID', 0, cpNormal, True); // not cpBenign according to Arthmoor - wbFULL := wbString(FULL, 'Name', 0, cpTranslate); - wbFULLActor := wbString(FULL, 'Name', 0, cpTranslate, False, wbActorTemplateUseBaseData); - wbFULLReq := wbString(FULL, 'Name', 0, cpNormal, True); - wbDESC := wbString(DESC, 'Description', 0, cpTranslate); - wbDESCReq := wbString(DESC, 'Description', 0, cpTranslate, True); - wbXSCL := wbFloat(XSCL, 'Scale'); - wbOBND := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ]); - wbOBNDReq := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ], cpNormal, True); - wbREPL := wbFormIDCkNoReach(REPL, 'Repair List', [FLST]); - wbEITM := wbFormIDCk(EITM, 'Object Effect', [ENCH, SPEL]); - wbBIPL := wbFormIDCk(BIPL, 'Biped Model List', [FLST]); - wbCOED := wbStructExSK(COED, [2], [0, 1], 'Extra Data', [ - {00} wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - {04} wbUnion('Global Variable / Required Rank', wbCOEDOwnerDecider, [ - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCk('Global Variable', [GLOB, NULL]), - wbInteger('Required Rank', itS32) - ]), - {08} wbFloat('Item Condition') - ]); - - wbYNAM := wbFormIDCk(YNAM, 'Sound - Pick Up', [SOUN]); - wbZNAM := wbFormIDCk(ZNAM, 'Sound - Drop', [SOUN]); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMODS := - wbArrayS(MODS, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO2S := - wbArrayS(MO2S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO3S := - wbArrayS(MO3S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO4S := - wbArrayS(MO4S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - - wbMODD := - wbInteger(MODD, 'FaceGen Model Flags', itU8, wbFlags([ - 'Head', - 'Torso', - 'Right Hand', - 'Left Hand' - ])); - wbMOSD := - wbInteger(MOSD, 'FaceGen Model Flags', itU8, wbFlags([ - 'Head', - 'Torso', - 'Right Hand', - 'Left Hand' - ])); - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files Hashes', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True); - - wbMODLActor := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files Hashes', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, False, wbActorTemplateUseModelAnimation, True); - - wbMODLReq := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, True, nil, True); - - - wbDEST := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'VATS Targetable' - ], True)), - wbByteArray('Unused', 2) - ]), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename'), - wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(DMDT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, nil, cpBenign) - ], []), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) - ) - ], []); - - wbDESTActor := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'VATS Targetable' - ])), - wbByteArray('Unused', 2) - ]), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename'), - wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(DMDT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, nil, cpBenign) - ], []), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) - ) - ], [], cpNormal, False, wbActorTemplateUseModelAnimation); - - wbSCRI := wbFormIDCk(SCRI, 'Script', [SCPT]); - wbSCRIActor := wbFormIDCk(SCRI, 'Script', [SCPT], False, cpNormal, False, wbActorTemplateUseScript); - wbENAM := wbFormIDCk(ENAM, 'Object Effect', [ENCH]); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', [PLYR, REFR, ACRE, ACHR, PGRE, PMIS, PBEA]), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent', - 'Pop In' - ])), - wbByteArray('Unused', 3) - ]); - - wbSCHRReq := wbStruct(SCHR, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU16, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Effect' - ])), - wbInteger('Flags', itU16, wbFlags([ - 'Enabled' - ]), cpNormal, False, nil, nil, 1) - ], cpNormal, True); - - wbSCROs := - wbRArray('References', - wbRUnion('', [ - wbFormID(SCRO, 'Global Reference'), -// wbFormIDCk(SCRO, 'Global Reference', -// [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, IMAD, -// BOOK, KEYM, ALCH, LIGH, QUST, PLYR, PACK, LVLI, ECZN, EXPL, FLST, IDLM, PMIS, -// FACT, ACHR, REFR, ACRE, GLOB, DIAL, CELL, SOUN, MGEF, WTHR, CLAS, EFSH, RACE, -// LVLC, CSTY, WRLD, SCPT, IMGS, MESG, MSTT, MUSC, NOTE, PERK, PGRE, PROJ, LVLN, -// WATR, ENCH, TREE, REPU, REGN, CSNO, CHAL, IMOD, RCCT, CMNY, CDCK, CHIP, CCRD, -// TERM, HAIR, EYES, ADDN, RCPE, NULL]), - wbInteger(SCRV, 'Local Variable', itU32) - ], []) - ); - - wbSLSD := wbStructSK(SLSD, [0], 'Local Variable Data', [ - wbInteger('Index', itU32), - wbByteArray('Unused', 12), - wbInteger('Flags', itU8, wbFlags(['IsLongOrShort']), cpCritical), - wbByteArray('Unused', 7) - ]); - - wbEmbeddedScript := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal{, True}), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, False, nil, False, wbEmbeddedScriptAfterLoad); - - wbEmbeddedScriptPerk := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal, True), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal, True), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, False, wbEPF2DontShow, False, wbEmbeddedScriptAfterLoad); - - wbEmbeddedScriptReq := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal{, True}), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, True, nil, False, wbEmbeddedScriptAfterLoad); - - - wbXLCM := wbInteger(XLCM, 'Level Modifier', itS32); - - wbRecord(ACHR, 'Placed NPC', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Ragdoll ---} - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Merchant Container ----} - wbFormIDCk(XMRC, 'Merchant Container', [REFR], True), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbXOWN := wbFormIDCkNoReach(XOWN, 'Owner', [FACT, ACHR, CREA, NPC_]); // Ghouls can own too aparently ! - wbXGLB := wbFormIDCk(XGLB, 'Global variable', [GLOB]); - - wbRecord(ACRE, 'Placed Creature', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [CREA], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Merchant Container ----} - wbFormIDCk(XMRC, 'Merchant Container', [REFR], True), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(ACTI, 'Activator', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Sound - Looping', [SOUN]), - wbFormIDCk(VNAM, 'Sound - Activation', [SOUN]), - wbFormIDCk(INAM, 'Radio Template', [SOUN]), - wbFormIDCk(RNAM, 'Radio Station', [TACT]), - wbFormIDCk(WNAM, 'Water Type', [WATR]), - wbString(XATO, 'Activation Prompt') - ]); - - wbICON := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename', 0, cpNormal, True), - wbString(MICO, 'Small Icon filename') - ], [], cpNormal, False, nil, True); - - wbICONReq := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename', 0, cpNormal, True), - wbString(MICO, 'Small Icon filename') - ], [], cpNormal, True, nil, True); - - wbVatsValueFunctionEnum := - wbEnum([ - 'Weapon Is', - 'Weapon In List', - 'Target Is', - 'Target In List', - 'Target Distance', - 'Target Part', - 'VATS Action', - 'Is Success', - 'Is Critical', - 'Critical Effect Is', - 'Critical Effect In List', - 'Is Fatal', - 'Explode Part', - 'Dismember Part', - 'Cripple Part', - 'Weapon Type Is', - 'Is Stranger', - 'Is Paralyzing Palm' - ]); - - wbActorValueEnum := - wbEnum([ - {00} 'Aggresion', - {01} 'Confidence', - {02} 'Energy', - {03} 'Responsibility', - {04} 'Mood', - {05} 'Strength', - {06} 'Perception', - {07} 'Endurance', - {08} 'Charisma', - {09} 'Intelligence', - {10} 'Agility', - {11} 'Luck', - {12} 'Action Points', - {13} 'Carry Weight', - {14} 'Critical Chance', - {15} 'Heal Rate', - {16} 'Health', - {17} 'Melee Damage', - {18} 'Damage Resistance', - {19} 'Poison Resistance', - {20} 'Rad Resistance', - {21} 'Speed Multiplier', - {22} 'Fatigue', - {23} 'Karma', - {24} 'XP', - {25} 'Perception Condition', - {26} 'Endurance Condition', - {27} 'Left Attack Condition', - {28} 'Right Attack Condition', - {29} 'Left Mobility Condition', - {30} 'Right Mobility Condition', - {31} 'Brain Condition', - {32} 'Barter', - {33} 'Big Guns (obsolete)', - {34} 'Energy Weapons', - {35} 'Explosives', - {36} 'Lockpick', - {37} 'Medicine', - {38} 'Melee Weapons', - {39} 'Repair', - {40} 'Science', - {41} 'Guns', - {42} 'Sneak', - {43} 'Speech', - {44} 'Survival', - {45} 'Unarmed', - {46} 'Inventory Weight', - {47} 'Paralysis', - {48} 'Invisibility', - {49} 'Chameleon', - {50} 'Night Eye', - {51} 'Turbo', - {52} 'Fire Resistance', - {53} 'Water Breathing', - {54} 'Rad Level', - {55} 'Bloody Mess', - {56} 'Unarmed Damage', - {57} 'Assistance', - {58} 'Electric Resistance', - {59} 'Frost Resistance', - {60} 'Energy Resistance', - {61} 'EMP Resistance', - {62} 'Variable01', - {63} 'Variable02', - {64} 'Variable03', - {65} 'Variable04', - {66} 'Variable05', - {67} 'Variable06', - {68} 'Variable07', - {79} 'Variable08', - {70} 'Variable09', - {71} 'Variable10', - {72} 'Ignore Crippled Limbs', - {73} 'Dehydration', - {74} 'Hunger', - {75} 'Sleep Deprivation', - {76} 'Damage Threshold' - ], [ - -1, 'None' - ]); - - wbModEffectEnum := - wbEnum([ - {00} 'None', - {01} 'Increase Weapon Damage', - {02} 'Increase Clip Capacity', - {03} 'Decrease Spread', - {04} 'Decrease Weight', - {05} 'Regenerate Ammo (shots)', - {06} 'Regenerate Ammo (seconds)', - {07} 'Decrease Equip Time', - {08} 'Increase Rate of Fire', - {09} 'Increase Projectile Speed', - {10} 'Increase Max. Condition', - {11} 'Silence', - {12} 'Split Beam', - {13} 'VATS Bonus', - {14} 'Increase Zoom', - {15} 'Decrease Equip Time', - {16} 'Suppressor' - ]); - - wbSkillEnum := - wbEnum([ - 'Barter', - 'Big Guns (obsolete)', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Guns', - 'Sneak', - 'Speech', - 'Survival', - 'Unarmed' - ], [ - -1, 'None' - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder' - ], [ - -1, 'None' - ]); - - wbActorValue := wbInteger('Actor Value', itS32, wbActorValueEnum); - - wbEquipTypeEnum := - wbEnum([ - {00} 'Big Guns', - {01} 'Energy Weapons', - {02} 'Small Guns', - {03} 'Melee Weapons', - {04} 'Unarmed Weapon', - {05} 'Thrown Weapons', - {06} 'Mine', - {07} 'Body Wear', - {08} 'Head Wear', - {09} 'Hand Wear', - {10} 'Chems', - {11} 'Stimpack', - {12} 'Food', - {13} 'Alcohol' - ], [ - -1, 'None' - ]); - - wbETYP := wbInteger(ETYP, 'Equiptment Type', itS32, wbEquipTypeEnum); - wbETYPReq := wbInteger(ETYP, 'Equiptment Type', itS32, wbEquipTypeEnum, cpNormal, True); - - wbFormTypeEnum := - wbEnum([], [ - $04, 'Texture Set', - $05, 'Menu Icon', - $06, 'Global', - $07, 'Class', - $08, 'Faction', - $09, 'Head Part', - $0A, 'Hair', - $0B, 'Eyes', - $0C, 'Race', - $0D, 'Sound', - $0E, 'Acoustic Space', - $0F, 'Skill', - $10, 'Base Effect', - $11, 'Script', - $12, 'Landscape Texture', - $13, 'Object Effect', - $14, 'Actor Effect', - $15, 'Activator', - $16, 'Talking Activator', - $17, 'Terminal', - $18, 'Armor', - $19, 'Book', - $1A, 'Clothing', - $1B, 'Container', - $1C, 'Door', - $1D, 'Ingredient', - $1E, 'Light', - $1F, 'Misc', - $20, 'Static', - $21, 'Static Collection', - $22, 'Movable Static', - $23, 'Placeable Water', - $24, 'Grass', - $25, 'Tree', - $26, 'Flora', - $27, 'Furniture', - $28, 'Weapon', - $29, 'Ammo', - $2A, 'NPC', - $2B, 'Creature', - $2C, 'Leveled Creature', - $2D, 'Leveled NPC', - $2E, 'Key', - $2F, 'Ingestible', - $30, 'Idle Marker', - $31, 'Note', - $32, 'Constructible Object', - $33, 'Projectile', - $34, 'Leveled Item', - $35, 'Weather', - $36, 'Climate', - $37, 'Region', - $39, 'Cell', - $3A, 'Placed Object', - $3B, 'Placed Character', - $3C, 'Placed Creature', - $3E, 'Placed Grenade', - $41, 'Worldspace', - $42, 'Landscape', - $43, 'Navigation Mesh', - $45, 'Dialog Topic', - $46, 'Dialog Response', - $47, 'Quest', - $48, 'Idle Animation', - $49, 'Package', - $4A, 'Combat Style', - $4B, 'Load Screen', - $4C, 'Leveled Spell', - $4D, 'Animated Object', - $4E, 'Water', - $4F, 'Effect Shader', - $51, 'Explosion', - $52, 'Debris', - $53, 'Image Space', - $54, 'Image Space Modifier', - $55, 'FormID List', - $56, 'Perk', - $57, 'Body Part Data', - $58, 'Addon Node', - $59, 'Actor Value Info', - $5A, 'Radiation Stage', - $5B, 'Camera Shot', - $5C, 'Camera Path', - $5D, 'Voice Type', - $5E, 'Impact Data', - $5F, 'Impact DataSet', - $60, 'Armor Addon', - $61, 'Encounter Zone', - $62, 'Message', - $63, 'Ragdoll', - $64, 'Default Object Manager', - $65, 'Lighting Template', - $66, 'Music Type', - $67, 'Item Mod', - $68, 'Reputation', - $69, '?PCBE', //no such records in FalloutNV.esm - $6A, 'Recipe', - $6B, 'Recipe Category', - $6C, 'Casino Chip', - $6D, 'Casino', - $6E, 'Load Screen Type', - $6F, 'Media Set', - $70, 'Media Location Controller', - $71, 'Challenge', - $72, 'Ammo Effect', - $73, 'Caravan Card', - $74, 'Caravan Money', - $75, 'Caravan Deck', - $76, 'Dehydration Stages', - $77, 'Hunger Stages', - $78, 'Sleep Deprivation Stages' - ]); - - wbMenuModeEnum := - wbEnum([],[ - 1, 'Type: Character Interface', - 2, 'Type: Other', - 3, 'Type: Console', - 1001, 'Specific: Message', - 1002, 'Specific: Inventory', - 1003, 'Specific: Stats', - 1004, 'Specific: HUDMainMenu', - 1007, 'Specific: Loading', - 1008, 'Specific: Container', - 1009, 'Specific: Dialog', - 1012, 'Specific: Sleep/Wait', - 1013, 'Specific: Pause', - 1014, 'Specific: LockPick', - 1016, 'Specific: Quantity', - 1027, 'Specific: Level Up', - 1035, 'Specific: Pipboy Repair', - 1036, 'Specific: Race / Sex', - 1047, 'Specific: Credits', - 1048, 'Specific: CharGen', - 1051, 'Specific: TextEdit', - 1053, 'Specific: Barter', - 1054, 'Specific: Surgery', - 1055, 'Specific: Hacking', - 1056, 'Specific: VATS', - 1057, 'Specific: Computers', - 1058, 'Specific: Vendor Repair', - 1059, 'Specific: Tutorial', - 1060, 'Specific: You''re SPECIAL book' - ]); -end; - -procedure DefineFNVb; -begin - wbMiscStatEnum := - wbEnum([ - 'Quests Completed', - 'Locations Discovered', - 'People Killed', - 'Creatures Killed', - 'Locks Picked', - 'Computers Hacked', - 'Stimpaks Taken', - 'Rad-X Taken', - 'RadAway Taken', - 'Chems Taken', - 'Times Addicted', - 'Mines Disarmed', - 'Speech Successes', - 'Pockets Picked', - 'Pants Exploded', - 'Books Read', - 'Bobbleheads Found', - 'Weapons Created', - 'People Mezzed', - 'Captives Rescued', - 'Sandman Kills', - 'Paralyzing Punches', - 'Robots Disabled', - 'Contracts Completed', - 'Corpses Eaten', - 'Mysterious Stranger Visits', - 'Doctor Bags Used', - 'Challenges Completed', - 'Miss Fortunate Occurrences', - 'Disintegrations', - 'Have Limbs Crippled', - 'Speech Failures', - 'Items Crafted', - 'Weapon Modifications', - 'Items Repaired', - 'Total Things Killed', - 'Dismembered Limbs', - 'Caravan Games Won', - 'Caravan Games Lost', - 'Barter Amount Traded', - 'Roulette Games Played', - 'Blackjack Games Played', - 'Slots Games Played' - ]); - - wbAlignmentEnum := - wbEnum([ - 'Good', - 'Neutral', - 'Evil', - 'Very Good', - 'Very Evil' - ]); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCriticalStageEnum := - wbEnum([ - 'None', - 'Goo Start', - 'Goo End', - 'Disintegrate Start', - 'Disintegrate End' - ]); - - wbSexEnum := - wbEnum(['Male','Female']); - - wbCreatureTypeEnum := - wbEnum([ - 'Animal', - 'Mutated Animal', - 'Mutated Insect', - 'Abomination', - 'Super Mutant', - 'Feral Ghoul', - 'Robot', - 'Giant' - ]); - - wbPlayerActionEnum := - wbEnum([ - '', - 'Swinging Melee Weapon', - 'Throwing Grenade', - 'Fire Weapon', - 'Lay Mine', - 'Z Key Object', - 'Jumping', - 'Knocking over Objects', - 'Stand on Table/Chair', - 'Iron Sites', - 'Destroying Object' - ]); - - wbBodyLocationEnum := - wbEnum([ - 'Torso', - 'Head 1', - 'Head 2', - 'Left Arm 1', - 'Left Arm 2', - 'Right Arm 1', - 'Right Arm 2', - 'Left Leg 1', - 'Left Leg 2', - 'Left Leg 3', - 'Right Leg 1', - 'Right Leg 2', - 'Right Leg 3', - 'Brain' - ], [ - -1, 'None' - ]); - - - wbEFID := wbFormIDCk(EFID, 'Base Effect', [MGEF]); - - wbEFIT := - wbStructSK(EFIT, [3, 4], '', [ - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbActorValue - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbCTDA := - wbStruct(CTDA, 'Condition', [ - wbInteger('Type', itU8, wbCtdaTypeToStr, wbCtdaTypeToInt, cpNormal, False, nil, wbCtdaTypeAfterSet), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), // Limited to itu16 - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Quest Stage (INVALID)', itS32), - {09} wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {10} wbInteger('Alignment', itU32, wbAlignmentEnum), - {11} wbInteger('Equip Type', itU32, wbEquipTypeEnum), - {12} wbInteger('Form Type', itU32, wbFormTypeEnum), - {13} wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {14} wbFormIDCkNoReach('Object Reference', [PLYR, REFR, ACHR, ACRE, PGRE, PMIS, PBEA, TRGT], True), - {16} wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, FLST, CHIP, CMNY, IMOD]), - {17} wbFormIDCkNoReach('Actor', [PLYR, ACHR, ACRE, TRGT], True), - {18} wbFormIDCkNoReach('Voice Type', [VTYP]), - {19} wbFormIDCkNoReach('Idle', [IDLE]), - {20} wbFormIDCkNoReach('Form List', [FLST]), - {21} wbFormIDCkNoReach('Note', [NOTE]), - {22} wbFormIDCkNoReach('Quest', [QUST]), - {23} wbFormIDCkNoReach('Faction', [FACT]), - {24} wbFormIDCkNoReach('Weapon', [WEAP]), - {25} wbFormIDCkNoReach('Cell', [CELL]), - {26} wbFormIDCkNoReach('Class', [CLAS]), - {27} wbFormIDCkNoReach('Race', [RACE]), - {28} wbFormIDCkNoReach('Actor Base', [NPC_, CREA, ACTI, TACT, NULL]), - {29} wbFormIDCkNoReach('Global', [GLOB]), - {30} wbFormIDCkNoReach('Weather', [WTHR]), - {31} wbFormIDCkNoReach('Package', [PACK]), - {32} wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {33} wbFormIDCkNoReach('Perk', [PERK]), - {34} wbFormIDCkNoReach('Owner', [FACT, NPC_]), - {35} wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {36} wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR]), - {37} wbFormIDCkNoReach('Base Effect', [MGEF]), - {38} wbFormIDCkNoReach('Worldspace', [WRLD]), - {39} wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - {40} wbInteger('VATS Value Param (INVALID)', itU32), - {41} wbInteger('Creature Type', itU32, wbCreatureTypeEnum), - {42} wbInteger('Menu Mode', itU32, wbMenuModeEnum), - {43} wbInteger('Player Action', itU32, wbPlayerActionEnum), - {44} wbInteger('Body Location', itS32, wbBodyLocationEnum), - {45} wbFormIDCkNoReach('Referenceable Object', [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, FLST, CHIP, CMNY, CCRD, IMOD, LVLC, LVLN], - [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, CHIP, CMNY, CCRD, IMOD, LVLC, LVLN]), - {46} wbInteger('Quest Objective (INVALID)', itS32), - {47} wbFormIDCkNoReach('Reputation', [REPU]), - {48} wbFormIDCkNoReach('Region', [REGN]), - {49} wbFormIDCkNoReach('Challenge', [CHAL]), - {50} wbFormIDCkNoReach('Casino', [CSNO]), - {51} wbFormID('Form') - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {09} wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {10} wbInteger('Alignment', itU32, wbAlignmentEnum), - {11} wbInteger('Equip Type', itU32, wbEquipTypeEnum), - {12} wbInteger('Form Type', itU32, wbFormTypeEnum), - {13} wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {14} wbFormIDCkNoReach('Object Reference', [PLYR, REFR, PMIS, PBEA, ACHR, ACRE, PGRE, TRGT], True), - {16} wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, FLST, CHIP, CMNY, CCRD, IMOD]), - {17} wbFormIDCkNoReach('Actor', [PLYR, ACHR, ACRE, TRGT], True), - {18} wbFormIDCkNoReach('Voice Type', [VTYP]), - {19} wbFormIDCkNoReach('Idle', [IDLE]), - {20} wbFormIDCkNoReach('Form List', [FLST]), - {21} wbFormIDCkNoReach('Note', [NOTE]), - {22} wbFormIDCkNoReach('Quest', [QUST]), - {23} wbFormIDCkNoReach('Faction', [FACT]), - {24} wbFormIDCkNoReach('Weapon', [WEAP]), - {25} wbFormIDCkNoReach('Cell', [CELL]), - {26} wbFormIDCkNoReach('Class', [CLAS]), - {27} wbFormIDCkNoReach('Race', [RACE]), - {28} wbFormIDCkNoReach('Actor Base', [NPC_, CREA, ACTI, TACT]), - {29} wbFormIDCkNoReach('Global', [GLOB]), - {30} wbFormIDCkNoReach('Weather', [WTHR]), - {31} wbFormIDCkNoReach('Package', [PACK]), - {32} wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {33} wbFormIDCkNoReach('Perk', [PERK]), - {34} wbFormIDCkNoReach('Owner', [FACT, NPC_]), - {35} wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {36} wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR]), - {37} wbFormIDCkNoReach('Base Effect', [MGEF]), - {38} wbFormIDCkNoReach('Worldspace', [WRLD]), - {39} wbInteger('VATS Value Function (INVALID)', itU32), - {40} wbUnion('VATS Value Param', wbCTDAParam2VATSValueParam, [ - wbFormIDCkNoReach('Weapon', [WEAP]), - wbFormIDCkNoReach('Weapon List', [FLST], [WEAP]), - wbFormIDCkNoReach('Target', [NPC_, CREA]), - wbFormIDCkNoReach('Target List', [FLST], [NPC_, CREA]), - wbByteArray('Unused', 4, cpIgnore), - wbInteger('Target Part', itS32, wbActorValueEnum), - wbInteger('VATS Action', itU32, wbEnum([ - 'Unarmed Attack', - 'One Hand Melee Attack', - 'Two Hand Melee Attack', - 'Fire Pistol', - 'Fire Rifle', - 'Fire Handle Weapon', - 'Fire Launcher', - 'Throw Grenade', - 'Place Mine', - 'Reload', - 'Crouch', - 'Stand', - 'Switch Weapon', - 'Toggle Weapon Drawn', - 'Heal', - 'Player Death', - 'Special Weapon Attack', - 'Special Unarmed Attack', - 'Kill Camera Shot', - 'Throw Weapon' - ])), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Critical Effect', [SPEL]), - wbFormIDCkNoReach('Critical Effect List', [FLST], [SPEL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbInteger('Weapon Type', itU32, wbWeaponAnimTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - {41} wbInteger('Creature Type', itU32, wbCreatureTypeEnum), - {42} wbInteger('Menu Mode', itU32, wbMenuModeEnum), - {43} wbInteger('Player Action', itU32, wbPlayerActionEnum), - {44} wbInteger('Body Location', itS32, wbBodyLocationEnum), - {45} wbFormIDCkNoReach('Referenceable Object', [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, FLST, CHIP, CMNY, CCRD, IMOD, LVLC, LVLN], - [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, CHIP, CMNY, CCRD, IMOD, LVLC, LVLN]), - {46} wbInteger('Quest Objective', itS32, wbCTDAParam2QuestObjectiveToStr, wbCTDAParam2QuestObjectiveToInt), - {47} wbFormIDCkNoReach('Reputation', [REPU]), - {48} wbFormIDCkNoReach('Region', [REGN]), - {49} wbFormIDCkNoReach('Challenge', [CHAL]), - {50} wbFormIDCkNoReach('Casino', [CSNO]), - {51} wbFormID('Form') - ]), - wbInteger('Run On', itU32, wbEnum([ - 'Subject', - 'Target', - 'Reference', - 'Combat Target', - 'Linked Reference' - ]), cpNormal, False, nil, wbCTDARunOnAfterSet), - wbUnion('Reference', wbCTDAReferenceDecider, [ - wbInteger('Unused', itU32, nil, cpIgnore), - wbFormIDCkNoReach('Reference', [PLYR, ACHR, ACRE, REFR, PMIS, PBEA, PGRE, NULL], True) // Can end up NULL if the original function requiring a reference is replaced by another who has no Run on prerequisite - ]) - ], cpNormal, False, nil, 6, wbCTDAAfterLoad); - wbCTDAs := wbRArray('Conditions', wbCTDA); - wbCTDAsReq := wbRArray('Conditions', wbCTDA, cpNormal, True); - - wbEffects := - wbRStructs('Effects','Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], []); - - wbEffectsReq := - wbRStructs('Effects','Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], [], cpNormal, True); - - - wbRecord(ALCH, 'Ingestible', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICON, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbETYPReq, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags?', itU8, wbFlags([ - 'No Auto-Calc (Unused)', - 'Food Item', - 'Medicine' - ])), - wbByteArray('Unused', 3), - wbFormIDCk('Withdrawal Effect', [SPEL, NULL]), - wbFloat('Addiction Chance'), - wbFormIDCk('Sound - Consume', [SOUN, NULL]) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(AMMO, 'Ammunition', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICON, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbFloat('Speed'), - wbInteger('Flags', itU8, wbFlags([ - 'Ignores Normal Weapon Resistance', - 'Non-Playable' - ])), - wbByteArray('Unused', 3), - wbInteger('Value', itS32), - wbInteger('Clip Rounds', itU8) - ], cpNormal, True), - wbStruct(DAT2, 'Data 2', [ - wbInteger('Proj. per Shot', itU32), - wbFormIDCk('Projectile', [PROJ, NULL]), - wbFloat('Weight'), - wbFormIDCk('Consumed Ammo', [AMMO, MISC, NULL]), - wbFloat('Consumed Percentage') - ], cpNormal, False, nil, 3), - wbString(ONAM, 'Short Name'), - wbString(QNAM, 'Abbrev.'), - wbRArray('Ammo Effects', - wbFormIDCk(RCIL, 'Effect', [AMEF]) - ) - ]); - - wbRecord(ANIO, 'Animated Object', [ - wbEDIDReq, - wbMODLReq, - wbFormIDCk(DATA, 'Animation', [IDLE], False, cpNormal, True) - ]); - - wbBMDT := wbStruct(BMDT, 'Biped Data', [ - wbInteger('Biped Flags', itU32, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Left Hand', - {0x00000010} 'Right Hand', - {0x00000020} 'Weapon', - {0x00000040} 'PipBoy', - {0x00000080} 'Backpack', - {0x00000100} 'Necklace', - {0x00000200} 'Headband', - {0x00000400} 'Hat', - {0x00000800} 'Eye Glasses', - {0x00001000} 'Nose Ring', - {0x00002000} 'Earrings', - {0x00004000} 'Mask', - {0x00008000} 'Choker', - {0x00010000} 'Mouth Object', - {0x00020000} 'Body AddOn 1', - {0x00040000} 'Body AddOn 2', - {0x00080000} 'Body AddOn 3' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} '1', - {0x0002} '2', - {0x0004} 'Has Backpack', - {0x0008} 'Medium', - {0x0010} '5', - {0x0020} 'Power Armor', - {0x0040} 'Non-Playable', - {0x0080} 'Heavy' - ], True)), - wbByteArray('Unused') - ], cpNormal, True); - - wbRecord(ARMO, 'Armor', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbSCRI, - wbEITM, - wbBMDT, - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbString(ICON, 'Male icon filename'), - wbString(MICO, 'Male mico filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename', 0, cpNormal, True), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S, - wbMOSD - ], [], cpNormal, False, nil, True), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(ICO2, 'Female icon filename'), - wbString(MIC2, 'Female mico filename'), - wbString(BMCT, 'Ragdoll Constraint Template'), - wbREPL, - wbBIPL, - wbETYPReq, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbInteger('Health', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(DNAM, '', [ - wbInteger('AR', itS16, wbDiv(100)), - wbInteger('Flags', itU16, wbFlags([ - 'Modulates Voice' - ])), - wbFloat('DT'), - wbByteArray('?', 4) - ], cpNormal, True, nil, 2), - wbInteger(BNAM, 'Overrides Animation Sounds', itU32, wbEnum(['No', 'Yes'])), - wbRArray('Animation Sounds', - wbStruct(SNAM, 'Animation Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Chance', itU8), - wbByteArray('Unused', 3), - wbInteger('Type', itU32, wbEnum([], [ - 19, 'Run', - 21, 'Run (Armor)', - 18, 'Sneak', - 20, 'Sneak (Armor)', - 17, 'Walk', - 22, 'Walk (Armor)' - ])) - ]) - ), - wbFormIDCk(TNAM, 'Animation Sounds Template', [ARMO]) - ]); - - wbRecord(ARMA, 'Armor Addon', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbBMDT, - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbString(ICON, 'Male icon filename'), - wbString(MICO, 'Male mico filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename', 0, cpNormal, True), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S, - wbMOSD - ], [], cpNormal, False, nil, True), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(ICO2, 'Female icon filename'), - wbString(MIC2, 'Female mico filename'), - wbETYPReq, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbInteger('Max Condition', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(DNAM, '', [ - wbInteger('AR', itS16, wbDiv(100)), - wbInteger('Flags', itU16, wbFlags([ // Only a byte or 2 distincts byte - 'Modulates Voice' - ])), - wbFloat('DT'), - wbByteArray('Unused', 4) - ], cpNormal, True, nil, 2) - ]); - - wbRecord(BOOK, 'Book', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbDESCReq, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU8, wbFlags([ - '', - 'Can''t be Taken' - ])), - wbInteger('Skill', itS8, wbSkillEnum), - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbSPLO := wbFormIDCk(SPLO, 'Actor Effect', [SPEL]); - wbSPLOs := wbRArrayS('Actor Effects', wbSPLO, cpNormal, False, nil, nil, wbActorTemplateUseActorEffectList); - - wbRecord(CELL, 'Cell', [ - wbEDID, - wbFULL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Is Interior Cell', - {0x02} 'Has water', - {0x04} 'Invert Fast Travel behavior', - {0x08} 'No LOD Water', - {0x10} '', - {0x20} 'Public place', - {0x40} 'Hand changed', - {0x80} 'Behave like exterior' - ]), cpNormal, True), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32), - wbInteger('Force Hide Land', itU32, wbFlags([ - 'Quad 1', - 'Quad 2', - 'Quad 3', - 'Quad 4' - ], True)) - ], cpNormal, False, nil, 2), - wbStruct(XCLL, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Dist'), - wbFloat('Fog Power') - ], cpNormal, False, nil, 7), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbRStruct('Light Template', [ - wbFormIDCk(LTMP, 'Template', [LGTM, NULL]), - wbInteger(LNAM, 'Inherit', itU32, wbFlags([ - {0x00000001}'Ambient Color', - {0x00000002}'Directional Color', - {0x00000004}'Fog Color', - {0x00000008}'Fog Near', - {0x00000010}'Fog Far', - {0x00000020}'Directional Rotation', - {0x00000040}'Directional Fade', - {0x00000080}'Clip Distance', - {0x00000100}'Fog Power' - ]), cpNormal, True) - ], [], cpNormal, True ), - wbFloat(XCLW, 'Water Height'), - wbString(XNAM, 'Water Noise Texture'), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbFormIDCk(XCIM, 'Image Space', [IMGS]), - wbByteArray(XCET, 'Unknown', 1, cpIgnore), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbFormIDCk(XCCM, 'Climate', [CLMT]), - wbFormIDCk(XCWT, 'Water', [WATR]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - wbFormIDCk(XCAS, 'Acoustic Space', [ASPC]), - wbByteArray(XCMT, 'Unused', 1, cpIgnore), - wbFormIDCk(XCMO, 'Music Type', [MUSC]) - ], True, wbCellAddInfo, cpNormal, False, wbCELLAfterLoad); - - wbServiceFlags := - wbFlags([ - {0x00000001} 'Weapons', - {0x00000002} 'Armor', - {0x00000004} 'Alcohol', - {0x00000008} 'Books', - {0x00000010} 'Food', - {0x00000020} 'Chems', - {0x00000040} 'Stimpacks', - {0x00000080} 'Lights?', - {0x00000100} '', - {0x00000200} '', - {0x00000400} 'Miscellaneous', - {0x00000800} '', - {0x00001000} '', - {0x00002000} 'Potions?', - {0x00004000} 'Training', - {0x00008000} '', - {0x00010000} 'Recharge', - {0x00020000} 'Repair' - ]); - - wbSpecializationEnum := wbEnum(['Combat', 'Magic', 'Stealth']); - - wbRecord(CLAS, 'Class', [ - wbEDIDReq, - wbFULLReq, - wbDESCReq, - wbICON, - wbStruct(DATA, '', [ - wbArray('Tag Skills', wbInteger('Tag Skill', itS32, wbActorValueEnum), 4), - wbInteger('Flags', itU32, wbFlags(['Playable', 'Guard'], True)), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbArray(ATTR, 'Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, True) - ]); -end; - -procedure DefineFNVc; -begin - wbRecord(CLMT, 'Climate', [ - wbEDIDReq, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR, NULL]), - wbInteger('Chance', itS32), - wbFormIDCk('Global', [GLOB, NULL]) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbCNTO := - wbRStructExSK([0], [1], 'Item', [ - wbStructExSK(CNTO, [0], [1], 'Item', [ - wbFormIDCk('Item', [ARMO, AMMO, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, NOTE, IMOD, CMNY, CCRD, LIGH, CHIP{, MSTT{?}{, STAT{?}]), - wbInteger('Count', itS32) - ]), - wbCOED - ], []); - - wbCNTOs := wbRArrayS('Items', wbCNTO); - - wbRecord(CONT, 'Container', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbCNTOs, - wbDEST, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['', 'Respawns'])), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(SNAM, 'Sound - Open', [SOUN]), - wbFormIDCk(QNAM, 'Sound - Close', [SOUN]), - wbFormIDCk(RNAM, 'Sound - Random/Looping', [SOUN]) - ], True); - - wbCSDT := wbRStructSK([0], 'Sound Type', [ - wbInteger(CSDT, 'Type', itU32,wbEnum([ - {00} 'Left Foot', - {01} 'Right Foot', - {02} 'Left Back Foot', - {03} 'Right Back Foot', - {04} 'Idle', - {05} 'Aware', - {06} 'Attack', - {07} 'Hit', - {08} 'Death', - {09} 'Weapon', - {10} 'Movement Loop', - {11} 'Conscious Loop', - {12} 'Auxiliary 1', - {13} 'Auxiliary 2', - {14} 'Auxiliary 3', - {15} 'Auxiliary 4', - {16} 'Auxiliary 5', - {17} 'Auxiliary 6', - {18} 'Auxiliary 7', - {19} 'Auxiliary 8', - {19} 'Auxiliary 8', - {20} 'Jump', - {21} 'PlayRandom/Loop' - ])), - wbRArrayS('Sounds', wbRStructSK([0], 'Sound', [ - wbFormIDCk(CSDI, 'Sound', [SOUN, NULL], False, cpNormal, True), - wbInteger(CSDC, 'Sound Chance', itU8, nil, cpNormal, True) - ], []), cpNormal, True) - ], []); - - wbCSDTs := wbRArrayS('Sound Types', wbCSDT, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation); - - wbAgressionEnum := wbEnum([ - 'Unaggressive', - 'Aggressive', - 'Very Aggressive', - 'Frenzied' - ]); - - wbConfidenceEnum := wbEnum([ - 'Cowardly', - 'Cautious', - 'Average', - 'Brave', - 'Foolhardy' - ]); - - wbMoodEnum := wbEnum([ - 'Neutral', - 'Afraid', - 'Annoyed', - 'Cocky', - 'Drugged', - 'Pleasant', - 'Angry', - 'Sad' - ]); - - wbAssistanceEnum := wbEnum([ - 'Helps Nobody', - 'Helps Allies', - 'Helps Friends and Allies' - ]); - - wbAggroRadiusFlags := wbFlags([ - 'Aggro Radius Behavior' - ]); - - wbAIDT := - wbStruct(AIDT, 'AI Data', [ - {00} wbInteger('Aggression', itU8, wbAgressionEnum), - {01} wbInteger('Confidence', itU8, wbConfidenceEnum), - {02} wbInteger('Energy Level', itU8), - {03} wbInteger('Responsibility', itU8), - {04} wbInteger('Mood', itU8, wbMoodEnum), - {05} wbByteArray('Unused', 3), // Mood is stored as a DWord as shown by endianSwapping but is truncated to byte during load :) - {08} wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - {0C} wbInteger('Teaches', itS8, wbSkillEnum), - {0D} wbInteger('Maximum training level', itU8), - {0E} wbInteger('Assistance', itS8, wbAssistanceEnum), - {0F} wbInteger('Aggro Radius Behavior', itU8, wbAggroRadiusFlags), - {10} wbInteger('Aggro Radius', itS32) - ], cpNormal, True, wbActorTemplateUseAIData); - - wbAttackAnimationEnum := - wbEnum([ - ], [ - 26, 'AttackLeft', - 27, 'AttackLeftUp', - 28, 'AttackLeftDown', - 29, 'AttackLeftIS', - 30, 'AttackLeftISUp', - 31, 'AttackLeftISDown', - 32, 'AttackRight', - 33, 'AttackRightUp', - 34, 'AttackRightDown', - 35, 'AttackRightIS', - 36, 'AttackRightISUp', - 37, 'AttackRightISDown', - 38, 'Attack3', - 39, 'Attack3Up', - 40, 'Attack3Down', - 41, 'Attack3IS', - 42, 'Attack3ISUp', - 43, 'Attack3ISDown', - 44, 'Attack4', - 45, 'Attack4Up', - 46, 'Attack4Down', - 47, 'Attack4IS', - 48, 'Attack4ISUp', - 49, 'Attack4ISDown', - 50, 'Attack5', - 51, 'Attack5Up', - 52, 'Attack5Down', - 53, 'Attack5IS', - 54, 'Attack5ISUp', - 55, 'Attack5ISDown', - 56, 'Attack6', - 57, 'Attack6Up', - 58, 'Attack6Down', - 59, 'Attack6IS', - 60, 'Attack6ISUp', - 61, 'Attack6ISDown', - 62, 'Attack7', - 63, 'Attack7Up', - 64, 'Attack7Down', - 65, 'Attack7IS', - 66, 'Attack7ISUp', - 67, 'Attack7ISDown', - 68, 'Attack8', - 69, 'Attack8Up', - 70, 'Attack8Down', - 71, 'Attack8IS', - 72, 'Attack8ISUp', - 73, 'Attack8ISDown', - 74, 'AttackLoop', - 75, 'AttackLoopUp', - 76, 'AttackLoopDown', - 77, 'AttackLoopIS', - 78, 'AttackLoopISUp', - 79, 'AttackLoopISDown', - 80, 'AttackSpin', - 81, 'AttackSpinUp', - 82, 'AttackSpinDown', - 83, 'AttackSpinIS', - 84, 'AttackSpinISUp', - 85, 'AttackSpinISDown', - 86, 'AttackSpin2', - 87, 'AttackSpin2Up', - 88, 'AttackSpin2Down', - 89, 'AttackSpin2IS', - 90, 'AttackSpin2ISUp', - 91, 'AttackSpin2ISDown', - 92, 'AttackPower', - 93, 'AttackForwardPower', - 94, 'AttackBackPower', - 95, 'AttackLeftPower', - 96, 'AttackRightPower', - 97, 'PlaceMine', - 98, 'PlaceMineUp', - 99, 'PlaceMineDown', - 100, 'PlaceMineIS', - 101, 'PlaceMineISUp', - 102, 'PlaceMineISDown', - 103, 'PlaceMine2', - 104, 'PlaceMine2Up', - 105, 'PlaceMine2Down', - 106, 'PlaceMine2IS', - 107, 'PlaceMine2ISUp', - 108, 'PlaceMine2ISDown', - 109, 'AttackThrow', - 110, 'AttackThrowUp', - 111, 'AttackThrowDown', - 112, 'AttackThrowIS', - 113, 'AttackThrowISUp', - 114, 'AttackThrowISDown', - 115, 'AttackThrow2', - 116, 'AttackThrow2Up', - 117, 'AttackThrow2Down', - 118, 'AttackThrow2IS', - 119, 'AttackThrow2ISUp', - 120, 'AttackThrow2ISDown', - 121, 'AttackThrow3', - 122, 'AttackThrow3Up', - 123, 'AttackThrow3Down', - 124, 'AttackThrow3IS', - 125, 'AttackThrow3ISUp', - 126, 'AttackThrow3ISDown', - 127, 'AttackThrow4', - 128, 'AttackThrow4Up', - 129, 'AttackThrow4Down', - 130, 'AttackThrow4IS', - 131, 'AttackThrow4ISUp', - 132, 'AttackThrow4ISDown', - 133, 'AttackThrow5', - 134, 'AttackThrow5Up', - 135, 'AttackThrow5Down', - 136, 'AttackThrow5IS', - 137, 'AttackThrow5ISUp', - 138, 'AttackThrow5ISDown', - - 167, 'PipBoy', - 178, 'PipBoyChild', - - 255, ' ANY' - ]); - - wbImpactMaterialTypeEnum := - wbEnum([ - 'Stone', - 'Dirt', - 'Grass', - 'Glass', - 'Metal', - 'Wood', - 'Organic', - 'Cloth', - 'Water', - 'Hollow Metal', - 'Organic Bug', - 'Organic Glow' - ]); - - wbTemplateFlags := wbFlags([ - 'Use Traits', - 'Use Stats', - 'Use Factions', - 'Use Actor Effect List', - 'Use AI Data', - 'Use AI Packages', - 'Use Model/Animation', - 'Use Base Data', - 'Use Inventory', - 'Use Script' - ]); - - wbRecord(CREA, 'Creature', [ - wbEDIDReq, - wbOBNDReq, - wbFULLActor, - wbMODLActor, - wbSPLOs, - wbFormIDCk(EITM, 'Unarmed Attack Effect', [ENCH, SPEL], False, cpNormal, False, wbActorTemplateUseActorEffectList), - wbInteger(EAMT, 'Unarmed Attack Animation', itU16, wbAttackAnimationEnum, cpNormal, True, False, wbActorTemplateUseActorEffectList), - wbArrayS(NIFZ, 'Model List', wbStringLC('Model'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbByteArray(NIFT, 'Texture Files Hashes', 0, cpIgnore, False, False, wbActorTemplateUseModelAnimation), - wbStruct(ACBS, 'Configuration', [ - {00} wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Biped', - {0x000002} 'Essential', - {0x000004} 'Weapon & Shield?', - {0x000008} 'Respawn', - {0x000010} 'Swims', - {0x000020} 'Flies', - {0x000040} 'Walks', - {0x000080} 'PC Level Mult', - {0x000100} 'Unknown 8', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} 'No Head', - {0x010000} 'No Right Arm', - {0x020000} 'No Left Arm', - {0x040000} 'No Combat in Water', - {0x080000} 'No Shadow', - {0x100000} 'No VATS Melee', - {0x00200000} 'Allow PC Dialogue', - {0x00400000} 'Can''t Open Doors', - {0x00800000} 'Immobile', - {0x01000000} 'Tilt Front/Back', - {0x02000000} 'Tilt Left/Right', - {0x03000000} 'No Knockdowns', - {0x08000000} 'Not Pushable', - {0x10000000} 'Allow Pickpocket', - {0x20000000} 'Is Ghost', - {0x40000000} 'No Rotating To Head-track', - {0x80000000} 'Invulnerable' - ], [ - {0x000001 Biped} wbActorTemplateUseModelAnimation, - {0x000002 Essential} wbActorTemplateUseBaseData, - {0x000004 Weapon & Shield} nil, - {0x000008 Respawn} wbActorTemplateUseBaseData, - {0x000010 Swims} wbActorTemplateUseModelAnimation, - {0x000020 Flies} wbActorTemplateUseModelAnimation, - {0x000040 Walks} wbActorTemplateUseModelAnimation, - {0x000080 PC Level Mult} wbActorTemplateUseStats, - {0x000100 Unknown 8} nil, - {0x000200 No Low Level Processing} wbActorTemplateUseBaseData, - {0x000400 } nil, - {0x000800 No Blood Spray} wbActorTemplateUseModelAnimation, - {0x001000 No Blood Decal} wbActorTemplateUseModelAnimation, - {0x002000 } nil, - {0x004000 } nil, - {0x008000 No Head} wbActorTemplateUseModelAnimation, - {0x010000 No Right Arm} wbActorTemplateUseModelAnimation, - {0x020000 No Left Arm} wbActorTemplateUseModelAnimation, - {0x040000 No Combat in Water} wbActorTemplateUseModelAnimation, - {0x080000 No Shadow} wbActorTemplateUseModelAnimation, - {0x100000 No VATS Melee} nil, - {0x00200000 Allow PC Dialogue} wbActorTemplateUseBaseData, - {0x00400000 Can''t Open Doors} wbActorTemplateUseBaseData, - {0x00800000 Immobile} wbActorTemplateUseModelAnimation, - {0x01000000 Tilt Front/Back} wbActorTemplateUseModelAnimation, - {0x02000000 Tilt Left/Right} wbActorTemplateUseModelAnimation, - {0x03000000 No Knockdowns} nil, - {0x08000000 Not Pushable} wbActorTemplateUseModelAnimation, - {0x10000000 Allow Pickpocket} wbActorTemplateUseBaseData, - {0x20000000 Is Ghost} nil, - {0x40000000 No Rotating To Head-track} wbActorTemplateUseModelAnimation, - {0x80000000 Invulnerable} nil - ])), - {04} wbInteger('Fatigue', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {06} wbInteger('Barter gold', itU16, nil, cpNormal, False, wbActorTemplateUseAIData), - {08} wbUnion('Level', wbCreaLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, False, wbActorTemplateUseStats) - ], cpNormal, False, wbActorTemplateUseStats), - {10} wbInteger('Calc min', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {12} wbInteger('Calc max', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {14} wbInteger('Speed Multiplier', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {16} wbFloat('Karma (Alignment)', cpNormal, False, 1, -1, wbActorTemplateUseTraits), - {20} wbInteger('Disposition Base', itS16, nil, cpNormal, False, wbActorTemplateUseTraits), - {22} wbInteger('Template Flags', itU16, wbTemplateFlags) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]), - cpNormal, False, nil, nil, wbActorTemplateUseFactions), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(TPLT, 'Template', [CREA, LVLC]), - wbDESTActor, - wbSCRIActor, - wbRArrayS('Items', wbCNTO, cpNormal, False, nil, nil, wbActorTemplateUseInventory), - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil, nil, wbActorTemplateUseAIPackages), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbStruct(DATA, '', [ - {00} wbInteger('Type', itU8, wbCreatureTypeEnum, cpNormal, False, wbActorTemplateUseTraits), - {01} wbInteger('Combat Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {02} wbInteger('Magic Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {03} wbInteger('Stealth Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {04} wbInteger('Health', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - {06} wbByteArray('Unused', 2), - {08} wbInteger('Damage', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - {10} wbArray('Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, False, wbActorTemplateUseStats) - ], cpNormal, True), - wbInteger(RNAM, 'Attack reach', itU8, nil, cpNormal, True, False, wbActorTemplateUseTraits), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(PNAM, 'Body Part Data', [BPTD], False, cpNormal, True, wbActorTemplateUseModelAnimation), - wbFloat(TNAM, 'Turning Speed', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbFloat(BNAM, 'Base Scale', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbFloat(WNAM, 'Foot Weight', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbInteger(NAM4, 'Impact Material Type', itU32, wbImpactMaterialTypeEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbInteger(NAM5, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbFormIDCk(CSCR, 'Inherits Sounds from', [CREA], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbCSDTs, - wbFormIDCk(CNAM, 'Impact Dataset', [IPDS], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbFormIDCk(LNAM, 'Melee Weapon List', [FLST], False, cpNormal, False, wbActorTemplateUseTraits) - ], True); - -end; - -procedure DefineFNVd; -begin - wbRecord(CSTY, 'Combat Style', [ - wbEDIDReq, - wbStruct(CSTD, 'Advanced - Standard', [ - {000}wbInteger('Maneuver Decision - Dodge % Chance', itU8), - {001}wbInteger('Maneuver Decision - Left/Right % Chance', itU8), - {002}wbByteArray('Unused', 2), - {004}wbFloat('Maneuver Decision - Dodge L/R Timer (min)'), - {008}wbFloat('Maneuver Decision - Dodge L/R Timer (max)'), - {012}wbFloat('Maneuver Decision - Dodge Forward Timer (min)'), - {016}wbFloat('Maneuver Decision - Dodge Forward Timer (max)'), - {020}wbFloat('Maneuver Decision - Dodge Back Timer Min'), - {024}wbFloat('Maneuver Decision - Dodge Back Timer Max'), - {028}wbFloat('Maneuver Decision - Idle Timer min'), - {032}wbFloat('Maneuver Decision - Idle Timer max'), - {036}wbInteger('Melee Decision - Block % Chance', itU8), - {037}wbInteger('Melee Decision - Attack % Chance', itU8), - {038}wbByteArray('Unused', 2), - {040}wbFloat('Melee Decision - Recoil/Stagger Bonus to Attack'), - {044}wbFloat('Melee Decision - Unconscious Bonus to Attack'), - {048}wbFloat('Melee Decision - Hand-To-Hand Bonus to Attack'), - {052}wbInteger('Melee Decision - Power Attacks - Power Attack % Chance', itU8), - {053}wbByteArray('Unused', 3), - {056}wbFloat('Melee Decision - Power Attacks - Recoil/Stagger Bonus to Power'), - {060}wbFloat('Melee Decision - Power Attacks - Unconscious Bonus to Power Attack'), - {064}wbInteger('Melee Decision - Power Attacks - Normal', itU8), - {065}wbInteger('Melee Decision - Power Attacks - Forward', itU8), - {066}wbInteger('Melee Decision - Power Attacks - Back', itU8), - {067}wbInteger('Melee Decision - Power Attacks - Left', itU8), - {068}wbInteger('Melee Decision - Power Attacks - Right', itU8), - {069}wbByteArray('Unused', 3), - {072}wbFloat('Melee Decision - Hold Timer (min)'), - {076}wbFloat('Melee Decision - Hold Timer (max)'), - {080}wbInteger('Flags', itU16, wbFlags([ - 'Choose Attack using % Chance', - 'Melee Alert OK', - 'Flee Based on Personal Survival', - '', - 'Ignore Threats', - 'Ignore Damaging Self', - 'Ignore Damaging Group', - 'Ignore Damaging Spectators', - 'Cannot Use Stealthboy' - ])), - {082}wbByteArray('Unused', 2), - {085}wbInteger('Maneuver Decision - Acrobatic Dodge % Chance', itU8), - {085}wbInteger('Melee Decision - Power Attacks - Rushing Attack % Chance', itU8), - {086}wbByteArray('Unused', 2), - {088}wbFloat('Melee Decision - Power Attacks - Rushing Attack Distance Mult') - ], cpNormal, True), - wbStruct(CSAD, 'Advanced - Advanced', [ - wbFloat('Dodge Fatigue Mod Mult'), - wbFloat('Dodge Fatigue Mod Base'), - wbFloat('Encumb. Speed Mod Base'), - wbFloat('Encumb. Speed Mod Mult'), - wbFloat('Dodge While Under Attack Mult'), - wbFloat('Dodge Not Under Attack Mult'), - wbFloat('Dodge Back While Under Attack Mult'), - wbFloat('Dodge Back Not Under Attack Mult'), - wbFloat('Dodge Forward While Attacking Mult'), - wbFloat('Dodge Forward Not Attacking Mult'), - wbFloat('Block Skill Modifier Mult'), - wbFloat('Block Skill Modifier Base'), - wbFloat('Block While Under Attack Mult'), - wbFloat('Block Not Under Attack Mult'), - wbFloat('Attack Skill Modifier Mult'), - wbFloat('Attack Skill Modifier Base'), - wbFloat('Attack While Under Attack Mult'), - wbFloat('Attack Not Under Attack Mult'), - wbFloat('Attack During Block Mult'), - wbFloat('Power Att. Fatigue Mod Base'), - wbFloat('Power Att. Fatigue Mod Mult') - ], cpNormal, True), - wbStruct(CSSD, 'Simple', [ - {00} wbFloat('Cover Search Radius'), - {04} wbFloat('Take Cover Chance'), - {08} wbFloat('Wait Timer (min)'), - {12} wbFloat('Wait Timer (max)'), - {16} wbFloat('Wait to Fire Timer (min)'), - {20} wbFloat('Wait to Fire Timer (max)'), - {24} wbFloat('Fire Timer (min)'), - {28} wbFloat('Fire Timer (max)'), - {32} wbFloat('Ranged Weapon Range Mult (min)'), - {36} wbByteArray('Unused', 4), - {40} wbInteger('Weapon Restrictions', itU32, wbEnum([ - 'None', - 'Melee Only', - 'Ranged Only' - ])), - {44} wbFloat('Ranged Weapon Range Mult (max)'), - {48} wbFloat('Max Targeting FOV'), - {52} wbFloat('Combat Radius'), - {56} wbFloat('Semi-Auto Firing Delay Mult (min)'), - {60} wbFloat('Semi-Auto Firing Delay Mult (max)') - ], cpNormal, True) - ]); - - wbRecord(DIAL, 'Dialog Topic', [ - wbEDIDReq, - wbRArrayS('Added Quests', wbRStructSK([0], 'Added Quest', [ - wbFormIDCkNoReach(QSTI, 'Quest', [QUST], False, cpBenign), - wbRArray('Shared Infos', wbRStruct('Shared Info', [ - wbFormIDCk(INFC, 'Info Connection', [INFO], False, cpBenign), - wbInteger(INFX, 'Info Index', itS32, nil, cpBenign) - ], [])) - ], [])), - // no QSTR in FNV, but keep it just in case - wbRArrayS('Removed Quests', wbRStructSK([0], 'Removed Quest', [ - wbFormIDCkNoReach(QSTR, 'Quest', [QUST], False, cpBenign) - ], [])), - // some records have INFC INFX (with absent formids) but no QSTI, probably error in GECK - // i.e. [DIAL:001287C6] and [DIAL:000E9084] - wbRArray('Unused', wbRStruct('Unused', [ - wbUnknown(INFC, cpIgnore), - wbUnknown(INFX, cpIgnore) - ], []), cpIgnore, False, nil, nil, wbNeverShow), - wbFULL, - wbFloat(PNAM, 'Priority', cpNormal, True, 1, -1, nil, nil, 50.0), - wbString(TDUM, 'Dumb Response'), - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous', - {7} 'Radio' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Rumors', - 'Top-level' - ])) - ], cpNormal, True, nil, 1) - ], True); - - wbRecord(DOOR, 'Door', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Sound - Open', [SOUN]), - wbFormIDCk(ANAM, 'Sound - Close', [SOUN]), - wbFormIDCk(BNAM, 'Sound - Looping', [SOUN]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - '', - 'Automatic Door', - 'Hidden', - 'Minimal Use', - 'Sliding Door' - ]), cpNormal, True) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - 'Normal', - 'Greater Than', - '', - 'Greater Than or Equal Than', - 'Always Show' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbString(NAM7, 'Holes Texture'), - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0} 'No Membrane Shader', - {1} '', - {2} '', - {3} 'No Particle Shader', - {4} 'Edge Effect - Inverse', - {5} 'Membrane Shader - Affect Skin Only' - ])), - wbByteArray('Unused', 3), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbStruct('Fill/Texture Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbStruct('Edge Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pusle Frequence'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Birth Ratio'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbStruct('Color Key 1 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 2 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 3 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time'), - wbFloat('Particle Shader - Initial Speed Along Normal +/-'), - wbFloat('Particle Shader - Initial Rotation (deg)'), - wbFloat('Particle Shader - Initial Rotation (deg) +/-'), - wbFloat('Particle Shader - Rotation Speed (deg/sec)'), - wbFloat('Particle Shader - Rotation Speed (deg/sec) +/-'), - wbFormIDCk('Addon Models', [DEBR, NULL]), - wbFloat('Holes - Start Time'), - wbFloat('Holes - End Time'), - wbFloat('Holes - Start Val'), - wbFloat('Holes - End Val'), - wbFloat('Edge Width (alpha units)'), - wbStruct('Edge Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Explosion Wind Speed'), - wbInteger('Texture Count U', itU32), - wbInteger('Texture Count V', itU32), - wbFloat('Addon Models - Fade In Time'), - wbFloat('Addon Models - Fade Out Time'), - wbFloat('Addon Models - Scale Start'), - wbFloat('Addon Models - Scale End'), - wbFloat('Addon Models - Scale In Time'), - wbFloat('Addon Models - Scale Out Time') - ], cpNormal, True, nil, 57) - ], False, nil, cpNormal, False, wbEFSHAfterLoad); - - wbRecord(ENCH, 'Object Effect', [ - wbEDIDReq, - wbFULL, - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Type', itU32, wbEnum([ - {0} '', - {1} '', - {2} 'Weapon', - {3} 'Apparel' - ])), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbInteger('Flags', itU8, wbFlags([ - 'No Auto-Calc', - 'Auto Calculate', - 'Hide Effect' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(EYES, 'Eyes', [ - wbEDIDReq, - wbFULLReq, - wbString(ICON, 'Texture', 0{, cpNormal, True??}), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female' - ]), cpNormal, True) - ]); - - wbXNAM := - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCkNoReach('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32), - wbInteger('Group Combat Reaction', itU32, wbEnum([ - 'Neutral', - 'Enemy', - 'Ally', - 'Friend' - ])) - ]); - - wbXNAMs := wbRArrayS('Relations', wbXNAM); - - wbRecord(FACT, 'Faction', [ - wbEDIDReq, - wbFULL, - wbXNAMs, - wbStruct(DATA, '', [ - wbInteger('Flags 1', itU8, wbFlags([ - 'Hidden from PC', - 'Evil', - 'Special Combat' - ])), - wbInteger('Flags 2', itU8, wbFlags([ - 'Track Crime', - 'Allow Sell' - ])), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 1), - wbFloat(CNAM, 'Unused'), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itS32), - wbString(MNAM, 'Male', 0, cpTranslate), - wbString(FNAM, 'Female', 0, cpTranslate), - wbString(INAM, 'Insignia (Unused)') - ], []), - wbFormIDCk(WMI1, 'Reputation', [REPU]) - ], False, nil, cpNormal, False, wbFACTAfterLoad); - - wbRecord(FURN, 'Furniture', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbByteArray(MNAM, 'Marker Flags', 0, cpNormal, True) - ]); - - wbRecord(GLOB, 'Global', [ - wbEDIDReq, - wbInteger(FNAM, 'Type', itU8, wbGLOBFNAM, nil, cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - - wbRecord(GMST, 'Game Setting', [ - wbString(EDID, 'Editor ID', 0, cpCritical, True, nil, wbGMSTEDIDAfterSet), - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbString('', 0, cpTranslate), - wbInteger('', itS32), - wbFloat('') - ], cpNormal, True) - ]); - - wbDODT := wbStruct(DODT, 'Decal Data', [ - wbFloat('Min Width'), - wbFloat('Max Width'), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Depth'), - wbFloat('Shininess'), - wbStruct('Parallax', [ - wbFloat('Scale'), - wbInteger('Passes', itU8) - ]), - wbInteger('Flags', itU8, wbFlags([ - 'Parallax', - 'Alpha - Blending', - 'Alpha - Testing' - ], True)), - wbByteArray('Unused', 2), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]); - - wbRecord(TXST, 'Texture Set', [ - wbEDIDReq, - wbOBNDReq, - wbRStruct('Textures (RGB/A)', [ - wbString(TX00,'Base Image / Transparency'), - wbString(TX01,'Normal Map / Specular'), - wbString(TX02,'Environment Map Mask / ?'), - wbString(TX03,'Glow Map / Unused'), - wbString(TX04,'Parallax Map / Unused'), - wbString(TX05,'Environment Map / Unused') - ], []), - wbDODT, - wbInteger(DNAM, 'Flags', itU16, wbFlags([ - 'No Specular Map' - ]), cpNormal, True) - ]); - - wbRecord(MICN, 'Menu Icon', [ - wbEDIDReq, - wbICONReq - ]); - - wbRecord(HDPT, 'Head Part', [ - wbEDIDReq, - wbFULLReq, - wbMODL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable' - ]), cpNormal, True), - wbRArrayS('Extra Parts', - wbFormIDCk(HNAM, 'Part', [HDPT]) - ) - ]); - - wbRecord(ASPC, 'Acoustic Space', [ - wbEDIDReq, - wbOBNDReq, - - wbFormIDCk(SNAM, 'Dawn / Default Loop', [NULL, SOUN], False, cpNormal, True), - wbFormIDCk(SNAM, 'Afternoon', [NULL, SOUN], False, cpNormal, True), - wbFormIDCk(SNAM, 'Dusk', [NULL, SOUN], False, cpNormal, True), - wbFormIDCk(SNAM, 'Night', [NULL, SOUN], False, cpNormal, True), - wbFormIDCk(SNAM, 'Walla', [NULL, SOUN], False, cpNormal, True), - - wbInteger(WNAM, 'Walla Trigger Count', itU32, nil, cpNormal, True), - wbFormIDCk(RDAT, 'Use Sound from Region (Interiors Only)', [REGN]), - wbInteger(ANAM, 'Environment Type', itU32, wbEnum([ - 'None', - 'Default', - 'Generic', - 'Padded Cell', - 'Room', - 'Bathroom', - 'Livingroom', - 'Stone Room', - 'Auditorium', - 'Concerthall', - 'Cave', - 'Arena', - 'Hangar', - 'Carpeted Hallway', - 'Hallway', - 'Stone Corridor', - 'Alley', - 'Forest', - 'City', - 'Mountains', - 'Quarry', - 'Plain', - 'Parkinglot', - 'Sewerpipe', - 'Underwater', - 'Small Room', - 'Medium Room', - 'Large Room', - 'Medium Hall', - 'Large Hall', - 'Plate' - ]), cpNormal, True), - wbInteger(INAM, 'Is Interior', itU32, wbEnum(['No', 'Yes']), cpNormal, True) - ]); - - wbRecord(TACT, 'Talking Activator', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Looping Sound', [SOUN]), - wbFormIDCk(VNAM, 'Voice Type', [VTYP]), - wbFormIDCk(INAM, 'Radio Template', [SOUN]) - ]); - - wbRecord(SCPT, 'Script', [ - wbEDIDReq, - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Script'), - wbStringScript(SCTX, 'Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ]); - - wbRecord(TERM, 'Terminal', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbDEST, - wbDESCReq, - wbFormIDCk(SNAM, 'Sound - Looping', [SOUN]), - wbFormIDCk(PNAM, 'Password Note', [NOTE]), - wbStruct(DNAM, '', [ - wbInteger('Base Hacking Difficulty', itU8, wbEnum([ - 'Very Easy', - 'Easy', - 'Average', - 'Hard', - 'Very Hard', - 'Requires Key' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Leveled', - 'Unlocked', - 'Alternate Colors', - 'Hide Welcome Text when displaying Image' - ])), - wbInteger('ServerType', itU8, wbEnum([ - '-Server 1-', - '-Server 2-', - '-Server 3-', - '-Server 4-', - '-Server 5-', - '-Server 6-', - '-Server 7-', - '-Server 8-', - '-Server 9-', - '-Server 10-' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRArray('Menu Items', - wbRStruct('Menu Item', [ - wbString(ITXT, 'Item Text'), - wbString(RNAM, 'Result Text', 0, cpNormal, True), - wbInteger(ANAM, 'Flags', itU8, wbFlags([ - 'Add Note', - 'Force Redraw' - ]), cpNormal, True), - wbFormIDCk(INAM, 'Display Note', [NOTE]), - wbFormIDCk(TNAM, 'Sub Menu', [TERM]), - wbEmbeddedScriptReq, - wbCTDAs - ], []) - ) - ]); - - wbRecord(SCOL, 'Static Collection', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbRStructsSK('Parts', 'Part', [0], [ - wbFormIDCk(ONAM, 'Static', [STAT]), - wbArrayS(DATA, 'Placements', wbStruct('Placement', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]), - wbFloat('Scale') - ]), 0, cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(MSTT, 'Moveable Static', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbDEST, - wbByteArray(DATA, 'Unknown', 1, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ]); - - wbRecord(PWAT, 'Placeable Water', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbStruct(DNAM, '', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Reflects', - {0x00000002}'Reflects - Actors', - {0x00000004}'Reflects - Land', - {0x00000008}'Reflects - LOD Land', - {0x00000010}'Reflects - LOD Buildings', - {0x00000020}'Reflects - Trees', - {0x00000040}'Reflects - Sky', - {0x00000080}'Reflects - Dynamic Objects', - {0x00000100}'Reflects - Dead Bodies', - {0x00000200}'Refracts', - {0x00000400}'Refracts - Actors', - {0x00000800}'Refracts - Land', - {0x00001000}'', - {0x00002000}'', - {0x00004000}'', - {0x00008000}'', - {0x00010000}'Refracts - Dynamic Objects', - {0x00020000}'Refracts - Dead Bodies', - {0x00040000}'Silhouette Reflections', - {0x00080000}'', - {0x00100000}'', - {0x00200000}'', - {0x00400000}'', - {0x00800000}'', - {0x01000000}'', - {0x02000000}'', - {0x03000000}'', - {0x08000000}'', - {0x10000000}'Depth', - {0x20000000}'Object Texture Coordinates', - {0x40000000}'', - {0x80000000}'No Underwater Fog' - ])), - wbFormIDCk('Water', [WATR]) - ], cpNormal, True) - ]); - - wbRecord(IDLM, 'Idle Marker', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - '', - 'Do Once' - ]), cpNormal, True), - wbStruct(IDLC, '', [ - wbInteger('Animation Count', itU8), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE, NULL]), 0, nil, wbIDLAsAfterSet, cpNormal, True) // NULL looks valid if IDLS\Animation Count is 0 - ], False, nil, cpNormal, False, nil, wbAnimationsAfterSet); - - wbRecord(NOTE, 'Note', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbYNAM, - wbZNAM, - wbInteger(DATA, 'Type', itU8, wbEnum([ - 'Sound', - 'Text', - 'Image', - 'Voice' - ]), cpNormal, True), - wbRArrayS('Quests', - wbFormIDCkNoReach(ONAM, 'Quest', [QUST]) - ), - wbString(XNAM, 'Texture'), - wbUnion(TNAM, 'Text / Topic', wbNOTETNAMDecide, [ - wbString('Text'), - wbFormIDCk('Topic', [DIAL]) - ]), - wbUnion(SNAM, 'Sound / NPC', wbNOTESNAMDecide, [ - wbFormIDCk('Sound', [SOUN]), - wbFormIDCk('Actor', [NPC_, CREA]) - ]) - ]); - -end; - -procedure DefineFNVe; -begin - wbRecord(PROJ, 'Projectile', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbDEST, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Flags', itU16, wbFlags([ - 'Hitscan', - 'Explosion', - 'Alt. Trigger', - 'Muzzle Flash', - '', - 'Can Be Disabled', - 'Can Be Picked Up', - 'Supersonic', - 'Pins Limbs', - 'Pass Through Small Transparent', - 'Detonates', - 'Rotation' - ])), - {02} wbInteger('Type', itU16, wbEnum([ - {00} '', - {01} 'Missile', - {02} 'Lobber', - {03} '', - {04} 'Beam', - {05} '', - {06} '', - {07} '', - {08} 'Flame', - {09} '', - {10} '', - {11} '', - {12} '', - {13} '', - {14} '', - {15} '', - {16} 'Continuous Beam' - ])), - {04} wbFloat('Gravity'), - {08} wbFloat('Speed'), - {12} wbFloat('Range'), - {16} wbFormIDCk('Light', [LIGH, NULL]), - {20} wbFormIDCk('Muzzle Flash - Light', [LIGH, NULL]), - {24} wbFloat('Tracer Chance'), - {28} wbFloat('Explosion - Alt. Trigger - Proximity'), - {32} wbFloat('Explosion - Alt. Trigger - Timer'), - {36} wbFormIDCk('Explosion', [EXPL, NULL]), - {40} wbFormIDCk('Sound', [SOUN, NULL]), - {44} wbFloat('Muzzle Flash - Duration'), - {48} wbFloat('Fade Duration'), - {52} wbFloat('Impact Force'), - {56} wbFormIDCk('Sound - Countdown', [SOUN, NULL]), - {60} wbFormIDCk('Sound - Disable', [SOUN, NULL]), - {64} wbFormIDCk('Default Weapon Source', [WEAP, NULL]), - {68} wbStruct('Rotation', [ - {68} wbFloat('X'), - {72} wbFloat('Y'), - {76} wbFloat('Z') - ]), - {80} wbFloat('Bouncy Mult') - ], cpNormal, True), - wbRStructSK([0], 'Muzzle Flash Model', [ - wbString(NAM1, 'Model Filename'), - wbByteArray(NAM2, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, True), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ]); - - wbRecord(NAVI, 'Navigation Mesh Info Map', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbRArray('Navigation Map Infos', - wbStruct(NVMI, 'Navigation Map Info', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Navigation Mesh', [NAVM]), - wbFormIDCk('Location', [CELL, WRLD]), - wbStruct('Grid', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbUnknown -{ wbUnion('Data', wbNAVINVMIDecider, [ - wbStruct('Data', [ - wbUnknown - ]), - wbStruct('Data', [ - wbArray('Unknown', wbFloat('Unknown'), 3), - wbByteArray('Unknown', 4) - ]), - wbStruct('Data', [ - wbArray('Unknown', wbArray('Unknown', wbFloat('Unknown'), 3), 3), - wbInteger('Count 1', itU16), - wbInteger('Count 2', itU16), - wbArray('Unknown', wbArray('Unknown', wbFloat('Unknown'), 3), [], wbNAVINAVMGetCount1), - wbUnknown - ]), - wbStruct('Data', [ - wbUnknown - ]) - ])} - ]) - ), - wbRArray('Unknown', - wbStruct(NVCI, 'Unknown', [ - wbFormIDCk('Unknown', [NAVM]), - wbArray('Unknown', wbFormIDCk('Unknown', [NAVM]), -1), - wbArray('Unknown', wbFormIDCk('Unknown', [NAVM]), -1), - wbArray('Doors', wbFormIDCk('Door', [REFR]), -1) - ]) - ) - ]); - - if wbSimpleRecords then begin - - wbRecord(NAVM, 'Navigation Mesh', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbStruct(DATA, '', [ - wbFormIDCk('Cell', [CELL]), - wbInteger('Vertex Count', itU32), - wbInteger('Triangle Count', itU32), - wbInteger('External Connections Count', itU32), - wbInteger('NVCA Count', itU32), - wbInteger('Doors Count', itU32) - ]), - wbByteArray(NVVX, 'Vertices'), - wbByteArray(NVTR, 'Triangles'), - wbByteArray(NVCA, 'Unknown'), - wbArray(NVDP, 'Doors', wbStruct('Door', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Triangle', itU16), - wbByteArray('Unused', 2) - ])), - wbByteArray(NVGD, 'Unknown'), - wbArray(NVEX, 'External Connections', wbStruct('Connection', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Navigation Mesh', [NAVM], False, cpNormal), - wbInteger('Triangle', itU16, nil, cpNormal) - ])) - ], False, wbNAVMAddInfo); - - end else begin - - wbRecord(NAVM, 'Navigation Mesh', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbStruct(DATA, '', [ - wbFormIDCk('Cell', [CELL]), - wbInteger('Vertex Count', itU32), - wbInteger('Triangle Count', itU32), - wbInteger('External Connections Count', itU32), - wbInteger('NVCA Count', itU32), - wbInteger('Doors Count', itU32) // as of version = 5 (earliest NavMesh version I saw (Fallout3 1.7) is already 11) - ]), - wbArray(NVVX, 'Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ])), - wbArray(NVTR, 'Triangles', wbStruct('Triangle', [ - wbArray('Vertices', wbInteger('Vertex', itS16), 3), - wbArray('Edges', wbInteger('Triangle', itS16, wbNVTREdgeToStr, wbNVTREdgeToInt), [ - '0 <-> 1', - '1 <-> 2', - '2 <-> 0' - ]), - wbInteger('Flags', itU32, wbFlags([ - 'Triangle #0 Is External', - 'Triangle #1 Is External', - 'Triangle #2 Is External', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Preferred pathing', - 'Unknown 8', - 'Unknown 9', - 'Water', - 'Contains door', - 'Unknown 12', - 'Unknown 13', // Cleared on LoadForm - 'Unknown 14', // Cleared on LoadForm - 'Unknown 15', // Cleared on LoadForm - 'Unknown 16', - 'Unknown 17', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Unknown 21', - 'Unknown 22', - 'Unknown 23', - 'Unknown 24', - 'Unknown 25', - 'Unknown 26', - 'Unknown 27', - 'Unknown 28', - 'Unknown 29', - 'Unknown 30', - 'Unknown 31', - 'Unknown 32' - ])) - ])), - wbArray(NVCA, 'Unknown', wbInteger('Triangle', itS16)), // Assumed triangle as the value fits the triangle id's - wbArray(NVDP, 'Doors', wbStruct('Door', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Triangle', itU16), - wbByteArray('Unused', 2) - ])), - wbStruct(NVGD, 'NavMesh Grid', [ - wbInteger('NavMeshGrid Divisor', itU32), - wbFloat('Max X Distance'), // Floats named after TES5 definition - wbFloat('Max Y Distance'), - wbFloat('Min X'), - wbFloat('Min Y'), - wbFloat('Min Z'), - wbFloat('Max X'), - wbFloat('Max Y'), - wbFloat('Max Z'), - wbArray('Cells', wbArray('Cell', wbInteger('Triangle', itS16), -2)) // Divisor is row count , assumed triangle as the values fit the triangle id's - ]), - wbArray(NVEX, 'External Connections', wbStruct('Connection', [ - wbByteArray('Unknown', 4), // absent in ver<9, not endian swap in ver>=9, so char or byte array - wbFormIDCk('Navigation Mesh', [NAVM, NULL], False, cpNormal), // NULL values are ignored silently. - wbInteger('Triangle', itU16, nil, cpNormal) - ])) // Different if ver<5: Length = $2E/$30 and contains other data between NavMesh and Triangle - ], False, wbNAVMAddInfo); - - end; - - wbRecord(PGRE, 'Placed Grenade', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(PMIS, 'Placed Missile', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(PBEA, 'Placed Beam', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(EXPL, 'Explosion', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbEITM, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]), - wbStruct(DATA, 'Data', [ - {00} wbFloat('Force'), - {04} wbFloat('Damage'), - {08} wbFloat('Radius'), - {12} wbFormIDCk('Light', [LIGH, NULL]), - {16} wbFormIDCk('Sound 1', [SOUN, NULL]), - {20} wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Unknown 1', - {0x00000002}'Always Uses World Orientation', - {0x00000004}'Knock Down - Always', - {0x00000008}'Knock Down - By Formula', - {0x00000010}'Ignore LOS Check', - {0x00000020}'Push Explosion Source Ref Only', - {0x00000040}'Ignore Image Space Swap' - ])), - {24} wbFloat('IS Radius'), - {28} wbFormIDCk('Impact DataSet', [IPDS, NULL]), - {32} wbFormIDCk('Sound 2', [SOUN, NULL]), - wbStruct('Radiation', [ - {36} wbFloat('Level'), - {40} wbFloat('Dissipation Time'), - {44} wbFloat('Radius') - ]), - {48} wbInteger('Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ], cpNormal, True), - wbFormIDCk(INAM, 'Placed Impact Object', [TREE, SOUN, ACTI, DOOR, STAT, FURN, - CONT, ARMO, AMMO, LVLN, LVLC, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, - ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, TXST, CHIP, CMNY, - CCRD, IMOD]) - ]); - - wbRecord(DEBR, 'Debris', [ - wbEDIDReq, - wbRStructs('Models', 'Model', [ - wbStruct(DATA, 'Data', [ - wbInteger('Percentage', itU8), - wbString('Model Filename'), - wbInteger('Flags', itU8, wbFlags([ - 'Has Collission Data' - ])) - ], cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, True) - ]); - - wbRecord(IMGS, 'Image Space', [ - wbEDIDReq, - wbStruct(DNAM, '', [ - wbStruct('HDR', [ - {00} wbFloat('Eye Adapt Speed'), - {04} wbFloat('Blur Radius'), - {08} wbFloat('Blur Passes'), - {12} wbFloat('Emissive Mult'), - {16} wbFloat('Target LUM'), - {20} wbFloat('Upper LUM Clamp'), - {24} wbFloat('Bright Scale'), - {28} wbFloat('Bright Clamp'), - {32} wbFloat('LUM Ramp No Tex'), - {36} wbFloat('LUM Ramp Min'), - {40} wbFloat('LUM Ramp Max'), - {44} wbFloat('Sunlight Dimmer'), - {48} wbFloat('Grass Dimmer'), - {52} wbFloat('Tree Dimmer'), - {56} wbUnion('Skin Dimmer', wbIMGSSkinDimmerDecider, [ - wbFloat('Skin Dimmer'), - wbEmpty('Skin Dimmer', cpIgnore) - ]) - ], cpNormal, False, nil, 14), - wbStruct('Bloom', [ - {60} wbFloat('Blur Radius'), - {64} wbFloat('Alpha Mult Interior'), - {68} wbFloat('Alpha Mult Exterior') - ]), - wbStruct('Get Hit', [ - {72} wbFloat('Blur Radius'), - {76} wbFloat('Blur Damping Constant'), - {80} wbFloat('Damping Constant') - ]), - wbStruct('Night Eye', [ - wbStruct('Tint Color', [ - {84} wbFloat('Red', cpNormal, False, 255, 0), - {88} wbFloat('Green', cpNormal, False, 255, 0), - {92} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - {96} wbFloat('Brightness') - ]), - wbStruct('Cinematic', [ - {100} wbFloat('Saturation'), - wbStruct('Contrast', [ - {104} wbFloat('Avg Lum Value'), - {108} wbFloat('Value') - ]), - {112} wbFloat('Cinematic - Brightness - Value'), - wbStruct('Tint', [ - wbStruct('Color', [ - {116} wbFloat('Red', cpNormal, False, 255, 0), - {120} wbFloat('Green', cpNormal, False, 255, 0), - {124} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - {128} wbFloat('Value') - ]) - ]), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbInteger('Flags', itU8, wbFlags([ - 'Saturation', - 'Contrast', - 'Tint', - 'Brightness' - ], True)), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 5) - ]); - - wbTimeInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Value') - ]); - - wbColorInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Red', cpNormal, False, 255, 0), - wbFloat('Green', cpNormal, False, 255, 0), - wbFloat('Blue', cpNormal, False, 255, 0), - wbFloat('Alpha', cpNormal, False, 255, 0) - ]); - - wbRecord(IMAD, 'Image Space Adapter', [ - wbEDID, - wbStruct(DNAM, 'Data Count', [ - wbInteger('Flags', itU32, wbFlags(['Animatable'])), - wbFloat('Duration'), - wbStruct('HDR', [ - wbInteger('Eye Adapt Speed Mult', itU32), - wbInteger('Eye Adapt Speed Add', itU32), - wbInteger('Bloom Blur Radius Mult', itU32), - wbInteger('Bloom Blur Radius Add', itU32), - wbInteger('Bloom Threshold Mult', itU32), - wbInteger('Bloom Threshold Add', itU32), - wbInteger('Bloom Scale Mult', itU32), - wbInteger('Bloom Scale Add', itU32), - wbInteger('Target Lum Min Mult', itU32), - wbInteger('Target Lum Min Add', itU32), - wbInteger('Target Lum Max Mult', itU32), - wbInteger('Target Lum Max Add', itU32), - wbInteger('Sunlight Scale Mult', itU32), - wbInteger('Sunlight Scale Add', itU32), - wbInteger('Sky Scale Mult', itU32), - wbInteger('Sky Scale Add', itU32) - ]), - wbInteger('Unknown08 Mult', itU32), - wbInteger('Unknown48 Add', itU32), - wbInteger('Unknown09 Mult', itU32), - wbInteger('Unknown49 Add', itU32), - wbInteger('Unknown0A Mult', itU32), - wbInteger('Unknown4A Add', itU32), - wbInteger('Unknown0B Mult', itU32), - wbInteger('Unknown4B Add', itU32), - wbInteger('Unknown0C Mult', itU32), - wbInteger('Unknown4C Add', itU32), - wbInteger('Unknown0D Mult', itU32), - wbInteger('Unknown4D Add', itU32), - wbInteger('Unknown0E Mult', itU32), - wbInteger('Unknown4E Add', itU32), - wbInteger('Unknown0F Mult', itU32), - wbInteger('Unknown4F Add', itU32), - wbInteger('Unknown10 Mult', itU32), - wbInteger('Unknown50 Add', itU32), - wbStruct('Cinematic', [ - wbInteger('Saturation Mult', itU32), - wbInteger('Saturation Add', itU32), - wbInteger('Brightness Mult', itU32), - wbInteger('Brightness Add', itU32), - wbInteger('Contrast Mult', itU32), - wbInteger('Contrast Add', itU32) - ]), - wbInteger('Unknown14 Mult', itU32), - wbInteger('Unknown54 Add', itU32), - wbInteger('Tint Color', itU32), - wbInteger('Blur Radius', itU32), - wbInteger('Double Vision Strength', itU32), - wbInteger('Radial Blur Strength', itU32), - wbInteger('Radial Blur Ramp Up', itU32), - wbInteger('Radial Blur Start', itU32), - wbInteger('Radial Blur Flags', itU32, wbFlags(['Use Target'])), - wbFloat('Radial Blur Center X'), - wbFloat('Radial Blur Center Y'), - wbInteger('DoF Strength', itU32), - wbInteger('DoF Distance', itU32), - wbInteger('DoF Range', itU32), - wbInteger('DoF Flags', itU32, wbFlags(['Use Target'])), - wbInteger('Radial Blur Ramp Down', itU32), - wbInteger('Radial Blur Down Start', itU32), - wbInteger('Fade Color', itU32), - wbInteger('Motion Blur Strength', itU32) - ], cpNormal, True, nil, 26), - wbArray(BNAM, 'Blur Radius', wbTimeInterpolator), - wbArray(VNAM, 'Double Vision Strength', wbTimeInterpolator), - wbArray(TNAM, 'Tint Color', wbColorInterpolator), - wbArray(NAM3, 'Fade Color', wbColorInterpolator), - wbArray(RNAM, 'Radial Blur Strength', wbTimeInterpolator), - wbArray(SNAM, 'Radial Blur Ramp Up', wbTimeInterpolator), - wbArray(UNAM, 'Radial Blur Start', wbTimeInterpolator), - wbArray(NAM1, 'Radial Blur Ramp Down', wbTimeInterpolator), - wbArray(NAM2, 'Radial Blur Down Start', wbTimeInterpolator), - wbArray(WNAM, 'DoF Strength', wbTimeInterpolator), - wbArray(XNAM, 'DoF Distance', wbTimeInterpolator), - wbArray(YNAM, 'DoF Range', wbTimeInterpolator), - wbArray(NAM4, 'Motion Blur Strength', wbTimeInterpolator), - wbRStruct('HDR', [ - wbArray(_00_IAD, 'Eye Adapt Speed Mult', wbTimeInterpolator), - wbArray(_40_IAD, 'Eye Adapt Speed Add', wbTimeInterpolator), - wbArray(_01_IAD, 'Bloom Blur Radius Mult', wbTimeInterpolator), - wbArray(_41_IAD, 'Bloom Blur Radius Add', wbTimeInterpolator), - wbArray(_02_IAD, 'Bloom Threshold Mult', wbTimeInterpolator), - wbArray(_42_IAD, 'Bloom Threshold Add', wbTimeInterpolator), - wbArray(_03_IAD, 'Bloom Scale Mult', wbTimeInterpolator), - wbArray(_43_IAD, 'Bloom Scale Add', wbTimeInterpolator), - wbArray(_04_IAD, 'Target Lum Min Mult', wbTimeInterpolator), - wbArray(_44_IAD, 'Target Lum Min Add', wbTimeInterpolator), - wbArray(_05_IAD, 'Target Lum Max Mult', wbTimeInterpolator), - wbArray(_45_IAD, 'Target Lum Max Add', wbTimeInterpolator), - wbArray(_06_IAD, 'Sunlight Scale Mult', wbTimeInterpolator), - wbArray(_46_IAD, 'Sunlight Scale Add', wbTimeInterpolator), - wbArray(_07_IAD, 'Sky Scale Mult', wbTimeInterpolator), - wbArray(_47_IAD, 'Sky Scale Add', wbTimeInterpolator) - ], []), - wbUnknown(_08_IAD), - wbUnknown(_48_IAD), - wbUnknown(_09_IAD), - wbUnknown(_49_IAD), - wbUnknown(_0A_IAD), - wbUnknown(_4A_IAD), - wbUnknown(_0B_IAD), - wbUnknown(_4B_IAD), - wbUnknown(_0C_IAD), - wbUnknown(_4C_IAD), - wbUnknown(_0D_IAD), - wbUnknown(_4D_IAD), - wbUnknown(_0E_IAD), - wbUnknown(_4E_IAD), - wbUnknown(_0F_IAD), - wbUnknown(_4F_IAD), - wbUnknown(_10_IAD), - wbUnknown(_50_IAD), - wbRStruct('Cinematic', [ - wbArray(_11_IAD, 'Saturation Mult', wbTimeInterpolator), - wbArray(_51_IAD, 'Saturation Add', wbTimeInterpolator), - wbArray(_12_IAD, 'Brightness Mult', wbTimeInterpolator), - wbArray(_52_IAD, 'Brightness Add', wbTimeInterpolator), - wbArray(_13_IAD, 'Contrast Mult', wbTimeInterpolator), - wbArray(_53_IAD, 'Contrast Add', wbTimeInterpolator) - ], []), - wbUnknown(_14_IAD), - wbUnknown(_54_IAD), - wbFormIDCk(RDSD, 'Sound - Intro', [SOUN]), - wbFormIDCk(RDSI, 'Sound - Outro', [SOUN]) - ]); - - wbRecord(FLST, 'FormID List', [ - wbString(EDID, 'Editor ID', 0, cpBenign, True, nil, wbFLSTEDIDAfterSet), - wbRArrayS('FormIDs', wbFormID(LNAM, 'FormID'), cpNormal, False, nil, nil, nil, wbFLSTLNAMIsSorted) - ]); - - wbRecord(PERK, 'Perk', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Trait', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Min Level', itU8), - wbInteger('Ranks', itU8), - wbInteger('Playable', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Hidden', itU8, wbEnum(['No', 'Yes'])) - ], cpNormal, True, nil, 4), - wbRStructsSK('Effects', 'Effect', [0, 1], [ - wbStructSK(PRKE, [1, 2, 0], 'Header', [ - wbInteger('Type', itU8, wbEnum([ - 'Quest + Stage', - 'Ability', - 'Entry Point' - ]), cpNormal, False, nil, wbPERKPRKETypeAfterSet), - wbInteger('Rank', itU8), - wbInteger('Priority', itU8) - ]), - wbUnion(DATA, 'Effect Data', wbPerkDATADecider, [ - wbStructSK([0, 1], 'Quest + Stage', [ - wbFormIDCk('Quest', [QUST]), - wbInteger('Quest Stage', itU8, wbPerkDATAQuestStageToStr, wbCTDAParam2QuestStageToInt), - wbByteArray('Unused', 3) - ]), - wbFormIDCk('Ability', [SPEL]), - wbStructSK([0, 1], 'Entry Point', [ - wbInteger('Entry Point', itU8, wbEnum([ - {00} 'Calculate Weapon Damage', - {01} 'Calculate My Critical Hit Chance', - {02} 'Calculate My Critical Hit Damage', - {03} 'Calculate Weapon Attack AP Cost', - {04} 'Calculate Mine Explode Chance', - {05} 'Adjust Range Penalty', - {06} 'Adjust Limb Damage', - {07} 'Calculate Weapon Range', - {08} 'Calculate To Hit Chance', - {09} 'Adjust Experience Points', - {10} 'Adjust Gained Skill Points', - {11} 'Adjust Book Skill Points', - {12} 'Modify Recovered Health', - {13} 'Calculate Inventory AP Cost', - {14} 'Get Disposition', - {15} 'Get Should Attack', - {16} 'Get Should Assist', - {17} 'Calculate Buy Price', - {18} 'Get Bad Karma', - {19} 'Get Good Karma', - {20} 'Ignore Locked Terminal', - {21} 'Add Leveled List On Death', - {22} 'Get Max Carry Weight', - {23} 'Modify Addiction Chance', - {24} 'Modify Addiction Duration', - {25} 'Modify Positive Chem Duration', - {26} 'Adjust Drinking Radiation', - {27} 'Activate', - {28} 'Mysterious Stranger', - {29} 'Has Paralyzing Palm', - {30} 'Hacking Science Bonus', - {31} 'Ignore Running During Detection', - {32} 'Ignore Broken Lock', - {33} 'Has Concentrated Fire', - {34} 'Calculate Gun Spread', - {35} 'Player Kill AP Reward', - {36} 'Modify Enemy Critical Hit Chance', - {37} 'Reload Speed', - {38} 'Equip Speed', - {39} 'Action Point Regen', - {40} 'Action Point Cost', - {41} 'Miss Fortune', - {42} 'Modify Run Speed', - {43} 'Modify Attack Speed', - {44} 'Modify Radiation Consumed', - {45} 'Has Pip Hacker', - {46} 'Has Meltdown', - {47} 'See Enemy Health', - {48} 'Has Jury Rigging', - {49} 'Modify Threat Range', - {50} 'Modify Thread', - {51} 'Has Fast Travel Always', - {52} 'Knockdown Chance', - {53} 'Modify Weapon Strength Req', - {54} 'Modify Aiming Move Speed', - {55} 'Modify Light Items', - {56} 'Modify Damage Threshold (defender)', - {57} 'Modify Chance for Ammo Item', - {58} 'Modify Damage Threshold (attacker)', - {59} 'Modify Throwing Velocity', - {60} 'Chance for Item on Fire', - {61} 'Has Unarmed Forward Power Attack', - {62} 'Has Unarmed Back Power Attack', - {63} 'Has Unarmed Crouched Power Attack', - {64} 'Has Unarmed Counter Attack', - {65} 'Has Unarmed Left Power Attack', - {66} 'Has Unarmed Right Power Attack', - {67} 'VATS HelperChance', - {68} 'Modify Item Damage', - {69} 'Has Improved Detection', - {70} 'Has Improved Spotting', - {71} 'Has Improved Item Detection', - {72} 'Adjust Explosion Radius', - {73} 'Reserved' - ]), cpNormal, True, nil, wbPERKEntryPointAfterSet), - wbInteger('Function', itU8, wbPerkDATAFunctionToStr, wbPerkDATAFunctionToInt, cpNormal, False, nil, wbPerkDATAFunctionAfterSet), - wbInteger('Perk Condition Tab Count', itU8, nil, cpIgnore) - ]) - ], cpNormal, True), - wbRStructsSK('Perk Conditions', 'Perk Condition', [0], [ - wbInteger(PRKC, 'Run On', itS8, wbPRKCToStr, wbPRKCToInt), - wbCTDAsReq - ], [], cpNormal, False, nil, nil, wbPERKPRKCDontShow), - wbRStruct('Entry Point Function Parameters', [ - wbInteger(EPFT, 'Type', itU8, wbPerkEPFTToStr, wbPerkEPFTToInt, cpIgnore, False, nil, wbPerkEPFTAfterSet), - wbUnion(EPFD, 'Data', wbEPFDDecider, [ - wbByteArray('Unknown'), - wbFloat('Float'), - wbStruct('Float, Float', [ - wbFloat('Float 1'), - wbFloat('Float 2') - ]), - wbFormIDCk('Leveled Item', [LVLI]), - wbEmpty('None (Script)'), - wbStruct('Actor Value, Float', [ - wbInteger('Actor Value', itU32, wbEPFDActorValueToStr, wbEPFDActorValueToInt), - wbFloat('Float') - ]) - ], cpNormal, False, wbEPFDDontShow), - wbString(EPF2, 'Button Label', 0, cpNormal, False, wbEPF2DontShow), - wbInteger(EPF3, 'Script Flags', itU16, wbFlags([ - 'Run Immediately' - ]), cpNormal, False, False, wbEPF2DontShow), - wbEmbeddedScriptPerk - ], [], cpNormal, False, wbPERKPRKCDontShow), - wbEmpty(PRKF, 'End Marker', cpIgnore, True) - ], []) - ]); - - wbBPNDStruct := wbStruct(BPND, '', [ - {00} wbFloat('Damage Mult'), - {04} wbInteger('Flags', itU8, wbFlags([ - 'Severable', - 'IK Data', - 'IK Data - Biped Data', - 'Explodable', - 'IK Data - Is Head', - 'IK Data - Headtracking', - 'To Hit Chance - Absolute' - ])), - {05} wbInteger('Part Type', itU8, wbEnum([ - 'Torso', - 'Head 1', - 'Head 2', - 'Left Arm 1', - 'Left Arm 2', - 'Right Arm 1', - 'Right Arm 2', - 'Left Leg 1', - 'Left Leg 2', - 'Left Leg 3', - 'Right Leg 1', - 'Right Leg 2', - 'Right Leg 3', - 'Brain', - 'Weapon' - ])), - {06} wbInteger('Health Percent', itU8), - {07} wbInteger('Actor Value', itS8, wbActorValueEnum), - {08} wbInteger('To Hit Chance', itU8), - {09} wbInteger('Explodable - Explosion Chance %', itU8), - {10} wbInteger('Explodable - Debris Count', itU16), - {12} wbFormIDCk('Explodable - Debris', [DEBR, NULL]), - {16} wbFormIDCk('Explodable - Explosion', [EXPL, NULL]), - {20} wbFloat('Tracking Max Angle'), - {24} wbFloat('Explodable - Debris Scale'), - {28} wbInteger('Severable - Debris Count', itS32), - {32} wbFormIDCk('Severable - Debris', [DEBR, NULL]), - {36} wbFormIDCk('Severable - Explosion', [EXPL, NULL]), - {40} wbFloat('Severable - Debris Scale'), - wbStruct('Gore Effects Positioning', [ - wbStruct('Translate', [ - {44} wbFloat('X'), - {48} wbFloat('Y'), - {52} wbFloat('Z') - ]), - wbStruct('Rotation', [ - {56} wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {60} wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {64} wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]), - {68} wbFormIDCk('Severable - Impact DataSet', [IPDS, NULL]), - {72} wbFormIDCk('Explodable - Impact DataSet', [IPDS, NULL]), - {28} wbInteger('Severable - Decal Count', itU8), - {28} wbInteger('Explodable - Decal Count', itU8), - {76} wbByteArray('Unused', 2), - {80} wbFloat('Limb Replacement Scale') - ], cpNormal, True); - - wbRecord(BPTD, 'Body Part Data', [ - wbEDIDReq, - wbMODLReq, - wbRStructS('Body Parts', 'Body Part', [ // When the Part Name is provided - wbString(BPTN, 'Part Name', 0, cpNormal, True), - wbString(BPNN, 'Part Node', 0, cpNormal, True), - wbString(BPNT, 'VATS Target', 0, cpNormal, True), - wbString(BPNI, 'IK Data - Start Node', 0, cpNormal, True), - wbBPNDStruct, - wbString(NAM1, 'Limb Replacement Model', 0, cpNormal, True), - wbString(NAM4, 'Gore Effects - Target Bone', 0, cpNormal, True), - wbByteArray(NAM5, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, False), - wbRStructS('Unnamed Body Parts', 'Body Part', [ // When the Part Name is not provided - wbString(BPNN, 'Part Node', 0, cpNormal, True), - wbString(BPNT, 'VATS Target', 0, cpNormal, True), - wbString(BPNI, 'IK Data - Start Node', 0, cpNormal, True), - wbBPNDStruct, - wbString(NAM1, 'Limb Replacement Model', 0, cpNormal, True), - wbString(NAM4, 'Gore Effects - Target Bone', 0, cpNormal, True), - wbByteArray(NAM5, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, False), - wbFormIDCk(RAGA, 'Ragdoll', [RGDL]) - ]); - - wbRecord(ADDN, 'Addon Node', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbInteger(DATA, 'Node Index', itS32, nil, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbStruct(DNAM, 'Data', [ - wbInteger('Master Particle System Cap', itU16), - wbByteArray('Unknown', 2) - ], cpNormal, True) - ]); - - wbRecord(AVIF, 'ActorValue Information', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbString(ANAM, 'Short Name') - ]); - - wbRecord(RADS, 'Radiation Stage', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbInteger('Trigger Threshold', itU32), - wbFormIDCk('Actor Effect', [SPEL]) - ], cpNormal, True) - ]); - - wbRecord(CAMS, 'Camera Shot', [ - wbEDIDReq, - wbMODL, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Action', itU32, wbEnum([ - 'Shoot', - 'Fly', - 'Hit', - 'Zoom' - ])), - {04} wbInteger('Location', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target' - ])), - {08} wbInteger('Target', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target' - ])), - {12} wbInteger('Flags', itU32, wbFlags([ - 'Position Follows Location', - 'Rotation Follows Target', - 'Don''t Follow Bone', - 'First Person Camera', - 'No Tracer', - 'Start At Time Zero' - ])), - wbStruct('Time Multipliers', [ - {16} wbFloat('Player'), - {20} wbFloat('Target'), - {24} wbFloat('Global') - ]), - {28} wbFloat('Max Time'), - {32} wbFloat('Min Time'), - {36} wbFloat('Target % Between Actors') - ], cpNormal, True, nil, 7), - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]) - ]); - - wbRecord(CPTH, 'Camera Path', [ - wbEDIDReq, - wbCTDAs, - wbArray(ANAM, 'Related Camera Paths', wbFormIDCk('Related Camera Path', [CPTH, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbInteger(DATA, 'Camera Zoom', itU8, wbEnum([ - 'Default', - 'Disable', - 'Shot List' - ]), cpNormal, True), - wbRArray('Camera Shots', wbFormIDCk(SNAM, 'Camera Shot', [CAMS])) - ]); - - wbRecord(VTYP, 'Voice Type', [ - wbEDIDReq, - wbInteger(DNAM, 'Flags', itU8, wbFlags([ - 'Allow Default Dialog', - 'Female' - ]), cpNormal, False) - ]); - - wbRecord(IPCT, 'Impact', [ - wbEDIDReq, - wbMODL, - wbStruct(DATA, '', [ - wbFloat('Effect - Duration'), - wbInteger('Effect - Orientation', itU32, wbEnum([ - 'Surface Normal', - 'Projectile Vector', - 'Projectile Reflection' - ])), - wbFloat('Angle Threshold'), - wbFloat('Placement Radius'), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbInteger('Flags', itU32, wbFlags([ - 'No Decal Data' - ])) - ], cpNormal, True), - wbDODT, - wbFormIDCk(DNAM, 'Texture Set', [TXST]), - wbFormIDCk(SNAM, 'Sound 1', [SOUN]), - wbFormIDCk(NAM1, 'Sound 2', [SOUN]) - ]); - - wbRecord(IPDS, 'Impact DataSet', [ - wbEDIDReq, - wbStruct(DATA, 'Impacts', [ - wbFormIDCk('Stone', [IPCT, NULL]), - wbFormIDCk('Dirt', [IPCT, NULL]), - wbFormIDCk('Grass', [IPCT, NULL]), - wbFormIDCk('Glass', [IPCT, NULL]), - wbFormIDCk('Metal', [IPCT, NULL]), - wbFormIDCk('Wood', [IPCT, NULL]), - wbFormIDCk('Organic', [IPCT, NULL]), - wbFormIDCk('Cloth', [IPCT, NULL]), - wbFormIDCk('Water', [IPCT, NULL]), - wbFormIDCk('Hollow Metal', [IPCT, NULL]), - wbFormIDCk('Organic Bug', [IPCT, NULL]), - wbFormIDCk('Organic Glow', [IPCT, NULL]) - ], cpNormal, True, nil, 9) - ]); - - wbRecord(ECZN, 'Encounter Zone', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - wbInteger('Rank', itS8), - wbInteger('Minimum Level', itS8), - wbInteger('Flags', itU8, wbFlags([ - 'Never Resets', - 'Match PC Below Minimum Level' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ]); - - wbRecord(MESG, 'Message', [ - wbEDIDReq, - wbDESCReq, - wbFULL, - wbFormIDCk(INAM, 'Icon', [MICN, NULL], False, cpNormal, True), - wbByteArray(NAM0, 'Unused', 0, cpIgnore), - wbByteArray(NAM1, 'Unused', 0, cpIgnore), - wbByteArray(NAM2, 'Unused', 0, cpIgnore), - wbByteArray(NAM3, 'Unused', 0, cpIgnore), - wbByteArray(NAM4, 'Unused', 0, cpIgnore), - wbByteArray(NAM5, 'Unused', 0, cpIgnore), - wbByteArray(NAM6, 'Unused', 0, cpIgnore), - wbByteArray(NAM7, 'Unused', 0, cpIgnore), - wbByteArray(NAM8, 'Unused', 0, cpIgnore), - wbByteArray(NAM9, 'Unused', 0, cpIgnore), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - 'Message Box', - 'Auto Display' - ]), cpNormal, True, False, nil, wbMESGDNAMAfterSet), - wbInteger(TNAM, 'Display Time', itU32, nil, cpNormal, False, False, wbMESGTNAMDontShow), - wbRStructs('Menu Buttons', 'Menu Button', [ - wbString(ITXT, 'Button Text'), - wbCTDAs - ], []) - ], False, nil, cpNormal, False, wbMESGAfterLoad); - - wbRecord(RGDL, 'Ragdoll', [ - wbEDIDReq, - wbInteger(NVER, 'Version', itU32, nil, cpNormal, True), - wbStruct(DATA, 'General Data', [ - wbInteger('Dynamic Bone Count', itU32), - wbByteArray('Unused', 4), - wbStruct('Enabled', [ - wbInteger('Feedback', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Foot IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Look IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Grab IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Pose Matching', itU8, wbEnum(['No', 'Yes'])) - ]), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(XNAM, 'Actor Base', [CREA, NPC_], False, cpNormal, True), - wbFormIDCk(TNAM, 'Body Part Data', [BPTD], False, cpNormal, True), - wbStruct(RAFD, 'Feedback Data', [ - {00} wbFloat('Dynamic/Keyframe Blend Amount'), - {04} wbFloat('Hierarchy Gain'), - {08} wbFloat('Position Gain'), - {12} wbFloat('Velocity Gain'), - {16} wbFloat('Acceleration Gain'), - {20} wbFloat('Snap Gain'), - {24} wbFloat('Velocity Damping'), - wbStruct('Snap Max Settings', [ - {28} wbFloat('Linear Velocity'), - {32} wbFloat('Angular Velocity'), - {36} wbFloat('Linear Distance'), - {40} wbFloat('Angular Distance') - ]), - wbStruct('Position Max Velocity', [ - {44} wbFloat('Linear'), - {48} wbFloat('Angular') - ]), - wbStruct('Position Max Velocity', [ - {52} wbInteger('Projectile', itS32, wbDiv(1000)), - {56} wbInteger('Melee', itS32, wbDiv(1000)) - ]) - ], cpNormal, False), - wbArray(RAFB, 'Feedback Dynamic Bones', wbInteger('Bone', itU16), 0, nil, nil, cpNormal, False), - wbStruct(RAPS, 'Pose Matching Data', [ - {00} wbArray('Match Bones', wbInteger('Bone', itU16, wbHideFFFF), 3), - {06} wbInteger('Flags', itU8, wbFlags([ - 'Disable On Move' - ])), - {07} wbByteArray('Unused', 1), - {08} wbFloat('Motors Strength'), - {12} wbFloat('Pose Activation Delay Time'), - {16} wbFloat('Match Error Allowance'), - {20} wbFloat('Displacement To Disable') - ], cpNormal, True), - wbString(ANAM, 'Death Pose') - ]); - - wbRecord(DOBJ, 'Default Object Manager', [ - wbEDIDReq, - wbArray(DATA, 'Default Objects', wbFormID('Default Object'), [ - 'Stimpack', - 'SuperStimpack', - 'RadX', - 'RadAway', - 'Morphine', - 'Perk Paralysis', - 'Player Faction', - 'Mysterious Stranger NPC', - 'Mysterious Stranger Faction', - 'Default Music', - 'Battle Music', - 'Death Music', - 'Success Music', - 'Level Up Music', - 'Player Voice (Male)', - 'Player Voice (Male Child)', - 'Player Voice (Female)', - 'Player Voice (Female Child)', - 'Eat Package Default Food', - 'Every Actor Ability', - 'Drug Wears Off Image Space', - 'Doctor''s Bag', - 'Miss Fortune NPC', - 'Miss Fortune Faction', - 'Meltdown Explosion', - 'Unarmed Forward PA', - 'Unarmed Backward PA', - 'Unarmed Left PA', - 'Unarmed Right PA', - 'Unarmed Crouch PA', - 'Unarmed Counter PA', - 'Spotter Effect', - 'Item Detected Effect', - 'Cateye Mobile Effect (NYI)' - ], cpNormal, True) - ]); - - wbRecord(LGTM, 'Lighting Template', [ - wbEDIDReq, - wbStruct(DATA, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Dist'), - wbFloat('Fog Power') - ], cpNormal, True) - ]); - - wbRecord(MUSC, 'Music Type', [ - wbEDIDReq, - wbString(FNAM, 'Filename'), - wbFloat(ANAM, 'dB (positive = Loop)') - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unused', 1), - wbInteger('Unit from water amount', itU16), - wbByteArray('Unused', 2), - wbInteger('Unit from water type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True) - ]); - - wbRecord(HAIR, 'Hair', [ - wbEDIDReq, - wbFULLReq, - wbMODLReq, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female', - 'Fixed' - ]), cpNormal, True) - ]); - - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbMODLReq, - wbCTDAs, - wbArray(ANAM, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [IDLE, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbStruct(DATA, '', [ - wbInteger('Animation Group Section', itU8, wbIdleAnam), - wbStruct('Looping', [ - wbInteger('Min', itU8), - wbInteger('Max', itU8) - ]), - wbByteArray('Unused', 1), - wbInteger('Replay Delay', itS16), - wbInteger('Flags', itU8, wbFlags([ - 'No attacking' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True, nil, 4) - ]); - - wbRecord(INFO, 'Dialog response', [ - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous', - {7} 'Radio' - ])), - wbInteger('Next Speaker', itU8, wbEnum([ - {0} 'Target', - {1} 'Self', - {2} 'Either' - ])), - wbInteger('Flags 1', itU8, wbFlags([ - {0x01} 'Goodbye', - {0x02} 'Random', - {0x04} 'Say Once', - {0x08} 'Run Immediately', - {0x10} 'Info Refusal', - {0x20} 'Random End', - {0x40} 'Run for Rumors', - {0x80} 'Speech Challenge' - ])), - wbInteger('Flags 2', itU8, wbFlags([ - {0x01} 'Say Once a Day', - {0x02} 'Always Darken', - {0x04} 'Unknown 2', - {0x08} 'Unknown 3', - {0x10} 'Low Intelligence', - {0x20} 'High Intelligence' - ])) - ], cpNormal, True, nil, 3), - wbFormIDCkNoReach(QSTI, 'Quest', [QUST], False, cpNormal, True), - wbFormIDCk(TPIC, 'Topic', [DIAL]), // The GECK ignores it for ESM - wbFormIDCkNoReach(PNAM, 'Previous INFO', [INFO, NULL]), - wbRArray('Add Topics', wbFormIDCk(NAME, 'Topic', [DIAL])), - wbRArray('Responses', - wbRStruct('Response', [ - wbStruct(TRDT, 'Response Data', [ - wbInteger('Emotion Type', itU32, wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise', - {7} 'Pained' - ])), - wbInteger('Emotion Value', itS32), - wbByteArray('Unused', 4), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3), - wbFormIDCk('Sound', [SOUN, NULL]), - wbInteger('Flags', itU8, wbFlags([ - 'Use Emotion Animation' - ])), - wbByteArray('Unused', 3) - ], cpNormal, False, nil, 5), - wbStringKC(NAM1, 'Response Text', 0, cpTranslate, True), - wbString(NAM2, 'Script Notes', 0, cpTranslate, True), - wbString(NAM3, 'Edits'), - wbFormIDCk(SNAM, 'Speaker Animation', [IDLE]), - wbFormIDCk(LNAM, 'Listener Animation', [IDLE]) - ], []) - ), - wbCTDAs, - wbRArray('Choices', wbFormIDCk(TCLT, 'Choice', [DIAL])), - wbRArray('Link From', wbFormIDCk(TCLF, 'Topic', [DIAL])), - wbRArray('Unknown', wbFormIDCk(TCFU, 'Info', [INFO] )), - wbRStruct('Script (Begin)', [ - wbEmbeddedScriptReq - ], [], cpNormal, True), - wbRStruct('Script (End)', [ - wbEmpty(NEXT, 'Marker'), - wbEmbeddedScriptReq - ], [], cpNormal, True), - wbFormIDCk(SNDD, 'Unused', [SOUN]), - wbString(RNAM, 'Prompt'), - wbFormIDCk(ANAM, 'Speaker', [CREA, NPC_]), - wbFormIDCk(KNAM, 'ActorValue/Perk', [AVIF, PERK]), - wbInteger(DNAM, 'Speech Challenge', itU32, wbEnum([ - '---', - 'Very Easy', - 'Easy', - 'Average', - 'Hard', - 'Very Hard' - ])) - ], False, wbINFOAddInfo, cpNormal, False, wbINFOAfterLoad); - - wbRecord(INGR, 'Ingredient', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbETYPReq, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(KEYM, 'Key', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICONReq, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(RNAM, 'Sound - Random/Looping', [SOUN]) - ]); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unused', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unused', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end; - - wbRecord(LIGH, 'Light', [ - wbEDIDReq, - wbOBNDReq, - wbMODL, - wbSCRI, - wbDEST, - wbFULL, - wbICON, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Dynamic', - {0x00000002} 'Can be Carried', - {0x00000004} 'Negative', - {0x00000008} 'Flicker', - {0x00000010} 'Unused', - {0x00000020} 'Off By Default', - {0x00000040} 'Flicker Slow', - {0x00000080} 'Pulse', - {0x00000100} 'Pulse Slow', - {0x00000200} 'Spot Light', - {0x00000400} 'Spot Shadow' - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbFloat(FNAM, 'Fade value', cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); - - wbRecord(LSCR, 'Load Screen', [ - wbEDIDReq, - wbICONReq, - wbDESCReq, - wbRArrayS('Locations', wbStructSK(LNAM, [0, 1], 'Location', [ - wbFormIDCk('Direct', [CELL, WRLD, NULL]), - wbStructSK([0, 1], 'Indirect', [ - wbFormIDCk('World', [NULL, WRLD]), - wbStructSK([0,1], 'Grid', [ - wbInteger('Y', itS16), - wbInteger('X', itS16) - ]) - ]) - ])), - wbFormIDCk(WMI1, 'Load Screen Type', [LSCT]) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDIDReq, - wbICON, - wbFormIDCk(TNAM, 'Texture', [TXST], False, cpNormal, True), - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Material Type', itU8, wbEnum([ - {00} 'STONE', - {01} 'CLOTH', - {02} 'DIRT', - {03} 'GLASS', - {04} 'GRASS', - {05} 'METAL', - {06} 'ORGANIC', - {07} 'SKIN', - {08} 'WATER', - {09} 'WOOD', - {10} 'HEAVY STONE', - {11} 'HEAVY METAL', - {12} 'HEAVY WOOD', - {13} 'CHAIN', - {14} 'SNOW', - {15} 'ELEVATOR', - {16} 'HOLLOW METAL', - {17} 'SHEET METAL', - {18} 'SAND', - {19} 'BRIKEN CONCRETE', - {20} 'VEHILCE BODY', - {21} 'VEHILCE PART SOLID', - {22} 'VEHILCE PART HOLLOW', - {23} 'BARREL', - {24} 'BOTTLE', - {25} 'SODA CAN', - {26} 'PISTOL', - {27} 'RIFLE', - {28} 'SHOPPING CART', - {29} 'LUNCHBOX', - {30} 'BABY RATTLE', - {31} 'RUBER BALL' - ])), - wbInteger('Friction', itU8), - wbInteger('Restitution', itU8) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True), - wbRArrayS('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])) - ]); - - wbRecord(LVLC, 'Leveled Creature', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [CREA, LVLC]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []), - cpNormal, True), - wbMODL - ]); - - wbRecord(LVLN, 'Leveled NPC', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [NPC_, LVLN]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []), - cpNormal, True), - wbMODL - ]); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use All' - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Global', [GLOB]), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [ARMO, AMMO, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, NOTE, IMOD, CMNY, CCRD, CHIP]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []) - ) - ]); - - wbArchtypeEnum := wbEnum([ - {00} 'Value Modifier', - {01} 'Script', - {02} 'Dispel', - {03} 'Cure Disease', - {04} '', - {05} '', - {06} '', - {07} '', - {08} '', - {09} '', - {10} '', - {11} 'Invisibility', - {12} 'Chameleon', - {13} 'Light', - {14} '', - {15} '', - {16} 'Lock', - {17} 'Open', - {18} 'Bound Item', - {19} 'Summon Creature', - {20} '', - {21} '', - {22} '', - {23} '', - {24} 'Paralysis', - {25} '', - {26} '', - {27} '', - {28} '', - {29} '', - {30} 'Cure Paralysis', - {31} 'Cure Addiction', - {32} 'Cure Poison', - {33} 'Concussion', - {34} 'Value And Parts', - {35} 'Limb Condition', - {36} 'Turbo' - ]); - - wbRecord(MGEF, 'Base Effect', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbMODL, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} '', - {0x00000010} 'Self', - {0x00000020} 'Touch', - {0x00000040} 'Target', - {0x00000080} 'No Duration', - {0x00000100} 'No Magnitude', - {0x00000200} 'No Area', - {0x00000400} 'FX Persist', - {0x00000800} '', - {0x00001000} 'Gory Visuals', - {0x00002000} 'Display Name Only', - {0x00004000} '', - {0x00008000} 'Radio Broadcast ??', - {0x00010000} '', - {0x00020000} '', - {0x00040000} '', - {0x00080000} 'Use skill', - {0x00100000} 'Use attribute', - {0x00200000} '', - {0x00400000} '', - {0x00800000} '', - {0x01000000} 'Painless', - {0x02000000} 'Spray projectile type (or Fog if Bolt is specified as well)', - {0x04000000} 'Bolt projectile type (or Fog if Spray is specified as well)', - {0x08000000} 'No Hit Effect', - {0x10000000} 'No Death Dispel', - {0x20000000} '????' - ])), - {04} wbFloat('Base cost (Unused)'), - {08} wbUnion('Assoc. Item', wbMGEFFAssocItemDecider, [ - wbFormID('Unused', cpIgnore), - wbFormID('Assoc. Item'), - wbFormIDCk('Assoc. Script', [SCPT, NULL]), //Script - wbFormIDCk('Assoc. Item', [WEAP, ARMO, NULL]), //Bound Item - wbFormIDCk('Assoc. Creature', [CREA]) //Summon Creature - ], cpNormal, false, nil, wbMGEFFAssocItemAfterSet), - {12} wbInteger('Magic School (Unused)', itS32, wbEnum([ - ], [ - -1, 'None' - ])), - {16} wbInteger('Resistance Type', itS32, wbActorValueEnum), - {20} wbInteger('Counter effect count', itU16), - {22} wbByteArray('Unused', 2), - {24} wbFormIDCk('Light', [LIGH, NULL]), - {28} wbFloat('Projectile speed'), - {32} wbFormIDCk('Effect Shader', [EFSH, NULL]), - {36} wbFormIDCk('Object Display Shader', [EFSH, NULL]), - {40} wbFormIDCk('Effect sound', [NULL, SOUN]), - {44} wbFormIDCk('Bolt sound', [NULL, SOUN]), - {48} wbFormIDCk('Hit sound', [NULL, SOUN]), - {52} wbFormIDCk('Area sound', [NULL, SOUN]), - {56} wbFloat('Constant Effect enchantment factor (Unused)'), - {60} wbFloat('Constant Effect barter factor (Unused)'), - {64} wbInteger('Archtype', itU32, wbArchtypeEnum, cpNormal, False, nil, wbMGEFArchtypeAfterSet), - {68} wbActorValue - ], cpNormal, True), - wbRArrayS('Counter Effects', wbFormIDCk(ESCE, 'Effect', [MGEF]), cpNormal, False, nil, wbCounterEffectsAfterSet) - ], False, nil, cpNormal, False, wbMGEFAfterLoad, wbMGEFAfterSet); - - wbRecord(MISC, 'Misc. Item', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(RNAM, 'Sound - Random/Looping', [SOUN]) - ]); - - wbRecord(COBJ, 'Constructible Object', [ - wbEDID, - wbOBND, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - // floats are reported to change faces after copying - if True {wbSimpleRecords} then begin - wbFaceGen := wbRStruct('FaceGen Data', [ - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True); - - wbFaceGenNPC := wbRStruct('FaceGen Data', [ // Arrays of 4bytes elements - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True, wbActorTemplateUseModelAnimation); - end else begin - wbFaceGen := wbRStruct('FaceGen Data', [ - wbArray(FGGS, 'FaceGen Geometry-Symmetric', wbFloat('Value'), [], cpNormal, True), - wbArray(FGGA, 'FaceGen Geometry-Asymmetric', wbFloat('Value'), [], cpNormal, True), - wbArray(FGTS, 'FaceGen Texture-Symmetric', wbFloat('Value'), [], cpNormal, True) - ], [], cpNormal, True); - - wbFaceGenNPC := wbRStruct('FaceGen Data', [ - wbArray(FGGS, 'FaceGen Geometry-Symmetric', wbFloat('Value'), [], cpNormal, True), - wbArray(FGGA, 'FaceGen Geometry-Asymmetric', wbFloat('Value'), [], cpNormal, True), - wbArray(FGTS, 'FaceGen Texture-Symmetric', wbFloat('Value'), [], cpNormal, True) - ], [], cpNormal, True, wbActorTemplateUseModelAnimation); - end; - - wbRecord(NPC_, 'Non-Player Character', [ - wbEDIDReq, - wbOBNDReq, - wbFULLActor, - wbMODLActor, - wbStruct(ACBS, 'Configuration', [ - {00} wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Female', - {0x000002} 'Essential', - {0x000004} 'Is CharGen Face Preset', - {0x000008} 'Respawn', - {0x000010} 'Auto-calc stats', - {0x000020} '', - {0x000040} '', - {0x000080} 'PC Level Mult', - {0x000100} 'Use Template', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} '', - {0x010000} '', - {0x020000} '', - {0x040000} '', - {0x080000} '', - {0x100000} 'No VATS Melee', - {0x00200000} '', - {0x00400000} 'Can be all races', - {0x00800000} 'Autocalc Service', - {0x01000000} '', - {0x02000000} '', - {0x04000000} 'No Knockdowns', - {0x08000000} 'Not Pushable', - {0x10000000} 'Unknown 28', - {0x20000000} '', - {0x40000000} 'No Rotating To Head-track', - {0x80000000} '' - ], [ - {0x000001 Female} wbActorTemplateUseTraits, - {0x000002 Essential} wbActorTemplateUseBaseData, - {0x000004 Is CharGen Face Preset} nil, - {0x000008 Respawn} wbActorTemplateUseBaseData, - {0x000010 Auto-calc stats} wbActorTemplateUseStats, - {0x000020 } nil, - {0x000040 } nil, - {0x000080 PC Level Mult} wbActorTemplateUseStats, - {0x000100 Use Template} nil, - {0x000200 No Low Level Processing} wbActorTemplateUseBaseData, - {0x000400 } nil, - {0x000800 No Blood Spray} wbActorTemplateUseModelAnimation, - {0x001000 No Blood Decal} wbActorTemplateUseModelAnimation, - {0x002000 } nil, - {0x004000 } nil, - {0x008000 } nil, - {0x010000 } nil, - {0x020000 } nil, - {0x040000 } nil, - {0x080000 } nil, - {0x100000 No VATS Melee} nil, - {0x00200000 } nil, - {0x00400000 Can be all races} nil, - {0x00800000 } nil, - {0x01000000 } nil, - {0x02000000 } nil, - {0x04000000 No Knockdowns} nil, - {0x08000000 Not Pushable} wbActorTemplateUseModelAnimation, - {0x10000000 } nil, - {0x20000000 } nil, - {0x40000000 No Rotating To Head-track} wbActorTemplateUseModelAnimation, - {0x80000000 } nil - ])), - {04} wbInteger('Fatigue', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {06} wbInteger('Barter gold', itU16, nil, cpNormal, False, wbActorTemplateUseAIData), - {08} wbUnion('Level', wbCreaLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, True, wbActorTemplateUseStats), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, True, wbActorTemplateUseStats) - ], cpNormal, True, wbActorTemplateUseStats), - {10} wbInteger('Calc min', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {12} wbInteger('Calc max', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {14} wbInteger('Speed Multiplier', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {16} wbFloat('Karma (Alignment)', cpNormal, False, 1, -1, wbActorTemplateUseTraits), - {20} wbInteger('Disposition Base', itS16, nil, cpNormal, False, wbActorTemplateUseTraits), - {22} wbInteger('Template Flags', itU16, wbTemplateFlags) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]), - cpNormal, False, nil, nil, wbActorTemplateUseFactions), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, True, wbActorTemplateUseTraits), - wbFormIDCk(TPLT, 'Template', [LVLN, NPC_]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True, wbActorTemplateUseTraits), - wbSPLOs, - wbFormIDCk(EITM, 'Unarmed Attack Effect', [ENCH, SPEL], False, cpNormal, False, wbActorTemplateUseActorEffectList), - wbInteger(EAMT, 'Unarmed Attack Animation', itU16, wbAttackAnimationEnum, cpNormal, True, False, wbActorTemplateUseActorEffectList), - wbDESTActor, - wbSCRIActor, - wbRArrayS('Items', wbCNTO, cpNormal, False, nil, nil, wbActorTemplateUseInventory), - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil, nil, wbActorTemplateUseAIPackages), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True, wbActorTemplateUseTraits), - wbStruct(DATA, '', [ - {00} wbInteger('Base Health', itS32), - {04} wbArray('Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, False, wbActorAutoCalcDontShow), - wbByteArray('Unused'{, 14 - only present in old record versions}) - ], cpNormal, True, wbActorTemplateUseStats), - wbStruct(DNAM, '', [ - {00} wbArray('Skill Values', wbInteger('Skill', itU8), [ - 'Barter', - 'Big Guns (obsolete)', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Guns', - 'Sneak', - 'Speech', - 'Survival', - 'Unarmed' - ]), - {14} wbArray('Skill Offsets', wbInteger('Skill', itU8), [ - 'Barter', - 'Big Guns (obsolete)', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Guns', - 'Sneak', - 'Speech', - 'Survival', - 'Unarmed' - ]) - ], cpNormal, False, wbActorTemplateUseStatsAutoCalc), - wbRArrayS('Head Parts', - wbFormIDCk(PNAM, 'Head Part', [HDPT]), - cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbFormIDCk(HNAM, 'Hair', [HAIR], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbFloat(LNAM, 'Hair length', cpNormal, False, 1, -1, wbActorTemplateUseModelAnimation), - wbFormIDCk(ENAM, 'Eyes', [EYES], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbStruct(HCLR, 'Hair color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True, wbActorTemplateUseModelAnimation), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False, wbActorTemplateUseTraits), - wbInteger(NAM4, 'Impact Material Type', itU32, wbImpactMaterialTypeEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbFaceGenNPC, - wbInteger(NAM5, 'Unknown', itU16, nil, cpNormal, True, False, nil, nil, 255), - wbFloat(NAM6, 'Height', cpNormal, True, 1, -1, wbActorTemplateUseTraits), - wbFloat(NAM7, 'Weight', cpNormal, True, 1, -1, wbActorTemplateUseTraits) - ], True, nil, cpNormal, False, wbNPCAfterLoad); - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers Services', - {0x00000002} 'Must reach location', - {0x00000004} 'Must complete', - {0x00000008} 'Lock doors at package start', - {0x00000010} 'Lock doors at package end', - {0x00000020} 'Lock doors at location', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Unlock doors at location', - {0x00000200} 'Continue if PC near', - {0x00000400} 'Once per day', - {0x00000800} '', - {0x00001000} 'Skip fallout behavior', - {0x00002000} 'Always run', - {0x00004000} '', - {0x00008000} '', - {0x00010000} '', - {0x00020000} 'Always sneak', - {0x00040000} 'Allow swimming', - {0x00080000} 'Allow falls', - {0x00100000} 'Head-Tracking off', - {0x00200000} 'Weapons unequipped', - {0x00400000} 'Defensive combat', - {0x00800000} 'Weapon Drawn', - {0x01000000} 'No idle anims', - {0x02000000} 'Pretend In Combat', - {0x04000000} 'Continue During Combat', - {0x08000000} 'No Combat Alert', - {0x10000000} 'No Warn/Attack Behaviour', - {0x20000000} '', - {0x40000000} '', - {0x80000000} '' - ]); - - wbPKDTType := wbEnum([ - {0} 'Find', - {1} 'Follow', - {2} 'Escort', - {3} 'Eat', - {4} 'Sleep', - {5} 'Wander', - {6} 'Travel', - {7} 'Accompany', - {8} 'Use Item At', - {9} 'Ambush', - {10} 'Flee Not Combat', - {11} 'Package Type 11', - {12} 'Sandbox', - {13} 'Patrol', - {14} 'Guard', - {15} 'Dialogue', - {16} 'Use Weapon', - {17} 'Package Type 17', - {18} 'Combat Controller', - {19} 'Package Type 19', - {20} 'Package Type 20', - {21} 'Alarm', - {22} 'Flee', - {23} 'TressPass', - {24} 'Spectator', - {25} 'Package Type 25', - {26} 'Package Type 26', - {27} 'Package Type 27', - {28} 'Dialogue 2', - {29} 'Package Type 29', - {30} 'Package Type 30', - {31} 'Package Type 31', - {32} 'Package Type 32', - {33} 'Package Type 33', - {34} 'Package Type 34', - {35} 'Package Type 35', - {36} 'Package Type 36', - {37} 'Package Type 37', - {38} 'Package Type 38', - {39} 'Package Type 39', - {40} 'Package Type 40' - ]); - - wbObjectTypeEnum := wbEnum([ - ' NONE', - 'Activators', - 'Armor', - 'Books', - 'Clothing', - 'Containers', - 'Doors', - 'Ingredients', - 'Lights', - 'Misc', - 'Flora', - 'Furniture', - 'Weapons: Any', - 'Ammo', - 'NPCs', - 'Creatures', - 'Keys', - 'Alchemy', - 'Food', - ' All: Combat Wearable', - ' All: Wearable', - 'Weapons: Ranged', - 'Weapons: Melee', - 'Weapons: NONE', - 'Actor Effects: Any', - 'Actor Effects: Range Target', - 'Actor Effects: Range Touch', - 'Actor Effects: Range Self', -// '', - 'Actors: Any' - ]); - - - wbPKDTSpecificFlagsUnused := True; - - wbRecord(PACK, 'Package', [ - wbEDIDReq, - wbStruct(PKDT, 'General', [ - wbInteger('General Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 1), - wbInteger('Fallout Behavior Flags', itU16, wbFlags([ - {0x00000001}'Hellos To Player', - {0x00000002}'Random Conversations', - {0x00000004}'Observe Combat Behavior', - {0x00000008}'Unknown 4', - {0x00000010}'Reaction To Player Actions', - {0x00000020}'Friendly Fire Comments', - {0x00000040}'Aggro Radius Behavior', - {0x00000080}'Allow Idle Chatter', - {0x00000100}'Avoid Radiation' - ], True)), - wbUnion('Type Specific Flags', wbPKDTSpecificFlagsDecider, [ - wbEmpty('Type Specific Flags (missing)', cpIgnore, False, nil, True), - wbInteger('Type Specific Flags - Find', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Find - Allow Buying', - {0x00000200}'Find - Allow Killing', - {0x00000400}'Find - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Follow', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Escort', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Escort - Allow Buying', - {0x00000200}'Escort - Allow Killing', - {0x00000400}'Escort - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Eat', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Eat - Allow Buying', - {0x00000200}'Eat - Allow Killing', - {0x00000400}'Eat - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Sleep', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Wander', itU16, wbFlags([ - {0x00000001}'Wander - No Eating', - {0x00000002}'Wander - No Sleeping', - {0x00000004}'Wander - No Conversation', - {0x00000008}'Wander - No Idle Markers', - {0x00000010}'Wander - No Furniture', - {0x00000020}'Wander - No Wandering' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Travel', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Accompany', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Use Item At', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'Use Item At - Sit Down', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Use Item At - Allow Buying', - {0x00000200}'Use Item At - Allow Killing', - {0x00000400}'Use Item At - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Ambush', itU16, wbFlags([ - {0x00000001}'Ambush - Hide While Ambushing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Flee Not Combat', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - ?', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Sandbox', itU16, wbFlags([ - {0x00000001}'Sandbox - No Eating', - {0x00000002}'Sandbox - No Sleeping', - {0x00000004}'Sandbox - No Conversation', - {0x00000008}'Sandbox - No Idle Markers', - {0x00000010}'Sandbox - No Furniture', - {0x00000020}'Sandbox - No Wandering' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Patrol', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Guard', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'Guard - Remain Near Reference to Guard' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Dialogue', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Use Weapon', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)) - ]), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 2), - wbRStruct('Locations', [ - wbStruct(PLDT, 'Location 1', [ - wbInteger('Type', itS32, wbEnum([ // Byte + filler - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, CHIP, CMNY, CCRD, IMOD]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ], cpNormal, True), - wbStruct(PLD2, 'Location 2', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, CHIP, CMNY, CCRD, IMOD]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]) - ], [], cpNormal, False, nil, True), - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Weekdays', - 'Weekends', - 'Monday, Wednesday, Friday', - 'Tuesday, Thursday' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Time', itS8), - wbInteger('Duration', itS32) - ], cpNormal, True), - wbStruct(PTDT, 'Target 1', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific Reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference' - ]), cpNormal, False, nil, nil, 2), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [ACHR, ACRE, REFR, PGRE, PMIS, PBEA, PLYR], True), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, LVLN, LVLC, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, FACT, FLST, IDLM, CHIP, CMNY, CCRD, IMOD]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32), - wbFloat('Unknown') - ], cpNormal, False, nil, 3), - wbCTDAs, - wbRStruct('Idle Animations', [ - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - '', - 'Do Once' - ]), cpNormal, True), - wbStruct(IDLC, '', [ - wbInteger( 'Animation Count', itU8), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, True), - wbByteArray(IDLB, 'Unused', 4, cpIgnore) - ], [], cpNormal, False, nil, False, nil {cannot be totally removed , wbAnimationsAfterSet}), - wbFormIDCk(CNAM, 'Combat Style', [CSTY]), - wbEmpty(PKED, 'Eat Marker'), - wbInteger(PKE2, 'Escort Distance', itU32), - wbFloat(PKFD, 'Follow - Start Location - Trigger Radius'), - wbStruct(PKPT, 'Patrol Flags', [ - wbInteger('Repeatable', itU8, wbEnum(['No', 'Yes']), cpNormal, False, nil, nil, 1), - wbByteArray('Unused', 1) - ], cpNormal, False, nil, 1), - wbStruct(PKW3, 'Use Weapon Data', [ - wbInteger('Flags', itU32, wbFlags([ - 'Always Hit', - '', - '', - '', - '', - '', - '', - '', - 'Do No Damage', - '', - '', - '', - '', - '', - '', - '', - 'Crouch To Reload', - '', - '', - '', - '', - '', - '', - '', - 'Hold Fire When Blocked' - ])), - wbInteger('Fire Rate', itU8, wbEnum([ - 'Auto Fire', - 'Volley Fire' - ])), - wbInteger('Fire Count', itU8, wbEnum([ - 'Number of Bursts', - 'Repeat Fire' - ])), - wbInteger('Number of Bursts', itU16), - wbStruct('Shoots Per Volleys', [ - wbInteger('Min', itU16), - wbInteger('Max', itU16) - ]), - wbStruct('Pause Between Volleys', [ - wbFloat('Min'), - wbFloat('Max') - ]), - wbByteArray('Unused', 4) - ]), - wbStruct(PTD2, 'Target 2', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference' - ])), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [ACHR, ACRE, REFR, PGRE, PMIS, PBEA, PLYR], True), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, LVLN, LVLC, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, FACT, FLST, CHIP, CMNY, CCRD, IMOD]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32), - wbFloat('Unknown') - ], cpNormal, False, nil, 3), - wbEmpty(PUID, 'Use Item Marker'), - wbEmpty(PKAM, 'Ambush Marker'), - wbStruct(PKDD, 'Dialogue Data', [ - wbFloat('FOV'), - wbFormIDCk('Topic', [DIAL, NULL]), - wbInteger('Flags', itU32, wbFlags([ - 'No Headtracking', - '', - '', - '', - '', - '', - '', - '', - 'Don''t Control Target Movement' - ])), - wbByteArray('Unused', 4), - wbInteger('Dialogue Type', itU32, wbEnum([ - 'Conversation', - 'Say To' - ])), - wbByteArray('Unknown', 4) - ], cpNormal, False, nil, 3), - wbStruct(PLD2, 'Location 2 (again??)', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, CHIP, CMNY, CCRD, IMOD]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]), - wbRStruct('OnBegin', [ - wbEmpty(POBA, 'OnBegin Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('OnEnd', [ - wbEmpty(POEA, 'OnEnd Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('OnChange', [ - wbEmpty(POCA, 'OnChange Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True) - ], False, nil, cpNormal, False, wbPACKAfterLoad); - - wbRecord(QUST, 'Quest', [ - wbEDIDReq, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, 'General', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Start game enabled', - {0x02} '', - {0x04} 'Allow repeated conversation topics', - {0x08} 'Allow repeated stages', - {0x10} 'Unknown 4' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused', 2), - wbFloat('Quest Delay') - ], cpNormal, True, nil, 3), - wbCTDAs, - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbInteger(INDX, 'Stage Index', itS16), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete Quest', - {0x02} 'Fail Quest' - ])), - wbCTDAs, - wbString(CNAM, 'Log Entry', 0, cpTranslate), - wbEmbeddedScriptReq, - wbFormIDCk(NAM0, 'Next Quest', [QUST]) - ], [])) - ], [])), - wbRArray('Objectives', wbRStruct('Objective', [ - wbInteger(QOBJ, 'Objective Index', itS32), - wbString(NNAM, 'Description', 0, cpNormal, True), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbFormIDCkNoReach('Target', [REFR, PGRE, PMIS, PBEA, ACRE, ACHR], True), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass Marker Ignores Locks' - ])), - wbByteArray('Unused', 3) - ]), - wbCTDAs - ], [])) - ], [])) - ]); - - wbHeadPartIndexEnum := wbEnum([ - 'Head', - 'Ears', - 'Mouth', - 'Teeth Lower', - 'Teeth Upper', - 'Tongue', - 'Left Eye', - 'Right Eye' - ]); - - wbBodyPartIndexEnum := wbEnum([ - 'Upper Body', - 'Left Hand', - 'Right Hand', - 'Upper Body Texture' - ]); - - wbRecord(RACE, 'Race', [ - wbEDIDReq, - wbFULLReq, - wbDESCReq, - wbXNAMs, - wbStruct(DATA, '', [ - wbArrayS('Skill Boosts', wbStructSK([0], 'Skill Boost', [ - wbInteger('Skill', itS8, wbActorValueEnum), - wbInteger('Boost', itS8) - ]), 7), - wbByteArray('Unused', 2), - wbFloat('Male Height'), - wbFloat('Female Height'), - wbFloat('Male Weight'), - wbFloat('Female Weight'), - wbInteger('Flags', itU32, wbFlags([ - 'Playable', - '', - 'Child' - ])) - ], cpNormal, True), - wbFormIDCk(ONAM, 'Older', [RACE]), - wbFormIDCk(YNAM, 'Younger', [RACE]), - wbEmpty(NAM2, 'Unknown Marker', cpNormal, True), - wbArray(VTCK, 'Voices', wbFormIDCk('Voice', [VTYP]), ['Male', 'Female'], cpNormal, True), - wbArray(DNAM, 'Default Hair Styles', wbFormIDCk('Default Hair Style', [HAIR, NULL]), ['Male', 'Female'], cpNormal, True), - wbArray(CNAM, 'Default Hair Colors', wbInteger('Default Hair Color', itU8, wbEnum([ - 'Bleached', - 'Brown', - 'Chocolate', - 'Platinum', - 'Cornsilk', - 'Suede', - 'Pecan', - 'Auburn', - 'Ginger', - 'Honey', - 'Gold', - 'Rosewood', - 'Black', - 'Chestnut', - 'Steel', - 'Champagne' - ])), ['Male', 'Female'], cpNormal, True), - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - wbByteArray(ATTR, 'Unused', 0, cpNormal, True), - wbRStruct('Head Data', [ - wbEmpty(NAM0, 'Head Data Marker', cpNormal, True), - wbRStruct('Male Head Data', [ - wbEmpty(MNAM, 'Male Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbHeadPartIndexEnum), - wbMODLReq, - wbICON - ], [], cpNormal, False, nil, False, nil, wbHeadPartsAfterSet), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Head Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbHeadPartIndexEnum), - wbMODLReq, - wbICON - ], [], cpNormal, False, nil, False, nil, wbHeadPartsAfterSet), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Body Data', [ - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbICON, - wbMODLReq - ], []), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbICON, - wbMODLReq - ], []), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbArrayS(HNAM, 'Hairs', wbFormIDCk('Hair', [HAIR]), 0, cpNormal, True), - wbArrayS(ENAM, 'Eyes', wbFormIDCk('Eye', [EYES]), 0, cpNormal, True), - wbRStruct('FaceGen Data', [ - wbRStruct('Male FaceGen Data', [ - wbEmpty(MNAM, 'Male Data Marker', cpNormal, True), - wbFaceGen, - wbInteger(SNAM, 'Unknown', itU16, nil, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female FaceGen Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbFaceGen, - wbInteger(SNAM, 'Unknown', itU16, nil, cpNormal, True) // will effectivly overwrite the SNAM from the male :) - ], [], cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(REFR, 'Placed Object', [ - wbEDID, - { - wbStruct(RCLR, 'Linked Reference Color (Old Format?)', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ], cpIgnore),} - wbByteArray(RCLR, 'Unused', 0, cpIgnore), - wbFormIDCk(NAME, 'Base', [TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, LVLN, LVLC, - MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, CHIP, - MSTT, NOTE, PWAT, SCOL, TACT, TERM, TXST, CCRD, IMOD, CMNY], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- ?? ---} - wbXRGD, - wbXRGB, - - {--- Primitive ---} - wbStruct(XPRM, 'Primitive', [ - wbStruct('Bounds', [ - wbFloat('X', cpNormal, True, 2, 4), - wbFloat('Y', cpNormal, True, 2, 4), - wbFloat('Z', cpNormal, True, 2, 4) - ]), - wbStruct('Color', [ - {84} wbFloat('Red', cpNormal, False, 255, 0), - {88} wbFloat('Green', cpNormal, False, 255, 0), - {92} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - wbFloat('Unknown'), - wbInteger('Type', itU32, wbEnum([ - 'None', - 'Box', - 'Sphere', - 'Portal Box' - ])) - ]), - wbInteger(XTRI, 'Collision Layer', itU32, wbEnum([ - 'Unidentified', - 'Static', - 'AnimStatic', - 'Transparent', - 'Clutter', - 'Weapon', - 'Projectile', - 'Spell', - 'Biped', - 'Trees', - 'Props', - 'Water', - 'Trigger', - 'Terrain', - 'Trap', - 'Non Collidable', - 'Cloud Trap', - 'Ground', - 'Portal', - 'Debris Small', - 'Debris Large', - 'Acustic Space', - 'Actor Zone', - 'Projectile Zone', - 'Gas Trap', - 'Shell Casing', - 'Transparent Small', - 'Invisible Wall', - 'Transparent Small Anim', - 'Dead Bip', - 'Char Controller', - 'Avoid Box', - 'Collision Box', - 'Camera Sphere', - 'Door Detection', - 'Camera Pick', - 'Item Pick', - 'Line Of Sight', - 'Path Pick', - 'Custom Pick 1', - 'Custom Pick 2', - 'Spell Explosion', - 'Dropping Pick' - ])), - wbEmpty(XMBP, 'MultiBound Primitive Marker'), - - {--- Bound Contents ---} - - {--- Bound Data ---} - wbStruct(XMBO, 'Bound Half Extents', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - - {--- Teleport ---} - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot, - wbInteger('Flags', itU32, wbFlags([ - 'No Alarm' - ])) - ]), - - {--- Map Data ---} - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Data'), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To', - {0x04} '"Show All" Hidden' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([ - 'None', - 'City', - 'Settlement', - 'Encampment', - 'Natural Landmark', - 'Cave', - 'Factory', - 'Monument', - 'Military', - 'Office', - 'Town Ruins', - 'Urban Ruins', - 'Sewer Ruins', - 'Metro', - 'Vault' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(WMI1, 'Reputation', [REPU]) - ], []), - - {--- Audio Data ---} - wbRStruct('Audio Data', [ - wbEmpty(MMRK, 'Audio Marker'), - wbUnknown(FULL), - wbFormIDCk(CNAM, 'Audio Location', [ALOC]), - wbInteger(BNAM, 'Flags', itU32, wbFlags(['Use Controller Values'])), - wbFloat(MNAM, 'Layer 2 Trigger %', cpNormal, True, 100), - wbFloat(NNAM, 'Layer 3 Trigger %', cpNormal, True, 100) - ], []), - - wbInteger(XSRF, 'Special Rendering Flags', itU32, wbFlags([ - 'Unknown 0', - 'Imposter', - 'Use Full Shader in LOD' - ])), - wbByteArray(XSRD, 'Special Rendering Data', 4), - - {--- X Target Data ---} - wbFormIDCk(XTRG, 'Target', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA], True), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Radio ---} - wbStruct(XRDO, 'Radio Data', [ - wbFloat('Range Radius'), - wbInteger('Broadcast Range Type', itU32, wbEnum([ - 'Radius', - 'Everywhere', - 'Worldspace and Linked Interiors', - 'Linked Interiors', - 'Current Cell Only' - ])), - wbFloat('Static Percentage'), - wbFormIDCkNoReach('Position Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, NULL]) - ]), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Lock ---} - wbStruct(XLOC, 'Lock Data', [ - wbInteger('Level', itU8), - wbByteArray('Unused', 3), - wbFormIDCkNoReach('Key', [KEYM, NULL]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3), - wbByteArray('Unknown', 8) - ], cpNormal, False, nil, 5), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - wbFloat(XRAD, 'Radiation'), - wbFloat(XCHG, 'Charge'), - wbRStruct('Ammo', [ - wbFormIDCk(XAMT, 'Type', [AMMO], False, cpNormal, True), - wbInteger(XAMC, 'Count', itS32, nil, cpNormal, True) - ], []), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Lit Water ---} - wbRArrayS('Lit Water', - wbFormIDCk(XLTW, 'Water', [REFR]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - wbString(XATO, 'Activation Prompt'), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - wbEmpty(ONAM, 'Open by Default'), - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- Generated Data ---} - wbStruct(XNDP, 'Navigation Door Link', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbInteger('Teleport Marker Triangle', itS16, wbREFRNavmeshTriangleToStr, wbStringToInt), - wbByteArray('Unused', 2) - ]), - - wbArray(XPOD, 'Portal Data', wbFormIDCk('Room', [REFR, NULL]), 2), - wbStruct(XPTL, 'Portal Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - - wbInteger(XSED, 'SpeedTree Seed', itU8), - - wbRStruct('Room Data', [ - wbStruct(XRMR, 'Header', [ - wbInteger('Linked Rooms Count', itU16), - wbByteArray('Unknown', 2) - ]), - wbRArrayS('Linked Rooms', - wbFormIDCk(XLRM, 'Linked Room', [REFR]) - ) - ], []), - - wbStruct(XOCP, 'Occlusion Plane Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - wbArray(XORD, 'Linked Occlusion Planes', wbFormIDCk('Plane', [REFR, NULL]), [ - 'Right', - 'Left', - 'Bottom', - 'Top' - ]), - - wbXLOD, - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - - wbRecord(REGN, 'Region', [ - wbEDID, - wbICON, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCkNoReach(WNAM, 'Worldspace', [WRLD]), - - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad) - ], [])), - - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0}'', - {1}'', - {2}'Objects', - {3}'Weather', - {4}'Map', - {5}'Land', - {6}'Grass', - {7}'Sound', - {8}'Imposter', - {9}'' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused') - ], cpNormal, True), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, STAT, LTEX]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unused', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unused', 2), - wbByteArray('Unknown', 4) - ]), 0, nil, nil, cpNormal, False, wbREGNObjectsDontShow), - - {--- Map ---} - wbString(RDMP, 'Map Name', 0, cpTranslate, False, wbREGNMapDontShow), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unknown',4) - ]), 0, cpNormal, False, nil, nil, wbREGNGrassDontShow), - - {--- Sound ---} - wbInteger(RDMD, 'Music Type', itU32, wbMusicEnum, cpIgnore, False, False, wbNeverShow), - wbFormIDCk(RDMO, 'Music', [MUSC], False, cpNormal, False, wbREGNSoundDontShow), - wbFormIDCk(RDSI, 'Incidental MediaSet', [MSET], False, cpNormal, False, wbREGNSoundDontShow), - wbRArray('Battle MediaSets', wbFormIDCk(RDSB, 'Battle MediaSet', [MSET]), cpNormal, False, nil, nil, wbREGNSoundDontShow), - wbArrayS(RDSD, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Flags', itU32, wbFlags([ - 'Pleasant', - 'Cloudy', - 'Rainy', - 'Snowy' - ])), - wbInteger('Chance', itU32, wbScaledInt4ToStr, wbScaledInt4ToInt) - ]), 0, cpNormal, False, nil, nil, wbREGNSoundDontShow), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32), - wbFormIDCk('Global', [GLOB, NULL]) - ]), 0, cpNormal, False, nil, nil, wbREGNWeatherDontShow), - - {--- Imposter ---} - wbArrayS(RDID, 'Imposters', wbFormIDCk('Imposter', [REFR]), 0, cpNormal, False, nil, nil, wbREGNImposterDontShow) - ], [])) - ], True); - - wbRecord(SOUN, 'Sound', [ - wbEDIDReq, - wbOBNDReq, - wbString(FNAM, 'Sound Filename'), - wbInteger(RNAM, 'Random Chance %', itU8), - wbRUnion('Sound Data', [ - wbStruct(SNDD, 'Sound Data', [ - wbInteger('Minimum Attentuation Distance', itU8, wbMul(5)), - wbInteger('Maximum Attentuation Distance', itU8, wbMul(100)), - wbInteger('Frequency Adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU32, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE', - {0x0100} 'Dialogue Sound', - {0x0200} 'Envelope Fast', - {0x0400} 'Envelope Slow', - {0x0800} '2D Radius', - {0x1000} 'Mute When Submerged', - {0x2000} 'Start at Random Position' - ])), - wbInteger('Static attentuation cdB', itS16), - wbInteger('Stop time ', itU8), - wbInteger('Start time ', itU8), - wbArray('Attenuation Curve', wbInteger('Point', itS16), 5), - wbInteger('Reverb Attenuation Control', itS16), - wbInteger('Priority', itS32), -// wbByteArray('Unknown', 8) - wbInteger('x', itS32), - wbInteger('y', itS32) - - ], cpNormal, True), - wbStruct(SNDX, 'Sound Data', [ - wbInteger('Minimum attentuation distance', itU8, wbMul(5)), - wbInteger('Maximum attentuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU32, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE', - {0x0100} 'Dialogue Sound', - {0x0200} 'Envelope Fast', - {0x0400} 'Envelope Slow', - {0x0800} '2D Radius', - {0x1000} 'Mute When Submerged' - ])), - wbInteger('Static attentuation cdB', itS16), - wbInteger('Stop time ', itU8), - wbInteger('Start time ', itU8) - ], cpNormal, True) - ], [], cpNormal, True), - wbArray(ANAM, 'Attenuation Curve', wbInteger('Point', itS16), 5, nil, nil, cpNormal, False, wbNeverShow), - wbInteger(GNAM, 'Reverb Attenuation Control', itS16, nil, cpNormal, False, False, wbNeverShow), - wbInteger(HNAM, 'Priority', itS32, nil, cpNormal, False, False, wbNeverShow) - ], False, nil, cpNormal, False, wbSOUNAfterLoad); - - wbRecord(SPEL, 'Actor Effect', [ - wbEDIDReq, - wbFULL, - wbStruct(SPIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Actor Effect', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison', - {6} '', - {7} '', - {8} '', - {9} '', - {10} 'Addiction' - ])), - wbInteger('Cost (Unused)', itU32), - wbInteger('Level (Unused)', itU32, wbEnum([ - {0} 'Unused' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x00000001} 'No Auto-Calc', - {0x00000002} 'Immune to Silence 1?', - {0x00000004} 'PC Start Effect', - {0x00000008} 'Immune to Silence 2?', - {0x00000010} 'Area Effect Ignores LOS', - {0x00000020} 'Script Effect Always Applies', - {0x00000040} 'Disable Absorb/Reflect', - {0x00000080} 'Force Touch Explode' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(STAT, 'Static', [ - wbEDIDReq, - wbOBNDReq, - wbMODL, - wbInteger(BRUS, 'Passthrough Sound', itS8, wbEnum([ - 'BushA', - 'BushB', - 'BushC', - 'BushD', - 'BushE', - 'BushF', - 'BushG', - 'BushH', - 'BushI', - 'BushJ' - ], [ - -1, 'NONE' - ])), - wbFormIDCk(RNAM, 'Sound - Looping/Random', [SOUN]) - ]); - - wbRecord(TES4, 'Main File Header', [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), - wbByteArray(DELE, 'Unknown', 0, cpIgnore), - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - wbByteArray(DATA, 'Unused', 8, cpIgnore, True) - ], [ONAM])), - wbArray(ONAM, 'Overriden Forms', wbFormIDCk('Form', [REFR, ACHR, ACRE, PMIS, PBEA, PGRE, LAND, NAVM]), 0, nil, nil, cpNormal, False, wbTES4ONAMDontShow), - wbByteArray(SCRN, 'Screenshot') - ], True, nil, cpNormal, True, wbRemoveOFST); - - wbRecord(TREE, 'Tree', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbICONReq, - wbArrayS(SNAM, 'SpeedTree Seeds', wbInteger('SpeedTree Seed', itU32), 0, cpNormal, True), - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Leaf Curvature'), - wbFloat('Minimum Leaf Angle'), - wbFloat('Maximum Leaf Angle'), - wbFloat('Branch Dimming Value'), - wbFloat('Leaf Dimming Value'), - wbInteger('Shadow Radius', itS32), - wbFloat('Rock Speed'), - wbFloat('Rustle Speed') - ], cpNormal, True), - wbStruct(BNAM, 'Billboard Dimensions', [ - wbFloat('Width'), - wbFloat('Height') - ], cpNormal, True) - ]); -end; - -procedure DefineFNVf; -begin - wbRecord(WATR, 'Water', [ - wbEDIDReq, - wbFULL, - wbString(NNAM, 'Noise Map', 0, cpNormal, True), - wbInteger(ANAM, 'Opacity', itU8, nil, cpNormal, True), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0}'Causes Damage', - {1}'Reflective' - ]), cpNormal, True), - wbString(MNAM, 'Material ID', 0, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbFormIDCk(XNAM, 'Actor Effect', [SPEL]), - wbInteger(DATA, 'Damage', itU16, nil, cpNormal, True, True), - wbRUnion('Visual Data', [ - wbStruct(DNAM, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Water Properties - Sun Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unused', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbByteArray('Unused', 4), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Noise Properties - Normals - Noise Scale'), - wbFloat('Noise Properties - Noise Layer One - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Two - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Three - Wind Direction'), - wbFloat('Noise Properties - Noise Layer One - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Two - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Three - Wind Speed'), - wbFloat('Noise Properties - Normals - Depth Falloff Start'), - wbFloat('Noise Properties - Normals - Depth Falloff End'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Noise Properties - Normals - UV Scale'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Distortion Amount'), - wbFloat('Water Properties - Shininess'), - wbFloat('Water Properties - Reflection HDR Multiplier'), - wbFloat('Water Properties - Light Radius'), - wbFloat('Water Properties - Light Brightness'), - wbFloat('Noise Properties - Noise Layer One - UV Scale'), - wbFloat('Noise Properties - Noise Layer Two - UV Scale'), - wbFloat('Noise Properties - Noise Layer Three - UV Scale'), - wbFloat('Noise Properties - Noise Layer One - Amplitude Scale'), - wbFloat('Noise Properties - Noise Layer Two - Amplitude Scale'), - wbFloat('Noise Properties - Noise Layer Three - Amplitude Scale') - ], cpNormal, True, nil, 46), - wbStruct(DATA, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Water Properties - Sun Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unused', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbByteArray('Unused', 4), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Noise Properties - Normals - Noise Scale'), - wbFloat('Noise Properties - Noise Layer One - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Two - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Three - Wind Direction'), - wbFloat('Noise Properties - Noise Layer One - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Two - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Three - Wind Speed'), - wbFloat('Noise Properties - Normals - Depth Falloff Start'), - wbFloat('Noise Properties - Normals - Depth Falloff End'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Noise Properties - Normals - UV Scale'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Distortion Amount'), - wbFloat('Water Properties - Shininess'), - wbFloat('Water Properties - Reflection HDR Multiplier'), - wbFloat('Water Properties - Light Radius'), - wbFloat('Water Properties - Light Brightness'), - wbFloat('Noise Properties - Noise Layer One - UV Scale'), - wbFloat('Noise Properties - Noise Layer Two - UV Scale'), - wbFloat('Noise Properties - Noise Layer Three - UV Scale'), - wbEmpty('Noise Properties - Noise Layer One - Amplitude Scale'), - wbEmpty('Noise Properties - Noise Layer Two - Amplitude Scale'), - wbEmpty('Noise Properties - Noise Layer Three - Amplitude Scale'), - wbInteger('Damage (Old Format)', itU16) - ], cpNormal, True) - ], [], cpNormal, True), - wbStruct(GNAM, 'Related Waters (Unused)', [ - wbFormIDCk('Daytime', [WATR, NULL]), - wbFormIDCk('Nighttime', [WATR, NULL]), - wbFormIDCk('Underwater', [WATR, NULL]) - ], cpNormal, True) - ], False, nil, cpNormal, False, wbWATRAfterLoad); - - wbRecord(WEAP, 'Weapon', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbEITM, - wbInteger(EAMT, 'Enchantment Charge Amount', itS16), - wbFormIDCkNoReach(NAM0, 'Ammo', [AMMO, FLST]), - wbDEST, - wbREPL, - wbETYPReq, - wbBIPL, - wbYNAM, - wbZNAM, - wbRStruct('Shell Casing Model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbRStruct('Scope Model', [ - wbString(MOD3, 'Model Filename'), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S - ], []), - wbFormIDCK(EFSD, 'Scope Effect', [EFSH]), - wbRStruct('World Model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(MWD1, 'Model - Mod 1'), - wbString(MWD2, 'Model - Mod 2'), - wbString(MWD3, 'Model - Mod 1 and 2'), - wbString(MWD4, 'Model - Mod 3'), - wbString(MWD5, 'Model - Mod 1 and 3'), - wbString(MWD6, 'Model - Mod 2 and 3'), - wbString(MWD7, 'Model - Mod 1, 2 and 3'), - {wbRStruct( 'Model with Mods', [ - wbString(MWD1, 'Mod 1'), - wbString(MWD2, 'Mod 2'), - wbString(MWD3, 'Mod 1 and 2'), - wbString(MWD4, 'Mod 3'), - wbString(MWD5, 'Mod 1 and 3'), - wbString(MWD6, 'Mod 2 and 3'), - wbString(MWD7, 'Mod 1, 2 and 3') - ], [], cpNormal, False, nil, True),} - - wbString(VANM, 'VATS Attack Name'), - wbString(NNAM, 'Embedded Weapon Node'), - - wbFormIDCk(INAM, 'Impact DataSet', [IPDS]), - wbFormIDCk(WNAM, '1st Person Model', [STAT]), - wbFormIDCk(WNM1, '1st Person Model - Mod 1', [STAT]), - wbFormIDCk(WNM2, '1st Person Model - Mod 2', [STAT]), - wbFormIDCk(WNM3, '1st Person Model - Mod 1 and 2', [STAT]), - wbFormIDCk(WNM4, '1st Person Model - Mod 3', [STAT]), - wbFormIDCk(WNM5, '1st Person Model - Mod 1 and 3', [STAT]), - wbFormIDCk(WNM6, '1st Person Model - Mod 2 and 3', [STAT]), - wbFormIDCk(WNM7, '1st Person Model - Mod 1, 2 and 3', [STAT]), - {wbRStruct('1st Person Models with Mods', [ - wbFormIDCk(WNM1, 'Mod 1', [STAT]), - wbFormIDCk(WNM2, 'Mod 2', [STAT]), - wbFormIDCk(WNM3, 'Mod 1 and 2', [STAT]), - wbFormIDCk(WNM4, 'Mod 3', [STAT]), - wbFormIDCk(WNM5, 'Mod 1 and 3', [STAT]), - wbFormIDCk(WNM6, 'Mod 2 and 3', [STAT]), - wbFormIDCk(WNM7, 'Mod 1, 2 and 3', [STAT]) - ], [], cpNormal, False, nil, True),} - wbFormIDCk(WMI1, 'Weapon Mod 1', [IMOD]), - wbFormIDCk(WMI2, 'Weapon Mod 2', [IMOD]), - wbFormIDCk(WMI3, 'Weapon Mod 3', [IMOD]), - {wbRStruct('Weapon Mods', [ - wbFormIDCk(WMI1, 'Mod 1', [IMOD]), - wbFormIDCk(WMI2, 'Mod 2', [IMOD]), - wbFormIDCk(WMI3, 'Mod 3', [IMOD]) - ], [], cpNormal, False, nil, True),} - wbRStruct('Sound - Gun', [ - wbFormIDCk(SNAM, 'Shoot 3D', [SOUN]), - wbFormIDCk(SNAM, 'Shoot Dist', [SOUN]) - ], []), - //wbFormIDCk(SNAM, 'Sound - Gun - Shoot 3D', [SOUN]), - //wbFormIDCk(SNAM, 'Sound - Gun - Shoot Dist', [SOUN]), - wbFormIDCk(XNAM, 'Sound - Gun - Shoot 2D', [SOUN]), - wbFormIDCk(NAM7, 'Sound - Gun - Shoot 3D Looping', [SOUN]), - wbFormIDCk(TNAM, 'Sound - Melee - Swing / Gun - No Ammo', [SOUN]), - wbFormIDCk(NAM6, 'Sound - Block', [SOUN]), - wbFormIDCk(UNAM, 'Sound - Idle', [SOUN]), - wbFormIDCk(NAM9, 'Sound - Equip', [SOUN]), - wbFormIDCk(NAM8, 'Sound - Unequip', [SOUN]), - wbRStruct('Sound - Mod 1', [ - wbFormIDCk(WMS1, 'Shoot 3D', [SOUN]), - wbFormIDCk(WMS1, 'Shoot Dist', [SOUN]) - ], []), - //wbFormIDCk(WMS1, 'Sound - Mod 1 - Shoot 3D', [SOUN]), - //wbFormIDCk(WMS1, 'Sound - Mod 1 - Shoot Dist', [SOUN]), - wbFormIDCk(WMS2, 'Sound - Mod 1 - Shoot 2D', [SOUN]), - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbInteger('Health', itS32), - wbFloat('Weight'), - wbInteger('Base Damage', itS16), - wbInteger('Clip Size', itU8) - ], cpNormal, True), - wbStruct(DNAM, '', [ - {00} wbInteger('Animation Type', itU32, wbWeaponAnimTypeEnum), - {04} wbFloat('Animation Multiplier'), - {08} wbFloat('Reach'), - {12} wbInteger('Flags 1', itU8, wbFlags([ - 'Ignores Normal Weapon Resistance', - 'Is Automatic', - 'Has Scope', - 'Can''t Drop', - 'Hide Backpack', - 'Embedded Weapon', - 'Don''t Use 1st Person IS Animations', - 'Non-Playable' - ])), - {13} wbInteger('Grip Animation', itU8, wbEnum([ - ], [ - 230, 'HandGrip1', - 231, 'HandGrip2', - 232, 'HandGrip3', - 233, 'HandGrip4', - 234, 'HandGrip5', - 235, 'HandGrip6', - 255, 'DEFAULT' - ])), - {14} wbInteger('Ammo Use', itU8), - {15} wbInteger('Reload Animation', itU8, wbReloadAnimEnum), - {16} wbFloat('Min Spread'), - {20} wbFloat('Spread'), - {24} wbFloat('Unknown'), - {28} wbFloat('Sight FOV'), - {32} wbFloat, - {36} wbFormIDCk('Projectile', [PROJ, NULL]), - {40} wbInteger('Base VATS To-Hit Chance', itU8), - {41} wbInteger('Attack Animation', itU8, wbEnum([ - ], [ - 26, 'AttackLeft', - 32, 'AttackRight', - 38, 'Attack3', - 44, 'Attack4', - 50, 'Attack5', - 56, 'Attack6', - 62, 'Attack7', - 68, 'Attack8', - 144, 'Attack9', - 74, 'AttackLoop', - 80, 'AttackSpin', - 86, 'AttackSpin2', - 114, 'AttackThrow', - 120, 'AttackThrow2', - 126, 'AttackThrow3', - 132, 'AttackThrow4', - 138, 'AttackThrow5', - 150, 'AttackThrow6', - 156, 'AttackThrow7', - 162, 'AttackThrow8', - 102, 'PlaceMine', - 108, 'PlaceMine2', - 255, 'DEFAULT' - ])), - {42} wbInteger('Projectile Count', itU8), - {43} wbInteger('Embedded Weapon - Actor Value', itU8, wbEnum([ - {00} 'Perception', - {01} 'Endurance', - {02} 'Left Attack', - {03} 'Right Attack', - {04} 'Left Mobility', - {05} 'Right Mobilty', - {06} 'Brain' - ])), - {44} wbFloat('Min Range'), - {48} wbFloat('Max Range'), - {52} wbInteger('On Hit', itU32, wbEnum([ - 'Normal formula behavior', - 'Dismember Only', - 'Explode Only', - 'No Dismember/Explode' - ])), - {56} wbInteger('Flags 2', itU32, wbFlags([ - {0x00000001}'Player Only', - {0x00000002}'NPCs Use Ammo', - {0x00000004}'No Jam After Reload', - {0x00000008}'Override - Action Points', - {0x00000010}'Minor Crime', - {0x00000020}'Range - Fixed', - {0x00000040}'Not Used In Normal Combat', - {0x00000080}'Override - Damage to Weapon Mult', - {0x00000100}'Don''t Use 3rd Person IS Animations', - {0x00000200}'Short Burst', - {0x00000400}'Rumble Alternate', - {0x00000800}'Long Burst', - {0x00001000}'Scope has NightVision', - {0x00002000}'Scope from Mod' - ])), - {60} wbFloat('Animation Attack Multiplier'), - {64} wbFloat('Fire Rate'), - {68} wbFloat('Override - Action Points'), - {72} wbFloat('Rumble - Left Motor Strength'), - {76} wbFloat('Rumble - Right Motor Strength'), - {80} wbFloat('Rumble - Duration'), - {84} wbFloat('Override - Damage to Weapon Mult'), - {88} wbFloat('Attack Shots/Sec'), - {92} wbFloat('Reload Time'), - {96} wbFloat('Jam Time'), - {100} wbFloat('Aim Arc'), - {104} wbInteger('Skill', itS32, wbActorValueEnum), - {108} wbInteger('Rumble - Pattern', itU32, wbEnum([ - 'Constant', - 'Square', - 'Triangle', - 'Sawtooth' - ])), - {112} wbFloat('Rumble - Wavelength'), - {116} wbFloat('Limb Dmg Mult'), - {120} wbInteger('Resist Type', itS32, wbActorValueEnum), - {124} wbFloat('Sight Usage'), - {128} wbFloat('Semi-Automatic Fire Delay Min'), - {132} wbFloat('Semi-Automatic Fire Delay Max'), - wbFloat, - wbInteger('Effect - Mod 1', itU32, wbModEffectEnum), - wbInteger('Effect - Mod 2', itU32, wbModEffectEnum), - wbInteger('Effect - Mod 3', itU32, wbModEffectEnum), - wbFloat('Value A - Mod 1'), - wbFloat('Value A - Mod 2'), - wbFloat('Value A - Mod 3'), - wbInteger('Power Attack Animation Override', itU32, wbEnum([ - ], [ - 0, '0?', - 97, 'AttackCustom1Power', - 98, 'AttackCustom2Power', - 99, 'AttackCustom3Power', - 100, 'AttackCustom4Power', - 101, 'AttackCustom5Power', - 255, 'DEFAULT' - ])), - wbInteger('Strength Req', itU32), - wbByteArray('Unknown', 1), - wbInteger('Reload Animation - Mod', itU8, wbReloadAnimEnum), - wbByteArray('Unknown', 2), - wbFloat('Regen Rate'), - wbFloat('Kill Impulse'), - wbFloat('Value B - Mod 1'), - wbFloat('Value B - Mod 2'), - wbFloat('Value B - Mod 3'), - wbFloat('Impulse Dist'), - wbInteger('Skill Req', itU32) - ], cpNormal, True, nil, 36), - - wbStruct(CRDT, 'Critical Data', [ - {00} wbInteger('Critical Damage', itU16), - {09} wbByteArray('Unused', 2), - {04} wbFloat('Crit % Mult'), - {08} wbInteger('Flags', itU8, wbFlags([ - 'On Death' - ])), - {09} wbByteArray('Unused', 3), - {12} wbFormIDCk('Effect', [SPEL, NULL]) - ], cpNormal, True), - wbStruct(VATS, 'VATS', [ - wbFormIDCk('Effect',[SPEL, NULL]), - wbFloat('Skill'), - wbFloat('Dam. Mult'), - wbFloat('AP'), - wbInteger('Silent', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Mod Required', itU8, wbEnum(['No', 'Yes'])), - wbByteArray('Unused', 2) - ]), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ], True, nil, cpNormal, False, wbWEAPAfterLoad); - - if wbSimpleRecords then - wbRecord(WRLD, 'Worldspace', [ - wbEDIDReq, - wbFULL, - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbInteger(PNAM, 'Flags', itU16, wbFlags([ - {0x00000001}'Use Land Data', - {0x00000002}'Use LOD Data', - {0x00000004}'Use Map Data', - {0x00000008}'Use Water Data', - {0x00000010}'Use Climate Data', - {0x00000020}'Use Image Space Data' - ], True), cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset') - ], cpNormal, True), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ // LoadForm supports a DWord here, but only first byte would be used. - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} '', - {0x08} '', - {0x10} 'No LOD Water', - {0x20} 'No LOD Noise', - {0x40} 'Don''t Allow NPC Fall Damage', - {0x80} 'Needs Water Adjustment' - ]), cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow', 0, cpNormal, True), - wbString(XNAM, 'Water Noise Texture', 0, cpNormal, True), - wbRArrayS('Swapped Impacts', wbStructExSK(IMPS, [0, 1], [2], 'Swapped Impact', [ - wbInteger('Material Type', itU32, wbImpactMaterialTypeEnum), - wbFormIDCkNoReach('Old', [IPCT]), - wbFormIDCk('New', [IPCT, NULL]) - ])), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbByteArray(OFST, 'Offset Data') - ], False, nil, cpNormal, False, wbRemoveOFST) - else - wbRecord(WRLD, 'Worldspace', [ - wbEDIDReq, - wbFULL, - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbInteger(PNAM, 'Flags', itU16, wbFlags([ - {0x00000001}'Use Land Data', - {0x00000002}'Use LOD Data', - {0x00000004}'Use Map Data', - {0x00000008}'Use Water Data', - {0x00000010}'Use Climate Data', - {0x00000020}'Use Image Space Data' // in order to use this "Image Space" needs to be NULL. - // Other parent flags are checked before the form value. - ], True), cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset') - ], cpNormal, True), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ // LoadForm supports a DWord here, but only first byte would be used. - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} '', - {0x08} '', - {0x10} 'No LOD Water', - {0x20} 'No LOD Noise', - {0x40} 'Don''t Allow NPC Fall Damage', - {0x80} 'Needs Water Adjustment' - ]), cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow', 0, cpNormal, True), - wbString(XNAM, 'Water Noise Texture', 0, cpNormal, True), - wbRArrayS('Swapped Impacts', wbStructExSK(IMPS, [0, 1], [2], 'Swapped Impact', [ - wbInteger('Material Type', itU32, wbImpactMaterialTypeEnum), - wbFormIDCkNoReach('Old', [IPCT]), - wbFormIDCk('New', [IPCT, NULL]) - ])), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbArray(OFST, 'Offset Data', wbArray('Rows', wbInteger('Offset', itU32), wbOffsetDataColsCounter), 0) // cannot be saved by GECK - ], False, nil, cpNormal, False, wbRemoveOFST); - - wbRecord(WTHR, 'Weather', [ - wbEDIDReq, - wbFormIDCk(_0_IAD, 'Sunrise Image Space Modifier', [IMAD]), - wbFormIDCk(_1_IAD, 'Day Image Space Modifier', [IMAD]), - wbFormIDCk(_2_IAD, 'Sunset Image Space Modifier', [IMAD]), - wbFormIDCk(_3_IAD, 'Night Image Space Modifier', [IMAD]), - wbFormIDCk(_4_IAD, 'Unknown', [IMAD]), - wbFormIDCk(_5_IAD, 'Unknown', [IMAD]), - wbString(DNAM, 'Cloud Textures - Layer 0', 0, cpNormal, True), - wbString(CNAM, 'Cloud Textures - Layer 1', 0, cpNormal, True), - wbString(ANAM, 'Cloud Textures - Layer 2', 0, cpNormal, True), - wbString(BNAM, 'Cloud Textures - Layer 3', 0, cpNormal, True), - wbMODL, - wbByteArray(LNAM, 'Unknown', 4, cpNormal, True), - wbArray(ONAM, 'Cloud Speed', wbInteger('Layer', itU8{, wbDiv(2550)}), 4, nil, nil, cpNormal, True), - wbArray(PNAM, 'Cloud Layer Colors', - wbArray('Layer', - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night', 'High Noon', 'Midnight'] - ), - 4), - wbArray(NAM0, 'Colors by Types/Times', - wbArray('Type', - wbStruct('Time', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night', 'High Noon', 'Midnight'] - ), - ['Sky-Upper','Fog','Unused','Ambient','Sunlight','Sun','Stars','Sky-Lower','Horizon','Unused'] - , cpNormal, True), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day - Near'), - wbFloat('Day - Far'), - wbFloat('Night - Near'), - wbFloat('Night - Far'), - wbFloat('Day - Power'), - wbFloat('Night - Fower') - ], cpNormal, True), - wbByteArray(INAM, 'Unused', 304, cpIgnore, True), - wbStruct(DATA, '', [ - wbInteger('Wind Speed', itU8), - wbInteger('Cloud Speed (Lower)', itU8), - wbInteger('Cloud Speed (Upper)', itU8), - wbInteger('Trans Delta', itU8), - wbInteger('Sun Glare', itU8), - wbInteger('Sun Damage', itU8), - wbInteger('Precipitation - Begin Fade In', itU8), - wbInteger('Precipitation - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Weather Classification', itU8, wbWthrDataClassification), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]) - ], cpNormal, True), - wbRArray('Sounds', wbStruct(SNAM, 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Type', itU32, wbEnum([ - {0}'Default', - {1}'Precip', - {2}'Wind', - {3}'Thunder' - ])) - ])) - ]); - - wbRecord(IMOD, 'Item Mod', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbDESC, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ]) - ]); - - wbRecord(ALOC, 'Media Location Controller', [ - wbEDIDReq, - wbFULL, - wbByteArray(NAM1, 'Flags and Enums, messily combined'), - wbUnknown(NAM2), - wbUnknown(NAM3), - wbFloat(NAM4, 'Location Delay'), - wbInteger(NAM5, 'Day Start', itU32, wbAlocTime), - wbInteger(NAM6, 'Night Start', itU32, wbAlocTime), - wbFloat(NAM7, 'Retrigger Delay'), - wbRArrayS('Neutral Sets', - wbFormIDCk(HNAM, 'Media Set', [MSET]) - ), - wbRArrayS('Ally Sets', - wbFormIDCk(ZNAM, 'Media Set', [MSET]) - ), - wbRArrayS('Friend Sets', - wbFormIDCk(XNAM, 'Media Set', [MSET]) - ), - wbRArrayS('Enemy Sets', - wbFormIDCk(YNAM, 'Media Set', [MSET]) - ), - wbRArrayS('Location Sets', - wbFormIDCk(LNAM, 'Media Set', [MSET]) - ), - wbRArrayS('Battle Sets', - wbFormIDCk(GNAM, 'Media Set', [MSET]) - ), - wbFormIDCk(RNAM, 'Conditional Faction', [FACT]), - wbUnknown(FNAM) - ]); - - wbRecord(MSET, 'Media Set', [ - wbEDIDReq, - wbFULL, - wbInteger(NAM1, 'Type', itU32, wbEnum([ - 'Battle Set', - 'Location Set', - 'Dungeon Set', - 'Incidental Set' - ], [ - -1, 'No Set' - ])), - wbString(NAM2, 'Loop (B) / Battle (D) / Day Outer (L)'), - wbString(NAM3, 'Explore (D) / Day Middle (L)'), - wbString(NAM4, 'Suspense (D) / Day Inner (L)'), - wbString(NAM5, 'Night Outer (L)'), - wbString(NAM6, 'Night Middle (L)'), - wbString(NAM7, 'Night Inner (L)'), - wbFloat(NAM8, 'Loop dB (B) / Battle dB (D) / Day Outer dB (L)'), - wbFloat(NAM9, 'Explore dB (D) / Day Middle dB (L)'), - wbFloat(NAM0, 'Suspense dB (D) / Day Inner dB (L)'), - wbFloat(ANAM, 'Night Outer dB (L)'), - wbFloat(BNAM, 'Night Middle dB (L)'), - wbFloat(CNAM, 'Night Inner dB (L)'), - wbFloat(JNAM, 'Day Outer Boundary % (L)'), - wbFloat(KNAM, 'Day Middle Boundary % (L)'), - wbFloat(LNAM, 'Day Inner Boundary % (L)'), - wbFloat(MNAM, 'Night Outer Boundary % (L)'), - wbFloat(NNAM, 'Night Middle Boundary % (L)'), - wbFloat(ONAM, 'Night Inner Boundary % (L)'), - wbInteger(PNAM, 'Enable Flags', itU8, wbFlags([ - {0x01} 'Day Outer', - {0x02} 'Day Middle', - {0x04} 'Day Inner', - {0x08} 'Night Outer', - {0x10} 'Night Middle', - {0x20} 'Night Inner' - ])), - wbFloat(DNAM, 'Wait Time (B) / Minimum Time On (D,L) / Daytime Min (I)'), - wbFloat(ENAM, 'Loop Fade Out (B) / Looping/Random Crossfade Overlap (D,L) / Nighttime Min (I)'), - wbFloat(FNAM, 'Recovery Time (B) / Layer Crossfade Time (D,L) / Daytime Max (I)'), - wbFloat(GNAM, 'Nighttime Max (I)'), - wbFormIDCk(HNAM, 'Intro (B,D) / Daytime (I)', [SOUN]), - wbFormIDCk(INAM, 'Outro (B,D) / Nighttime (I)', [SOUN]), - wbUnknown(DATA) - ]); - - wbRecord(AMEF, 'Ammo Effect', [ - wbEDIDReq, - wbFULL, - wbStruct(DATA, 'Data', [ - wbInteger('Type', itU32, wbEnum([ - 'Damage Mod', - 'DR Mod', - 'DT Mod', - 'Spread Mod', - 'Weapon Condition Mod', - 'Fatigue Mod' - ])), - wbInteger('Operation', itU32, wbEnum([ - 'Add', - 'Multiply', - 'Subtract' - ])), - wbFloat('Value') - ]) - ]); - - wbRecord(CCRD, 'Caravan Card', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbYNAM, - wbZNAM, - wbRStruct('High Res Image', [ - wbString(TX00, 'Face'), - wbString(TX01, 'Back') - ], []), - wbRStruct('Card', [ - wbInteger(INTV, 'Suit', itU32, wbEnum([ - '', - 'Hearts', - 'Spades', - 'Diamonds', - 'Clubs', - 'Joker' - ])), - wbInteger(INTV, 'Value', itU32, wbEnum([ - '', - 'Ace', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '10', - '', - 'Jack', - 'Queen', - 'King', - 'Joker' - ])) - ], []), - wbInteger(DATA, 'Value', itU32) - ]); - - wbRecord(CDCK, 'Caravan Deck', [ - wbEDIDReq, - wbFULL, - wbRArrayS('Cards', - wbFormIDCk(CARD, 'Card', [CCRD]) - ), - wbInteger(DATA, 'Count (broken)', itU32) - ]); - - wbRecord(CHAL, 'Challenge', [ - wbEDIDReq, - wbFULL, - wbICON, - wbSCRI, - wbDESC, - wbStruct(DATA, 'Data', [ - wbInteger('Type', itU32, wbEnum([ - {00} 'Kill from a Form List', - {01} 'Kill a specific FormID', - {02} 'Kill any in a category', - {03} 'Hit an Enemy', - {04} 'Discover a Map Marker', - {05} 'Use an Item', - {06} 'Acquire an Item', - {07} 'Use a Skill', - {08} 'Do Damage', - {09} 'Use an Item from a List', - {10} 'Acquire an Item from a List', - {11} 'Miscellaneous Stat', - {12} 'Craft Using an Item', - {13} 'Scripted Challenge' - ])), - wbInteger('Threshold', itU32), - wbInteger('Flags', itU32, wbFlags([ - 'Start Disabled', - 'Recurring', - 'Show Zero Progress' - ])), - wbInteger('Interval', itU32), - wbByteArray('(depends on type)', 2), - wbByteArray('(depends on type)', 2), - wbByteArray('(depends on type)', 4) - ]), - wbFormID(SNAM, '(depends on type)'), - wbFormID(XNAM, '(depends on type)') - ]); - - wbRecord(CHIP, 'Casino Chip', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM - ]); - - wbRecord(CMNY, 'Caravan Money', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbYNAM, - wbZNAM, - wbInteger(DATA, 'Absolute Value', itU32) - ]); - - wbRecord(CSNO, 'Casino', [ - wbEDIDReq, - wbFULL, - wbStruct(DATA, 'Data', [ - wbFloat('Decks % Before Shuffle'), - wbFloat('BlackJack Payout Ratio'), - wbArray('Slot Reel Stops', wbInteger('Reel', itU32),[ - 'Symbol 1', - 'Symbol 2', - 'Symbol 3', - 'Symbol 4', - 'Symbol 5', - 'Symbol 6', - 'Symbol W' - ]), - wbInteger('Number of Decks', itU32), - wbInteger('Max Winnings', itU32), - wbFormIDCk('Currency', [CHIP]), - wbFormIDCk('Casino Winnings Quest', [QUST]), - wbInteger('Flags', itU32, wbFlags([ - 'Dealer Stay on Soft 17' - ])) - ]), - wbRStruct('Casino Chip Models', [ - wbString(MODL, '$1 Chip'), - wbString(MODL, '$5 Chip'), - wbString(MODL, '$10 Chip'), - wbString(MODL, '$25 Chip'), - wbString(MODL, '$100 Chip'), - wbString(MODL, '$500 Chip'), - wbString(MODL, 'Roulette Chip') - ], []), - wbString(MODL, 'Slot Machine Model'), - wbString(MOD2, 'Slot Machine Model (again?)'), - wbString(MOD3, 'BlackJack Table Model'), - wbString(MODT, 'BlackJack Table Model related'), - wbString(MOD4, 'Roulette Table Model'), - wbRStruct('Slot Reel Textures', [ - wbString(ICON, 'Symbol 1'), - wbString(ICON, 'Symbol 2'), - wbString(ICON, 'Symbol 3'), - wbString(ICON, 'Symbol 4'), - wbString(ICON, 'Symbol 5'), - wbString(ICON, 'Symbol 6'), - wbString(ICON, 'Symbol W') - ], []), - wbRStruct('BlackJack Decks', [ - wbString(ICO2, 'Deck 1'), - wbString(ICO2, 'Deck 2'), - wbString(ICO2, 'Deck 3'), - wbString(ICO2, 'Deck 4') - ], []) - ]); - - wbRecord(DEHY, 'Dehydration Stage', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbInteger('Trigger Threshold', itU32), - wbFormIDCk('Actor Effect', [SPEL]) - ], cpNormal, True) - ]); - - wbRecord(HUNG, 'Hunger Stage', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbInteger('Trigger Threshold', itU32), - wbFormIDCk('Actor Effect', [SPEL]) - ], cpNormal, True) - ]); - - wbRecord(LSCT, 'Load Screen Type', [ - wbEDIDReq, - wbStruct(DATA, 'Data', [ - wbInteger('Type', itU32, wbEnum([ - 'None', - 'XP Progress', - 'Objective', - 'Tip', - 'Stats' - ])), - wbStruct('Data 1', [ - wbInteger('X', itU32), - wbInteger('Y', itU32), - wbInteger('Width', itU32), - wbInteger('Height', itU32), - wbFloat('Orientation', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbInteger('Font', itU32, wbEnum([ - '', - '2', - '3', - '4', - '5', - '6', - '7', - '8' - ])), - wbStruct('Font Color', [ - wbFloat('R'), - wbFloat('G'), - wbFloat('B') - ]), - wbInteger('Font', itU32, wbEnum([ - '', - 'Left', - 'Center', - '', - 'Right' - ])) - ]), - wbByteArray('Unknown', 20), - wbStruct('Data 2', [ - wbInteger('Font', itU32, wbEnum([ - '', - '2', - '3', - '4', - '5', - '6', - '7', - '8' - ])), - wbStruct('Font Color', [ - wbFloat('R'), - wbFloat('G'), - wbFloat('B') - ]), - wbByteArray('', 4), - wbInteger('Stats', itU32, wbEnum([ - '', - '2', - '3', - '4', - '5', - '6', - '7', - '8' - ])) - ]) - ]) - ]); - - wbRecord(RCCT, 'Recipe Category', [ - wbEDIDReq, - wbFULL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Subcategory?', - '', - '', - '', - '', - '', - '', - '' - ])) - ]); - - wbRecord(RCPE, 'Recipe', [ - wbEDIDReq, - wbFULL, - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Skill', itS32, wbActorValueEnum), - wbInteger('Level', itU32), - wbFormIDCk('Category', [RCCT, NULL]), // Some of DeadMoney are NULL - wbFormIDCk('Sub-Category', [RCCT]) - ]), - wbRStructs('Ingredients', 'Ingredient', [ - wbFormIDCk(RCIL, 'Item', [ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, NOTE, IMOD, CMNY, CCRD, CHIP, LIGH], False, cpNormal, True), - wbInteger(RCQY, 'Quantity', itU32, nil, cpNormal, True) - ], []), - wbRStructs('Outputs', 'Output', [ - wbFormIDCk(RCOD, 'Item', [ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, NOTE, IMOD, CMNY, CCRD, CHIP, LIGH], False, cpNormal, True), - wbInteger(RCQY, 'Quantity', itU32, nil, cpNormal, True) - ], []) - ]); - - wbRecord(REPU, 'Reputation', [ - wbEDIDReq, - wbFULL, - wbICON, - wbFloat(DATA, 'Value') - ]); - - wbRecord(SLPD, 'Sleep Deprivation Stage', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbInteger('Trigger Threshold', itU32), - wbFormIDCk('Actor Effect', [SPEL]) - ], cpNormal, True) - ]); - - wbAddGroupOrder(GMST); - wbAddGroupOrder(TXST); - wbAddGroupOrder(MICN); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HDPT); - wbAddGroupOrder(HAIR); - wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(ASPC); - wbAddGroupOrder(MGEF); - wbAddGroupOrder(SCPT); - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(TACT); - wbAddGroupOrder(TERM); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(STAT); - wbAddGroupOrder(SCOL); - wbAddGroupOrder(MSTT); - wbAddGroupOrder(PWAT); - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(CREA); - wbAddGroupOrder(LVLC); - wbAddGroupOrder(LVLN); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(IDLM); - wbAddGroupOrder(NOTE); - wbAddGroupOrder(COBJ); - wbAddGroupOrder(PROJ); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(REGN); - wbAddGroupOrder(NAVI); - wbAddGroupOrder(DIAL); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); - wbAddGroupOrder(EXPL); - wbAddGroupOrder(DEBR); - wbAddGroupOrder(IMGS); - wbAddGroupOrder(IMAD); - wbAddGroupOrder(FLST); - wbAddGroupOrder(PERK); - wbAddGroupOrder(BPTD); - wbAddGroupOrder(ADDN); - wbAddGroupOrder(AVIF); - wbAddGroupOrder(RADS); - wbAddGroupOrder(CAMS); - wbAddGroupOrder(CPTH); - wbAddGroupOrder(VTYP); - wbAddGroupOrder(IPCT); - wbAddGroupOrder(IPDS); - wbAddGroupOrder(ARMA); - wbAddGroupOrder(ECZN); - wbAddGroupOrder(MESG); - wbAddGroupOrder(RGDL); - wbAddGroupOrder(DOBJ); - wbAddGroupOrder(LGTM); - wbAddGroupOrder(MUSC); - wbAddGroupOrder(IMOD); - wbAddGroupOrder(REPU); - wbAddGroupOrder(RCPE); - wbAddGroupOrder(RCCT); - wbAddGroupOrder(CHIP); - wbAddGroupOrder(CSNO); - wbAddGroupOrder(LSCT); - wbAddGroupOrder(MSET); - wbAddGroupOrder(ALOC); - wbAddGroupOrder(CHAL); - wbAddGroupOrder(AMEF); - wbAddGroupOrder(CCRD); - wbAddGroupOrder(CMNY); - wbAddGroupOrder(CDCK); - wbAddGroupOrder(DEHY); - wbAddGroupOrder(HUNG); - wbAddGroupOrder(SLPD); - // Forced at the end. - wbAddGroupOrder(CELL); - wbAddGroupOrder(WRLD); -end; - -procedure DefineFNV; -begin - DefineFNVa; - DefineFNVb; - DefineFNVc; - DefineFNVd; - DefineFNVe; - DefineFNVf; -end; - -end. diff --git a/lib/xedit/wbDefinitionsFO3.pas b/lib/xedit/wbDefinitionsFO3.pas deleted file mode 100644 index 103a65d..0000000 --- a/lib/xedit/wbDefinitionsFO3.pas +++ /dev/null @@ -1,10758 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbDefinitionsFO3; - -{$I wbDefines.inc} - -interface - -uses - wbInterface; - -var - wbAggroRadiusFlags: IwbFlagsDef; - wbPKDTFlags: IwbFlagsDef; - wbRecordFlagsFlags: IwbFlagsDef; - wbServiceFlags: IwbFlagsDef; - wbTemplateFlags: IwbFlagsDef; - - wbAgressionEnum: IwbEnumDef; - wbAlignmentEnum: IwbEnumDef; - wbArchtypeEnum: IwbEnumDef; - wbAssistanceEnum: IwbEnumDef; - wbAttackAnimationEnum: IwbEnumDef; - wbAxisEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbBodyLocationEnum: IwbEnumDef; - wbBodyPartIndexEnum: IwbEnumDef; - wbConfidenceEnum: IwbEnumDef; - wbCreatureTypeEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbCriticalStageEnum: IwbEnumDef; - wbEquipTypeEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFunctionsEnum: IwbEnumDef; - wbHeadPartIndexEnum: IwbEnumDef; - wbImpactMaterialTypeEnum: IwbEnumDef; - wbMenuModeEnum: IwbEnumDef; - wbMiscStatEnum: IwbEnumDef; - wbModEffectEnum: IwbEnumDef; - wbMoodEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbObjectTypeEnum: IwbEnumDef; - wbPKDTType: IwbEnumDef; - wbPlayerActionEnum: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbReloadAnimEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoundLevelEnum: IwbEnumDef; - wbSpecializationEnum: IwbEnumDef; - wbVatsValueFunctionEnum: IwbEnumDef; - wbWeaponAnimTypeEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - -procedure DefineFO3; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants, - wbHelpers; - -const - _00_IAD: TwbSignature = #$00'IAD'; - _40_IAD: TwbSignature = #$40'IAD'; - _01_IAD: TwbSignature = #$01'IAD'; - _41_IAD: TwbSignature = #$41'IAD'; - _02_IAD: TwbSignature = #$02'IAD'; - _42_IAD: TwbSignature = #$42'IAD'; - _03_IAD: TwbSignature = #$03'IAD'; - _43_IAD: TwbSignature = #$43'IAD'; - _04_IAD: TwbSignature = #$04'IAD'; - _44_IAD: TwbSignature = #$44'IAD'; - _05_IAD: TwbSignature = #$05'IAD'; - _45_IAD: TwbSignature = #$45'IAD'; - _06_IAD: TwbSignature = #$06'IAD'; - _46_IAD: TwbSignature = #$46'IAD'; - _07_IAD: TwbSignature = #$07'IAD'; - _47_IAD: TwbSignature = #$47'IAD'; - _08_IAD: TwbSignature = #$08'IAD'; - _48_IAD: TwbSignature = #$48'IAD'; - _09_IAD: TwbSignature = #$09'IAD'; - _49_IAD: TwbSignature = #$49'IAD'; - _0A_IAD: TwbSignature = #$0A'IAD'; - _4A_IAD: TwbSignature = #$4A'IAD'; - _0B_IAD: TwbSignature = #$0B'IAD'; - _4B_IAD: TwbSignature = #$4B'IAD'; - _0C_IAD: TwbSignature = #$0C'IAD'; - _4C_IAD: TwbSignature = #$4C'IAD'; - _0D_IAD: TwbSignature = #$0D'IAD'; - _4D_IAD: TwbSignature = #$4D'IAD'; - _0E_IAD: TwbSignature = #$0E'IAD'; - _4E_IAD: TwbSignature = #$4E'IAD'; - _0F_IAD: TwbSignature = #$0F'IAD'; - _4F_IAD: TwbSignature = #$4F'IAD'; - _10_IAD: TwbSignature = #$10'IAD'; - _50_IAD: TwbSignature = #$50'IAD'; - _11_IAD: TwbSignature = #$11'IAD'; - _51_IAD: TwbSignature = #$51'IAD'; - _12_IAD: TwbSignature = #$12'IAD'; - _52_IAD: TwbSignature = #$52'IAD'; - _13_IAD: TwbSignature = #$13'IAD'; - _53_IAD: TwbSignature = #$53'IAD'; - _14_IAD: TwbSignature = #$14'IAD'; - _54_IAD: TwbSignature = #$54'IAD'; - - _0_IAD : TwbSignature = #0'IAD'; - _1_IAD : TwbSignature = #1'IAD'; - _2_IAD : TwbSignature = #2'IAD'; - _3_IAD : TwbSignature = #3'IAD'; - ACBS : TwbSignature = 'ACBS'; - ACHR : TwbSignature = 'ACHR'; - ACRE : TwbSignature = 'ACRE'; - ACTI : TwbSignature = 'ACTI'; - ADDN : TwbSignature = 'ADDN'; - AIDT : TwbSignature = 'AIDT'; - ALCH : TwbSignature = 'ALCH'; - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - ARMA : TwbSignature = 'ARMA'; - ARMO : TwbSignature = 'ARMO'; - ASPC : TwbSignature = 'ASPC'; - ATTR : TwbSignature = 'ATTR'; - ATXT : TwbSignature = 'ATXT'; - AVIF : TwbSignature = 'AVIF'; - BIPL : TwbSignature = 'BIPL'; - BMCT : TwbSignature = 'BMCT'; - BMDT : TwbSignature = 'BMDT'; - BNAM : TwbSignature = 'BNAM'; - BOOK : TwbSignature = 'BOOK'; - BPND : TwbSignature = 'BPND'; - BPNI : TwbSignature = 'BPNI'; - BPNN : TwbSignature = 'BPNN'; - BPNT : TwbSignature = 'BPNT'; - BPTD : TwbSignature = 'BPTD'; - BPTN : TwbSignature = 'BPTN'; - BTXT : TwbSignature = 'BTXT'; - CAMS : TwbSignature = 'CAMS'; - CELL : TwbSignature = 'CELL'; - CLAS : TwbSignature = 'CLAS'; - CLMT : TwbSignature = 'CLMT'; - CNAM : TwbSignature = 'CNAM'; - CNTO : TwbSignature = 'CNTO'; - COBJ : TwbSignature = 'COBJ'; - COED : TwbSignature = 'COED'; - CONT : TwbSignature = 'CONT'; - CPTH : TwbSignature = 'CPTH'; - CRDT : TwbSignature = 'CRDT'; - CREA : TwbSignature = 'CREA'; - CSAD : TwbSignature = 'CSAD'; - CSCR : TwbSignature = 'CSCR'; - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSSD : TwbSignature = 'CSSD'; - CSTD : TwbSignature = 'CSTD'; - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - DATA : TwbSignature = 'DATA'; - DEBR : TwbSignature = 'DEBR'; - DELE : TwbSignature = 'DELE'; - DESC : TwbSignature = 'DESC'; - DEST : TwbSignature = 'DEST'; - DIAL : TwbSignature = 'DIAL'; - DMDL : TwbSignature = 'DMDL'; - DMDT : TwbSignature = 'DMDT'; - DNAM : TwbSignature = 'DNAM'; - DOBJ : TwbSignature = 'DOBJ'; - DODT : TwbSignature = 'DODT'; - DOOR : TwbSignature = 'DOOR'; - DSTD : TwbSignature = 'DSTD'; - DSTF : TwbSignature = 'DSTF'; - EAMT : TwbSignature = 'EAMT'; - ECZN : TwbSignature = 'ECZN'; - EDID : TwbSignature = 'EDID'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - EFSD : TwbSignature = 'EFSD'; - EFSH : TwbSignature = 'EFSH'; - EITM : TwbSignature = 'EITM'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - EPF2 : TwbSignature = 'EPF2'; - EPF3 : TwbSignature = 'EPF3'; - EPFD : TwbSignature = 'EPFD'; - EPFT : TwbSignature = 'EPFT'; - ESCE : TwbSignature = 'ESCE'; - ETYP : TwbSignature = 'ETYP'; - EXPL : TwbSignature = 'EXPL'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FGGA : TwbSignature = 'FGGA'; - FGGS : TwbSignature = 'FGGS'; - FGTS : TwbSignature = 'FGTS'; - FLST : TwbSignature = 'FLST'; - FLTV : TwbSignature = 'FLTV'; - FNAM : TwbSignature = 'FNAM'; - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - GLOB : TwbSignature = 'GLOB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - HAIR : TwbSignature = 'HAIR'; - HCLR : TwbSignature = 'HCLR'; - HDPT : TwbSignature = 'HDPT'; - HEDR : TwbSignature = 'HEDR'; - HNAM : TwbSignature = 'HNAM'; - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLA : TwbSignature = 'IDLA'; - IDLB : TwbSignature = 'IDLB'; - IDLC : TwbSignature = 'IDLC'; - IDLE : TwbSignature = 'IDLE'; - IDLF : TwbSignature = 'IDLF'; - IDLM : TwbSignature = 'IDLM'; - IDLT : TwbSignature = 'IDLT'; - IMAD : TwbSignature = 'IMAD'; - IMGS : TwbSignature = 'IMGS'; - INAM : TwbSignature = 'INAM'; - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - IPCT : TwbSignature = 'IPCT'; - IPDS : TwbSignature = 'IPDS'; - ITXT : TwbSignature = 'ITXT'; - JNAM : TwbSignature = 'JNAM'; - KEYM : TwbSignature = 'KEYM'; - KFFZ : TwbSignature = 'KFFZ'; - KNAM : TwbSignature = 'KNAM'; - LAND : TwbSignature = 'LAND'; - LGTM : TwbSignature = 'LGTM'; - LIGH : TwbSignature = 'LIGH'; - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LTEX : TwbSignature = 'LTEX'; - LTMP : TwbSignature = 'LTMP'; - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLG : TwbSignature = 'LVLG'; - LVLI : TwbSignature = 'LVLI'; - LVLN : TwbSignature = 'LVLN'; - LVLO : TwbSignature = 'LVLO'; - MAST : TwbSignature = 'MAST'; - MESG : TwbSignature = 'MESG'; - MGEF : TwbSignature = 'MGEF'; - MICN : TwbSignature = 'MICN'; - MICO : TwbSignature = 'MICO'; - MIC2 : TwbSignature = 'MIC2'; - MISC : TwbSignature = 'MISC'; - MNAM : TwbSignature = 'MNAM'; - MO2B : TwbSignature = 'MO2B'; - MO2S : TwbSignature = 'MO2S'; - MO2T : TwbSignature = 'MO2T'; - MO3B : TwbSignature = 'MO3B'; - MO3S : TwbSignature = 'MO3S'; - MO3T : TwbSignature = 'MO3T'; - MO4B : TwbSignature = 'MO4B'; - MO4S : TwbSignature = 'MO4S'; - MO4T : TwbSignature = 'MO4T'; - MOD2 : TwbSignature = 'MOD2'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MODB : TwbSignature = 'MODB'; - MODD : TwbSignature = 'MODD'; - MODL : TwbSignature = 'MODL'; - MODS : TwbSignature = 'MODS'; - MODT : TwbSignature = 'MODT'; - MOSD : TwbSignature = 'MOSD'; - MSTT : TwbSignature = 'MSTT'; - MUSC : TwbSignature = 'MUSC'; - IMPS : TwbSignature = 'IMPS'; - IMPF : TwbSignature = 'IMPF'; - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM3 : TwbSignature = 'NAM3'; - NAM4 : TwbSignature = 'NAM4'; - NAM5 : TwbSignature = 'NAM5'; - NAM6 : TwbSignature = 'NAM6'; - NAM7 : TwbSignature = 'NAM7'; - NAM8 : TwbSignature = 'NAM8'; - NAM9 : TwbSignature = 'NAM9'; - NAME : TwbSignature = 'NAME'; - NAVI : TwbSignature = 'NAVI'; - NAVM : TwbSignature = 'NAVM'; - NEXT : TwbSignature = 'NEXT'; - NIFT : TwbSignature = 'NIFT'; - NIFZ : TwbSignature = 'NIFZ'; - NNAM : TwbSignature = 'NNAM'; - NOTE : TwbSignature = 'NOTE'; - NPC_ : TwbSignature = 'NPC_'; - NULL : TwbSignature = 'NULL'; - NVCA : TwbSignature = 'NVCA'; - NVCI : TwbSignature = 'NVCI'; - NVDP : TwbSignature = 'NVDP'; - NVER : TwbSignature = 'NVER'; - NVEX : TwbSignature = 'NVEX'; - NVGD : TwbSignature = 'NVGD'; - NVMI : TwbSignature = 'NVMI'; - NVTR : TwbSignature = 'NVTR'; - NVVX : TwbSignature = 'NVVX'; - OBND : TwbSignature = 'OBND'; - OFST : TwbSignature = 'OFST'; - ONAM : TwbSignature = 'ONAM'; - PACK : TwbSignature = 'PACK'; - PBEA : TwbSignature = 'PBEA'; - PERK : TwbSignature = 'PERK'; - PFIG : TwbSignature = 'PFIG'; - PFPC : TwbSignature = 'PFPC'; - PGAG : TwbSignature = 'PGAG'; - PGRE : TwbSignature = 'PGRE'; - PMIS : TwbSignature = 'PMIS'; - TRGT : TwbSignature = 'TRGT'; - PGRI : TwbSignature = 'PGRI'; - PGRL : TwbSignature = 'PGRL'; - PGRP : TwbSignature = 'PGRP'; - PGRR : TwbSignature = 'PGRR'; - PKAM : TwbSignature = 'PKAM'; - PKDD : TwbSignature = 'PKDD'; - PKDT : TwbSignature = 'PKDT'; - PKE2 : TwbSignature = 'PKE2'; - PKED : TwbSignature = 'PKED'; - PKFD : TwbSignature = 'PKFD'; - PKID : TwbSignature = 'PKID'; - PKPT : TwbSignature = 'PKPT'; - PKW3 : TwbSignature = 'PKW3'; - PLD2 : TwbSignature = 'PLD2'; - PLDT : TwbSignature = 'PLDT'; - PLYR : TwbSignature = 'PLYR'; - PNAM : TwbSignature = 'PNAM'; - POBA : TwbSignature = 'POBA'; - POCA : TwbSignature = 'POCA'; - POEA : TwbSignature = 'POEA'; - PRKC : TwbSignature = 'PRKC'; - PRKE : TwbSignature = 'PRKE'; - PRKF : TwbSignature = 'PRKF'; - PROJ : TwbSignature = 'PROJ'; - PSDT : TwbSignature = 'PSDT'; - PTD2 : TwbSignature = 'PTD2'; - PTDT : TwbSignature = 'PTDT'; - PUID : TwbSignature = 'PUID'; - PWAT : TwbSignature = 'PWAT'; - QNAM : TwbSignature = 'QNAM'; - QOBJ : TwbSignature = 'QOBJ'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QSTI : TwbSignature = 'QSTI'; - TPIC : TwbSignature = 'TPIC'; - QSTR : TwbSignature = 'QSTR'; - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RADS : TwbSignature = 'RADS'; - RAFB : TwbSignature = 'RAFB'; - RAFD : TwbSignature = 'RAFD'; - RAGA : TwbSignature = 'RAGA'; - RAPS : TwbSignature = 'RAPS'; - RCLR : TwbSignature = 'RCLR'; - RDAT : TwbSignature = 'RDAT'; - RDMD : TwbSignature = 'RDMD'; - RDMO : TwbSignature = 'RDMO'; - RDMP : TwbSignature = 'RDMP'; - RDGS : TwbSignature = 'RDGS'; - RDOT : TwbSignature = 'RDOT'; - RDSD : TwbSignature = 'RDSD'; - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - REGN : TwbSignature = 'REGN'; - REPL : TwbSignature = 'REPL'; - RGDL : TwbSignature = 'RGDL'; - RNAM : TwbSignature = 'RNAM'; - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - SCDA : TwbSignature = 'SCDA'; - SCHR : TwbSignature = 'SCHR'; - SCOL : TwbSignature = 'SCOL'; - SCPT : TwbSignature = 'SCPT'; - SCRI : TwbSignature = 'SCRI'; - SCRN : TwbSignature = 'SCRN'; - SCRO : TwbSignature = 'SCRO'; - SCRV : TwbSignature = 'SCRV'; - SCTX : TwbSignature = 'SCTX'; - SCVR : TwbSignature = 'SCVR'; - SLCP : TwbSignature = 'SLCP'; - SLSD : TwbSignature = 'SLSD'; - SNAM : TwbSignature = 'SNAM'; - SNDD : TwbSignature = 'SNDD'; - SNDX : TwbSignature = 'SNDX'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPEL : TwbSignature = 'SPEL'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - STAT : TwbSignature = 'STAT'; - TACT : TwbSignature = 'TACT'; - TCLF : TwbSignature = 'TCLF'; - TCLT : TwbSignature = 'TCLT'; - TERM : TwbSignature = 'TERM'; - TES4 : TwbSignature = 'TES4'; - TNAM : TwbSignature = 'TNAM'; - TPLT : TwbSignature = 'TPLT'; - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - TX00 : TwbSignature = 'TX00'; - TX01 : TwbSignature = 'TX01'; - TX02 : TwbSignature = 'TX02'; - TX03 : TwbSignature = 'TX03'; - TX04 : TwbSignature = 'TX04'; - TX05 : TwbSignature = 'TX05'; - TXST : TwbSignature = 'TXST'; - UNAM : TwbSignature = 'UNAM'; - VCLR : TwbSignature = 'VCLR'; - VHGT : TwbSignature = 'VHGT'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VTCK : TwbSignature = 'VTCK'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - VTYP : TwbSignature = 'VTYP'; - WATR : TwbSignature = 'WATR'; - WEAP : TwbSignature = 'WEAP'; - WLST : TwbSignature = 'WLST'; - WNAM : TwbSignature = 'WNAM'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - XACT : TwbSignature = 'XACT'; - XAMC : TwbSignature = 'XAMC'; - XAMT : TwbSignature = 'XAMT'; - XAPD : TwbSignature = 'XAPD'; - XAPR : TwbSignature = 'XAPR'; - XCAS : TwbSignature = 'XCAS'; - XCCM : TwbSignature = 'XCCM'; - XCET : TwbSignature = 'XCET'; - XCHG : TwbSignature = 'XCHG'; - XCIM : TwbSignature = 'XCIM'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLP : TwbSignature = 'XCLP'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMO : TwbSignature = 'XCMO'; - XCMT : TwbSignature = 'XCMT'; - XCNT : TwbSignature = 'XCNT'; - XCWT : TwbSignature = 'XCWT'; - XEMI : TwbSignature = 'XEMI'; - XESP : TwbSignature = 'XESP'; - XEZN : TwbSignature = 'XEZN'; - XGLB : TwbSignature = 'XGLB'; - XHLP : TwbSignature = 'XHLP'; - XDCR : TwbSignature = 'XDCR'; - XHLT : TwbSignature = 'XHLT'; - XIBS : TwbSignature = 'XIBS'; - XLCM : TwbSignature = 'XLCM'; - XLKR : TwbSignature = 'XLKR'; - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XLRM : TwbSignature = 'XLRM'; - XLTW : TwbSignature = 'XLTW'; - XMBO : TwbSignature = 'XMBO'; - XMBP : TwbSignature = 'XMBP'; - XMBR : TwbSignature = 'XMBR'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XNAM : TwbSignature = 'XNAM'; - XNDP : TwbSignature = 'XNDP'; - XOCP : TwbSignature = 'XOCP'; - XORD : TwbSignature = 'XORD'; - XOWN : TwbSignature = 'XOWN'; - XPOD : TwbSignature = 'XPOD'; - XPTL : TwbSignature = 'XPTL'; - XPPA : TwbSignature = 'XPPA'; - XPRD : TwbSignature = 'XPRD'; - XPRM : TwbSignature = 'XPRM'; - XPWR : TwbSignature = 'XPWR'; - XRAD : TwbSignature = 'XRAD'; - XRDO : TwbSignature = 'XRDO'; - XRDS : TwbSignature = 'XRDS'; - XRGB : TwbSignature = 'XRGB'; - XRGD : TwbSignature = 'XRGD'; - XRMR : TwbSignature = 'XRMR'; - XRNK : TwbSignature = 'XRNK'; - XRTM : TwbSignature = 'XRTM'; - XSCL : TwbSignature = 'XSCL'; - XSED : TwbSignature = 'XSED'; - XSRF : TwbSignature = 'XSRF'; - XSRD : TwbSignature = 'XSRD'; - XTEL : TwbSignature = 'XTEL'; - XTRG : TwbSignature = 'XTRG'; - XTRI : TwbSignature = 'XTRI'; - XXXX : TwbSignature = 'XXXX'; - YNAM : TwbSignature = 'YNAM'; - ZNAM : TwbSignature = 'ZNAM'; - -var - wbPKDTSpecificFlagsUnused : Boolean; - wbEDID: IwbSubRecordDef; - wbEDIDReq: IwbSubRecordDef; - wbBMDT: IwbSubRecordDef; - wbYNAM: IwbSubRecordDef; - wbZNAM: IwbSubRecordDef; - wbCOED: IwbSubRecordDef; - wbXLCM: IwbSubRecordDef; - wbEITM: IwbSubRecordDef; - wbREPL: IwbSubRecordDef; - wbBIPL: IwbSubRecordDef; - wbOBND: IwbSubRecordDef; - wbOBNDReq: IwbSubRecordDef; - wbDEST: IwbSubRecordStructDef; - wbDESTActor: IwbSubRecordStructDef; - wbDODT: IwbSubRecordDef; - wbXOWN: IwbSubRecordDef; - wbXGLB: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbXRGB: IwbSubRecordDef; - wbSLSD: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordStructDef; - wbCNTOs: IwbSubRecordArrayDef; - wbAIDT: IwbSubRecordDef; - wbCSDT: IwbSubRecordStructDef; - wbCSDTs: IwbSubRecordArrayDef; - wbFULL: IwbSubRecordDef; - wbFULLActor: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbXNAM: IwbSubRecordDef; - wbXNAMs: IwbSubRecordArrayDef; - wbDESC: IwbSubRecordDef; - wbDESCReq: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot : IwbSubRecordDef; - wbPosRot : IwbStructDef; - wbMODD: IwbSubRecordDef; - wbMOSD: IwbSubRecordDef; - wbMODL: IwbSubRecordStructDef; - wbMODS: IwbSubRecordDef; - wbMO2S: IwbSubRecordDef; - wbMO3S: IwbSubRecordDef; - wbMO4S: IwbSubRecordDef; - wbMODLActor: IwbSubRecordStructDef; - wbMODLReq: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordDef; - wbSCHRReq: IwbSubRecordDef; - wbCTDAs: IwbSubRecordArrayDef; - wbCTDAsReq: IwbSubRecordArrayDef; - wbSCROs: IwbSubRecordArrayDef; - wbPGRP: IwbSubRecordDef; - wbEmbeddedScript: IwbSubRecordStructDef; - wbEmbeddedScriptPerk: IwbSubRecordStructDef; - wbEmbeddedScriptReq: IwbSubRecordStructDef; - wbSCRI: IwbSubRecordDef; - wbSCRIActor: IwbSubRecordDef; - wbFaceGen: IwbSubRecordStructDef; - wbFaceGenNPC: IwbSubRecordStructDef; - wbENAM: IwbSubRecordDef; - wbFGGS: IwbSubRecordDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordStructDef; - wbICONReq: IwbSubRecordStructDef; - wbActorValue: IwbIntegerDef; - wbETYP: IwbSubRecordDef; - wbETYPReq: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEffects: IwbSubRecordArrayDef; - wbEffectsReq: IwbSubRecordArrayDef; - wbBPNDStruct: IwbSubRecordDef; - wbTimeInterpolator: IwbStructDef; - wbColorInterpolator: IwbStructDef; - -function wbNVTREdgeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Index : Integer; - Flags : Cardinal; - IsExternal : Boolean; - Container : IwbContainerElementRef; -begin - Result := ''; - IsExternal := False; - if Supports(aElement, IwbContainerElementRef, Container) then begin - Index := StrToIntDef(Copy(Container.Name, 11, 1), -1); - if (Index >= 0) and (Index <= 2) then begin - Flags := Container.ElementNativeValues['..\..\Flags']; - IsExternal := Flags and (Cardinal(1) shl Index) <> 0; - end; - end; - - if IsExternal then begin - case aType of - ctToStr: begin - Result := IntToStr(aInt); - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := Result + ' (Triangle #' + - Container.ElementValues['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Triangle'] + ' in ' + - Container.ElementValues['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Navigation Mesh'] + ')' - else - Result := Result + ' '; - end; - ctToSortKey: - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := - Container.ElementSortKeys['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Navigation Mesh', True] + '|' + - Container.ElementSortKeys['..\..\..\..\NVEX\Connection #' + IntToStr(aInt) + '\Triangle', True]; - ctCheck: - if Container.ElementExists['..\..\..\..\NVEX\Connection #' + IntToStr(aInt)] then - Result := '' - else - Result := 'NVEX\Connection #' + IntToStr(aInt) + ' is missing'; - end - end else - case aType of - ctToStr: Result := IntToStr(aInt); - end; -end; - -function wbNVTREdgeToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToInt64(aString); -end; - - -function wbEPFDActorValueToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsCardinal := aInt; - AsFloat := PSingle(@AsCardinal)^; - aInt := Round(AsFloat); - case aType of - ctToStr: Result := wbActorValueEnum.ToString(aInt, aElement); - ctToSortKey: Result := wbActorValueEnum.ToSortKey(aInt, aElement); - ctCheck: Result := wbActorValueEnum.Check(aInt, aElement); - ctToEditValue: Result := wbActorValueEnum.ToEditValue(aInt, aElement); - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := wbActorValueEnum.EditInfo[aInt, aElement]; - end; -end; - -function wbEPFDActorValueToInt(const aString: string; const aElement: IwbElement): Int64; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsFloat := wbActorValueEnum.FromEditValue(aString, aElement); - PSingle(@AsCardinal)^ := AsFloat; - Result := AsCardinal; -end; - -function wbCTDAParam2VariableNameToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - //Container2 : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - Variables : TStringList; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - MainRecord := nil; - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; -{ if Param1.NativeValue = 0 then - if Supports(Container.Container, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[i], IwbContainerElementRef, Container2) then - if SameText(Container2.ElementValues['Function'], 'GetIsID') then begin - Param1 := Container2.ElementByName['Parameter #1']; - if Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Break; - end;} - - if not Assigned(MainRecord) then - Exit; - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - Script := Script.HighestOverrideOrSelf[aElement._File.LoadOrder]; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - Variables := TStringList.Create; - else - Variables := nil; - end; - try - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if Assigned(Variables) then - Variables.AddObject(s, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := s; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - Variables.Sort; - Result := Variables.CommaText; - end; - end; - finally - FreeAndNil(Variables); - end; -end; - -function wbCTDAParam2VariableNameToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - Result := StrToInt64Def(aString, Low(Cardinal)); - if Result <> Low(Cardinal) then - Exit; - - if not Assigned(aElement) then - raise Exception.Create('aElement not specified'); - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - raise Exception.Create('Container not assigned'); - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - raise Exception.Create('Could not find "Parameter #1"'); - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - raise Exception.Create('"Parameter #1" does not reference a valid main record'); - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not contain a SCRI subrecord'); - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not have a valid script'); - - Script := Script.HighestOverrideOrSelf[aElement._File.LoadOrder]; - - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if SameText(s, Trim(aString)) then begin - Result := j; - Exit; - end; - end; - end; - - raise Exception.Create('Variable "'+aString+'" was not found in "'+MainRecord.ShortName+'"'); -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbPerkDATAQuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Quest']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestObjectiveToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Objectives : IwbContainerElementRef; - Objective : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Objectives'], IwbContainerElementRef, Objectives) then begin - for i := 0 to Pred(Objectives.ElementCount) do - if Supports(Objectives.Elements[i], IwbContainerElementRef, Objective) then begin - j := Objective.ElementNativeValues['QOBJ']; - s := Trim(Objective.ElementValues['NNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -function wbCTDAParam2QuestObjectiveToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ) - else - Result := ''; -end; - -function wbREFRNavmeshTriangleToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Navmesh : IwbElement; - MainRecord : IwbMainRecord; - Triangles : IwbContainerElementRef; -begin - case aType of - ctToStr: Result := IntToStr(aInt); - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Navmesh := Container.Elements[0]; - - if not Assigned(Navmesh) then - Exit; - - if not Supports(Navmesh.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> NAVM then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not wbSimpleRecords and (aType = ctCheck) and Supports(MainRecord.ElementByPath['NVTR'], IwbContainerElementRef, Triangles) then - if aInt >= Triangles.ElementCount then - Result := ''; -end; - -function wbStringToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToIntDef(aString, 0); -end; - - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaTypeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - case aType of - ctEditType: - Result := 'CheckComboBox'; - ctEditInfo: - Result := 'Equal,Greater,Lesser,Or,"Use Global","Run on Target"'; - ctToEditValue: begin - Result := '000000'; - case aInt and $F0 of - $00 : Result[1] := '1'; - $40 : Result[2] := '1'; - $60 : begin - Result[1] := '1'; - Result[2] := '1'; - end; - $80 : Result[3] := '1'; - $A0 : begin - Result[1] := '1'; - Result[3] := '1'; - end; - end; - if (aInt and $01) <> 0 then - Result[4] := '1'; - if (aInt and $02) <> 0 then - Result[6] := '1'; - if (aInt and $04) <> 0 then - Result[5] := '1'; - end; - ctToStr: begin - case aInt and $F0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.ToString(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $F0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.Check(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbCtdaTypeToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; -begin - s := aString + '000000'; -// Result := 0; - if s[1] = '1' then begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $00; - end else begin - Result := $60; - end; - end else begin - if s[3] = '1' then begin - Result := $A0; - end else begin - Result := $00; - end; - end; - end else begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $20; - end else begin - Result := $40; - end; - end else begin - if s[3] = '1' then begin - Result := $80; - end else begin - Result := $20; - end; - end; - end; - if s[4] = '1' then - Result := Result or $01; - if s[6] = '1' then - Result := Result or $02; - if s[5] = '1' then - Result := Result or $04; -end; - -procedure wbHeadPartsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainerElementRef, Container) then - if (Container.Elements[0].NativeValue = 1) and (Container.ElementCount > 2) then - Container.RemoveElement(1); - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGDNAMAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : Integer; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := Integer(aOldValue) and 1; - NewValue := Integer(aNewValue) and 1; - if NewValue = OldValue then - Exit; - if NewValue = 1 then - Container.RemoveElement('TNAM') - else - Container.Add('TNAM', True); - end; -end; - -procedure wbGMSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - if (Length(OldValue) < 1) or (Length(OldValue) < 1) or (OldValue[1] <> NewValue[1]) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - end; - end; -end; - -procedure wbFLSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - OldOrdered, NewOrdered : Boolean; - Container : IwbContainerElementRef; -const - OrderedList = 'OrderedList'; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - - if Length(OldValue) > Length(OrderedList) then - Delete(OldValue, 1, Length(OldValue)-Length(OrderedList)); - if Length(NewValue) > Length(OrderedList) then - Delete(NewValue, 1, Length(NewValue)-Length(OrderedList)); - - OldOrdered := SameText(OldValue, OrderedList); - NewOrdered := SameText(NewValue, OrderedList); - - if OldOrdered <> NewOrdered then - Container.RemoveElement('FormIDs'); - end; -end; - -procedure wbCtdaTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - OldValue := aOldValue and $04; - NewValue := aNewValue and $04; - if OldValue <> NewValue then - Container.ElementNativeValues['..\Comparison Value'] := 0; - - if aNewValue and $02 then begin - Container.ElementNativeValues['..\Run On'] := 1; - if Integer(Container.ElementNativeValues['..\Run On']) = 1 then - aElement.NativeValue := Byte(aNewValue) and not $02; - end; -end; - -function wbMODTCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Strings: TDynStrings; - i: Integer; -begin - Result := ''; - if wbLoaderDone and (aType in [ctToStr, ctToSortKey] ) then begin - Strings := wbContainerHandler.ResolveHash(aInt); - for i := Low(Strings) to High(Strings) do - Result := Result + Strings[i] + ', '; - SetLength(Result, Length(Result) -2 ); - end; -end; - - -function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not $C0 of - 0: Result := 'Idle'; - 1: Result := 'Movement'; - 2: Result := 'Left Arm'; - 3: Result := 'Left Hand'; - 4: Result := 'Weapon'; - 5: Result := 'Weapon Up'; - 6: Result := 'Weapon Down'; - 7: Result := 'Special Idle'; - 20: Result := 'Whole Body'; - 21: Result := 'Upper Body'; - else - Result := ''; - end; - - if (aInt and $80) = 0 then - Result := Result + ', Must return a file'; - if (aInt and $40) = 1 then - Result := Result + ', Unknown Flag'; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - end; - ctCheck: begin - case aInt and not $C0 of - 0..7, 20, 21: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbGLOBFNAM(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt of - Ord('s'): Result := 'Short'; - Ord('l'): Result := 'Long'; - Ord('f'): Result := 'Float'; - else - Result := ''; - end; - end; - ctToSortKey: Result := Chr(aInt); - ctCheck: begin - case aInt of - Ord('s'), Ord('l'), Ord('f'): Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; - Cell: IwbMainRecord; - Position: TwbVector; - Grid: TwbGridCell; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - - // grid position of persistent reference in exterior persistent cell (interior cells are not persistent) - if Supports(aMainRecord.Container, IwbGroupRecord, Container) then - Cell := IwbGroupRecord(Container).ChildrenOf; - if Assigned(Cell) and Cell.IsPersistent and (Cell.Signature = 'CELL') then - if aMainRecord.GetPosition(Position) then begin - Grid := wbPositionToGridCell(Position); - Result := Result + ' at ' + IntToStr(Grid.x) + ',' + IntToStr(Grid.y); - end; - end; - end; -end; - -function wbINFOAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := Trim(aMainRecord.ElementValues['Responses\Response\NAM1']); - if Result <> '' then - Result := '''' + Result + ''''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; - - s := Trim(aMainRecord.ElementValues['QSTI']); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'for ' + s; - end; -end; - -function wbNAVMAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec : IwbRecord; - Element : IwbElement; - s : string; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['DATA']; - if Assigned(Rec) then begin - Element := Rec.ElementByName['Cell']; - if Assigned(Element) then - Element := Element.LinksTo; - if Assigned(Element) then - s := Trim(Element.Name); - if s <> '' then - Result := 'for ' + s; - end; -end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - if not aMainRecord.IsPersistent then begin - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -function wbWthrDataClassification(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not 192 of - 0: Result := 'None'; - 1: Result := 'Pleasant'; - 2: Result := 'Cloudy'; - 4: Result := 'Rainy'; - 8: Result := 'Snow'; - else - Result := ''; - end; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2) - end; - ctCheck: begin - case aInt and not 192 of - 0, 1, 2, 4, 8: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbNOTETNAMDecide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rDATA: IwbRecord; -begin - Result := 0; - rDATA := aElement.Container.RecordBySignature[DATA]; - if Assigned(rDATA) then - if rDATA.NativeValue = 3 then //Voice - Result := 1; -end; - -function wbNOTESNAMDecide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rDATA: IwbRecord; -begin - Result := 0; - rDATA := aElement.Container.RecordBySignature[DATA]; - if Assigned(rDATA) then - if rDATA.NativeValue = 3 then //Voice - Result := 1; -end; - -function wbIPDSDATACount(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) then - Result := (Cardinal(aBasePtr) - Cardinal(aBasePtr)) div 4 - else - Result := 12; -end; - -function wbNAVINAVMGetCount1(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - DataContainer : IwbDataContainer; -begin - Result := 0; - - if Supports(aElement, IwbDataContainer, DataContainer) then begin - if DataContainer.ElementType = etArray then - if not Supports(DataContainer.Container, IwbDataContainer, DataContainer) then - Exit; - Assert(DataContainer.Name = 'Data'); - Result := PWord(Cardinal(DataContainer.DataBasePtr) + 3*3*4)^; - end; -end; - -function wbNAVINAVMGetCount2(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - DataContainer : IwbDataContainer; -begin - Result := 0; - - if Supports(aElement, IwbDataContainer, DataContainer) then begin - if DataContainer.ElementType = etArray then - if not Supports(DataContainer.Container, IwbDataContainer, DataContainer) then - Exit; - Assert(DataContainer.Name = 'Data'); - Result := PWord(Cardinal(DataContainer.DataBasePtr) + 3*3*4 + 2)^; - end; -end; - -procedure wbCTDARunOnAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - if aOldValue <> aNewValue then - if aNewValue <> 2 then - aElement.Container.ElementNativeValues['Reference'] := 0; -end; - -procedure wbPERKPRKETypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -// rDATA : IwbRecord; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - if Supports(Container.Container, IwbContainerElementRef, Container) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - Container.RemoveElement('Perk Conditions'); - Container.RemoveElement('Entry Point Function Parameters'); - if aNewValue = 2 then begin - Container.Add('EPFT', True); - Container.ElementNativeValues['DATA\Entry Point\Function'] := 2; - end; - end; - end; -end; - -function wbMGEFFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Archtype : Variant; - DataContainer : IwbDataContainer; - Element : IwbElement; -const - OffsetArchtype = 56; - -begin - Result := 1; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - VarClear(ArchType); - Element := Container.ElementByName['Archtype']; - if Assigned(Element) then - ArchType := Element.NativeValue - else if Supports(Container, IwbDataContainer, DataContainer) and - DataContainer.IsValidOffset(aBasePtr, aEndPtr, OffsetArchtype) then - begin // we are part of a proper structure - aBasePtr := Pointer(Cardinal(aBasePtr) + OffsetArchtype); - ArchType := PCardinal(aBasePtr)^; - end; - - if not VarIsEmpty(ArchType) then - case Integer(ArchType) of - 01: Result := 2;//Script - 18: Result := 3;//Bound Item - 19: Result := 4;//Summon Creature - else - Result := 0; - end; -end; - -procedure wbMGEFFAssocItemAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0) then begin - Element := Container.ElementByName['Archtype']; - if Assigned(Element) and Element.NativeValue = 0 then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - end; -end; - -procedure wbMGEFArchtypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if (aNewValue < $FF) and (aOldValue < $FF) then begin - Container.ElementNativeValues['..\Assoc. Item'] := 0; - case Integer(aNewValue) of - 11: Container.ElementNativeValues['..\Actor Value'] := 48;//Invisibility - 12: Container.ElementNativeValues['..\Actor Value'] := 49;//Chameleon - 24: Container.ElementNativeValues['..\Actor Value'] := 47;//Paralysis - else - Container.ElementNativeValues['..\Actor Value'] := -1; - end; - end; -end; - -procedure wbCounterEffectsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterByPathAfterSet('DATA - Data\Counter effect count', aElement); -end; - -procedure wbMGEFAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerByPathAfterSet('DATA - Data\Counter effect count', 'Counter Effects', aElement); -end; - -function wbCTDAReferenceDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementNativeValues['Run On']) = 2 then - Result := 1; -end; - -function wbNAVINVMIDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - case Integer(Container.ElementNativeValues['Type']) of - $00: Result :=1; - $20: Result :=2; - $30: Result :=3; - end; -end; - -function wbIMGSSkinDimmerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize in [132, 148] then - Result := 1; -end; - -function wbCOEDOwnerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - LinksTo : IwbElement; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - LinksTo := Container.ElementByName['Owner'].LinksTo; - - if Supports(LinksTo, IwbMainRecord, MainRecord) then - if MainRecord.Signature = 'NPC_' then - Result := 1 - else if MainRecord.Signature = 'FACT' then - Result := 2; -end; - -function wbCreaLevelDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - i := Container.ElementByName['Flags'].NativeValue; - if i and $00000080 <> 0 then - Result := 1; -end; - - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; - 'f': Result := 2; - end; - end; -end; - -function wbFLSTLNAMIsSorted(const aContainer: IwbContainer): Boolean; -var - rEDID : IwbRecord; - s : string; - _File : IwbFile; - MainRecord : IwbMainRecord; -const - OrderedList = 'OrderedList'; -begin - Result := wbSortFLST; {>>> Should not be sorted according to Arthmoor and JustinOther, left as sorted for compatibility <<<} - rEDID := aContainer.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > Length(OrderedList) then - Delete(s, 1, Length(s)-Length(OrderedList)); - if SameText(s, OrderedList) then - Result := False; - end; - if Result then begin - MainRecord := aContainer.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - MainRecord := MainRecord.MasterOrSelf; - if not Assigned(MainRecord) then - Exit; - _File := MainRecord._File; - if not Assigned(_File) then - Exit; - if not SameText(_File.FileName, 'WeaponModKits.esp') then - Exit; - case (MainRecord.FormID and $FFFFFF) of - $0130EB, $0130ED, $01522D, $01522E, $0158D5, $0158D6, $0158D7, $0158D8, $0158D9, $0158DA, $0158DC, $0158DD, $018E20: - Result := False; - end; - end; -end; - -function wbPerkDATADecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rPRKE: IwbRecord; - eType: IwbElement; -begin - Result := 0; - rPRKE := aElement.Container.RecordBySignature[PRKE]; - if Assigned(rPRKE) then begin - eType := rPRKE.ElementByName['Type']; - if Assigned(eType) then begin - Result := eType.NativeValue; - end; - end; -end; - -function wbEPFDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['EPFT']; - if Result = 2 then - if Integer(Container.ElementNativeValues['..\DATA\Entry Point\Function']) = 5 then - Result := 5; -end; - -type - TCTDAFunctionParamType = ( - ptNone, - ptInteger, - ptVariableName, //Integer - ptSex, //Enum: Male, Female - ptActorValue, //Enum: wbActorValue - ptCrimeType, //?? Enum - ptAxis, //?? Char - ptQuestStage, //?? Integer - ptMiscStat, //?? Enum - ptAlignment, //?? Enum - ptEquipType, //?? Enum - ptFormType, //?? Enum - ptCriticalStage, //?? Enum - - ptObjectReference, //REFR, ACHR, ACRE, PGRE - ptInventoryObject, //ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, ARMA - ptActor, //ACHR, ACRE - ptVoiceType, //VTYP - ptIdleForm, //IDLE - ptFormList, //FLST - ptNote, //NOTE - ptQuest, //QUST - ptFaction, //FACT - ptWeapon, //WEAP - ptCell, //CELL - ptClass, //CLAS - ptRace, //RACE - ptActorBase, //NPC_, CREA - ptGlobal, //GLOB - ptWeather, //WTHR - ptPackage, //PACK - ptEncounterZone, //ECZN - ptPerk, //PERK - ptOwner, //FACT, NPC_ - ptFurniture, //FURN - ptMagicItem, //SPEL - ptMagicEffect, //MGEF - ptWorldspace, //WRLD - ptVATSValueFunction, - ptVATSValueParam, - ptCreatureType, - ptMenuMode, - ptPlayerAction, - ptBodyLocation, - ptReferencableObject //TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - end; - -const - wbCTDAFunctions : array[0..243] of TCTDAFunction = ( - (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), - (Index: 5; Name: 'GetLocked'), - (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), - (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), - (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), - (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), - (Index: 12; Name: 'GetSecondsPassed'), - (Index: 14; Name: 'GetActorValue'; ParamType1: ptActorValue), - (Index: 18; Name: 'GetCurrentTime'), - (Index: 24; Name: 'GetScale'), - (Index: 25; Name: 'IsMoving'), - (Index: 26; Name: 'IsTurning'), - (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), - (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), - (Index: 35; Name: 'GetDisabled'), - (Index: 36; Name: 'MenuMode'; ParamType1: ptMenuMode), - (Index: 39; Name: 'GetDisease'), - (Index: 40; Name: 'GetVampire'), - (Index: 41; Name: 'GetClothingValue'), - (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), - (Index: 43; Name: 'SameRace'; ParamType1: ptActor), - (Index: 44; Name: 'SameSex'; ParamType1: ptActor), - (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), - (Index: 46; Name: 'GetDead'), - (Index: 47; Name: 'GetItemCount'; ParamType1: ptInventoryObject), - (Index: 48; Name: 'GetGold'), - (Index: 49; Name: 'GetSleeping'), - (Index: 50; Name: 'GetTalkedToPC'), - (Index: 53; Name: 'GetScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), - (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), - (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), - (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), - (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), - (Index: 61; Name: 'GetAlarmed'), - (Index: 62; Name: 'IsRaining'), - (Index: 63; Name: 'GetAttacked'), - (Index: 64; Name: 'GetIsCreature'), - (Index: 65; Name: 'GetLockLevel'), - (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), - (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), - (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), - (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), - (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), - (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), - (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), - (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), - (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), - (Index: 75; Name: 'IsSnowing'), - (Index: 76; Name: 'GetDisposition'; ParamType1: ptActor), - (Index: 77; Name: 'GetRandomPercent'), - (Index: 79; Name: 'GetQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), - (Index: 80; Name: 'GetLevel'), - (Index: 81; Name: 'GetArmorRating'), - (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), - (Index: 91; Name: 'GetIsAlerted'), - (Index: 98; Name: 'GetPlayerControlsDisabled'; ParamType1: ptInteger; ParamType2: ptInteger{; ParamType3: ptInteger; ParamType4: ptInteger; ParamType5: ptInteger; ParamType6: ptInteger; ParamType7: ptInteger}), - (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), - (Index: 101; Name: 'IsWeaponOut'), - (Index: 102; Name: 'IsTorchOut'), - (Index: 103; Name: 'IsShieldOut'), - (Index: 106; Name: 'IsFacingUp'), - (Index: 107; Name: 'GetKnockedState'), - (Index: 108; Name: 'GetWeaponAnimType'), - (Index: 109; Name: 'IsWeaponSkillType'; ParamType1: ptActorValue), - (Index: 110; Name: 'GetCurrentAIPackage'), - (Index: 111; Name: 'IsWaiting'), - (Index: 112; Name: 'IsIdlePlaying'), - (Index: 116; Name: 'GetMinorCrimeCount'), - (Index: 117; Name: 'GetMajorCrimeCount'), - (Index: 118; Name: 'GetActorAggroRadiusViolated'), - (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), - (Index: 123; Name: 'IsGreetingPlayer'), - (Index: 125; Name: 'IsGuard'), - (Index: 127; Name: 'HasBeenEaten'), - (Index: 128; Name: 'GetFatiguePercentage'), - (Index: 129; Name: 'GetPCIsClass'; ParamType1: ptClass), - (Index: 130; Name: 'GetPCIsRace'; ParamType1: ptRace), - (Index: 131; Name: 'GetPCIsSex'; ParamType1: ptSex), - (Index: 132; Name: 'GetPCInFaction'; ParamType1: ptFaction), - (Index: 133; Name: 'SameFactionAsPC'), - (Index: 134; Name: 'SameRaceAsPC'), - (Index: 135; Name: 'SameSexAsPC'), - (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), - (Index: 141; Name: 'IsTalking'), - (Index: 142; Name: 'GetWalkSpeed'), - (Index: 143; Name: 'GetCurrentAIProcedure'), - (Index: 144; Name: 'GetTrespassWarningLevel'), - (Index: 145; Name: 'IsTrespassing'), - (Index: 146; Name: 'IsInMyOwnedCell'), - (Index: 147; Name: 'GetWindSpeed'), - (Index: 148; Name: 'GetCurrentWeatherPercent'), - (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), - (Index: 150; Name: 'IsContinuingPackagePCNear'), - (Index: 153; Name: 'CanHaveFlames'), - (Index: 154; Name: 'HasFlames'), - (Index: 157; Name: 'GetOpenState'), - (Index: 159; Name: 'GetSitting'), - (Index: 160; Name: 'GetFurnitureMarkerID'), - (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), - (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), - (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), - (Index: 170; Name: 'GetDayOfWeek'), - (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), - (Index: 175; Name: 'IsPCSleeping'), - (Index: 176; Name: 'IsPCAMurderer'), - (Index: 180; Name: 'GetDetectionLevel'; ParamType1: ptActor), - (Index: 182; Name: 'GetEquipped'; ParamType1: ptInventoryObject), - (Index: 185; Name: 'IsSwimming'), - (Index: 190; Name: 'GetAmountSoldStolen'), - (Index: 192; Name: 'GetIgnoreCrime'), - (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), - (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), - (Index: 197; Name: 'GetPCEnemyofFaction'; ParamType1: ptFaction), - (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), - (Index: 203; Name: 'GetDestroyed'), - (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), - (Index: 215; Name: 'GetDefaultOpen'), - (Index: 219; Name: 'GetAnimAction'), - (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), - (Index: 224; Name: 'GetVATSMode'), - (Index: 225; Name: 'GetPersuasionNumber'), - (Index: 226; Name: 'GetSandman'), - (Index: 227; Name: 'GetCannibal'), - (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), - (Index: 229; Name: 'GetClassDefaultMatch'), - (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), - (Index: 235; Name: 'GetVatsTargetHeight'), - (Index: 237; Name: 'GetIsGhost'), - (Index: 242; Name: 'GetUnconscious'), - (Index: 244; Name: 'GetRestrained'), - (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), - (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), - (Index: 254; Name: 'GetIsPlayableRace'), - (Index: 255; Name: 'GetOffersServicesNow'), - (Index: 258; Name: 'GetUsedItemLevel'), - (Index: 259; Name: 'GetUsedItemActivate'), - (Index: 264; Name: 'GetBarterGold'), - (Index: 265; Name: 'IsTimePassing'), - (Index: 266; Name: 'IsPleasant'), - (Index: 267; Name: 'IsCloudy'), - (Index: 274; Name: 'GetArmorRatingUpperBody'), - (Index: 277; Name: 'GetBaseActorValue'; ParamType1: ptActorValue), - (Index: 278; Name: 'IsOwner'; ParamType1: ptOwner), - (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwner), - (Index: 282; Name: 'IsHorseStolen'), - (Index: 285; Name: 'IsLeftUp'), - (Index: 286; Name: 'IsSneaking'), - (Index: 287; Name: 'IsRunning'), - (Index: 288; Name: 'GetFriendHit'), - (Index: 289; Name: 'IsInCombat'), - (Index: 300; Name: 'IsInInterior'), - (Index: 304; Name: 'IsWaterObject'), - (Index: 306; Name: 'IsActorUsingATorch'), - (Index: 309; Name: 'IsXBox'), - (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldSpace), - (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptMiscStat), - (Index: 313; Name: 'IsActorEvil'), - (Index: 314; Name: 'IsActorAVictim'), - (Index: 315; Name: 'GetTotalPersuasionNumber'), - (Index: 318; Name: 'GetIdleDoneOnce'), - (Index: 320; Name: 'GetNoRumors'), - (Index: 323; Name: 'WhichServiceMenu'), - (Index: 327; Name: 'IsRidingHorse'), - (Index: 332; Name: 'IsInDangerousWater'), - (Index: 338; Name: 'GetIgnoreFriendlyHits'), - (Index: 339; Name: 'IsPlayersLastRiddenHorse'), - (Index: 353; Name: 'IsActor'), - (Index: 354; Name: 'IsEssential'), - (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), - (Index: 361; Name: 'GetTimeDead'), - (Index: 362; Name: 'GetPlayerHasLastRiddenHorse'), - (Index: 365; Name: 'IsChild'), - (Index: 367; Name: 'GetLastPlayerAction'), - (Index: 368; Name: 'IsPlayerActionActive'; ParamType1: ptPlayerAction), - (Index: 370; Name: 'IsTalkingActivatorActor'; ParamType1: ptActor), - (Index: 372; Name: 'IsInList'; ParamType1: ptFormList), - (Index: 382; Name: 'GetHasNote'; ParamType1: ptNote), - (Index: 391; Name: 'GetHitLocation'), - (Index: 392; Name: 'IsPC1stPerson'), - (Index: 397; Name: 'GetCauseofDeath'), - (Index: 398; Name: 'IsLimbGone'; ParamType1: ptBodyLocation), - (Index: 399; Name: 'IsWeaponInList'; ParamType1: ptFormList), - (Index: 403; Name: 'HasFriendDisposition'), - (Index: 408; Name: 'GetVATSValue'; ParamType1: ptVATSValueFunction; ParamType2: ptVATSValueParam), - (Index: 409; Name: 'IsKiller'; ParamType1: ptActor), - (Index: 410; Name: 'IsKillerObject'; ParamType1: ptFormList), - (Index: 411; Name: 'GetFactionCombatReaction'; ParamType1: ptFaction; ParamType2: ptFaction), - (Index: 415; Name: 'Exists'; ParamType1: ptObjectReference), - (Index: 416; Name: 'GetGroupMemberCount'), - (Index: 417; Name: 'GetGroupTargetCount'), - (Index: 427; Name: 'GetIsVoiceType'; ParamType1: ptVoiceType), - (Index: 428; Name: 'GetPlantedExplosive'), - (Index: 430; Name: 'IsActorTalkingThroughActivator'), - (Index: 431; Name: 'GetHealthPercentage'), - (Index: 433; Name: 'GetIsObjectType'; ParamType1: ptFormType), - (Index: 435; Name: 'GetDialogueEmotion'), - (Index: 436; Name: 'GetDialogueEmotionValue'), - (Index: 438; Name: 'GetIsCreatureType'; ParamType1: ptCreatureType), - (Index: 446; Name: 'GetInZone'; ParamType1: ptEncounterZone), - (Index: 449; Name: 'HasPerk'; ParamType1: ptPerk), - (Index: 450; Name: 'GetFactionRelation'; ParamType1: ptActor), - (Index: 451; Name: 'IsLastIdlePlayed'; ParamType1: ptIdleForm), - (Index: 454; Name: 'GetPlayerTeammate'), - (Index: 455; Name: 'GetPlayerTeammateCount'), - (Index: 459; Name: 'GetActorCrimePlayerEnemy'), - (Index: 460; Name: 'GetActorFactionPlayerEnemy'), - (Index: 464; Name: 'IsPlayerGrabbedRef'; ParamType1: ptObjectReference), - (Index: 471; Name: 'GetDestructionStage'), - (Index: 474; Name: 'GetIsAlignment'; ParamType1: ptAlignment), - (Index: 478; Name: 'GetThreatRatio'; ParamType1: ptActor), - (Index: 480; Name: 'GetIsUsedItemEquipType'; ParamType1: ptEquipType), - (Index: 489; Name: 'GetConcussed'), - (Index: 492; Name: 'GetMapMarkerVisible'), - (Index: 495; Name: 'GetPermanentActorValue'; ParamType1: ptActorValue), - (Index: 496; Name: 'GetKillingBlowLimb'), - (Index: 500; Name: 'GetWeaponHealthPerc'), - (Index: 503; Name: 'GetRadiationLevel'), - (Index: 510; Name: 'GetLastHitCritical'), - (Index: 515; Name: 'IsCombatTarget'; ParamType1: ptActor), - (Index: 518; Name: 'GetVATSRightAreaFree'; ParamType1: ptObjectReference), - (Index: 519; Name: 'GetVATSLeftAreaFree'; ParamType1: ptObjectReference), - (Index: 520; Name: 'GetVATSBackAreaFree'; ParamType1: ptObjectReference), - (Index: 521; Name: 'GetVATSFrontAreaFree'; ParamType1: ptObjectReference), - (Index: 522; Name: 'GetIsLockBroken'), - (Index: 523; Name: 'IsPS3'), - (Index: 524; Name: 'IsWin32'), - (Index: 525; Name: 'GetVATSRightTargetVisible'; ParamType1: ptObjectReference), - (Index: 526; Name: 'GetVATSLeftTargetVisible'; ParamType1: ptObjectReference), - (Index: 527; Name: 'GetVATSBackTargetVisible'; ParamType1: ptObjectReference), - (Index: 528; Name: 'GetVATSFrontTargetVisible'; ParamType1: ptObjectReference), - (Index: 531; Name: 'IsInCriticalStage'; ParamType1: ptCriticalStage), - (Index: 533; Name: 'GetXPForNextLevel'), - (Index: 546; Name: 'GetQuestCompleted'; ParamType1: ptQuest), - (Index: 550; Name: 'IsGoreDisabled'), - (Index: 555; Name: 'GetSpellUsageNum'; ParamType1: ptMagicItem), - (Index: 557; Name: 'GetActorsInHigh'), - (Index: 558; Name: 'HasLoaded3D'), - - // Added by FOSE: - (Index: 1024; Name: 'GetFOSEVersion'; ), - (Index: 1025; Name: 'GetFOSERevision'; ), - (Index: 1028; Name: 'GetWeight'; ParamType1: ptInventoryObject; ), - (Index: 1082; Name: 'IsKeyPressed'; ParamType1: ptInteger;), - (Index: 1165; Name: 'GetWeaponHasScope'; ParamType1: ptInventoryObject; ), - (Index: 1166; Name: 'IsControlPressed'; ParamType1: ptInteger; ), - (Index: 1213; Name: 'GetFOSEBeta'; ) - ); -var - wbCTDAFunctionEditInfo: string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType1)); -end; - -function wbCTDAParam2VATSValueParam(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Parameter #1'].NativeValue; -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType2)); -end; - -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -type - TPERKEntryPointConditionType = ( - epcDefault, - epcItem, - epcWeapon, - epcWeaponTarget, - epcTarget, - epcAttacker, - epcAttackerAttackee, - epcAttackerAttackerWeapon - ); - - TPERKEntryPointFunctionType = ( - epfFloat, - epfLeveledItem, - epfScript, - epfUnknown - ); - - TPERKEntryPointFunctionParamType = ( - epfpNone, - epfpFloat, - epfpFloatFloat, - epfpLeveledItem, - epfpScript - ); - - PPERKEntryPoint = ^TPERKEntryPoint; - TPERKEntryPoint = record - Name : string; - Condition : TPERKEntryPointConditionType; - FunctionType : TPERKEntryPointFunctionType; - end; - - PPERKCondition = ^TPERKCondition; - TPERKCondition = record - Count : Integer; - Caption1 : string; - Caption2 : string; - Caption3 : string; - end; - - PPERKFunction = ^TPERKFunction; - TPERKFunction = record - Name : string; - FunctionType : TPERKEntryPointFunctionType; - ParamType : TPERKEntryPointFunctionParamType; - end; - -const - wbPERKCondition : array[TPERKEntryPointConditionType] of TPERKCondition = ( - (Count: 1; Caption1: 'Perk Owner'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Item'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Weapon'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Weapon'; Caption3: 'Target'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Target'), - (Count: 2; Caption1: 'Perk Owner'; Caption2: 'Attacker'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Attacker'; Caption3: 'Attackee'), - (Count: 3; Caption1: 'Perk Owner'; Caption2: 'Attacker'; Caption3: 'Attacker Weapon') - ); - - wbPERKFunctions : array[0..9] of TPERKFunction = ( - (Name: ''; FunctionType: epfUnknown; ParamType: epfpNone), - (Name: 'Set Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Add Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Multiply Value'; FunctionType: epfFloat; ParamType: epfpFloat), - (Name: 'Add Range To Value'; FunctionType: epfFloat; ParamType: epfpFloatFloat), - (Name: 'Add Actor Value Mult'; FunctionType: epfFloat; ParamType: epfpFloatFloat), - (Name: ''; FunctionType: epfUnknown; ParamType: epfpNone), - (Name: ''; FunctionType: epfUnknown; ParamType: epfpNone), - (Name: 'Add Leveled List'; FunctionType: epfLeveledItem; ParamType: epfpLeveledItem), - (Name: 'Add Activate Choice'; FunctionType: epfScript; ParamType: epfpScript) - ); - - wbPERKEntryPoints : array[0..36] of TPERKEntryPoint = ( - (Name: 'Calculate Weapon Damage'; Condition: epcWeaponTarget), - (Name: 'Calculate My Critical Hit Chance'; Condition: epcWeaponTarget), - (Name: 'Calculate My Critical Hit Damage'; Condition: epcWeaponTarget), - (Name: 'Calculate Weapon Attack AP Cost'; Condition: epcWeapon), - (Name: 'Calculate Mine Explode Chance'; Condition: epcItem), - (Name: 'Adjust Range Penalty'; Condition: epcWeapon), - (Name: 'Adjust Limb Damage'; Condition: epcAttackerAttackerWeapon), - (Name: 'Calculate Weapon Range'; Condition: epcWeapon), - (Name: 'Calculate To Hit Chance'; Condition: epcWeaponTarget), - (Name: 'Adjust Experience Points'), - (Name: 'Adjust Gained Skill Points'), - (Name: 'Adjust Book Skill Points'), - (Name: 'Modify Recovered Health'), - (Name: 'Calculate Inventory AP Cost'), - (Name: 'Get Disposition'; Condition: epcTarget), - (Name: 'Get Should Attack'; Condition: epcAttacker), - (Name: 'Get Should Assist'; Condition: epcAttackerAttackee), - (Name: 'Calculate Buy Price'; Condition: epcItem), - (Name: 'Get Bad Karma'), - (Name: 'Get Good Karma'), - (Name: 'Ignore Locked Terminal'), - (Name: 'Add Leveled List On Death'; Condition: epcTarget; FunctionType: epfLeveledItem), - (Name: 'Get Max Carry Weight'), - (Name: 'Modify Addiction Chance'), - (Name: 'Modify Addiction Duration'), - (Name: 'Modify Positive Chem Duration'), - (Name: 'Adjust Drinking Radiation'), - (Name: 'Activate'; Condition: epcTarget; FunctionType: epfScript), - (Name: 'Mysterious Stranger'), - (Name: 'Has Paralyzing Palm'), - (Name: 'Hacking Science Bonus'), - (Name: 'Ignore Running During Detection'), - (Name: 'Ignore Broken Lock'), - (Name: 'Has Concentrated Fire'), - (Name: 'Calculate Gun Spread'; Condition: epcWeapon), - (Name: 'Player Kill AP Reward'; Condition: epcWeaponTarget), - (Name: 'Modify Enemy Critical Hit Chance'; Condition: epcWeaponTarget) - ); - - wbPERKFunctionParams: array[TPERKEntryPointFunctionParamType] of string = ( - 'None', - 'Float', - 'Float, Float', - 'Leveled Item', - 'Script' - ); - -procedure wbPERKEntryPointAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldEntryPoint : PPERKEntryPoint; - NewEntryPoint : PPERKEntryPoint; - OldCondition : PPERKCondition; - NewCondition : PPERKCondition; - OldFunction : PPERKFunction; - EntryPoint : IwbContainerElementRef; - Effect : IwbContainerElementRef; - PerkConditions : IwbContainerElementRef; - PerkCondition : IwbContainerElementRef; - Container : IwbContainerElementRef; - i : Integer; -begin - if aOldValue <> aNewValue then begin - OldEntryPoint := @wbPERKEntryPoints[Integer(aOldValue)]; - NewEntryPoint := @wbPERKEntryPoints[Integer(aNewValue)]; - OldCondition := @wbPERKCondition[OldEntryPoint.Condition]; - NewCondition := @wbPERKCondition[NewEntryPoint.Condition]; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, EntryPoint) then - Exit; - i := EntryPoint.ElementNativeValues['Function']; - if (i >= Low(wbPERKFunctions)) and (i <= High(wbPERKFunctions)) then - OldFunction := @wbPERKFunctions[i] - else - OldFunction := nil; - if not Assigned(OldFunction) or (OldFunction.FunctionType <> NewEntryPoint.FunctionType) then - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - with wbPERKFunctions[i] do - if FunctionType = NewEntryPoint.FunctionType then begin - EntryPoint.ElementNativeValues['Function'] := i; - Break; - end; - EntryPoint.ElementNativeValues['Perk Condition Tab Count'] := NewCondition.Count; - - if not Supports(EntryPoint.Container, IwbContainerElementRef, Container) then - Exit; - if not Supports(Container.Container, IwbContainerElementRef, Effect) then - Exit; - - if not Supports(Effect.ElementByName['Perk Conditions'], IwbContainerElementRef, PerkConditions) then - Exit; - - for i := Pred(PerkConditions.ElementCount) downto 0 do - if Supports(PerkConditions.Elements[i], IwbContainerElementRef, PerkCondition) then - if Integer(PerkCondition.ElementNativeValues['PRKC']) >= NewCondition.Count then - PerkCondition.Remove - else - case Integer(PerkCondition.ElementNativeValues['PRKC']) of - 2: if OldCondition.Caption2 <> NewCondition.Caption2 then - PerkCondition.Remove; - 3: if OldCondition.Caption3 <> NewCondition.Caption3 then - PerkCondition.Remove; - end; - end; -end; - -function wbPRKCToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - EntryPointVar := Container.ElementNativeValues['..\..\..\DATA\Entry Point\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - Exit; - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKEntryPoints[EntryPoint] do begin - with wbPERKCondition[Condition] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: with TStringList.Create do try - if Caption1 <> '' then - Add(Caption1); - if Caption2 <> '' then - Add(Caption2); - if Caption3 <> '' then - Add(Caption3); - Sort; - Result := CommaText; - finally - Free; - end; - else - if (aInt < 0) or (aInt >= Count) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: case Integer(aInt) of - 0: Result := Caption1; - 1: Result := Caption2; - 2: Result := Caption3; - end; - ctCheck: Result := ''; - end; - end; - end; - end; -end; - -function wbPRKCToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - s : string; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then begin - Result := 0; - Exit; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Entry Point'); - EntryPointVar := Container.ElementNativeValues['..\..\..\DATA\Entry Point\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - raise Exception.Create('Could not resolve Entry Point'); - - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then - raise Exception.Create('Unknown Entry Point #'+IntToStr(EntryPoint)); - - with wbPERKEntryPoints[EntryPoint] do - with wbPERKCondition[Condition] do - if SameText(aString, Caption1) then - Result := 0 - else if SameText(aString, Caption2) then - Result := 1 - else if SameText(aString, Caption3) then - Result := 2 - else - raise Exception.Create('"'+s+'" is not valid for this Entry Point'); -end; - -function wbNeverShow(const aElement: IwbElement): Boolean; -begin - Result := wbHideNeverShow; -end; - -function GetREGNType(aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := -1; - if not Assigned(aElement) then - Exit; - while aElement.Name <> 'Region Data Entry' do begin - aElement := aElement.Container; - if not Assigned(aElement) then - Exit; - end; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['RDAT\Type']; -end; - -function wbREGNObjectsDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 2; -end; - -function wbREGNWeatherDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 3; -end; - -function wbREGNMapDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 4; -end; - -function wbREGNLandDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 5; -end; - -function wbREGNGrassDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 6; -end; - -function wbREGNSoundDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 7; -end; - -function wbMESGTNAMDontShow(const aElement: IwbElement): Boolean; -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - Result := False; - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['DNAM']) and 1 <> 0 then - Result := True; -end; - -function wbEPFDDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [1..3]) then - Result := True; -end; - -function wbTES4ONAMDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := False; - if not Assigned(aElement) then - Exit; - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - if not MainRecord.IsESM then - Result := True; -end; - - -function wbEPF2DontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [4]) then - Result := True; -end; - -function wbPERKPRKCDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Effect' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['PRKE\Type']) <> 2 then - Result := True; -end; - -function wbPerkDATAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - i : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - EntryPointVar := Container.ElementNativeValues['..\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - Exit; - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKEntryPoints[EntryPoint] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: with TStringList.Create do try - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - if wbPERKFunctions[i].FunctionType = FunctionType then - if (wbPERKFunctions[i].Name <> '') then - Add(wbPERKFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - else - if (aInt < Low(wbPERKFunctions)) or (aInt > High(wbPERKFunctions)) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: begin - Result := wbPERKFunctions[Integer(aInt)].Name; - if (aType = ctToStr) and (wbPERKFunctions[Integer(aInt)].FunctionType <> FunctionType) then - Result := Result + ' '; - end; - ctCheck: - if wbPERKFunctions[Integer(aInt)].FunctionType <> FunctionType then - Result := '' - else - Result := ''; - end; - end; - end; -end; - -function wbPerkDATAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - EntryPointVar : Variant; - EntryPoint : Integer; - s : string; - i : Integer; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then - raise Exception.Create('"" is not a valid value for this field'); - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Entry Point'); - EntryPointVar := Container.ElementNativeValues['..\Entry Point']; - if VarIsNull(EntryPointVar) or VarIsClear(EntryPointVar) then - raise Exception.Create('Could not resolve Entry Point'); - - EntryPoint := EntryPointVar; - if (EntryPoint < Low(wbPERKEntryPoints)) or (EntryPoint > High(wbPERKEntryPoints)) then - raise Exception.Create('Unknown Entry Point #'+IntToStr(EntryPoint)); - - with wbPERKEntryPoints[EntryPoint] do - for i := Low(wbPERKFunctions) to High(wbPERKFunctions) do - if wbPERKFunctions[i].FunctionType = FunctionType then - if SameText(s, wbPERKFunctions[i].Name) then begin - Result := i; - Exit; - end; - - raise Exception.Create('"'+s+'" is not valid for this Entry Point'); -end; - -procedure wbPerkDATAFunctionAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - NewFunction : Integer; - Container : IwbContainerElementRef; - OldParamType: Integer; - NewParamType: Integer; -begin - NewFunction := aNewValue; - if (NewFunction < Low(wbPERKFunctions)) or (NewFunction > High(wbPERKFunctions)) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - OldParamType := Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT']; - NewParamType := Ord(wbPERKFunctions[NewFunction].ParamType); - if (OldParamType = NewParamType) and not VarSameValue(aOldValue, aNewValue) and (NewFunction in [4,5]) then - Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT'] := 0; - Container.ElementNativeValues['..\..\..\Entry Point Function Parameters\EPFT'] := NewParamType; -end; - -function wbPerkEPFTToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - FunctionTypeVar : Variant; - FunctionType : Integer; -// i : Integer; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - FunctionTypeVar := Container.ElementNativeValues['..\..\DATA\Entry Point\Function']; - if VarIsNull(FunctionTypeVar) or VarIsClear(FunctionTypeVar) then - Exit; - FunctionType := FunctionTypeVar; - if (FunctionType < Low(wbPERKFunctions)) or (FunctionType > High(wbPERKFunctions)) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - with wbPERKFunctions[FunctionType] do begin - case aType of - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := '"' + wbPERKFunctionParams[ParamType] + '"'; - else - if (aInt < Ord(Low(wbPERKFunctionParams))) or (aInt > Ord(High(wbPERKFunctionParams))) then - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end - else - case aType of - ctToStr, ctToEditValue: begin - Result := wbPERKFunctionParams[TPERKEntryPointFunctionParamType(aInt)]; - if (aType = ctToStr) and (TPERKEntryPointFunctionParamType(aInt) <> ParamType) then - Result := Result + ' '; - end; - ctCheck: - if TPERKEntryPointFunctionParamType(aInt) <> ParamType then - Result := Result + ' ' - else - Result := ''; - end; - end; - end; -end; - -function wbPerkEPFTToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - FunctionTypeVar : Variant; - FunctionType : Integer; - s : string; -// i : Integer; - j : TPERKEntryPointFunctionParamType; -begin - s := Trim(aString); - - Result := StrToInt64Def(s, Low(Integer)); - if Result <> Low(Integer) then - Exit; - if s = '' then - raise Exception.Create('"" is not a valid value for this field'); - - if not Supports(aElement, IwbContainerElementRef, Container) then - raise Exception.Create('Could not resolve Function'); - FunctionTypeVar := Container.ElementNativeValues['..\..\DATA\Entry Point\Function']; - if VarIsNull(FunctionTypeVar) or VarIsClear(FunctionTypeVar) then - raise Exception.Create('Could not resolve Function'); - - FunctionType := FunctionTypeVar; - if (FunctionType < Low(wbPERKFunctions)) or (FunctionType > High(wbPERKFunctions)) then - raise Exception.Create('Unknown Function #'+IntToStr(FunctionType)); - - with wbPERKFunctions[FunctionType] do begin - for j := Low(wbPERKFunctionParams) to High(wbPERKFunctionParams) do - if SameText(s, wbPERKFunctionParams[j]) then begin - if j <> ParamType then - raise Exception.Create('"'+s+'" is not a valid Parameter Type for Function "'+Name+'"'); - Result := Ord(j); - Exit; - end; - end; - - raise Exception.Create('"'+s+'" is not a valid Parameter Type'); -end; - -procedure wbPerkEPFTAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - i: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - i := aNewValue; - if (i < Ord(Low(wbPERKFunctionParams))) or (i> Ord(High(wbPERKFunctionParams))) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Container.RemoveElement('EPFD'); - Container.RemoveElement('EPF2'); - Container.RemoveElement('EPF3'); - Container.RemoveElement('Embedded Script'); - case TPERKEntryPointFunctionParamType(i) of - epfpFloat, epfpFloatFloat, epfpLeveledItem: - Container.Add('EPFD', True); - epfpScript: begin - Container.Add('EPF2', True); - Container.Add('EPF3', True); - Container.Add('SCHR', True); - end; - end; -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if not wbRemoveOffsetData then - Exit; - - if Supports(aElement, IwbContainer, Container) then begin - if wbBeginInternalEdit then try - Container.RemoveElement(OFST); - finally - wbEndInternalEdit; - end else begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; - end; -end; - -function wbActorTemplateUseTraits(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000001) <> 0; - end; -end; - -function wbActorTemplateUseStats(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000002) <> 0; - end; -end; - -function wbActorAutoCalcDontShow(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseStatsAutoCalc(const aElement: IwbElement): Boolean; -begin - if not wbActorTemplateHide then - Result := False - else - Result := wbActorTemplateUseStats(aElement) or wbActorAutoCalcDontShow(aElement); -end; - -function wbActorTemplateUseFactions(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000004) <> 0; - end; -end; - -function wbActorTemplateUseActorEffectList(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000008) <> 0; - end; -end; - -function wbActorTemplateUseAIData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseAIPackages(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000020) <> 0; - end; -end; - -function wbActorTemplateUseModelAnimation(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000040) <> 0; - end; -end; - -function wbActorTemplateUseBaseData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000080) <> 0; - end; -end; - -function wbActorTemplateUseInventory(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000100) <> 0; - end; -end; - -function wbActorTemplateUseScript(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - if not wbActorTemplateHide then Exit; - Element := GetElementFromUnion(aElement); - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000200) <> 0; - end; -end; - -procedure wbCTDAAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - //Size : Cardinal; - TypeFlags : Cardinal; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - TypeFlags := Container.ElementNativeValues['Type']; - if (TypeFlags and $02) <> 0 then begin - if Container.DataSize = 20 then - Container.DataSize := 28; - Container.ElementNativeValues['Type'] := TypeFlags and not $02; - Container.ElementEditValues['Run On'] := 'Target'; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMGEFAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - OldActorValue : Integer; - NewActorValue : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - OldActorValue := Container.ElementNativeValues['DATA - Data\Actor Value']; - NewActorValue := OldActorValue; - case Integer(Container.ElementNativeValues['DATA - Data\Archtype']) of - 01, //Script - 02, //Dispel - 03, //Cure Disease - 13, //Light - 16, //Lock - 17, //Open - 18, //Bound Item - 19, //Summon Creature - 30, //Cure Paralysis - 31, //Cure Addiction - 32, //Cure Poison - 33: //Concussion - NewActorValue := -1; - 11: //Invisibility - NewActorValue := 48; //Invisibility - 12: //Chameleon - NewActorValue := 49; //Chameleon - 24: //Paralysis - NewActorValue := 47; //Paralysis - end; - if OldActorValue <> NewActorValue then - Container.ElementNativeValues['DATA - Data\Actor Value'] := NewActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbPACKAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - NewContainer : IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - case Integer(Container.ElementNativeValues['PKDT - General\Type']) of - 0: begin {Find} - Container.Add('PTDT'); - end; - 1: begin {Follow} - Container.Add('PKFD'); - end; - 2: begin {Escort} - end; - 3: begin {Eat} - Container.Add('PTDT'); - Container.Add('PKED'); - end; - 4: begin {Sleep} - if not Container.ElementExists['Locations'] then - if Supports(Container.Add('Locations'), IwbContainerElementRef, NewContainer) then - NewContainer.ElementEditValues['PLDT - Location 1\Type'] := 'Near editor location'; - end; - 5: begin {Wander} - end; - 6: begin {Travel} - end; - 7: begin {Accompany} - end; - 8: begin {Use Item At} - end; - 9: begin {Ambush} - end; - 10: begin {Flee Not Combat} - end; - 12: begin {Sandbox} - end; - 13: begin {Patrol} - if not Container.ElementExists['Locations'] then - if Supports(Container.Add('Locations'), IwbContainerElementRef, NewContainer) then - NewContainer.ElementEditValues['PLDT - Location 1\Type'] := 'Near linked reference'; - Container.Add('PKPT'); - end; - 14: begin {Guard} - end; - 15: begin {Dialogue} - end; - 16: begin {Use Weapon} - end; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbNPCAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// BaseRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementNativeValues['NAM5'] > 255 then - Container.ElementNativeValues['NAM5'] := 255; - finally - wbEndInternalEdit; - end; -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('RCLR'); - - if Container.ElementExists['Ammo'] then begin - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) and (BaseRecord.Signature <> 'WEAP') then - Container.RemoveElement('Ammo'); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbINFOAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if (Integer(Container.ElementNativeValues['DATA\Flags 1']) and $80) = 0 then - Container.RemoveElement('DNAM'); - - Container.RemoveElement('SNDD'); - - if Container.ElementNativeValues['DATA\Type'] = 3 {Persuasion} then - Container.ElementNativeValues['DATA\Type'] := 0 {Topic}; - finally - wbEndInternalEdit; - end; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; -// Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// i : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if (not Container.ElementExists['XCLW']) and ((Integer(Container.ElementNativeValues['DATA']) and $02) <> 0) then begin - Container.Add('XCLW', True); - Container.ElementEditValues['XCLW'] := 'Default'; - end; - - if (not Container.ElementExists['XNAM']) and ((Integer(Container.ElementNativeValues['DATA']) and $02) <> 0) then - Container.Add('XNAM', True); - -// if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin -// for i:= Pred(Container2.ElementCount) downto 0 do -// if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then -// Container2.RemoveElement(i); -// if Container2.ElementCount < 1 then -// Container2.Remove; -// end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbEmbeddedScriptAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if Container.ElementEditValues['SCHR\Type'] = 'Quest' then - Container.ElementEditValues['SCHR\Type'] := 'Object'; - finally - wbEndInternalEdit; - end; -end; - - -procedure wbSOUNAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; - OldCntr: IwbContainerElementRef; - NewCntr: IwbContainerElementRef; - NewCntr2: IwbContainerElementRef; - i: Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['SNDD'] then - Exit; - - if not Supports(Container.RemoveElement('SNDX - Sound Data'), IwbContainerElementRef, OldCntr) then - Exit; - if not Supports(Container.Add('SNDD', True), IwbContainerElementRef, NewCntr) then - Exit; - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr.ElementCount)) do - NewCntr.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - - if not Supports(NewCntr.ElementByName['Attenuation Curve'], IwbContainerElementRef, NewCntr2) then - Assert(False); - Assert(NewCntr2.ElementCount = 5); - - if Supports(Container.RemoveElement('ANAM'), IwbContainerElementRef, OldCntr) then begin - Assert(OldCntr.ElementCount = 5); - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr2.ElementCount)) do - NewCntr2.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - end else begin - NewCntr2.Elements[0].NativeValue := 100; - NewCntr2.Elements[1].NativeValue := 50; - NewCntr2.Elements[2].NativeValue := 20; - NewCntr2.Elements[3].NativeValue := 5; - NewCntr2.Elements[4].NativeValue := 0; - end; - - if not Supports(NewCntr.ElementByName['Reverb Attenuation Control'], IwbContainerElementRef, NewCntr2) then - Assert(False); - - if Supports(Container.RemoveElement('GNAM'), IwbContainerElementRef, OldCntr) then - NewCntr2.Assign(Low(Integer), OldCntr, False) - else - NewCntr2.NativeValue := 80; - - if not Supports(NewCntr.ElementByName['Priority'], IwbContainerElementRef, NewCntr2) then - Assert(False); - - if Supports(Container.RemoveElement('HNAM'), IwbContainerElementRef, OldCntr) then - NewCntr2.Assign(Low(Integer), OldCntr, False) - else - NewCntr2.NativeValue := 128; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbWATRAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -// AnimationMultiplier : Extended; -// AnimationAttackMultiplier : Extended; - OldCntr: IwbContainerElementRef; - NewCntr: IwbContainerElementRef; - i: Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['DNAM'] then - Exit; - - if not Supports(Container.RemoveElement('DATA - Visual Data'), IwbContainerElementRef, OldCntr) then - Exit; - if not Supports(Container.Add('DNAM', True), IwbContainerElementRef, NewCntr) then - Exit; - for i := 0 to Pred(Min(OldCntr.ElementCount, NewCntr.ElementCount)) do - if OldCntr.Elements[i].Name = 'Damage (Old Format)' then - Container.ElementNativeValues['DATA - Damage'] := OldCntr.Elements[i].NativeValue - else - NewCntr.Elements[i].Assign(Low(Integer), OldCntr.Elements[i], False); - - NewCntr.ElementNativeValues['Noise Properties - Noise Layer One - Amplitude Scale'] := 1.0; - NewCntr.ElementNativeValues['Noise Properties - Noise Layer Two - Amplitude Scale'] := 0.5; - NewCntr.ElementNativeValues['Noise Properties - Noise Layer Three - Amplitude Scale'] := 0.25; - finally - wbEndInternalEdit; - end; -end; - - -procedure wbWEAPAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DNAM'] then - Exit; - - if Container.ElementNativeValues['DNAM\Animation Multiplier'] = 0.0 then - Container.ElementNativeValues['DNAM\Animation Multiplier'] := 1.0; - if Container.ElementNativeValues['DNAM\Animation Attack Multiplier'] = 0.0 then - Container.ElementNativeValues['DNAM\Animation Attack Multiplier'] := 1.0; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - IsMessageBox : Boolean; - HasTimeDelay : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - IsMessageBox := (Integer(Container.ElementNativeValues['DNAM']) and 1) = 1; - HasTimeDelay := Container.ElementExists['TNAM']; - - if IsMessageBox = HasTimeDelay then - if IsMessageBox then - Container.RemoveElement('TNAM') - else begin - if not Container.ElementExists['DNAM'] then - Container.Add('DNAM', True); - Container.ElementNativeValues['DNAM'] := Integer(Container.ElementNativeValues['DNAM']) or 1; - end; - - finally - wbEndInternalEdit; - end; -end; - - -procedure wbEFSHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; - FullParticleBirthRatio : Extended; - PersistantParticleBirthRatio : Extended; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DATA'] then - Exit; - - FullParticleBirthRatio := Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio']; - PersistantParticleBirthRatio := Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Birth Ratio']; - - if ((FullParticleBirthRatio <> 0) and (FullParticleBirthRatio <= 1)) then begin - FullParticleBirthRatio := FullParticleBirthRatio * 78.0; - Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio'] := FullParticleBirthRatio; - end; - - if ((PersistantParticleBirthRatio <> 0) and (PersistantParticleBirthRatio <= 1)) then begin - PersistantParticleBirthRatio := PersistantParticleBirthRatio * 78.0; - Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Birth Ratio'] := PersistantParticleBirthRatio; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbFACTAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Container.ElementExists['CNAM'] then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('CNAM'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['FNAM'] then begin - Container.Add('FNAM', True); - Container.ElementNativeValues['FNAM'] := 1.0; - end; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - MainRecord := Container.ContainingMainRecord; - if not Assigned(MainRecord) or MainRecord.IsDeleted then - Exit; - - Element := Container.ElementByPath['..\EFID']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Actor Value']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container: IwbContainer; - a, b: Single; - NeedsFlip: Boolean; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[0].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].Value); - case CompareValue(a, b) of - EqualsValue: begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[1].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].Value); - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbPxDTLocationDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Type'].NativeValue; -end; - -function wbPKDTFalloutBehaviorFlagsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 8 then - Result := 1; -end; - -function wbPKDTSpecificFlagsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 8 then - Exit; - Result := Container.ElementByName['Type'].NativeValue + 1; -end; - -procedure wbIDLAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - if wbBeginInternalEdit then try -// if not wbCounterAfterSet('IDLC - Animation Count', aElement) then - if Supports(aElement.Container, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - if Assigned(Element) and Supports(aElement, IwbContainer, SelfAsContainer) and - (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbAnimationsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - if wbBeginInternalEdit then try -// if not wbCounterContainerAfterSet('IDLC - Animation Count', 'IDLA - Animations', aElement) then - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - Elems := Container.ElementByName['IDLA - Animations']; - if Assigned(Element) and not Assigned(Elems) then - if Element.GetNativeValue<>0 then - Element.SetNativeValue(0); - end; - finally - wbEndInternalEdit; - end; -end; - -function wbOffsetDataColsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbDataContainer; - Element : IwbElement; - fResult : Extended; -begin - Result := 0; - - if Supports(aElement.Container, IwbDataContainer, Container) and (Container.Name = 'OFST - Offset Data') and - Supports(Container.Container, IwbDataContainer, Container) then begin - Element := Container.ElementByPath['Object Bounds\NAM0 - Min\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 0 - else - Result := Trunc(fResult); - Element := Container.ElementByPath['Object Bounds\NAM9 - Max\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 1 - else - Result := Trunc(fResult) - Result + 1; - end; - end; - end; -end; - -procedure DefineFO3a; -begin - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags([ - {0x00000001}'ESM', - {0x00000002}'', - {0x00000004}'', // Plugin selected (Editor) - {0x00000008}'', // Form cannot be saved (Runtime)/Plugin active (Editor) - {0x00000010}'Form initialized (Runtime only)', // Plugin cannot be active or selected (Editor) - {0x00000020}'Deleted', - {0x00000040}'Border Region / Has Tree LOD / Constant / Hidden From Local Map', - {0x00000080}'Turn Off Fire', - {0x00000100}'Inaccessible', - {0x00000200}'Casts shadows / On Local Map / Motion Blur', - {0x00000400}'Quest item / Persistent reference', - {0x00000800}'Initially disabled', - {0x00001000}'Ignored', - {0x00002000}'No Voice Filter', - {0x00004000}'Cannot Save (Runtime only)', - {0x00008000}'Visible when distant', - {0x00010000}'Random Anim Start / High Priority LOD', - {0x00020000}'Dangerous / Off limits (Interior cell) / Radio Station (Talking Activator)', - {0x00040000}'Compressed', - {0x00080000}'Can''t wait / Platform Specific Texture / Dead', - {0x00100000}'Unknown 21', - {0x00200000}'Load Started', // set when beginning to load the form from save - {0x00400000}'Unknown 23', - {0x00800000}'Unknown 24', - {0x01000000}'Destructible (Runtime only)', - {0x02000000}'Obstacle / No AI Acquire', - {0x03000000}'NavMesh Generation - Filter', - {0x08000000}'NavMesh Generation - Bounding Box', - {0x10000000}'Non-Pipboy / Reflected by Auto Water', - {0x20000000}'Child Can Use / Refracted by Auto Water', - {0x40000000}'NavMesh Generation - Ground', - {0x80000000}'Multibound' - ])); - -(* wbInteger('Record Flags 2', itU32, wbFlags([ - {0x00000001}'Unknown 1', - {0x00000002}'Unknown 2', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'Unknown 5', - {0x00000020}'Unknown 6', - {0x00000040}'Unknown 7', - {0x00000080}'Unknown 8', - {0x00000100}'Unknown 9', - {0x00000200}'Unknown 10', - {0x00000400}'Unknown 11', - {0x00000800}'Unknown 12', - {0x00001000}'Unknown 13', - {0x00002000}'Unknown 14', - {0x00004000}'Unknown 15', - {0x00008000}'Unknown 16', - {0x00010000}'Unknown 17', - {0x00020000}'Unknown 18', - {0x00040000}'Unknown 19', - {0x00080000}'Unknown 20', - {0x00100000}'Unknown 21', - {0x00200000}'Unknown 22', - {0x00400000}'Unknown 23', - {0x00800000}'Unknown 24', - {0x01000000}'Unknown 25', - {0x02000000}'Unknown 26', - {0x03000000}'Unknown 27', - {0x08000000}'Unknown 28', - {0x10000000}'Unknown 29', - {0x20000000}'Unknown 30', - {0x40000000}'Unknown 31', - {0x80000000}'Unknown 32' - ])); (**) - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbByteArray('Version Control Info 1', 4, cpIgnore), - wbInteger('Form Version', itU16, nil, cpIgnore), - wbByteArray('Version Control Info 2', 2, cpIgnore) - ]); - - wbSizeOfMainRecordStruct := 24; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - wbXRGB := wbByteArray(XRGB, 'Ragdoll Biped Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - wbSoundLevelEnum := wbEnum([ - 'Loud', - 'Normal', - 'Silent' - ]); - - wbWeaponAnimTypeEnum := wbEnum([ - {00} 'Hand to Hand', - {01} 'Melee (1 Hand)', - {02} 'Melee (2 Hand)', - {03} 'Pistol - Balistic (1 Hand)', - {04} 'Pistol - Energy (1 Hand)', - {05} 'Rifle - Balistic (2 Hand)', - {06} 'Rifle - Automatic (2 Hand)', - {07} 'Rifle - Energy (2 Hand)', - {08} 'Handle (2 Hand)', - {09} 'Launcher (2 Hand)', - {10} 'Grenade Throw (1 Hand)', - {11} 'Land Mine (1 Hand)', - {12} 'Mine Drop (1 Hand)' - ]); - - wbReloadAnimEnum := wbEnum([ - 'ReloadA', - 'ReloadB', - 'ReloadC', - 'ReloadD', - 'ReloadE', - 'ReloadF', - 'ReloadG', - 'ReloadH', - 'ReloadI', - 'ReloadJ', - 'ReloadK' - ],[255, 'None']); - - wbEDID := wbString(EDID, 'Editor ID', 0, cpNormal); // not cpBenign according to Arthmoor - wbEDIDReq := wbString(EDID, 'Editor ID', 0, cpNormal, True); // not cpBenign according to Arthmoor - wbFULL := wbString(FULL, 'Name', 0, cpTranslate); - wbFULLActor := wbString(FULL, 'Name', 0, cpTranslate, False, wbActorTemplateUseBaseData); - wbFULLReq := wbString(FULL, 'Name', 0, cpNormal, True); - wbDESC := wbString(DESC, 'Description', 0, cpTranslate); - wbDESCReq := wbString(DESC, 'Description', 0, cpTranslate, True); - wbXSCL := wbFloat(XSCL, 'Scale'); - wbOBND := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ]); - wbOBNDReq := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ], cpNormal, True); - wbREPL := wbFormIDCkNoReach(REPL, 'Repair List', [FLST]); - wbEITM := wbFormIDCk(EITM, 'Object Effect', [ENCH, SPEL]); - wbBIPL := wbFormIDCk(BIPL, 'Biped Model List', [FLST]); - wbCOED := wbStructExSK(COED, [2], [0, 1], 'Extra Data', [ - {00} wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - {04} wbUnion('Global Variable / Required Rank', wbCOEDOwnerDecider, [ - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCk('Global Variable', [GLOB, NULL]), - wbInteger('Required Rank', itU32) - ]), - {08} wbFloat('Item Condition') - ]); - - wbYNAM := wbFormIDCk(YNAM, 'Sound - Pick Up', [SOUN]); - wbZNAM := wbFormIDCk(ZNAM, 'Sound - Drop', [SOUN]); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMODS := - wbArrayS(MODS, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO2S := - wbArrayS(MO2S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO3S := - wbArrayS(MO3S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO4S := - wbArrayS(MO4S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - - wbMODD := - wbInteger(MODD, 'FaceGen Model Flags', itU8, wbFlags([ - 'Head', - 'Torso', - 'Right Hand', - 'Left Hand' - ])); - wbMOSD := - wbInteger(MOSD, 'FaceGen Model Flags', itU8, wbFlags([ - 'Head', - 'Torso', - 'Right Hand', - 'Left Hand' - ])); - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files Hashes', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True); - - wbMODLActor := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files Hashes', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, False, wbActorTemplateUseModelAnimation, True); - - wbMODLReq := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODB, 'Unknown', 4, cpIgnore), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), -// wbArray(MODT, 'Texture Files', -// wbByteArray('Unknown', 24, cpBenign), -// wbArray('Hashes', wbInteger('Hash', itU64, wbMODTCallback), 3), -// 0, nil, nil, cpBenign), - wbMODS, - wbMODD - ], [], cpNormal, True, nil, True); - - - wbDEST := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'VATS Targetable' - ], True)), - wbByteArray('Unused', 2) - ]), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename'), - wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(DMDT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, nil, cpBenign) - ], []), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) - ) - ], []); - - wbDESTActor := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'VATS Targetable' - ])), - wbByteArray('Unused', 2) - ]), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename'), - wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(DMDT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, nil, cpBenign) - ], []), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) - ) - ], [], cpNormal, False, wbActorTemplateUseModelAnimation); - - wbSCRI := wbFormIDCk(SCRI, 'Script', [SCPT]); - wbSCRIActor := wbFormIDCk(SCRI, 'Script', [SCPT], False, cpNormal, False, wbActorTemplateUseScript); - wbENAM := wbFormIDCk(ENAM, 'Object Effect', [ENCH]); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', [PLYR, REFR, ACRE, ACHR, PGRE, PMIS, PBEA]), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent', - 'Pop In' - ])), - wbByteArray('Unused', 3) - ]); - - wbSCHRReq := wbStruct(SCHR, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU16, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Effect' - ])), - wbInteger('Flags', itU16, wbFlags([ - 'Enabled' - ]), cpNormal, False, nil, nil, 1) - ], cpNormal, True); - - wbSCROs := - wbRArray('References', - wbRUnion('', [ - wbFormID(SCRO, 'Global Reference'), -// wbFormIDCk(SCRO, 'Global Reference', -// [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, IMAD, -// BOOK, KEYM, ALCH, LIGH, QUST, PLYR, PACK, LVLI, ECZN, EXPL, FLST, IDLM, PMIS, -// FACT, ACHR, REFR, ACRE, GLOB, DIAL, CELL, SOUN, MGEF, WTHR, CLAS, EFSH, RACE, -// LVLC, CSTY, WRLD, SCPT, IMGS, MESG, MSTT, MUSC, NOTE, PERK, PGRE, PROJ, LVLN, -// WATR, ENCH, TREE, TERM, HAIR, EYES, ADDN, NULL]), - wbInteger(SCRV, 'Local Variable', itU32) - ], []) - ); - - wbSLSD := wbStructSK(SLSD, [0], 'Local Variable Data', [ - wbInteger('Index', itU32), - wbByteArray('Unused', 12), - wbInteger('Flags', itU8, wbFlags(['IsLongOrShort']), cpCritical), - wbByteArray('Unused', 7) - ]); - - wbEmbeddedScript := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal{, True}), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, False, nil, False, wbEmbeddedScriptAfterLoad); - - wbEmbeddedScriptPerk := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal, True), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal, True), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, False, wbEPF2DontShow, False, wbEmbeddedScriptAfterLoad); - - wbEmbeddedScriptReq := wbRStruct('Embedded Script', [ - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Embedded Script', 0, cpNormal{, True}), - wbStringScript(SCTX, 'Embedded Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ], [], cpNormal, True, nil, False, wbEmbeddedScriptAfterLoad); - - - wbXLCM := wbInteger(XLCM, 'Level Modifier', itS32); - - wbRecord(ACHR, 'Placed NPC', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Ragdoll ---} - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Merchant Container ----} - wbFormIDCk(XMRC, 'Merchant Container', [REFR], True), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbXOWN := wbFormIDCkNoReach(XOWN, 'Owner', [FACT, ACHR, CREA, NPC_]); // Ghouls can own too aparently ! - wbXGLB := wbFormIDCk(XGLB, 'Global variable', [GLOB]); - - wbRecord(ACRE, 'Placed Creature', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [CREA], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Merchant Container ----} - wbFormIDCk(XMRC, 'Merchant Container', [REFR], True), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(ACTI, 'Activator', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Sound - Looping', [SOUN]), - wbFormIDCk(VNAM, 'Sound - Activation', [SOUN]), - wbFormIDCk(RNAM, 'Radio Station', [TACT]), - wbFormIDCk(WNAM, 'Water Type', [WATR]) - ]); - - wbICON := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename'), - wbString(MICO, 'Small Icon filename') - ], []); - - wbICONReq := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename'), - wbString(MICO, 'Small Icon filename') - ], [], cpNormal, True); - - wbVatsValueFunctionEnum := - wbEnum([ - 'Weapon Is', - 'Weapon In List', - 'Target Is', - 'Target In List', - 'Target Distance', - 'Target Part', - 'VATS Action', - 'Is Success', - 'Is Critical', - 'Critical Effect Is', - 'Critical Effect In List', - 'Is Fatal', - 'Explode Part', - 'Dismember Part', - 'Cripple Part', - 'Weapon Type Is', - 'Is Stranger', - 'Is Paralyzing Palm' - ]); - - wbActorValueEnum := - wbEnum([ - {00} 'Aggresion', - {01} 'Confidence', - {02} 'Energy', - {03} 'Responsibility', - {04} 'Mood', - {05} 'Strength', - {06} 'Perception', - {07} 'Endurance', - {08} 'Charisma', - {09} 'Intelligence', - {10} 'Agility', - {11} 'Luck', - {12} 'Action Points', - {13} 'Carry Weight', - {14} 'Critical Chance', - {15} 'Heal Rate', - {16} 'Health', - {17} 'Melee Damage', - {18} 'Damage Resistance', - {19} 'Poison Resistance', - {20} 'Rad Resistance', - {21} 'Speed Multiplier', - {22} 'Fatigue', - {23} 'Karma', - {24} 'XP', - {25} 'Perception Condition', - {26} 'Endurance Condition', - {27} 'Left Attack Condition', - {28} 'Right Attack Condition', - {29} 'Left Mobility Condition', - {30} 'Right Mobility Condition', - {31} 'Brain Condition', - {32} 'Barter', - {33} 'Big Guns', - {34} 'Energy Weapons', - {35} 'Explosives', - {36} 'Lockpick', - {37} 'Medicine', - {38} 'Melee Weapons', - {39} 'Repair', - {40} 'Science', - {41} 'Small Guns', - {42} 'Sneak', - {43} 'Speech', - {44} 'Throwing (unused)', - {45} 'Unarmed', - {46} 'Inventory Weight', - {47} 'Paralysis', - {48} 'Invisibility', - {49} 'Chameleon', - {50} 'Night Eye', - {51} 'Detect Life Range', - {52} 'Fire Resistance', - {53} 'Water Breathing', - {54} 'Rad Level', - {55} 'Bloody Mess', - {56} 'Unarmed Damage', - {57} 'Assistance', - {58} 'Electric Resistance', - {59} 'Frost Resistance', - {60} 'Energy Resistance', - {61} 'EMP Resistance', - {62} 'Variable01', - {63} 'Variable02', - {64} 'Variable03', - {65} 'Variable04', - {66} 'Variable05', - {67} 'Variable06', - {68} 'Variable07', - {79} 'Variable08', - {70} 'Variable09', - {71} 'Variable10', - {72} 'Ignore Negative Effects' - ], [ - -1, 'None' - ]); - - wbSkillEnum := - wbEnum([ - 'Barter', - 'Big Guns', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Small Guns', - 'Sneak', - 'Speech', - 'Throwing (unused)', - 'Unarmed' - ], [ - -1, 'None' - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder' - ], [ - -1, 'None' - ]); - - wbActorValue := wbInteger('Actor Value', itS32, wbActorValueEnum); - - wbEquipTypeEnum := - wbEnum([ - {00} 'Big Guns', - {01} 'Energy Weapons', - {02} 'Small Guns', - {03} 'Melee Weapons', - {04} 'Unarmed Weapon', - {05} 'Thrown Weapons', - {06} 'Mine', - {07} 'Body Wear', - {08} 'Head Wear', - {09} 'Hand Wear', - {10} 'Chems', - {11} 'Stimpack', - {12} 'Food', - {13} 'Alcohol' - ], [ - -1, 'None' - ]); - - wbETYP := wbInteger(ETYP, 'Equiptment Type', itS32, wbEquipTypeEnum); - wbETYPReq := wbInteger(ETYP, 'Equiptment Type', itS32, wbEquipTypeEnum, cpNormal, True); - - wbFormTypeEnum := - wbEnum([], [ - $04, 'Texture Set', - $05, 'Menu Icon', - $06, 'Global', - $07, 'Class', - $08, 'Faction', - $09, 'Head Part', - $0A, 'Hair', - $0B, 'Eyes', - $0C, 'Race', - $0D, 'Sound', - $0E, 'Acoustic Space', - $0F, 'Skill', - $10, 'Base Effect', - $11, 'Script', - $12, 'Landscape Texture', - $13, 'Object Effect', - $14, 'Actor Effect', - $15, 'Activator', - $16, 'Talking Activator', - $17, 'Terminal', - $18, 'Armor', - $19, 'Book', - $1A, 'Clothing', - $1B, 'Container', - $1C, 'Door', - $1D, 'Ingredient', - $1E, 'Light', - $1F, 'Misc', - $20, 'Static', - $21, 'Static Collection', - $22, 'Movable Static', - $23, 'Placeable Water', - $24, 'Grass', - $25, 'Tree', - $26, 'Flora', - $27, 'Furniture', - $28, 'Weapon', - $29, 'Ammo', - $2A, 'NPC', - $2B, 'Creature', - $2C, 'Leveled Creature', - $2D, 'Leveled NPC', - $2E, 'Key', - $2F, 'Ingestible', - $30, 'Idle Marker', - $31, 'Note', - $32, 'Constructible Object', - $33, 'Projectile', - $34, 'Leveled Item', - $35, 'Weather', - $36, 'Climate', - $37, 'Region', - $39, 'Cell', - $3A, 'Placed Object', - $3B, 'Placed Character', - $3C, 'Placed Creature', - $3E, 'Placed Grenade', - $41, 'Worldspace', - $42, 'Landscape', - $43, 'Navigation Mesh', - $45, 'Dialog Topic', - $46, 'Dialog Response', - $47, 'Quest', - $48, 'Idle Animation', - $49, 'Package', - $4A, 'Combat Style', - $4B, 'Load Screen', - $4C, 'Leveled Spell', - $4D, 'Animated Object', - $4E, 'Water', - $4F, 'Effect Shader', - $51, 'Explosion', - $52, 'Debris', - $53, 'Image Space', - $54, 'Image Space Modifier', - $55, 'FormID List', - $56, 'Perk', - $57, 'Body Part Data', - $58, 'Addon Node', - $59, 'Actor Value Info', - $5A, 'Radiation Stage', - $5B, 'Camera Shot', - $5C, 'Camera Path', - $5D, 'Voice Type', - $5E, 'Impact Data', - $5F, 'Impact DataSet', - $60, 'Armor Addon', - $61, 'Encounter Zone', - $62, 'Message', - $63, 'Ragdoll', - $64, 'Default Object Manager', - $65, 'Lighting Template', - $66, 'Music Type' - ]); - - wbMenuModeEnum := - wbEnum([],[ - 1, 'Type: Character Interface', - 2, 'Type: Other', - 3, 'Type: Console', - 1001, 'Specific: Message', - 1002, 'Specific: Inventory', - 1003, 'Specific: Stats', - 1004, 'Specific: HUDMainMenu', - 1007, 'Specific: Loading', - 1008, 'Specific: Container', - 1009, 'Specific: Dialog', - 1012, 'Specific: Sleep/Wait', - 1013, 'Specific: Pause', - 1014, 'Specific: LockPick', - 1016, 'Specific: Quantity', - 1027, 'Specific: Level Up', - 1035, 'Specific: Pipboy Repair', - 1036, 'Specific: Race / Sex', - 1047, 'Specific: Credits', - 1048, 'Specific: CharGen', - 1051, 'Specific: TextEdit', - 1053, 'Specific: Barter', - 1054, 'Specific: Surgery', - 1055, 'Specific: Hacking', - 1056, 'Specific: VATS', - 1057, 'Specific: Computers', - 1058, 'Specific: Vendor Repair', - 1059, 'Specific: Tutorial', - 1060, 'Specific: You''re SPECIAL book' - ]); -end; - -procedure DefineFO3b; -begin - wbMiscStatEnum := - wbEnum([ - 'Quests Completed', - 'Locations Discovered', - 'People Killed', - 'Creatures Killed', - 'Locks Picked', - 'Computers Hacked', - 'Stimpaks Taken', - 'Rad-X Taken', - 'RadAway Taken', - 'Chems Taken', - 'Times Addicted', - 'Mines Disarmed', - 'Speech Successes', - 'Pockets Picked', - 'Pants Exploded', - 'Books Read', - 'Bobbleheads Found', - 'Weapons Created', - 'People Mezzed', - 'Captives Rescued', - 'Sandman Kills', - 'Paralyzing Punches', - 'Robots Disabled', - 'Contracts Completed', - 'Corpses Eaten', - 'Mysterious Stranger Visits' - ]); - - wbAlignmentEnum := - wbEnum([ - 'Good', - 'Neutral', - 'Evil', - 'Very Good', - 'Very Evil' - ]); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCriticalStageEnum := - wbEnum([ - 'None', - 'Goo Start', - 'Goo End', - 'Disintegrate Start', - 'Disintegrate End' - ]); - - wbSexEnum := - wbEnum(['Male','Female']); - - wbCreatureTypeEnum := - wbEnum([ - 'Animal', - 'Mutated Animal', - 'Mutated Insect', - 'Abomination', - 'Super Mutant', - 'Feral Ghoul', - 'Robot', - 'Giant' - ]); - - wbPlayerActionEnum := - wbEnum([ - '', - 'Swinging Melee Weapon', - 'Throwing Grenade', - 'Fire Weapon', - 'Lay Mine', - 'Z Key Object', - 'Jumping', - 'Knocking over Objects', - 'Stand on Table/Chair', - 'Iron Sites', - 'Destroying Object' - ]); - - wbBodyLocationEnum := - wbEnum([ - 'Torso', - 'Head 1', - 'Head 2', - 'Left Arm 1', - 'Left Arm 2', - 'Right Arm 1', - 'Right Arm 2', - 'Left Leg 1', - 'Left Leg 2', - 'Left Leg 3', - 'Right Leg 1', - 'Right Leg 2', - 'Right Leg 3', - 'Brain' - ], [ - -1, 'None' - ]); - - - wbEFID := wbFormIDCk(EFID, 'Base Effect', [MGEF]); - - wbEFIT := - wbStructSK(EFIT, [3, 4], '', [ - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbActorValue - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbCTDA := - wbStruct(CTDA, 'Condition', [ - wbInteger('Type', itU8, wbCtdaTypeToStr, wbCtdaTypeToInt, cpNormal, False, nil, wbCtdaTypeAfterSet), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), // Limited to itu16 - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Quest Stage (INVALID)', itS32), - {09} wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {10} wbInteger('Alignment', itU32, wbAlignmentEnum), - {11} wbInteger('Equip Type', itU32, wbEquipTypeEnum), - {12} wbInteger('Form Type', itU32, wbFormTypeEnum), - {13} wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {14} wbFormIDCkNoReach('Object Reference', [PLYR, REFR, ACHR, ACRE, PGRE, PMIS, PBEA, TRGT], True), - {16} wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, FLST]), - {17} wbFormIDCkNoReach('Actor', [PLYR, ACHR, ACRE, TRGT], True), - {18} wbFormIDCkNoReach('Voice Type', [VTYP]), - {19} wbFormIDCkNoReach('Idle', [IDLE]), - {20} wbFormIDCkNoReach('Form List', [FLST]), - {21} wbFormIDCkNoReach('Note', [NOTE]), - {22} wbFormIDCkNoReach('Quest', [QUST]), - {23} wbFormIDCkNoReach('Faction', [FACT]), - {24} wbFormIDCkNoReach('Weapon', [WEAP]), - {25} wbFormIDCkNoReach('Cell', [CELL]), - {26} wbFormIDCkNoReach('Class', [CLAS]), - {27} wbFormIDCkNoReach('Race', [RACE]), - {28} wbFormIDCkNoReach('Actor Base', [NPC_, CREA, ACTI, TACT]), - {29} wbFormIDCkNoReach('Global', [GLOB]), - {30} wbFormIDCkNoReach('Weather', [WTHR]), - {31} wbFormIDCkNoReach('Package', [PACK]), - {32} wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {33} wbFormIDCkNoReach('Perk', [PERK]), - {34} wbFormIDCkNoReach('Owner', [FACT, NPC_]), - {35} wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {36} wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR]), - {37} wbFormIDCkNoReach('Base Effect', [MGEF]), - {38} wbFormIDCkNoReach('Worldspace', [WRLD]), - {39} wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - {40} wbInteger('VATS Value Param (INVALID)', itU32), - {41} wbInteger('Creature Type', itU32, wbCreatureTypeEnum), - {42} wbInteger('Menu Mode', itU32, wbMenuModeEnum), - {43} wbInteger('Player Action', itU32, wbPlayerActionEnum), - {44} wbInteger('Body Location', itS32, wbBodyLocationEnum), - {45} wbFormIDCkNoReach('Referenceable Object', [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, FLST, LVLC, LVLN], - [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, LVLC, LVLN]) - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {09} wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {10} wbInteger('Alignment', itU32, wbAlignmentEnum), - {11} wbInteger('Equip Type', itU32, wbEquipTypeEnum), - {12} wbInteger('Form Type', itU32, wbFormTypeEnum), - {13} wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {14} wbFormIDCkNoReach('Object Reference', [PLYR, REFR, PMIS, PBEA, ACHR, ACRE, PGRE, TRGT], True), - {16} wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, FLST]), - {17} wbFormIDCkNoReach('Actor', [PLYR, ACHR, ACRE, TRGT], True), - {18} wbFormIDCkNoReach('Voice Type', [VTYP]), - {19} wbFormIDCkNoReach('Idle', [IDLE]), - {20} wbFormIDCkNoReach('Form List', [FLST]), - {21} wbFormIDCkNoReach('Note', [NOTE]), - {22} wbFormIDCkNoReach('Quest', [QUST]), - {23} wbFormIDCkNoReach('Faction', [FACT]), - {24} wbFormIDCkNoReach('Weapon', [WEAP]), - {25} wbFormIDCkNoReach('Cell', [CELL]), - {26} wbFormIDCkNoReach('Class', [CLAS]), - {27} wbFormIDCkNoReach('Race', [RACE]), - {28} wbFormIDCkNoReach('Actor Base', [NPC_, CREA, ACTI, TACT]), - {29} wbFormIDCkNoReach('Global', [GLOB]), - {30} wbFormIDCkNoReach('Weather', [WTHR]), - {31} wbFormIDCkNoReach('Package', [PACK]), - {32} wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {33} wbFormIDCkNoReach('Perk', [PERK]), - {34} wbFormIDCkNoReach('Owner', [FACT, NPC_]), - {35} wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {36} wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR]), - {37} wbFormIDCkNoReach('Base Effect', [MGEF]), - {38} wbFormIDCkNoReach('Worldspace', [WRLD]), - {39} wbInteger('VATS Value Function (INVALID)', itU32), - {40} wbUnion('VATS Value Param', wbCTDAParam2VATSValueParam, [ - wbFormIDCkNoReach('Weapon', [WEAP]), - wbFormIDCkNoReach('Weapon List', [FLST], [WEAP]), - wbFormIDCkNoReach('Target', [NPC_, CREA]), - wbFormIDCkNoReach('Target List', [FLST], [NPC_, CREA]), - wbByteArray('Unused', 4, cpIgnore), - wbInteger('Target Part', itS32, wbActorValueEnum), - wbInteger('VATS Action', itU32, wbEnum([ - 'Unarmed Attack', - 'One Hand Melee Attack', - 'Two Hand Melee Attack', - 'Fire Pistol', - 'Fire Rifle', - 'Fire Handle Weapon', - 'Fire Launcher', - 'Throw Grenade', - 'Place Mine', - 'Reload', - 'Crouch', - 'Stand', - 'Switch Weapon', - 'Toggle Weapon Drawn', - 'Heal', - 'Player Death' - ])), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Critical Effect', [SPEL]), - wbFormIDCkNoReach('Critical Effect List', [FLST], [SPEL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbInteger('Weapon Type', itU32, wbWeaponAnimTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - {41} wbInteger('Creature Type', itU32, wbCreatureTypeEnum), - {42} wbInteger('Menu Mode', itU32, wbMenuModeEnum), - {43} wbInteger('Player Action', itU32, wbPlayerActionEnum), - {44} wbInteger('Body Location', itS32, wbBodyLocationEnum), - {45} wbFormIDCkNoReach('Referenceable Object', [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, FLST, LVLC, LVLN], - [CREA, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, LVLC, LVLN]) - ]), - wbInteger('Run On', itU32, wbEnum([ - 'Subject', - 'Target', - 'Reference', - 'Combat Target', - 'Linked Reference' - ]), cpNormal, False, nil, wbCTDARunOnAfterSet), - wbUnion('Reference', wbCTDAReferenceDecider, [ - wbInteger('Unused', itU32, nil, cpIgnore), - wbFormIDCkNoReach('Reference', [PLYR, ACHR, ACRE, REFR, PMIS, PBEA, PGRE], True) - ]) - ], cpNormal, False, nil, 6, wbCTDAAfterLoad); - wbCTDAs := wbRArray('Conditions', wbCTDA); - wbCTDAsReq := wbRArray('Conditions', wbCTDA, cpNormal, True); - - wbEffects := - wbRStructs('Effects','Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], []); - - wbEffectsReq := - wbRStructs('Effects','Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], [], cpNormal, True); - - - wbRecord(ALCH, 'Ingestible', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICON, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbETYPReq, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags?', itU8, wbFlags([ - 'No Auto-Calc (Unused)', - 'Food Item', - 'Medicine' - ])), - wbByteArray('Unused', 3), - wbFormIDCk('Withdrawal Effect', [SPEL, NULL]), - wbFloat('Addiction Chance'), - wbFormIDCk('Sound - Consume', [SOUN]) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(AMMO, 'Ammunition', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbFloat('Speed'), - wbInteger('Flags', itU8, wbFlags([ - 'Ignores Normal Weapon Resistance', - 'Non-Playable' - ])), - wbByteArray('Unused', 3), - wbInteger('Value', itS32), - wbInteger('Clip Rounds', itU8) - ], cpNormal, True), - wbString(ONAM, 'Short Name') - ]); - - wbRecord(ANIO, 'Animated Object', [ - wbEDIDReq, - wbMODLReq, - wbFormIDCk(DATA, 'Animation', [IDLE], False, cpNormal, True) - ]); - - wbBMDT := wbStruct(BMDT, 'Biped Data', [ - wbInteger('Biped Flags', itU32, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Left Hand', - {0x00000010} 'Right Hand', - {0x00000020} 'Weapon', - {0x00000040} 'PipBoy', - {0x00000080} 'Backpack', - {0x00000100} 'Necklace', - {0x00000200} 'Headband', - {0x00000400} 'Hat', - {0x00000800} 'Eye Glasses', - {0x00001000} 'Nose Ring', - {0x00002000} 'Earrings', - {0x00004000} 'Mask', - {0x00008000} 'Choker', - {0x00010000} 'Mouth Object', - {0x00020000} 'Body AddOn 1', - {0x00040000} 'Body AddOn 2', - {0x00080000} 'Body AddOn 3' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} '', - {0x0002} '', - {0x0004} '', - {0x0008} '', - {0x0010} '', - {0x0020} 'Power Armor', - {0x0040} 'Non-Playable', - {0x0080} 'Heavy' - ], True)), - wbByteArray('Unused', 3) - ], cpNormal, True); - - wbRecord(ARMO, 'Armor', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbSCRI, - wbEITM, - wbBMDT, - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbString(ICON, 'Male icon filename'), - wbString(MICO, 'Male mico filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename', 0, cpNormal, True), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S, - wbMOSD - ], [], cpNormal, False, nil, True), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(ICO2, 'Female icon filename'), - wbString(MIC2, 'Female mico filename'), - wbString(BMCT, 'Ragdoll Constraint Template'), - wbDEST, - wbREPL, - wbBIPL, - wbETYPReq, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbInteger('Max Condition', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(DNAM, '', [ - wbInteger('AR', itS16, wbDiv(100)), - wbInteger('Flags', itU16, wbFlags([ - 'Modulates Voice' - ])) - ], cpNormal, True) - ]); - - wbRecord(ARMA, 'Armor Addon', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbBMDT, - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore), - wbMODS, - wbMODD - ], [], cpNormal, False, nil, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbString(ICON, 'Male icon filename'), - wbString(MICO, 'Male mico filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename', 0, cpNormal, True), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S, - wbMOSD - ], [], cpNormal, False, nil, True), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(ICO2, 'Female icon filename'), - wbString(MIC2, 'Female mico filename'), - wbETYPReq, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbInteger('Max Condition', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(DNAM, '', [ - wbInteger('AR', itS16, wbDiv(100)), - wbInteger('Flags', itU16, wbFlags([ - 'Modulates Voice' - ])) - ], cpNormal, True) - ]); - - wbRecord(BOOK, 'Book', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbDESCReq, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU8, wbFlags([ - '', - 'Can''t be Taken' - ])), - wbInteger('Skill', itS8, wbSkillEnum), - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbSPLO := wbFormIDCk(SPLO, 'Actor Effect', [SPEL]); - wbSPLOs := wbRArrayS('Actor Effects', wbSPLO, cpNormal, False, nil, nil, wbActorTemplateUseActorEffectList); - - wbRecord(CELL, 'Cell', [ - wbEDID, - wbFULL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Is Interior Cell', - {0x02} 'Has water', - {0x04} 'Invert Fast Travel behavior', - {0x08} 'No LOD Water', - {0x10} '', - {0x20} 'Public place', - {0x40} 'Hand changed', - {0x80} 'Behave like exterior' - ]), cpNormal, True), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32), - wbInteger('Force Hide Land', itU32, wbFlags([ - 'Quad 1', - 'Quad 2', - 'Quad 3', - 'Quad 4' - ], True)) - ], cpNormal, False, nil, 2), - wbStruct(XCLL, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Dist'), - wbFloat('Fog Power') - ], cpNormal, False, nil, 7), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbRStruct('Light Template', [ - wbFormIDCk(LTMP, 'Template', [LGTM, NULL]), - wbInteger(LNAM, 'Inherit', itU32, wbFlags([ - {0x00000001}'Ambient Color', - {0x00000002}'Directional Color', - {0x00000004}'Fog Color', - {0x00000008}'Fog Near', - {0x00000010}'Fog Far', - {0x00000020}'Directional Rotation', - {0x00000040}'Directional Fade', - {0x00000080}'Clip Distance', - {0x00000100}'Fog Power' - ]), cpNormal, True) - ], [], cpNormal, True ), - wbFloat(XCLW, 'Water Height'), - wbString(XNAM, 'Water Noise Texture'), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbFormIDCk(XCIM, 'Image Space', [IMGS]), - wbByteArray(XCET, 'Unknown', 1, cpIgnore), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbFormIDCk(XCCM, 'Climate', [CLMT]), - wbFormIDCk(XCWT, 'Water', [WATR]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - wbFormIDCk(XCAS, 'Acoustic Space', [ASPC]), - wbByteArray(XCMT, 'Unused', 1, cpIgnore), - wbFormIDCk(XCMO, 'Music Type', [MUSC]) - ], True, wbCellAddInfo, cpNormal, False, wbCELLAfterLoad); - - wbServiceFlags := - wbFlags([ - {0x00000001} 'Weapons', - {0x00000002} 'Armor', - {0x00000004} 'Alcohol', - {0x00000008} 'Books', - {0x00000010} 'Food', - {0x00000020} 'Chems', - {0x00000040} 'Stimpacks', - {0x00000080} 'Lights?', - {0x00000100} '', - {0x00000200} '', - {0x00000400} 'Miscellaneous', - {0x00000800} '', - {0x00001000} '', - {0x00002000} 'Potions?', - {0x00004000} 'Training', - {0x00008000} '', - {0x00010000} 'Recharge', - {0x00020000} 'Repair' - ]); - - wbSpecializationEnum := wbEnum(['Combat', 'Magic', 'Stealth']); - - wbRecord(CLAS, 'Class', [ - wbEDIDReq, - wbFULLReq, - wbDESCReq, - wbICON, - wbStruct(DATA, '', [ - wbArray('Tag Skills', wbInteger('Tag Skill', itS32, wbActorValueEnum), 4), - wbInteger('Flags', itU32, wbFlags(['Playable', 'Guard'], True)), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbArray(ATTR, 'Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, True) - ]); -end; - -procedure DefineFO3c; -begin - wbRecord(CLMT, 'Climate', [ - wbEDIDReq, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR, NULL]), - wbInteger('Chance', itS32), - wbFormIDCk('Global', [GLOB, NULL]) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbCNTO := - wbRStructExSK([0], [1], 'Item', [ - wbStructExSK(CNTO, [0], [1], 'Item', [ - wbFormIDCk('Item', [ARMO, AMMO, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, NOTE, MSTT{?}, STAT{?}]), - wbInteger('Count', itS32) - ]), - wbCOED - ], []); - - wbCNTOs := wbRArrayS('Items', wbCNTO); - - wbRecord(CONT, 'Container', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbCNTOs, - wbDEST, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['', 'Respawns'])), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(SNAM, 'Sound - Open', [SOUN]), - wbFormIDCk(QNAM, 'Sound - Close', [SOUN]) - ], True); - - wbCSDT := wbRStructSK([0], 'Sound Type', [ - wbInteger(CSDT, 'Type', itU32,wbEnum([ - {0x00} 'Left Foot', - {0x01} 'Right Foot', - {0x02} 'Left Back Foot', - {0x03} 'Right Back Foot', - {0x04} 'Idle', - {0x05} 'Aware', - {0x06} 'Attack', - {0x07} 'Hit', - {0x08} 'Death', - {0x09} 'Weapon', - {0x0A} 'Movement', - {0x0B} 'Conscious' - ])), - wbRArrayS('Sounds', wbRStructSK([0], 'Sound', [ - wbFormIDCk(CSDI, 'Sound', [SOUN], False, cpNormal, True), - wbInteger(CSDC, 'Sound Chance', itU8, nil, cpNormal, True) - ], []), cpNormal, True) - ], []); - - wbCSDTs := wbRArrayS('Sound Types', wbCSDT, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation); - - wbAgressionEnum := wbEnum([ - 'Unaggressive', - 'Aggressive', - 'Very Aggressive', - 'Frenzied' - ]); - - wbConfidenceEnum := wbEnum([ - 'Cowardly', - 'Cautious', - 'Average', - 'Brave', - 'Foolhardy' - ]); - - wbMoodEnum := wbEnum([ - 'Neutral', - 'Afraid', - 'Annoyed', - 'Cocky', - 'Drugged', - 'Pleasant', - 'Angry', - 'Sad' - ]); - - wbAssistanceEnum := wbEnum([ - 'Helps Nobody', - 'Helps Allies', - 'Helps Friends and Allies' - ]); - - wbAggroRadiusFlags := wbFlags([ - 'Aggro Radius Behavior' - ]); - - wbAIDT := - wbStruct(AIDT, 'AI Data', [ - {00} wbInteger('Aggression', itU8, wbAgressionEnum), - {01} wbInteger('Confidence', itU8, wbConfidenceEnum), - {02} wbInteger('Energy Level', itU8), - {03} wbInteger('Responsibility', itU8), - {04} wbInteger('Mood', itU8, wbMoodEnum), - wbByteArray('Unused', 3), - {08} wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - {0C} wbInteger('Teaches', itS8, wbSkillEnum), - {0D} wbInteger('Maximum training level', itU8), - {0E} wbInteger('Assistance', itS8, wbAssistanceEnum), - {0F} wbInteger('Aggro Radius Behavior', itU8, wbAggroRadiusFlags), - {10} wbInteger('Aggro Radius', itS32) - ], cpNormal, True, wbActorTemplateUseAIData); - - wbAttackAnimationEnum := - wbEnum([ - ], [ - 26, 'AttackLeft', - 27, 'AttackLeftUp', - 28, 'AttackLeftDown', - 29, 'AttackLeftIS', - 30, 'AttackLeftISUp', - 31, 'AttackLeftISDown', - 32, 'AttackRight', - 33, 'AttackRightUp', - 34, 'AttackRightDown', - 35, 'AttackRightIS', - 36, 'AttackRightISUp', - 37, 'AttackRightISDown', - 38, 'Attack3', - 39, 'Attack3Up', - 40, 'Attack3Down', - 41, 'Attack3IS', - 42, 'Attack3ISUp', - 43, 'Attack3ISDown', - 44, 'Attack4', - 45, 'Attack4Up', - 46, 'Attack4Down', - 47, 'Attack4IS', - 48, 'Attack4ISUp', - 49, 'Attack4ISDown', - 50, 'Attack5', - 51, 'Attack5Up', - 52, 'Attack5Down', - 53, 'Attack5IS', - 54, 'Attack5ISUp', - 55, 'Attack5ISDown', - 56, 'Attack6', - 57, 'Attack6Up', - 58, 'Attack6Down', - 59, 'Attack6IS', - 60, 'Attack6ISUp', - 61, 'Attack6ISDown', - 62, 'Attack7', - 63, 'Attack7Up', - 64, 'Attack7Down', - 65, 'Attack7IS', - 66, 'Attack7ISUp', - 67, 'Attack7ISDown', - 68, 'Attack8', - 69, 'Attack8Up', - 70, 'Attack8Down', - 71, 'Attack8IS', - 72, 'Attack8ISUp', - 73, 'Attack8ISDown', - 74, 'AttackLoop', - 75, 'AttackLoopUp', - 76, 'AttackLoopDown', - 77, 'AttackLoopIS', - 78, 'AttackLoopISUp', - 79, 'AttackLoopISDown', - 80, 'AttackSpin', - 81, 'AttackSpinUp', - 82, 'AttackSpinDown', - 83, 'AttackSpinIS', - 84, 'AttackSpinISUp', - 85, 'AttackSpinISDown', - 86, 'AttackSpin2', - 87, 'AttackSpin2Up', - 88, 'AttackSpin2Down', - 89, 'AttackSpin2IS', - 90, 'AttackSpin2ISUp', - 91, 'AttackSpin2ISDown', - 92, 'AttackPower', - 93, 'AttackForwardPower', - 94, 'AttackBackPower', - 95, 'AttackLeftPower', - 96, 'AttackRightPower', - 97, 'PlaceMine', - 98, 'PlaceMineUp', - 99, 'PlaceMineDown', - 100, 'PlaceMineIS', - 101, 'PlaceMineISUp', - 102, 'PlaceMineISDown', - 103, 'PlaceMine2', - 104, 'PlaceMine2Up', - 105, 'PlaceMine2Down', - 106, 'PlaceMine2IS', - 107, 'PlaceMine2ISUp', - 108, 'PlaceMine2ISDown', - 109, 'AttackThrow', - 110, 'AttackThrowUp', - 111, 'AttackThrowDown', - 112, 'AttackThrowIS', - 113, 'AttackThrowISUp', - 114, 'AttackThrowISDown', - 115, 'AttackThrow2', - 116, 'AttackThrow2Up', - 117, 'AttackThrow2Down', - 118, 'AttackThrow2IS', - 119, 'AttackThrow2ISUp', - 120, 'AttackThrow2ISDown', - 121, 'AttackThrow3', - 122, 'AttackThrow3Up', - 123, 'AttackThrow3Down', - 124, 'AttackThrow3IS', - 125, 'AttackThrow3ISUp', - 126, 'AttackThrow3ISDown', - 127, 'AttackThrow4', - 128, 'AttackThrow4Up', - 129, 'AttackThrow4Down', - 130, 'AttackThrow4IS', - 131, 'AttackThrow4ISUp', - 132, 'AttackThrow4ISDown', - 133, 'AttackThrow5', - 134, 'AttackThrow5Up', - 135, 'AttackThrow5Down', - 136, 'AttackThrow5IS', - 137, 'AttackThrow5ISUp', - 138, 'AttackThrow5ISDown', - - 167, 'PipBoy', - 178, 'PipBoyChild', - - 255, ' ANY' - ]); - - wbImpactMaterialTypeEnum := - wbEnum([ - 'Stone', - 'Dirt', - 'Grass', - 'Glass', - 'Metal', - 'Wood', - 'Organic', - 'Cloth', - 'Water', - 'Hollow Metal', - 'Organic Bug', - 'Organic Glow' - ]); - - wbTemplateFlags := wbFlags([ - 'Use Traits', - 'Use Stats', - 'Use Factions', - 'Use Actor Effect List', - 'Use AI Data', - 'Use AI Packages', - 'Use Model/Animation', - 'Use Base Data', - 'Use Inventory', - 'Use Script' - ]); - - wbRecord(CREA, 'Creature', [ - wbEDIDReq, - wbOBNDReq, - wbFULLActor, - wbMODLActor, - wbSPLOs, - wbFormIDCk(EITM, 'Unarmed Attack Effect', [ENCH, SPEL], False, cpNormal, False, wbActorTemplateUseActorEffectList), - wbInteger(EAMT, 'Unarmed Attack Animation', itU16, wbAttackAnimationEnum, cpNormal, True, False, wbActorTemplateUseActorEffectList), - wbArrayS(NIFZ, 'Model List', wbStringLC('Model'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbByteArray(NIFT, 'Texture Files Hashes', 0, cpIgnore, False, False, wbActorTemplateUseModelAnimation), - wbStruct(ACBS, 'Configuration', [ - {00} wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Biped', - {0x000002} 'Essential', - {0x000004} 'Weapon & Shield?', - {0x000008} 'Respawn', - {0x000010} 'Swims', - {0x000020} 'Flies', - {0x000040} 'Walks', - {0x000080} 'PC Level Mult', - {0x000100} 'Unknown 8', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} 'No Head', - {0x010000} 'No Right Arm', - {0x020000} 'No Left Arm', - {0x040000} 'No Combat in Water', - {0x080000} 'No Shadow', - {0x100000} 'No VATS Melee', - {0x00200000} 'Allow PC Dialogue', - {0x00400000} 'Can''t Open Doors', - {0x00800000} 'Immobile', - {0x01000000} 'Tilt Front/Back', - {0x02000000} 'Tilt Left/Right', - {0x03000000} 'No Knockdowns', - {0x08000000} 'Not Pushable', - {0x10000000} 'Allow Pickpocket', - {0x20000000} 'Is Ghost', - {0x40000000} 'No Rotating To Head-track', - {0x80000000} 'Invulnerable' - ], [ - {0x000001 Biped} wbActorTemplateUseModelAnimation, - {0x000002 Essential} wbActorTemplateUseBaseData, - {0x000004 Weapon & Shield} nil, - {0x000008 Respawn} wbActorTemplateUseBaseData, - {0x000010 Swims} wbActorTemplateUseModelAnimation, - {0x000020 Flies} wbActorTemplateUseModelAnimation, - {0x000040 Walks} wbActorTemplateUseModelAnimation, - {0x000080 PC Level Mult} wbActorTemplateUseStats, - {0x000100 Unknown 8} nil, - {0x000200 No Low Level Processing} wbActorTemplateUseBaseData, - {0x000400 } nil, - {0x000800 No Blood Spray} wbActorTemplateUseModelAnimation, - {0x001000 No Blood Decal} wbActorTemplateUseModelAnimation, - {0x002000 } nil, - {0x004000 } nil, - {0x008000 No Head} wbActorTemplateUseModelAnimation, - {0x010000 No Right Arm} wbActorTemplateUseModelAnimation, - {0x020000 No Left Arm} wbActorTemplateUseModelAnimation, - {0x040000 No Combat in Water} wbActorTemplateUseModelAnimation, - {0x080000 No Shadow} wbActorTemplateUseModelAnimation, - {0x100000 No VATS Melee} nil, - {0x00200000 Allow PC Dialogue} wbActorTemplateUseBaseData, - {0x00400000 Can''t Open Doors} wbActorTemplateUseBaseData, - {0x00800000 Immobile} wbActorTemplateUseModelAnimation, - {0x01000000 Tilt Front/Back} wbActorTemplateUseModelAnimation, - {0x02000000 Tilt Left/Right} wbActorTemplateUseModelAnimation, - {0x03000000 No Knockdowns} nil, - {0x08000000 Not Pushable} wbActorTemplateUseModelAnimation, - {0x10000000 Allow Pickpocket} wbActorTemplateUseBaseData, - {0x20000000 Is Ghost} nil, - {0x40000000 No Rotating To Head-track} wbActorTemplateUseModelAnimation, - {0x80000000 Invulnerable} nil - ])), - {04} wbInteger('Fatigue', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {06} wbInteger('Barter gold', itU16, nil, cpNormal, False, wbActorTemplateUseAIData), - {08} wbUnion('Level', wbCreaLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, False, wbActorTemplateUseStats) - ], cpNormal, False, wbActorTemplateUseStats), - {10} wbInteger('Calc min', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {12} wbInteger('Calc max', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {14} wbInteger('Speed Multiplier', itU16, nil, cpNormal, False, wbActorTemplateUseStats), - {16} wbFloat('Karma (Alignment)', cpNormal, False, 1, -1, wbActorTemplateUseTraits), - {20} wbInteger('Disposition Base', itS16, nil, cpNormal, False, wbActorTemplateUseTraits), - {22} wbInteger('Template Flags', itU16, wbTemplateFlags) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]), - cpNormal, False, nil, nil, wbActorTemplateUseFactions), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(TPLT, 'Template', [CREA, LVLC]), - wbDESTActor, - wbSCRIActor, - wbRArrayS('Items', wbCNTO, cpNormal, False, nil, nil, wbActorTemplateUseInventory), - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil, nil, wbActorTemplateUseAIPackages), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbStruct(DATA, '', [ - {00} wbInteger('Type', itU8, wbCreatureTypeEnum, cpNormal, False, wbActorTemplateUseTraits), - {01} wbInteger('Combat Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {02} wbInteger('Magic Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {03} wbInteger('Stealth Skill', itU8, nil, cpNormal, False, wbActorTemplateUseStats), - {04} wbInteger('Health', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - {06} wbByteArray('Unused', 2), - {08} wbInteger('Damage', itS16, nil, cpNormal, False, wbActorTemplateUseStats), - {10} wbArray('Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, False, wbActorTemplateUseStats) - ], cpNormal, True), - wbInteger(RNAM, 'Attack reach', itU8, nil, cpNormal, True, False, wbActorTemplateUseTraits), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(PNAM, 'Body Part Data', [BPTD], False, cpNormal, True, wbActorTemplateUseModelAnimation), - wbFloat(TNAM, 'Turning Speed', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbFloat(BNAM, 'Base Scale', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbFloat(WNAM, 'Foot Weight', cpNormal, True, 1, -1, wbActorTemplateUseStats), - wbInteger(NAM4, 'Impact Material Type', itU32, wbImpactMaterialTypeEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbInteger(NAM5, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbFormIDCk(CSCR, 'Inherits Sounds from', [CREA], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbCSDTs, - wbFormIDCk(CNAM, 'Impact Dataset', [IPDS], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbFormIDCk(LNAM, 'Melee Weapon List', [FLST], False, cpNormal, False, wbActorTemplateUseTraits) - ], True); - -end; - -procedure DefineFO3d; -begin - wbRecord(CSTY, 'Combat Style', [ - wbEDIDReq, - wbStruct(CSTD, 'Advanced - Standard', [ - {000}wbInteger('Maneuver Decision - Dodge % Chance', itU8), - {001}wbInteger('Maneuver Decision - Left/Right % Chance', itU8), - {002}wbByteArray('Unused', 2), - {004}wbFloat('Maneuver Decision - Dodge L/R Timer (min)'), - {008}wbFloat('Maneuver Decision - Dodge L/R Timer (max)'), - {012}wbFloat('Maneuver Decision - Dodge Forward Timer (min)'), - {016}wbFloat('Maneuver Decision - Dodge Forward Timer (max)'), - {020}wbFloat('Maneuver Decision - Dodge Back Timer Min'), - {024}wbFloat('Maneuver Decision - Dodge Back Timer Max'), - {028}wbFloat('Maneuver Decision - Idle Timer min'), - {032}wbFloat('Maneuver Decision - Idle Timer max'), - {036}wbInteger('Melee Decision - Block % Chance', itU8), - {037}wbInteger('Melee Decision - Attack % Chance', itU8), - {038}wbByteArray('Unused', 2), - {040}wbFloat('Melee Decision - Recoil/Stagger Bonus to Attack'), - {044}wbFloat('Melee Decision - Unconscious Bonus to Attack'), - {048}wbFloat('Melee Decision - Hand-To-Hand Bonus to Attack'), - {052}wbInteger('Melee Decision - Power Attacks - Power Attack % Chance', itU8), - {053}wbByteArray('Unused', 3), - {056}wbFloat('Melee Decision - Power Attacks - Recoil/Stagger Bonus to Power'), - {060}wbFloat('Melee Decision - Power Attacks - Unconscious Bonus to Power Attack'), - {064}wbInteger('Melee Decision - Power Attacks - Normal', itU8), - {065}wbInteger('Melee Decision - Power Attacks - Forward', itU8), - {066}wbInteger('Melee Decision - Power Attacks - Back', itU8), - {067}wbInteger('Melee Decision - Power Attacks - Left', itU8), - {068}wbInteger('Melee Decision - Power Attacks - Right', itU8), - {069}wbByteArray('Unused', 3), - {072}wbFloat('Melee Decision - Hold Timer (min)'), - {076}wbFloat('Melee Decision - Hold Timer (max)'), - {080}wbInteger('Flags', itU16, wbFlags([ - 'Choose Attack using % Chance', - 'Melee Alert OK', - 'Flee Based on Personal Survival', - '', - 'Ignore Threats', - 'Ignore Damaging Self', - 'Ignore Damaging Group', - 'Ignore Damaging Spectators', - 'Cannot Use Stealthboy' - ])), - {082}wbByteArray('Unused', 2), - {085}wbInteger('Maneuver Decision - Acrobatic Dodge % Chance', itU8), - {085}wbInteger('Melee Decision - Power Attacks - Rushing Attack % Chance', itU8), - {086}wbByteArray('Unused', 2), - {088}wbFloat('Melee Decision - Power Attacks - Rushing Attack Distance Mult') - ], cpNormal, True), - wbStruct(CSAD, 'Advanced - Advanced', [ - wbFloat('Dodge Fatigue Mod Mult'), - wbFloat('Dodge Fatigue Mod Base'), - wbFloat('Encumb. Speed Mod Base'), - wbFloat('Encumb. Speed Mod Mult'), - wbFloat('Dodge While Under Attack Mult'), - wbFloat('Dodge Not Under Attack Mult'), - wbFloat('Dodge Back While Under Attack Mult'), - wbFloat('Dodge Back Not Under Attack Mult'), - wbFloat('Dodge Forward While Attacking Mult'), - wbFloat('Dodge Forward Not Attacking Mult'), - wbFloat('Block Skill Modifier Mult'), - wbFloat('Block Skill Modifier Base'), - wbFloat('Block While Under Attack Mult'), - wbFloat('Block Not Under Attack Mult'), - wbFloat('Attack Skill Modifier Mult'), - wbFloat('Attack Skill Modifier Base'), - wbFloat('Attack While Under Attack Mult'), - wbFloat('Attack Not Under Attack Mult'), - wbFloat('Attack During Block Mult'), - wbFloat('Power Att. Fatigue Mod Base'), - wbFloat('Power Att. Fatigue Mod Mult') - ], cpNormal, True), - wbStruct(CSSD, 'Simple', [ - {00} wbFloat('Cover Search Radius'), - {04} wbFloat('Take Cover Chance'), - {08} wbFloat('Wait Timer (min)'), - {12} wbFloat('Wait Timer (max)'), - {16} wbFloat('Wait to Fire Timer (min)'), - {20} wbFloat('Wait to Fire Timer (max)'), - {24} wbFloat('Fire Timer (min)'), - {28} wbFloat('Fire Timer (max)'), - {32} wbFloat('Ranged Weapon Range Mult (min)'), - {36} wbByteArray('Unused', 4), - {40} wbInteger('Weapon Restrictions', itU32, wbEnum([ - 'None', - 'Melee Only', - 'Ranged Only' - ])), - {44} wbFloat('Ranged Weapon Range Mult (max)'), - {48} wbFloat('Max Targeting FOV'), - {52} wbFloat('Combat Radius'), - {56} wbFloat('Semi-Auto Firing Delay Mult (min)'), - {60} wbFloat('Semi-Auto Firing Delay Mult (max)') - ], cpNormal, True) - ]); - - wbRecord(DIAL, 'Dialog Topic', [ - wbEDIDReq, - wbRArrayS('Quests', wbFormIDCkNoReach(QSTI, 'Quest', [QUST], False, cpBenign)), - wbRArrayS('Quests?', wbFormIDCkNoReach(QSTR, 'Quest?', [QUST], False, cpBenign)), - wbFULL, - wbFloat(PNAM, 'Priority', cpNormal, True, 1, -1, nil, nil, 50.0), - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous', - {7} 'Radio' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Rumors', - 'Top-level' - ])) - ], cpNormal, True, nil, 1) - ], True); - - wbRecord(DOOR, 'Door', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Sound - Open', [SOUN]), - wbFormIDCk(ANAM, 'Sound - Close', [SOUN]), - wbFormIDCk(BNAM, 'Sound - Looping', [SOUN]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - '', - 'Automatic Door', - 'Hidden', - 'Minimal Use', - 'Sliding Door' - ]), cpNormal, True) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - 'Normal', - 'Greater Than', - '', - 'Greater Than or Equal Than', - 'Always Show' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbString(NAM7, 'Holes Texture'), - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0} 'No Membrane Shader', - {1} '', - {2} '', - {3} 'No Particle Shader', - {4} 'Edge Effect - Inverse', - {5} 'Membrane Shader - Affect Skin Only' - ])), - wbByteArray('Unused', 3), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbStruct('Fill/Texture Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbStruct('Edge Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pusle Frequence'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Birth Ratio'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbStruct('Color Key 1 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 2 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 3 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time'), - wbFloat('Particle Shader - Initial Speed Along Normal +/-'), - wbFloat('Particle Shader - Initial Rotation (deg)'), - wbFloat('Particle Shader - Initial Rotation (deg) +/-'), - wbFloat('Particle Shader - Rotation Speed (deg/sec)'), - wbFloat('Particle Shader - Rotation Speed (deg/sec) +/-'), - wbFormIDCk('Addon Models', [DEBR, NULL]), - wbFloat('Holes - Start Time'), - wbFloat('Holes - End Time'), - wbFloat('Holes - Start Val'), - wbFloat('Holes - End Val'), - wbFloat('Edge Width (alpha units)'), - wbStruct('Edge Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Explosion Wind Speed'), - wbInteger('Texture Count U', itU32), - wbInteger('Texture Count V', itU32), - wbFloat('Addon Models - Fade In Time'), - wbFloat('Addon Models - Fade Out Time'), - wbFloat('Addon Models - Scale Start'), - wbFloat('Addon Models - Scale End'), - wbFloat('Addon Models - Scale In Time'), - wbFloat('Addon Models - Scale Out Time') - ], cpNormal, True, nil, 57) - ], False, nil, cpNormal, False, wbEFSHAfterLoad); - - wbRecord(ENCH, 'Object Effect', [ - wbEDIDReq, - wbFULL, - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Type', itU32, wbEnum([ - {0} '', - {1} '', - {2} 'Weapon', - {3} 'Apparel' - ])), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbInteger('Flags', itU8, wbFlags([ - 'No Auto-Calc', - '', - 'Hide Effect' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(EYES, 'Eyes', [ - wbEDIDReq, - wbFULLReq, - wbString(ICON, 'Texture', 0{, cpNormal, True??}), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female' - ]), cpNormal, True) - ]); - - wbXNAM := - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCkNoReach('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32), - wbInteger('Group Combat Reaction', itU32, wbEnum([ - 'Neutral', - 'Enemy', - 'Ally', - 'Friend' - ])) - ]); - - wbXNAMs := wbRArrayS('Relations', wbXNAM); - - wbRecord(FACT, 'Faction', [ - wbEDIDReq, - wbFULL, - wbXNAMs, - wbStruct(DATA, '', [ - wbInteger('Flags 1', itU8, wbFlags([ - 'Hidden from PC', - 'Evil', - 'Special Combat' - ])), - wbInteger('Flags 2', itU8, wbFlags([ - 'Track Crime', - 'Allow Sell' - ])), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 1), - wbFloat(CNAM, 'Unused'), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itS32), - wbString(MNAM, 'Male', 0, cpTranslate), - wbString(FNAM, 'Female', 0, cpTranslate), - wbString(INAM, 'Insignia (Unused)') - ], []) - ], False, nil, cpNormal, False, wbFACTAfterLoad); - - wbRecord(FURN, 'Furniture', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbByteArray(MNAM, 'Marker Flags', 0, cpNormal, True) - ]); - - wbRecord(GLOB, 'Global', [ - wbEDIDReq, - wbInteger(FNAM, 'Type', itU8, wbGLOBFNAM, nil, cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - - wbRecord(GMST, 'Game Setting', [ - wbString(EDID, 'Editor ID', 0, cpCritical, True, nil, wbGMSTEDIDAfterSet), - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbString('', 0, cpTranslate), - wbInteger('', itS32), - wbFloat('') - ], cpNormal, True) - ]); - - wbDODT := wbStruct(DODT, 'Decal Data', [ - wbFloat('Min Width'), - wbFloat('Max Width'), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Depth'), - wbFloat('Shininess'), - wbStruct('Parallax', [ - wbFloat('Scale'), - wbInteger('Passes', itU8) - ]), - wbInteger('Flags', itU8, wbFlags([ - 'Parallax', - 'Alpha - Blending', - 'Alpha - Testing' - ], True)), - wbByteArray('Unused', 2), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]); - - wbRecord(TXST, 'Texture Set', [ - wbEDIDReq, - wbOBNDReq, - wbRStruct('Textures (RGB/A)', [ - wbString(TX00,'Base Image / Transparency'), - wbString(TX01,'Normal Map / Specular'), - wbString(TX02,'Environment Map Mask / ?'), - wbString(TX03,'Glow Map / Unused'), - wbString(TX04,'Parallax Map / Unused'), - wbString(TX05,'Environment Map / Unused') - ], []), - wbDODT, - wbInteger(DNAM, 'Flags', itU16, wbFlags([ - 'No Specular Map' - ]), cpNormal, True) - ]); - - wbRecord(MICN, 'Menu Icon', [ - wbEDIDReq, - wbICONReq - ]); - - wbRecord(HDPT, 'Head Part', [ - wbEDIDReq, - wbFULLReq, - wbMODL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable' - ]), cpNormal, True), - wbRArrayS('Extra Parts', - wbFormIDCk(HNAM, 'Part', [HDPT]) - ) - ]); - - wbRecord(ASPC, 'Acoustic Space', [ - wbEDIDReq, - wbOBNDReq, - wbFormIDCk(SNAM, 'Sound - Looping', [SOUN]), - wbFormIDCk(RDAT, 'Use Sound from Region (Interiors Only)', [REGN]), - wbInteger(ANAM, 'Environment Type', itU32, wbEnum([ - 'None', - 'Default', - 'Generic', - 'Padded Cell', - 'Room', - 'Bathroom', - 'Livingroom', - 'Stone Room', - 'Auditorium', - 'Concerthall', - 'Cave', - 'Arena', - 'Hangar', - 'Carpeted Hallway', - 'Hallway', - 'Stone Corridor', - 'Alley', - 'Forest', - 'City', - 'Mountains', - 'Quarry', - 'Plain', - 'Parkinglot', - 'Sewerpipe', - 'Underwater', - 'Small Room', - 'Medium Room', - 'Large Room', - 'Medium Hall', - 'Large Hall', - 'Plate' - ]), cpNormal, True) - ]); - - wbRecord(TACT, 'Talking Activator', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbSCRI, - wbDEST, - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbFormIDCk(VNAM, 'Voice Type', [VTYP]) - ]); - - wbRecord(SCPT, 'Script', [ - wbEDIDReq, - wbSCHRReq, - wbByteArray(SCDA, 'Compiled Script'), - wbStringScript(SCTX, 'Script Source', 0, cpNormal{, True}), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical, True) - ], [])), - wbSCROs - ]); - - wbRecord(TERM, 'Terminal', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbSCRI, - wbDEST, - wbDESCReq, - wbFormIDCk(SNAM, 'Sound - Looping', [SOUN]), - wbFormIDCk(PNAM, 'Password Note', [NOTE]), - wbStruct(DNAM, '', [ - wbInteger('Base Hacking Difficulty', itU8, wbEnum([ - 'Very Easy', - 'Easy', - 'Average', - 'Hard', - 'Very Hard', - 'Requires Key' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Leveled', - 'Unlocked', - 'Alternate Colors', - 'Hide Welcome Text when displaying Image' - ])), - wbInteger('ServerType', itU8, wbEnum([ - '-Server 1-', - '-Server 2-', - '-Server 3-', - '-Server 4-', - '-Server 5-', - '-Server 6-', - '-Server 7-', - '-Server 8-', - '-Server 9-', - '-Server 10-' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRArray('Menu Items', - wbRStruct('Menu Item', [ - wbString(ITXT, 'Item Text'), - wbString(RNAM, 'Result Text', 0, cpNormal, True), - wbInteger(ANAM, 'Flags', itU8, wbFlags([ - 'Add Note', - 'Force Redraw' - ]), cpNormal, True), - wbFormIDCk(INAM, 'Display Note', [NOTE]), - wbFormIDCk(TNAM, 'Sub Menu', [TERM]), - wbEmbeddedScriptReq, - wbCTDAs - ], []) - ) - ]); - - wbRecord(SCOL, 'Static Collection', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbRStructsSK('Parts', 'Part', [0], [ - wbFormIDCk(ONAM, 'Static', [STAT]), - wbArrayS(DATA, 'Placements', wbStruct('Placement', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]), - wbFloat('Scale') - ]), 0, cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(MSTT, 'Moveable Static', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbDEST, - wbByteArray(DATA, 'Unknown', 1, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ]); - - wbRecord(PWAT, 'Placeable Water', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbStruct(DNAM, '', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Reflects', - {0x00000002}'Reflects - Actors', - {0x00000004}'Reflects - Land', - {0x00000008}'Reflects - LOD Land', - {0x00000010}'Reflects - LOD Buildings', - {0x00000020}'Reflects - Trees', - {0x00000040}'Reflects - Sky', - {0x00000080}'Reflects - Dynamic Objects', - {0x00000100}'Reflects - Dead Bodies', - {0x00000200}'Refracts', - {0x00000400}'Refracts - Actors', - {0x00000800}'Refracts - Land', - {0x00001000}'', - {0x00002000}'', - {0x00004000}'', - {0x00008000}'', - {0x00010000}'Refracts - Dynamic Objects', - {0x00020000}'Refracts - Dead Bodies', - {0x00040000}'Silhouette Reflections', - {0x00080000}'', - {0x00100000}'', - {0x00200000}'', - {0x00400000}'', - {0x00800000}'', - {0x01000000}'', - {0x02000000}'', - {0x03000000}'', - {0x08000000}'', - {0x10000000}'Depth', - {0x20000000}'Object Texture Coordinates', - {0x40000000}'', - {0x80000000}'No Underwater Fog' - ])), - wbFormIDCk('Water', [WATR]) - ], cpNormal, True) - ]); - - wbRecord(IDLM, 'Idle Marker', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - '', - 'Do Once' - ]), cpNormal, True), - wbStruct(IDLC, '', [ - wbInteger('Animation Count', itU8), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE, NULL]), 0, nil, wbIDLAsAfterSet, cpNormal, True) // NULL looks valid if IDLS\Animation Count is 0 - ], False, nil, cpNormal, False, nil, wbAnimationsAfterSet); - - wbRecord(NOTE, 'Note', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbYNAM, - wbZNAM, - wbInteger(DATA, 'Type', itU8, wbEnum([ - 'Sound', - 'Text', - 'Image', - 'Voice' - ]), cpNormal, True), - wbRArrayS('Quests', - wbFormIDCkNoReach(ONAM, 'Quest', [QUST]) - ), - wbString(XNAM, 'Texture'), - wbUnion(TNAM, 'Text / Topic', wbNOTETNAMDecide, [ - wbString('Text'), - wbFormIDCk('Topic', [DIAL]) - ]), - wbUnion(SNAM, 'Sound / NPC', wbNOTESNAMDecide, [ - wbFormIDCk('Sound', [SOUN]), - wbFormIDCk('NPC', [NPC_]) - ]) - ]); - -end; - -procedure DefineFO3e; -begin - wbRecord(PROJ, 'Projectile', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODLReq, - wbDEST, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Flags', itU16, wbFlags([ - 'Hitscan', - 'Explosion', - 'Alt. Trigger', - 'Muzzle Flash', - '', - 'Can Be Disabled', - 'Can Be Picked Up', - 'Supersonic', - 'Pins Limbs', - 'Pass Through Small Transparent' - ])), - {00} wbInteger('Type', itU16, wbEnum([ - {00} '', - {01} 'Missile', - {02} 'Lobber', - {03} '', - {04} 'Beam', - {05} '', - {06} '', - {07} '', - {08} 'Flame' - ])), - {04} wbFloat('Gravity'), - {08} wbFloat('Speed'), - {12} wbFloat('Range'), - {16} wbFormIDCk('Light', [LIGH, NULL]), - {20} wbFormIDCk('Muzzle Flash - Light', [LIGH, NULL]), - {24} wbFloat('Tracer Chance'), - {28} wbFloat('Explosion - Alt. Trigger - Proximity'), - {32} wbFloat('Explosion - Alt. Trigger - Timer'), - {36} wbFormIDCk('Explosion', [EXPL, NULL]), - {40} wbFormIDCk('Sound', [SOUN, NULL]), - {44} wbFloat('Muzzle Flash - Duration'), - {48} wbFloat('Fade Duration'), - {52} wbFloat('Impact Force'), - {56} wbFormIDCk('Sound - Countdown', [SOUN, NULL]), - {60} wbFormIDCk('Sound - Disable', [SOUN, NULL]), - {64} wbFormIDCk('Default Weapon Source', [WEAP, NULL]) - ], cpNormal, True), - wbRStructSK([0], 'Muzzle Flash Model', [ - wbString(NAM1, 'Model Filename'), - wbByteArray(NAM2, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, True), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ]); - - wbRecord(NAVI, 'Navigation Mesh Info Map', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbRArray('Navigation Map Infos', - wbStruct(NVMI, 'Navigation Map Info', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Navigation Mesh', [NAVM]), - wbFormIDCk('Location', [CELL, WRLD]), - wbStruct('Grid', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbUnknown -{ wbUnion('Data', wbNAVINVMIDecider, [ - wbStruct('Data', [ - wbUnknown - ]), - wbStruct('Data', [ - wbArray('Unknown', wbFloat('Unknown'), 3), - wbByteArray('Unknown', 4) - ]), - wbStruct('Data', [ - wbArray('Unknown', wbArray('Unknown', wbFloat('Unknown'), 3), 3), - wbInteger('Count 1', itU16), - wbInteger('Count 2', itU16), - wbArray('Unknown', wbArray('Unknown', wbFloat('Unknown'), 3), [], wbNAVINAVMGetCount1), - wbUnknown - ]), - wbStruct('Data', [ - wbUnknown - ]) - ])} - ]) - ), - wbRArray('Unknown', - wbStruct(NVCI, 'Unknown', [ - wbFormIDCk('Unknown', [NAVM]), - wbArray('Unknown', wbFormIDCk('Unknown', [NAVM]), -1), - wbArray('Unknown', wbFormIDCk('Unknown', [NAVM]), -1), - wbArray('Doors', wbFormIDCk('Door', [REFR]), -1) - ]) - ) - ]); - - if wbSimpleRecords then begin - - wbRecord(NAVM, 'Navigation Mesh', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbStruct(DATA, '', [ - wbFormIDCk('Cell', [CELL]), - wbInteger('Vertex Count', itU32), - wbInteger('Triangle Count', itU32), - wbInteger('External Connections Count', itU32), - wbInteger('NVCA Count', itU32), - wbInteger('Doors Count', itU32) - ]), - wbByteArray(NVVX, 'Vertices'), - wbByteArray(NVTR, 'Triangles'), - wbByteArray(NVCA, 'Unknown'), - wbArray(NVDP, 'Doors', wbStruct('Door', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Triangle', itU16), - wbByteArray('Unused', 2) - ])), - wbByteArray(NVGD, 'Unknown'), - wbArray(NVEX, 'External Connections', wbStruct('Connection', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Navigation Mesh', [NAVM], False, cpNormal), - wbInteger('Triangle', itU16, nil, cpNormal) - ])) - ], False, wbNAVMAddInfo); - - end else begin - - wbRecord(NAVM, 'Navigation Mesh', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbStruct(DATA, '', [ - wbFormIDCk('Cell', [CELL]), - wbInteger('Vertex Count', itU32), - wbInteger('Triangle Count', itU32), - wbInteger('External Connections Count', itU32), - wbInteger('NVCA Count', itU32), - wbInteger('Doors Count', itU32) // as of version = 5 (earliest NavMesh version I saw (Fallout3 1.7) is already 11) - ]), - wbArray(NVVX, 'Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ])), - wbArray(NVTR, 'Triangles', wbStruct('Triangle', [ - wbArray('Vertices', wbInteger('Vertex', itS16), 3), - wbArray('Edges', wbInteger('Triangle', itS16, wbNVTREdgeToStr, wbNVTREdgeToInt), [ - '0 <-> 1', - '1 <-> 2', - '2 <-> 0' - ]), - wbInteger('Flags', itU32, wbFlags([ - 'Triangle #0 Is External', - 'Triangle #1 Is External', - 'Triangle #2 Is External', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Unknown 7', - 'Unknown 8', - 'Unknown 9', - 'Unknown 10', - 'Unknown 11', - 'Unknown 12', - 'Unknown 13', - 'Unknown 14', - 'Unknown 15', - 'Unknown 16', - 'Unknown 17', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Unknown 21', - 'Unknown 22', - 'Unknown 23', - 'Unknown 24', - 'Unknown 25', - 'Unknown 26', - 'Unknown 27', - 'Unknown 28', - 'Unknown 29', - 'Unknown 30', - 'Unknown 31', - 'Unknown 32' - ])) - ])), - wbArray(NVCA, 'Unknown', wbInteger('Unknown', itS16)), - wbArray(NVDP, 'Doors', wbStruct('Door', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Triangle', itU16), - wbByteArray('Unused', 2) - ])), - wbStruct(NVGD, 'Unknown', [ - wbByteArray('Unknown', 4), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbArray('Unknown', wbArray('Unknown', wbInteger('Unknown', itU16), -2)) - ]), - wbArray(NVEX, 'External Connections', wbStruct('Connection', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Navigation Mesh', [NAVM], False, cpNormal), - wbInteger('Triangle', itU16, nil, cpNormal) - ])) - ], False, wbNAVMAddInfo); - - end; - - wbRecord(PGRE, 'Placed Grenade', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(PMIS, 'Placed Missile', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(PBEA, 'Placed Beam', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [PROJ], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(EXPL, 'Explosion', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbEITM, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]), - wbStruct(DATA, 'Data', [ - {00} wbFloat('Force'), - {04} wbFloat('Damage'), - {08} wbFloat('Radius'), - {12} wbFormIDCk('Light', [LIGH, NULL]), - {16} wbFormIDCk('Sound 1', [SOUN, NULL]), - {20} wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Unknown 1', - {0x00000002}'Always Uses World Orientation', - {0x00000004}'Knock Down - Always', - {0x00000008}'Knock Down - By Formula', - {0x00000010}'Ignore LOS Check', - {0x00000020}'Push Explosion Source Ref Only', - {0x00000040}'Ignore Image Space Swap' - ])), - {24} wbFloat('IS Radius'), - {28} wbFormIDCk('Impact DataSet', [IPDS, NULL]), - {32} wbFormIDCk('Sound 2', [SOUN, NULL]), - wbStruct('Radiation', [ - {36} wbFloat('Level'), - {40} wbFloat('Dissipation Time'), - {44} wbFloat('Radius') - ]), - {48} wbInteger('Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ], cpNormal, True), - wbFormIDCk(INAM, 'Placed Impact Object', [TREE, SOUN, ACTI, DOOR, STAT, FURN, - CONT, ARMO, AMMO, LVLN, LVLC, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, - ASPC, IDLM, ARMA, MSTT, NOTE, PWAT, SCOL, TACT, TERM, TXST]) - ]); - - wbRecord(DEBR, 'Debris', [ - wbEDIDReq, - wbRStructs('Models', 'Model', [ - wbStruct(DATA, 'Data', [ - wbInteger('Percentage', itU8), - wbString('Model Filename'), - wbInteger('Flags', itU8, wbFlags([ - 'Has Collission Data' - ])) - ], cpNormal, True), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, True) - ]); - - wbRecord(IMGS, 'Image Space', [ - wbEDIDReq, - wbStruct(DNAM, '', [ - wbStruct('HDR', [ - {00} wbFloat('Eye Adapt Speed'), - {04} wbFloat('Blur Radius'), - {08} wbFloat('Blur Passes'), - {12} wbFloat('Emissive Mult'), - {16} wbFloat('Target LUM'), - {20} wbFloat('Upper LUM Clamp'), - {24} wbFloat('Bright Scale'), - {28} wbFloat('Bright Clamp'), - {32} wbFloat('LUM Ramp No Tex'), - {36} wbFloat('LUM Ramp Min'), - {40} wbFloat('LUM Ramp Max'), - {44} wbFloat('Sunlight Dimmer'), - {48} wbFloat('Grass Dimmer'), - {52} wbFloat('Tree Dimmer'), - {56} wbUnion('Skin Dimmer', wbIMGSSkinDimmerDecider, [ - wbFloat('Skin Dimmer'), - wbEmpty('Skin Dimmer', cpIgnore) - ]) - ], cpNormal, False, nil, 14), - wbStruct('Bloom', [ - {60} wbFloat('Blur Radius'), - {64} wbFloat('Alpha Mult Interior'), - {68} wbFloat('Alpha Mult Exterior') - ]), - wbStruct('Get Hit', [ - {72} wbFloat('Blur Radius'), - {76} wbFloat('Blur Damping Constant'), - {80} wbFloat('Damping Constant') - ]), - wbStruct('Night Eye', [ - wbStruct('Tint Color', [ - {84} wbFloat('Red', cpNormal, False, 255, 0), - {88} wbFloat('Green', cpNormal, False, 255, 0), - {92} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - {96} wbFloat('Brightness') - ]), - wbStruct('Cinematic', [ - {100} wbFloat('Saturation'), - wbStruct('Contrast', [ - {104} wbFloat('Avg Lum Value'), - {108} wbFloat('Value') - ]), - {112} wbFloat('Cinematic - Brightness - Value'), - wbStruct('Tint', [ - wbStruct('Color', [ - {116} wbFloat('Red', cpNormal, False, 255, 0), - {120} wbFloat('Green', cpNormal, False, 255, 0), - {124} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - {128} wbFloat('Value') - ]) - ]), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbByteArray('Unused', 4), - wbInteger('Flags', itU8, wbFlags([ - 'Saturation', - 'Contrast', - 'Tint', - 'Brightness' - ], True)), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 5) - ]); - - wbTimeInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Value') - ]); - - wbColorInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Red', cpNormal, False, 255, 0), - wbFloat('Green', cpNormal, False, 255, 0), - wbFloat('Blue', cpNormal, False, 255, 0), - wbFloat('Alpha', cpNormal, False, 255, 0) - ]); - - wbRecord(IMAD, 'Image Space Adapter', [ - wbEDID, - wbStruct(DNAM, 'Data Count', [ - wbInteger('Flags', itU32, wbFlags(['Animatable'])), - wbFloat('Duration'), - wbStruct('HDR', [ - wbInteger('Eye Adapt Speed Mult', itU32), - wbInteger('Eye Adapt Speed Add', itU32), - wbInteger('Bloom Blur Radius Mult', itU32), - wbInteger('Bloom Blur Radius Add', itU32), - wbInteger('Bloom Threshold Mult', itU32), - wbInteger('Bloom Threshold Add', itU32), - wbInteger('Bloom Scale Mult', itU32), - wbInteger('Bloom Scale Add', itU32), - wbInteger('Target Lum Min Mult', itU32), - wbInteger('Target Lum Min Add', itU32), - wbInteger('Target Lum Max Mult', itU32), - wbInteger('Target Lum Max Add', itU32), - wbInteger('Sunlight Scale Mult', itU32), - wbInteger('Sunlight Scale Add', itU32), - wbInteger('Sky Scale Mult', itU32), - wbInteger('Sky Scale Add', itU32) - ]), - wbInteger('Unknown08 Mult', itU32), - wbInteger('Unknown48 Add', itU32), - wbInteger('Unknown09 Mult', itU32), - wbInteger('Unknown49 Add', itU32), - wbInteger('Unknown0A Mult', itU32), - wbInteger('Unknown4A Add', itU32), - wbInteger('Unknown0B Mult', itU32), - wbInteger('Unknown4B Add', itU32), - wbInteger('Unknown0C Mult', itU32), - wbInteger('Unknown4C Add', itU32), - wbInteger('Unknown0D Mult', itU32), - wbInteger('Unknown4D Add', itU32), - wbInteger('Unknown0E Mult', itU32), - wbInteger('Unknown4E Add', itU32), - wbInteger('Unknown0F Mult', itU32), - wbInteger('Unknown4F Add', itU32), - wbInteger('Unknown10 Mult', itU32), - wbInteger('Unknown50 Add', itU32), - wbStruct('Cinematic', [ - wbInteger('Saturation Mult', itU32), - wbInteger('Saturation Add', itU32), - wbInteger('Brightness Mult', itU32), - wbInteger('Brightness Add', itU32), - wbInteger('Contrast Mult', itU32), - wbInteger('Contrast Add', itU32) - ]), - wbInteger('Unknown14 Mult', itU32), - wbInteger('Unknown54 Add', itU32), - wbInteger('Tint Color', itU32), - wbInteger('Blur Radius', itU32), - wbInteger('Double Vision Strength', itU32), - wbInteger('Radial Blur Strength', itU32), - wbInteger('Radial Blur Ramp Up', itU32), - wbInteger('Radial Blur Start', itU32), - wbInteger('Radial Blur Flags', itU32, wbFlags(['Use Target'])), - wbFloat('Radial Blur Center X'), - wbFloat('Radial Blur Center Y'), - wbInteger('DoF Strength', itU32), - wbInteger('DoF Distance', itU32), - wbInteger('DoF Range', itU32), - wbInteger('DoF Flags', itU32, wbFlags(['Use Target'])), - wbInteger('Radial Blur Ramp Down', itU32), - wbInteger('Radial Blur Down Start', itU32), - wbInteger('Fade Color', itU32), - wbInteger('Motion Blur Strength', itU32) - ], cpNormal, True, nil, 26), - wbArray(BNAM, 'Blur Radius', wbTimeInterpolator), - wbArray(VNAM, 'Double Vision Strength', wbTimeInterpolator), - wbArray(TNAM, 'Tint Color', wbColorInterpolator), - wbArray(NAM3, 'Fade Color', wbColorInterpolator), - wbArray(RNAM, 'Radial Blur Strength', wbTimeInterpolator), - wbArray(SNAM, 'Radial Blur Ramp Up', wbTimeInterpolator), - wbArray(UNAM, 'Radial Blur Start', wbTimeInterpolator), - wbArray(NAM1, 'Radial Blur Ramp Down', wbTimeInterpolator), - wbArray(NAM2, 'Radial Blur Down Start', wbTimeInterpolator), - wbArray(WNAM, 'DoF Strength', wbTimeInterpolator), - wbArray(XNAM, 'DoF Distance', wbTimeInterpolator), - wbArray(YNAM, 'DoF Range', wbTimeInterpolator), - wbArray(NAM4, 'Motion Blur Strength', wbTimeInterpolator), - wbRStruct('HDR', [ - wbArray(_00_IAD, 'Eye Adapt Speed Mult', wbTimeInterpolator), - wbArray(_40_IAD, 'Eye Adapt Speed Add', wbTimeInterpolator), - wbArray(_01_IAD, 'Bloom Blur Radius Mult', wbTimeInterpolator), - wbArray(_41_IAD, 'Bloom Blur Radius Add', wbTimeInterpolator), - wbArray(_02_IAD, 'Bloom Threshold Mult', wbTimeInterpolator), - wbArray(_42_IAD, 'Bloom Threshold Add', wbTimeInterpolator), - wbArray(_03_IAD, 'Bloom Scale Mult', wbTimeInterpolator), - wbArray(_43_IAD, 'Bloom Scale Add', wbTimeInterpolator), - wbArray(_04_IAD, 'Target Lum Min Mult', wbTimeInterpolator), - wbArray(_44_IAD, 'Target Lum Min Add', wbTimeInterpolator), - wbArray(_05_IAD, 'Target Lum Max Mult', wbTimeInterpolator), - wbArray(_45_IAD, 'Target Lum Max Add', wbTimeInterpolator), - wbArray(_06_IAD, 'Sunlight Scale Mult', wbTimeInterpolator), - wbArray(_46_IAD, 'Sunlight Scale Add', wbTimeInterpolator), - wbArray(_07_IAD, 'Sky Scale Mult', wbTimeInterpolator), - wbArray(_47_IAD, 'Sky Scale Add', wbTimeInterpolator) - ], []), - wbUnknown(_08_IAD), - wbUnknown(_48_IAD), - wbUnknown(_09_IAD), - wbUnknown(_49_IAD), - wbUnknown(_0A_IAD), - wbUnknown(_4A_IAD), - wbUnknown(_0B_IAD), - wbUnknown(_4B_IAD), - wbUnknown(_0C_IAD), - wbUnknown(_4C_IAD), - wbUnknown(_0D_IAD), - wbUnknown(_4D_IAD), - wbUnknown(_0E_IAD), - wbUnknown(_4E_IAD), - wbUnknown(_0F_IAD), - wbUnknown(_4F_IAD), - wbUnknown(_10_IAD), - wbUnknown(_50_IAD), - wbRStruct('Cinematic', [ - wbArray(_11_IAD, 'Saturation Mult', wbTimeInterpolator), - wbArray(_51_IAD, 'Saturation Add', wbTimeInterpolator), - wbArray(_12_IAD, 'Brightness Mult', wbTimeInterpolator), - wbArray(_52_IAD, 'Brightness Add', wbTimeInterpolator), - wbArray(_13_IAD, 'Contrast Mult', wbTimeInterpolator), - wbArray(_53_IAD, 'Contrast Add', wbTimeInterpolator) - ], []), - wbUnknown(_14_IAD), - wbUnknown(_54_IAD) - ]); - - wbRecord(FLST, 'FormID List', [ - wbString(EDID, 'Editor ID', 0, cpBenign, True, nil, wbFLSTEDIDAfterSet), - wbRArrayS('FormIDs', wbFormID(LNAM, 'FormID'), cpNormal, False, nil, nil, nil, wbFLSTLNAMIsSorted) - ]); - - wbRecord(PERK, 'Perk', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Trait', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Min Level', itU8), - wbInteger('Ranks', itU8), - wbInteger('Playable', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Hidden', itU8, wbEnum(['No', 'Yes'])) - ], cpNormal, True, nil, 4), - wbRStructsSK('Effects', 'Effect', [0, 1], [ - wbStructSK(PRKE, [1, 2, 0], 'Header', [ - wbInteger('Type', itU8, wbEnum([ - 'Quest + Stage', - 'Ability', - 'Entry Point' - ]), cpNormal, False, nil, wbPERKPRKETypeAfterSet), - wbInteger('Rank', itU8), - wbInteger('Priority', itU8) - ]), - wbUnion(DATA, 'Effect Data', wbPerkDATADecider, [ - wbStructSK([0, 1], 'Quest + Stage', [ - wbFormIDCk('Quest', [QUST]), - wbInteger('Quest Stage', itU8, wbPerkDATAQuestStageToStr, wbCTDAParam2QuestStageToInt), - wbByteArray('Unused', 3) - ]), - wbFormIDCk('Ability', [SPEL]), - wbStructSK([0, 1], 'Entry Point', [ - wbInteger('Entry Point', itU8, wbEnum([ - {00} 'Calculate Weapon Damage', - {01} 'Calculate My Critical Hit Chance', - {02} 'Calculate My Critical Hit Damage', - {03} 'Calculate Weapon Attack AP Cost', - {04} 'Calculate Mine Explode Chance', - {05} 'Adjust Range Penalty', - {06} 'Adjust Limb Damage', - {07} 'Calculate Weapon Range', - {08} 'Calculate To Hit Chance', - {09} 'Adjust Experience Points', - {10} 'Adjust Gained Skill Points', - {11} 'Adjust Book Skill Points', - {12} 'Modify Recovered Health', - {13} 'Calculate Inventory AP Cost', - {14} 'Get Disposition', - {15} 'Get Should Attack', - {16} 'Get Should Assist', - {17} 'Calculate Buy Price', - {18} 'Get Bad Karma', - {19} 'Get Good Karma', - {20} 'Ignore Locked Terminal', - {21} 'Add Leveled List On Death', - {22} 'Get Max Carry Weight', - {23} 'Modify Addiction Chance', - {24} 'Modify Addiction Duration', - {25} 'Modify Positive Chem Duration', - {26} 'Adjust Drinking Radiation', - {27} 'Activate', - {28} 'Mysterious Stranger', - {29} 'Has Paralyzing Palm', - {30} 'Hacking Science Bonus', - {31} 'Ignore Running During Detection', - {32} 'Ignore Broken Lock', - {33} 'Has Concentrated Fire', - {34} 'Calculate Gun Spread', - {35} 'Player Kill AP Reward', - {36} 'Modify Enemy Critical Hit Chance' - ]), cpNormal, True, nil, wbPERKEntryPointAfterSet), - wbInteger('Function', itU8, wbPerkDATAFunctionToStr, wbPerkDATAFunctionToInt, cpNormal, False, nil, wbPerkDATAFunctionAfterSet), - wbInteger('Perk Condition Tab Count', itU8, nil, cpIgnore) - ]) - ], cpNormal, True), - wbRStructsSK('Perk Conditions', 'Perk Condition', [0], [ - wbInteger(PRKC, 'Run On', itS8, wbPRKCToStr, wbPRKCToInt), - wbCTDAsReq - ], [], cpNormal, False, nil, nil, wbPERKPRKCDontShow), - wbRStruct('Entry Point Function Parameters', [ - wbInteger(EPFT, 'Type', itU8, wbPerkEPFTToStr, wbPerkEPFTToInt, cpIgnore, False, nil, wbPerkEPFTAfterSet), - wbUnion(EPFD, 'Data', wbEPFDDecider, [ - wbByteArray('Unknown'), - wbFloat('Float'), - wbStruct('Float, Float', [ - wbFloat('Float 1'), - wbFloat('Float 2') - ]), - wbFormIDCk('Leveled Item', [LVLI]), - wbEmpty('None (Script)'), - wbStruct('Actor Value, Float', [ - wbInteger('Actor Value', itU32, wbEPFDActorValueToStr, wbEPFDActorValueToInt), - wbFloat('Float') - ]) - ], cpNormal, False, wbEPFDDontShow), - wbString(EPF2, 'Button Label', 0, cpNormal, False, wbEPF2DontShow), - wbInteger(EPF3, 'Script Flags', itU16, wbFlags([ - 'Run Immediately' - ]), cpNormal, False, False, wbEPF2DontShow), - wbEmbeddedScriptPerk - ], [], cpNormal, False, wbPERKPRKCDontShow), - wbEmpty(PRKF, 'End Marker', cpIgnore, True) - ], []) - ]); - - wbBPNDStruct := wbStruct(BPND, '', [ - {00} wbFloat('Damage Mult'), - {04} wbInteger('Flags', itU8, wbFlags([ - 'Severable', - 'IK Data', - 'IK Data - Biped Data', - 'Explodable', - 'IK Data - Is Head', - 'IK Data - Headtracking', - 'To Hit Chance - Absolute' - ])), - {05} wbInteger('Part Type', itU8, wbEnum([ - 'Torso', - 'Head 1', - 'Head 2', - 'Left Arm 1', - 'Left Arm 2', - 'Right Arm 1', - 'Right Arm 2', - 'Left Leg 1', - 'Left Leg 2', - 'Left Leg 3', - 'Right Leg 1', - 'Right Leg 2', - 'Right Leg 3', - 'Brain', - 'Weapon' - ])), - {06} wbInteger('Health Percent', itU8), - {07} wbInteger('Actor Value', itS8, wbActorValueEnum), - {08} wbInteger('To Hit Chance', itU8), - {09} wbInteger('Explodable - Explosion Chance %', itU8), - {10} wbInteger('Explodable - Debris Count', itU16), - {12} wbFormIDCk('Explodable - Debris', [DEBR, NULL]), - {16} wbFormIDCk('Explodable - Explosion', [EXPL, NULL]), - {20} wbFloat('Tracking Max Angle'), - {24} wbFloat('Explodable - Debris Scale'), - {28} wbInteger('Severable - Debris Count', itS32), - {32} wbFormIDCk('Severable - Debris', [DEBR, NULL]), - {36} wbFormIDCk('Severable - Explosion', [EXPL, NULL]), - {40} wbFloat('Severable - Debris Scale'), - wbStruct('Gore Effects Positioning', [ - wbStruct('Translate', [ - {44} wbFloat('X'), - {48} wbFloat('Y'), - {52} wbFloat('Z') - ]), - wbStruct('Rotation', [ - {56} wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {60} wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {64} wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]), - {68} wbFormIDCk('Severable - Impact DataSet', [IPDS, NULL]), - {72} wbFormIDCk('Explodable - Impact DataSet', [IPDS, NULL]), - {28} wbInteger('Severable - Decal Count', itU8), - {28} wbInteger('Explodable - Decal Count', itU8), - {76} wbByteArray('Unused', 2), - {80} wbFloat('Limb Replacement Scale') - ], cpNormal, True); - - wbRecord(BPTD, 'Body Part Data', [ - wbEDIDReq, - wbMODLReq, - wbRStructS('Body Parts', 'Body Part', [ - wbString(BPTN, 'Part Name', 0, cpNormal, True), - wbString(BPNN, 'Part Node', 0, cpNormal, True), - wbString(BPNT, 'VATS Target', 0, cpNormal, True), - wbString(BPNI, 'IK Data - Start Node', 0, cpNormal, True), - wbBPNDStruct, - wbString(NAM1, 'Limb Replacement Model', 0, cpNormal, True), - wbString(NAM4, 'Gore Effects - Target Bone', 0, cpNormal, True), - wbByteArray(NAM5, 'Texture Files Hashes', 0, cpIgnore) - ], [], cpNormal, True), - wbFormIDCk(RAGA, 'Ragdoll', [RGDL]) - ]); - - wbRecord(ADDN, 'Addon Node', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbInteger(DATA, 'Node Index', itS32, nil, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbStruct(DNAM, 'Data', [ - wbInteger('Master Particle System Cap', itU16), - wbByteArray('Unknown', 2) - ], cpNormal, True) - ]); - - wbRecord(AVIF, 'ActorValue Information', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbString(ANAM, 'Short Name') - ]); - - wbRecord(RADS, 'Radiation Stage', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbInteger('Trigger Threshold', itU32), - wbFormIDCk('Actor Effect', [SPEL]) - ], cpNormal, True) - ]); - - wbRecord(CAMS, 'Camera Shot', [ - wbEDIDReq, - wbMODL, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Action', itU32, wbEnum([ - 'Shoot', - 'Fly', - 'Hit', - 'Zoom' - ])), - {04} wbInteger('Location', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target' - ])), - {08} wbInteger('Target', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target' - ])), - {12} wbInteger('Flags', itU32, wbFlags([ - 'Position Follows Location', - 'Rotation Follows Target', - 'Don''t Follow Bone', - 'First Person Camera', - 'No Tracer', - 'Start At Time Zero' - ])), - wbStruct('Time Multipliers', [ - {16} wbFloat('Player'), - {20} wbFloat('Target'), - {24} wbFloat('Global') - ]), - {28} wbFloat('Max Time'), - {32} wbFloat('Min Time'), - {36} wbFloat('Target % Between Actors') - ], cpNormal, True, nil, 7), - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]) - ]); - - wbRecord(CPTH, 'Camera Path', [ - wbEDIDReq, - wbCTDAs, - wbArray(ANAM, 'Related Camera Paths', wbFormIDCk('Related Camera Path', [CPTH, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbInteger(DATA, 'Camera Zoom', itU8, wbEnum([ - 'Default', - 'Disable', - 'Shot List' - ]), cpNormal, True), - wbRArray('Camera Shots', wbFormIDCk(SNAM, 'Camera Shot', [CAMS])) - ]); - - wbRecord(VTYP, 'Voice Type', [ - wbEDIDReq, - wbInteger(DNAM, 'Flags', itU8, wbFlags([ - 'Allow Default Dialog', - 'Female' - ]), cpNormal, True) - ]); - - wbRecord(IPCT, 'Impact', [ - wbEDIDReq, - wbMODL, - wbStruct(DATA, '', [ - wbFloat('Effect - Duration'), - wbInteger('Effect - Orientation', itU32, wbEnum([ - 'Surface Normal', - 'Projectile Vector', - 'Projectile Reflection' - ])), - wbFloat('Angle Threshold'), - wbFloat('Placement Radius'), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbInteger('Flags', itU32, wbFlags([ - 'No Decal Data' - ])) - ], cpNormal, True), - wbDODT, - wbFormIDCk(DNAM, 'Texture Set', [TXST]), - wbFormIDCk(SNAM, 'Sound 1', [SOUN]), - wbFormIDCk(NAM1, 'Sound 2', [SOUN]) - ]); - - wbRecord(IPDS, 'Impact DataSet', [ - wbEDIDReq, - wbStruct(DATA, 'Impacts', [ - wbFormIDCk('Stone', [IPCT, NULL]), - wbFormIDCk('Dirt', [IPCT, NULL]), - wbFormIDCk('Grass', [IPCT, NULL]), - wbFormIDCk('Glass', [IPCT, NULL]), - wbFormIDCk('Metal', [IPCT, NULL]), - wbFormIDCk('Wood', [IPCT, NULL]), - wbFormIDCk('Organic', [IPCT, NULL]), - wbFormIDCk('Cloth', [IPCT, NULL]), - wbFormIDCk('Water', [IPCT, NULL]), - wbFormIDCk('Hollow Metal', [IPCT, NULL]), - wbFormIDCk('Organic Bug', [IPCT, NULL]), - wbFormIDCk('Organic Glow', [IPCT, NULL]) - ], cpNormal, True, nil, 9) - ]); - - wbRecord(ECZN, 'Encounter Zone', [ - wbEDIDReq, - wbStruct(DATA, '', [ - wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - wbInteger('Rank', itS8), - wbInteger('Minimum Level', itS8), - wbInteger('Flags', itU8, wbFlags([ - 'Never Resets', - 'Match PC Below Minimum Level' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ]); - - wbRecord(MESG, 'Message', [ - wbEDIDReq, - wbDESCReq, - wbFULL, - wbFormIDCk(INAM, 'Icon', [MICN, NULL], False, cpNormal, True), - wbByteArray(NAM0, 'Unused', 0, cpIgnore), - wbByteArray(NAM1, 'Unused', 0, cpIgnore), - wbByteArray(NAM2, 'Unused', 0, cpIgnore), - wbByteArray(NAM3, 'Unused', 0, cpIgnore), - wbByteArray(NAM4, 'Unused', 0, cpIgnore), - wbByteArray(NAM5, 'Unused', 0, cpIgnore), - wbByteArray(NAM6, 'Unused', 0, cpIgnore), - wbByteArray(NAM7, 'Unused', 0, cpIgnore), - wbByteArray(NAM8, 'Unused', 0, cpIgnore), - wbByteArray(NAM9, 'Unused', 0, cpIgnore), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - 'Message Box', - 'Auto Display' - ]), cpNormal, True, False, nil, wbMESGDNAMAfterSet), - wbInteger(TNAM, 'Display Time', itU32, nil, cpNormal, False, False, wbMESGTNAMDontShow), - wbRStructs('Menu Buttons', 'Menu Button', [ - wbString(ITXT, 'Button Text'), - wbCTDAs - ], []) - ], False, nil, cpNormal, False, wbMESGAfterLoad); - - wbRecord(RGDL, 'Ragdoll', [ - wbEDIDReq, - wbInteger(NVER, 'Version', itU32, nil, cpNormal, True), - wbStruct(DATA, 'General Data', [ - wbInteger('Dynamic Bone Count', itU32), - wbByteArray('Unused', 4), - wbStruct('Enabled', [ - wbInteger('Feedback', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Foot IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Look IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Grab IK (broken, don''t use)', itU8, wbEnum(['No', 'Yes'])), - wbInteger('Pose Matching', itU8, wbEnum(['No', 'Yes'])) - ]), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(XNAM, 'Actor Base', [CREA, NPC_], False, cpNormal, True), - wbFormIDCk(TNAM, 'Body Part Data', [BPTD], False, cpNormal, True), - wbStruct(RAFD, 'Feedback Data', [ - {00} wbFloat('Dynamic/Keyframe Blend Amount'), - {04} wbFloat('Hierarchy Gain'), - {08} wbFloat('Position Gain'), - {12} wbFloat('Velocity Gain'), - {16} wbFloat('Acceleration Gain'), - {20} wbFloat('Snap Gain'), - {24} wbFloat('Velocity Damping'), - wbStruct('Snap Max Settings', [ - {28} wbFloat('Linear Velocity'), - {32} wbFloat('Angular Velocity'), - {36} wbFloat('Linear Distance'), - {40} wbFloat('Angular Distance') - ]), - wbStruct('Position Max Velocity', [ - {44} wbFloat('Linear'), - {48} wbFloat('Angular') - ]), - wbStruct('Position Max Velocity', [ - {52} wbInteger('Projectile', itS32, wbDiv(1000)), - {56} wbInteger('Melee', itS32, wbDiv(1000)) - ]) - ], cpNormal, False), - wbArray(RAFB, 'Feedback Dynamic Bones', wbInteger('Bone', itU16), 0, nil, nil, cpNormal, False), - wbStruct(RAPS, 'Pose Matching Data', [ - {00} wbArray('Match Bones', wbInteger('Bone', itU16, wbHideFFFF), 3), - {06} wbInteger('Flags', itU8, wbFlags([ - 'Disable On Move' - ])), - {07} wbByteArray('Unused', 1), - {08} wbFloat('Motors Strength'), - {12} wbFloat('Pose Activation Delay Time'), - {16} wbFloat('Match Error Allowance'), - {20} wbFloat('Displacement To Disable') - ], cpNormal, True), - wbString(ANAM, 'Death Pose') - ]); - - wbRecord(DOBJ, 'Default Object Manager', [ - wbEDIDReq, - wbArray(DATA, 'Default Objects', wbFormID('Default Object'), [ - 'Stimpack', - 'SuperStimpack', - 'RadX', - 'RadAway', - 'Morphine', - 'Perk Paralysis', - 'Player Faction', - 'Mysterious Stranger NPC', - 'Mysterious Stranger Faction', - 'Default Music', - 'Battle Music', - 'Death Music', - 'Success Music', - 'Level Up Music', - 'Player Voice (Male)', - 'Player Voice (Male Child)', - 'Player Voice (Female)', - 'Player Voice (Female Child)', - 'Eat Package Default Food', - 'Every Actor Ability', - 'Drug Wears Off Image Space' - ], cpNormal, True) - ]); - - wbRecord(LGTM, 'Lighting Template', [ - wbEDIDReq, - wbStruct(DATA, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Dist'), - wbFloat('Fog Power') - ], cpNormal, True) - ]); - - wbRecord(MUSC, 'Music Type', [ - wbEDIDReq, - wbString(FNAM, 'Filename') - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unused', 1), - wbInteger('Unit from water amount', itU16), - wbByteArray('Unused', 2), - wbInteger('Unit from water type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True) - ]); - - wbRecord(HAIR, 'Hair', [ - wbEDIDReq, - wbFULLReq, - wbMODLReq, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female', - 'Fixed' - ]), cpNormal, True) - ]); - - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbMODLReq, - wbCTDAs, - wbArray(ANAM, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [IDLE, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbStruct(DATA, '', [ - wbInteger('Animation Group Section', itU8, wbIdleAnam), - wbStruct('Looping', [ - wbInteger('Min', itU8), - wbInteger('Max', itU8) - ]), - wbByteArray('Unused', 1), - wbInteger('Replay Delay', itS16), - wbInteger('Flags', itU8, wbFlags([ - 'No attacking' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True, nil, 4) - ]); - - wbRecord(INFO, 'Dialog response', [ - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous', - {7} 'Radio' - ])), - wbInteger('Next Speaker', itU8, wbEnum([ - {0} 'Target', - {1} 'Self', - {2} 'Either' - ])), - wbInteger('Flags 1', itU8, wbFlags([ - {0x01} 'Goodbye', - {0x02} 'Random', - {0x04} 'Say Once', - {0x08} 'Run Immediately', - {0x10} 'Info Refusal', - {0x20} 'Random End', - {0x40} 'Run for Rumors', - {0x80} 'Speech Challenge' - ])), - wbInteger('Flags 2', itU8, wbFlags([ - {0x01} 'Say Once a Day', - {0x02} 'Always Darken' - ])) - ], cpNormal, True, nil, 3), - wbFormIDCkNoReach(QSTI, 'Quest', [QUST], False, cpNormal, True), - wbFormIDCk(TPIC, 'Topic', [DIAL]), - wbFormIDCkNoReach(PNAM, 'Previous INFO', [INFO, NULL]), - wbRArray('Add Topics', wbFormIDCk(NAME, 'Topic', [DIAL])), - wbRArray('Responses', - wbRStruct('Response', [ - wbStruct(TRDT, 'Response Data', [ - wbInteger('Emotion Type', itU32, wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise', - {7} 'Pained' - ])), - wbInteger('Emotion Value', itS32), - wbByteArray('Unused', 4), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3), - wbFormIDCk('Sound', [SOUN, NULL]), - wbInteger('Flags', itU8, wbFlags([ - 'Use Emotion Animation' - ])), - wbByteArray('Unused', 3) - ], cpNormal, False, nil, 5), - wbStringKC(NAM1, 'Response Text', 0, cpTranslate, True), - wbString(NAM2, 'Script Notes', 0, cpTranslate, True), - wbString(NAM3, 'Edits'), - wbFormIDCk(SNAM, 'Speaker Animation', [IDLE]), - wbFormIDCk(LNAM, 'Listener Animation', [IDLE]) - ], []) - ), - wbCTDAs, - wbRArray('Choices', wbFormIDCk(TCLT, 'Choice', [DIAL])), - wbRArray('Link From', wbFormIDCk(TCLF, 'Topic', [DIAL])), - wbRStruct('Script (Begin)', [ - wbEmbeddedScriptReq - ], [], cpNormal, True), - wbRStruct('Script (End)', [ - wbEmpty(NEXT, 'Marker'), - wbEmbeddedScriptReq - ], [], cpNormal, True), - wbFormIDCk(SNDD, 'Unused', [SOUN]), - wbString(RNAM, 'Prompt'), - wbFormIDCk(ANAM, 'Speaker', [CREA, NPC_]), - wbFormIDCk(KNAM, 'ActorValue/Perk', [AVIF, PERK]), - wbInteger(DNAM, 'Speech Challenge', itU32, wbEnum([ - '---', - 'Very Easy', - 'Easy', - 'Average', - 'Hard', - 'Very Hard' - ])) - ], False, wbINFOAddInfo, cpNormal, False, wbINFOAfterLoad); - - wbRecord(INGR, 'Ingredient', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbETYPReq, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(KEYM, 'Key', [ - wbEDIDReq, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICONReq, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unused', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unused', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end; - - wbRecord(LIGH, 'Light', [ - wbEDIDReq, - wbOBNDReq, - wbMODL, - wbSCRI, - wbDEST, - wbFULL, - wbICON, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Dynamic', - {0x00000002} 'Can be Carried', - {0x00000004} 'Negative', - {0x00000008} 'Flicker', - {0x00000010} 'Unused', - {0x00000020} 'Off By Default', - {0x00000040} 'Flicker Slow', - {0x00000080} 'Pulse', - {0x00000100} 'Pulse Slow', - {0x00000200} 'Spot Light', - {0x00000400} 'Spot Shadow' - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbFloat(FNAM, 'Fade value', cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); - - wbRecord(LSCR, 'Load Screen', [ - wbEDIDReq, - wbICONReq, - wbDESCReq, - wbRArrayS('Locations', wbStructSK(LNAM, [0, 1], 'Location', [ - wbFormIDCkNoReach('Cell', [CELL, WRLD]), - wbByteArray('Unused', 8) - ])) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDIDReq, - wbICON, - wbFormIDCk(TNAM, 'Texture', [TXST], False, cpNormal, True), - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Material Type', itU8, wbEnum([ - {00} 'STONE', - {01} 'CLOTH', - {02} 'DIRT', - {03} 'GLASS', - {04} 'GRASS', - {05} 'METAL', - {06} 'ORGANIC', - {07} 'SKIN', - {08} 'WATER', - {09} 'WOOD', - {10} 'HEAVY STONE', - {11} 'HEAVY METAL', - {12} 'HEAVY WOOD', - {13} 'CHAIN', - {14} 'SNOW', - {15} 'ELEVATOR', - {16} 'HOLLOW METAL', - {17} 'SHEET METAL', - {18} 'SAND', - {19} 'BRIKEN CONCRETE', - {20} 'VEHILCE BODY', - {21} 'VEHILCE PART SOLID', - {22} 'VEHILCE PART HOLLOW', - {23} 'BARREL', - {24} 'BOTTLE', - {25} 'SODA CAN', - {26} 'PISTOL', - {27} 'RIFLE', - {28} 'SHOPPING CART', - {29} 'LUNCHBOX', - {30} 'BABY RATTLE', - {31} 'RUBER BALL' - ])), - wbInteger('Friction', itU8), - wbInteger('Restitution', itU8) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True), - wbRArrayS('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])) - ]); - - wbRecord(LVLC, 'Leveled Creature', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [CREA, LVLC]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []), - cpNormal, True), - wbMODL - ]); - - wbRecord(LVLN, 'Leveled NPC', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [NPC_, LVLN]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []), - cpNormal, True), - wbMODL - ]); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDIDReq, - wbOBNDReq, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use All' - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Global', [GLOB]), - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [ARMO, AMMO, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, NOTE]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ]), - wbCOED - ], []) - ) - ]); - - wbArchtypeEnum := wbEnum([ - {00} 'Value Modifier', - {01} 'Script', - {02} 'Dispel', - {03} 'Cure Disease', - {04} '', - {05} '', - {06} '', - {07} '', - {08} '', - {09} '', - {10} '', - {11} 'Invisibility', - {12} 'Chameleon', - {13} 'Light', - {14} '', - {15} '', - {16} 'Lock', - {17} 'Open', - {18} 'Bound Item', - {19} 'Summon Creature', - {20} '', - {21} '', - {22} '', - {23} '', - {24} 'Paralysis', - {25} '', - {26} '', - {27} '', - {28} '', - {29} '', - {30} 'Cure Paralysis', - {31} 'Cure Addiction', - {32} 'Cure Poison', - {33} 'Concussion', - {34} 'Value And Parts' - ]); - - wbRecord(MGEF, 'Base Effect', [ - wbEDIDReq, - wbFULL, - wbDESCReq, - wbICON, - wbMODL, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} '', - {0x00000010} 'Self', - {0x00000020} 'Touch', - {0x00000040} 'Target', - {0x00000080} 'No Duration', - {0x00000100} 'No Magnitude', - {0x00000200} 'No Area', - {0x00000400} 'FX Persist', - {0x00000800} '', - {0x00001000} 'Gory Visuals', - {0x00002000} 'Display Name Only', - {0x00004000} '', - {0x00008000} 'Radio Broadcast ??', - {0x00010000} '', - {0x00020000} '', - {0x00040000} '', - {0x00080000} 'Use skill', - {0x00100000} 'Use attribute', - {0x00200000} '', - {0x00400000} '', - {0x00800000} '', - {0x01000000} 'Painless', - {0x02000000} 'Spray projectile type (or Fog if Bolt is specified as well)', - {0x04000000} 'Bolt projectile type (or Fog if Spray is specified as well)', - {0x08000000} 'No Hit Effect', - {0x10000000} 'No Death Dispel', - {0x20000000} '????' - ])), - {04} wbFloat('Base cost (Unused)'), - {08} wbUnion('Assoc. Item', wbMGEFFAssocItemDecider, [ - wbFormID('Unused', cpIgnore), - wbFormID('Assoc. Item'), - wbFormIDCk('Assoc. Script', [SCPT, NULL]), //Script - wbFormIDCk('Assoc. Item', [WEAP, ARMO, NULL]), //Bound Item - wbFormIDCk('Assoc. Creature', [CREA]) //Summon Creature - ], cpNormal, false, nil, wbMGEFFAssocItemAfterSet), - {12} wbInteger('Magic School (Unused)', itS32, wbEnum([ - ], [ - -1, 'None' - ])), - {16} wbInteger('Resistance Type', itS32, wbActorValueEnum), - {20} wbInteger('Counter effect count', itU16), - {22} wbByteArray('Unused', 2), - {24} wbFormIDCk('Light', [LIGH, NULL]), - {28} wbFloat('Projectile speed'), - {32} wbFormIDCk('Effect Shader', [EFSH, NULL]), - {36} wbFormIDCk('Object Display Shader', [EFSH, NULL]), - {40} wbFormIDCk('Effect sound', [NULL, SOUN]), - {44} wbFormIDCk('Bolt sound', [NULL, SOUN]), - {48} wbFormIDCk('Hit sound', [NULL, SOUN]), - {52} wbFormIDCk('Area sound', [NULL, SOUN]), - {56} wbFloat('Constant Effect enchantment factor (Unused)'), - {60} wbFloat('Constant Effect barter factor (Unused)'), - {64} wbInteger('Archtype', itU32, wbArchtypeEnum, cpNormal, False, nil, wbMGEFArchtypeAfterSet), - {68} wbActorValue - ], cpNormal, True), - wbRArrayS('Counter Effects', wbFormIDCk(ESCE, 'Effect', [MGEF]), cpNormal, False, nil, wbCounterEffectsAfterSet) - ], False, nil, cpNormal, False, wbMGEFAfterLoad, wbMGEFAfterSet); - - wbRecord(MISC, 'Misc. Item', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbRecord(COBJ, 'Constructible Object', [ - wbEDID, - wbOBND, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbFaceGen := wbRStruct('FaceGen Data', [ - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True); - - wbFaceGenNPC := wbRStruct('FaceGen Data', [ - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True, wbActorTemplateUseModelAnimation); - - - wbRecord(NPC_, 'Non-Player Character', [ - wbEDIDReq, - wbOBNDReq, - wbFULLActor, - wbMODLActor, - wbStruct(ACBS, 'Configuration', [ - {00} wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Female', - {0x000002} 'Essential', - {0x000004} 'Is CharGen Face Preset', - {0x000008} 'Respawn', - {0x000010} 'Auto-calc stats', - {0x000020} '', - {0x000040} '', - {0x000080} 'PC Level Mult', - {0x000100} 'Use Template', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} '', - {0x010000} '', - {0x020000} '', - {0x040000} '', - {0x080000} '', - {0x100000} 'No VATS Melee', - {0x00200000} '', - {0x00400000} 'Can be all races', - {0x00800000} '', - {0x01000000} '', - {0x02000000} '', - {0x03000000} 'No Knockdowns', - {0x08000000} 'Not Pushable', - {0x10000000} '', {28} - {0x20000000} '', - {0x40000000} 'No Rotating To Head-track', - {0x80000000} '' - ], [ - {0x000001 Female} wbActorTemplateUseTraits, - {0x000002 Essential} wbActorTemplateUseBaseData, - {0x000004 Is CharGen Face Preset} nil, - {0x000008 Respawn} wbActorTemplateUseBaseData, - {0x000010 Auto-calc stats} wbActorTemplateUseStats, - {0x000020 } nil, - {0x000040 } nil, - {0x000080 PC Level Mult} wbActorTemplateUseStats, - {0x000100 Use Template} nil, - {0x000200 No Low Level Processing} wbActorTemplateUseBaseData, - {0x000400 } nil, - {0x000800 No Blood Spray} wbActorTemplateUseModelAnimation, - {0x001000 No Blood Decal} wbActorTemplateUseModelAnimation, - {0x002000 } nil, - {0x004000 } nil, - {0x008000 } nil, - {0x010000 } nil, - {0x020000 } nil, - {0x040000 } nil, - {0x080000 } nil, - {0x100000 No VATS Melee} nil, - {0x00200000 } nil, - {0x00400000 Can be all races} nil, - {0x00800000 } nil, - {0x01000000 } nil, - {0x02000000 } nil, - {0x03000000 No Knockdowns} nil, - {0x08000000 Not Pushable} wbActorTemplateUseModelAnimation, - {0x10000000 } nil, - {0x20000000 } nil, - {0x40000000 No Rotating To Head-track} wbActorTemplateUseModelAnimation, - {0x80000000 } nil - ])), - {04} wbInteger('Fatigue', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {06} wbInteger('Barter gold', itU16, nil, cpNormal, False, wbActorTemplateUseAIData), - {08} wbUnion('Level', wbCreaLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, True, wbActorTemplateUseStats), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, True, wbActorTemplateUseStats) - ], cpNormal, True, wbActorTemplateUseStats), - {10} wbInteger('Calc min', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {12} wbInteger('Calc max', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {14} wbInteger('Speed Multiplier', itU16, nil, cpNormal, True, wbActorTemplateUseStats), - {16} wbFloat('Karma (Alignment)', cpNormal, False, 1, -1, wbActorTemplateUseTraits), - {20} wbInteger('Disposition Base', itS16, nil, cpNormal, False, wbActorTemplateUseTraits), - {22} wbInteger('Template Flags', itU16, wbTemplateFlags) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]), - cpNormal, False, nil, nil, wbActorTemplateUseFactions), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, wbActorTemplateUseTraits), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, True, wbActorTemplateUseTraits), - wbFormIDCk(TPLT, 'Template', [LVLN, NPC_]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True, wbActorTemplateUseTraits), - wbSPLOs, - wbFormIDCk(EITM, 'Unarmed Attack Effect', [ENCH, SPEL], False, cpNormal, False, wbActorTemplateUseActorEffectList), - wbInteger(EAMT, 'Unarmed Attack Animation', itU16, wbAttackAnimationEnum, cpNormal, True, False, wbActorTemplateUseActorEffectList), - wbDESTActor, - wbSCRIActor, - wbRArrayS('Items', wbCNTO, cpNormal, False, nil, nil, wbActorTemplateUseInventory), - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil, nil, wbActorTemplateUseAIPackages), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation'), 0, cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True, wbActorTemplateUseTraits), - wbStruct(DATA, '', [ - {00} wbInteger('Base Health', itS32), - {04} wbArray('Attributes', wbInteger('Attribute', itU8), [ - 'Strength', - 'Perception', - 'Endurance', - 'Charisma', - 'Intelligence', - 'Agility', - 'Luck' - ], cpNormal, False, wbActorAutoCalcDontShow), - wbByteArray('Unused'{, 14 - only present in old record versions}) - ], cpNormal, True, wbActorTemplateUseStats), - wbStruct(DNAM, '', [ - {00} wbArray('Skill Values', wbInteger('Skill', itU8), [ - 'Barter', - 'Big Guns', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Small Guns', - 'Sneak', - 'Speech', - 'Throwing (unused)', - 'Unarmed' - ]), - {14} wbArray('Skill Offsets', wbInteger('Skill', itU8), [ - 'Barter', - 'Big Guns', - 'Energy Weapons', - 'Explosives', - 'Lockpick', - 'Medicine', - 'Melee Weapons', - 'Repair', - 'Science', - 'Small Guns', - 'Sneak', - 'Speech', - 'Throwing (unused)', - 'Unarmed' - ]) - ], cpNormal, False, wbActorTemplateUseStatsAutoCalc), - wbRArrayS('Head Parts', - wbFormIDCk(PNAM, 'Head Part', [HDPT]), - cpNormal, False, nil, nil, wbActorTemplateUseModelAnimation), - wbFormIDCk(HNAM, 'Hair', [HAIR], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbFloat(LNAM, 'Hair length', cpNormal, False, 1, -1, wbActorTemplateUseModelAnimation), - wbFormIDCk(ENAM, 'Eyes', [EYES], False, cpNormal, False, wbActorTemplateUseModelAnimation), - wbStruct(HCLR, 'Hair color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True, wbActorTemplateUseModelAnimation), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False, wbActorTemplateUseTraits), - wbInteger(NAM4, 'Impact Material Type', itU32, wbImpactMaterialTypeEnum, cpNormal, True, False, wbActorTemplateUseModelAnimation), - wbFaceGenNPC, - wbInteger(NAM5, 'Unknown', itU16, nil, cpNormal, True, False, nil, nil, 255), - wbFloat(NAM6, 'Height', cpNormal, True, 1, -1, wbActorTemplateUseTraits), - wbFloat(NAM7, 'Weight', cpNormal, True, 1, -1, wbActorTemplateUseTraits) - ], True, nil, cpNormal, False, wbNPCAfterLoad); - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers Services', - {0x00000002} 'Must reach location', - {0x00000004} 'Must complete', - {0x00000008} 'Lock doors at package start', - {0x00000010} 'Lock doors at package end', - {0x00000020} 'Lock doors at location', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Unlock doors at location', - {0x00000200} 'Continue if PC near', - {0x00000400} 'Once per day', - {0x00000800} '', - {0x00001000} 'Skip fallout behavior', - {0x00002000} 'Always run', - {0x00004000} '', - {0x00008000} '', - {0x00010000} '', - {0x00020000} 'Always sneak', - {0x00040000} 'Allow swimming', - {0x00080000} 'Allow falls', - {0x00100000} 'Head-Tracking off', - {0x00200000} 'Weapons unequipped', - {0x00400000} 'Defensive combat', - {0x00800000} 'Weapon Drawn', - {0x01000000} 'No idle anims', - {0x02000000} 'Pretend In Combat', - {0x04000000} 'Continue During Combat', - {0x08000000} 'No Combat Alert', - {0x10000000} 'No Warn/Attack Behaviour', - {0x20000000} '', - {0x40000000} '', - {0x80000000} '' - ]); - - wbPKDTType := wbEnum([ - {0} 'Find', - {1} 'Follow', - {2} 'Escort', - {3} 'Eat', - {4} 'Sleep', - {5} 'Wander', - {6} 'Travel', - {7} 'Accompany', - {8} 'Use Item At', - {9} 'Ambush', - {10} 'Flee Not Combat', - {11} '', - {12} 'Sandbox', - {13} 'Patrol', - {14} 'Guard', - {15} 'Dialogue', - {16} 'Use Weapon' - ]); - - wbObjectTypeEnum := wbEnum([ - ' NONE', - 'Activators', - 'Armor', - 'Books', - 'Clothing', - 'Containers', - 'Doors', - 'Ingredients', - 'Lights', - 'Misc', - 'Flora', - 'Furniture', - 'Weapons: Any', - 'Ammo', - 'NPCs', - 'Creatures', - 'Keys', - 'Alchemy', - 'Food', - ' All: Combat Wearable', - ' All: Wearable', - 'Weapons: Ranged', - 'Weapons: Melee', - 'Weapons: NONE', - 'Actor Effects: Any', - 'Actor Effects: Range Target', - 'Actor Effects: Range Touch', - 'Actor Effects: Range Self', - '', - 'Actors: Any' - ]); - - - wbPKDTSpecificFlagsUnused := True; - - wbRecord(PACK, 'Package', [ - wbEDIDReq, - wbStruct(PKDT, 'General', [ - wbInteger('General Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 1), - wbInteger('Fallout Behavior Flags', itU16, wbFlags([ - {0x00000001}'Hellos To Player', - {0x00000002}'Random Conversations', - {0x00000004}'Observe Combat Behavior', - {0x00000008}'Unknown 4', - {0x00000010}'Reaction To Player Actions', - {0x00000020}'Friendly Fire Comments', - {0x00000040}'Aggro Radius Behavior', - {0x00000080}'Allow Idle Chatter', - {0x00000100}'Avoid Radiation' - ], True)), - wbUnion('Type Specific Flags', wbPKDTSpecificFlagsDecider, [ - wbEmpty('Type Specific Flags (missing)', cpIgnore, False, nil, True), - wbInteger('Type Specific Flags - Find', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Find - Allow Buying', - {0x00000200}'Find - Allow Killing', - {0x00000400}'Find - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Follow', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Escort', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Escort - Allow Buying', - {0x00000200}'Escort - Allow Killing', - {0x00000400}'Escort - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Eat', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Eat - Allow Buying', - {0x00000200}'Eat - Allow Killing', - {0x00000400}'Eat - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Sleep', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Wander', itU16, wbFlags([ - {0x00000001}'Wander - No Eating', - {0x00000002}'Wander - No Sleeping', - {0x00000004}'Wander - No Conversation', - {0x00000008}'Wander - No Idle Markers', - {0x00000010}'Wander - No Furniture', - {0x00000020}'Wander - No Wandering' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Travel', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Accompany', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Use Item At', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'Use Item At - Sit Down', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'', - {0x00000040}'', - {0x00000080}'', - {0x00000100}'Use Item At - Allow Buying', - {0x00000200}'Use Item At - Allow Killing', - {0x00000400}'Use Item At - Allow Stealing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Ambush', itU16, wbFlags([ - {0x00000001}'Ambush - Hide While Ambushing' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Flee Not Combat', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - ?', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Sandbox', itU16, wbFlags([ - {0x00000001}'Sandbox - No Eating', - {0x00000002}'Sandbox - No Sleeping', - {0x00000004}'Sandbox - No Conversation', - {0x00000008}'Sandbox - No Idle Markers', - {0x00000010}'Sandbox - No Furniture', - {0x00000020}'Sandbox - No Wandering' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Patrol', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Guard', itU16, wbFlags([ - {0x00000001}'', - {0x00000002}'', - {0x00000004}'Guard - Remain Near Reference to Guard' - ], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Dialogue', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)), - wbInteger('Type Specific Flags - Use Weapon', itU16, wbFlags([], wbPKDTSpecificFlagsUnused)) - ]), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 2), - wbRStruct('Locations', [ - wbStruct(PLDT, 'Location 1', [ - wbInteger('Type', itS32, wbEnum([ // Byte + filler - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]), - wbStruct(PLD2, 'Location 2', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]) - ], []), - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Weekdays', - 'Weekends', - 'Monday, Wednesday, Friday', - 'Tuesday, Thursday' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Time', itS8), - wbInteger('Duration', itS32) - ], cpNormal, True), - wbStruct(PTDT, 'Target 1', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific Reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference' - ]), cpNormal, False, nil, nil, 2), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [ACHR, ACRE, REFR, PGRE, PMIS, PBEA, PLYR], True), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, LVLN, LVLC, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, FACT, FLST]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32), - wbFloat('Unknown') - ], cpNormal, False, nil, 3), - wbCTDAs, - wbRStruct('Idle Animations', [ - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - '', - 'Do Once' - ]), cpNormal, True), - wbStruct(IDLC, '', [ - wbInteger( 'Animation Count', itU8), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, True), - wbByteArray(IDLB, 'Unused', 4, cpIgnore) - ], [], cpNormal, False, nil, False, nil {cannot be totally removed , wbAnimationsAfterSet}), - wbFormIDCk(CNAM, 'Combat Style', [CSTY]), - wbEmpty(PKED, 'Eat Marker'), - wbInteger(PKE2, 'Escort Distance', itU32), - wbFloat(PKFD, 'Follow - Start Location - Trigger Radius'), - wbStruct(PKPT, 'Patrol Flags', [ - wbInteger('Repeatable', itU8, wbEnum(['No', 'Yes']), cpNormal, False, nil, nil, 1), - wbByteArray('Unused', 1) - ], cpNormal, False, nil, 1), - wbStruct(PKW3, 'Use Weapon Data', [ - wbInteger('Flags', itU32, wbFlags([ - 'Always Hit', - '', - '', - '', - '', - '', - '', - '', - 'Do No Damage', - '', - '', - '', - '', - '', - '', - '', - 'Crouch To Reload', - '', - '', - '', - '', - '', - '', - '', - 'Hold Fire When Blocked' - ])), - wbInteger('Fire Rate', itU8, wbEnum([ - 'Auto Fire', - 'Volley Fire' - ])), - wbInteger('Fire Count', itU8, wbEnum([ - 'Number of Bursts', - 'Repeat Fire' - ])), - wbInteger('Number of Bursts', itU16), - wbStruct('Shoots Per Volleys', [ - wbInteger('Min', itU16), - wbInteger('Max', itU16) - ]), - wbStruct('Pause Between Volleys', [ - wbFloat('Min'), - wbFloat('Max') - ]), - wbByteArray('Unused', 4) - ]), - wbStruct(PTD2, 'Target 2', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference' - ])), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [ACHR, ACRE, REFR, PGRE, PMIS, PBEA, PLYR], True), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, LVLN, LVLC, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, FACT, FLST]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32), - wbFloat('Unknown') - ], cpNormal, False, nil, 3), - wbEmpty(PUID, 'Use Item Marker'), - wbEmpty(PKAM, 'Ambush Marker'), - wbStruct(PKDD, 'Dialogue Data', [ - wbFloat('FOV'), - wbFormIDCk('Topic', [DIAL, NULL]), - wbInteger('Flags', itU32, wbFlags([ - 'No Headtracking', - '', - '', - '', - '', - '', - '', - '', - 'Don''t Control Target Movement' - ])), - wbByteArray('Unused', 4), - wbInteger('Dialogue Type', itU32, wbEnum([ - 'Conversation', - 'Say To' - ])), - wbByteArray('Unknown', 4) - ], cpNormal, False, nil, 3), - wbStruct(PLD2, 'Location 2 (again??)', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCkNoReach('Reference', [REFR, PGRE, PMIS, PBEA, ACHR, ACRE, PLYR], True), - wbFormIDCkNoReach('Cell', [CELL]), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCkNoReach('Object ID', [ACTI, DOOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH]), - wbInteger('Object Type', itU32, wbObjectTypeEnum), - wbByteArray('Unused', 4, cpIgnore), - wbByteArray('Unused', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]), - wbRStruct('OnBegin', [ - wbEmpty(POBA, 'OnBegin Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('OnEnd', [ - wbEmpty(POEA, 'OnEnd Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('OnChange', [ - wbEmpty(POCA, 'OnChange Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], [], cpNormal, True) - ], False, nil, cpNormal, False, wbPACKAfterLoad); - - wbRecord(QUST, 'Quest', [ - wbEDIDReq, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, 'General', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Start game enabled', - {0x02} '', - {0x04} 'Allow repeated conversation topics', - {0x08} 'Allow repeated stages', - {0x10} 'Unknown 4' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused', 2), - wbFloat('Quest Delay') - ], cpNormal, True, nil, 3), - wbCTDAs, - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbInteger(INDX, 'Stage Index', itS16), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete Quest', - {0x02} 'Fail Quest' - ])), - wbCTDAs, - wbString(CNAM, 'Log Entry', 0, cpTranslate), - wbEmbeddedScriptReq, - wbFormIDCk(NAM0, 'Next Quest', [QUST]) - ], [])) - ], [])), - wbRArray('Objectives', wbRStruct('Objective', [ - wbInteger(QOBJ, 'Objective Index', itS32), - wbString(NNAM, 'Description', 0, cpNormal, True), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbFormIDCkNoReach('Target', [REFR, PGRE, PMIS, PBEA, ACRE, ACHR], True), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass Marker Ignores Locks' - ])), - wbByteArray('Unused', 3) - ]), - wbCTDAs - ], [])) - ], [])) - ]); - - wbHeadPartIndexEnum := wbEnum([ - 'Head', - 'Ears', - 'Mouth', - 'Teeth Lower', - 'Teeth Upper', - 'Tongue', - 'Left Eye', - 'Right Eye' - ]); - - wbBodyPartIndexEnum := wbEnum([ - 'Upper Body', - 'Left Hand', - 'Right Hand', - 'Upper Body Texture' - ]); - - wbRecord(RACE, 'Race', [ - wbEDIDReq, - wbFULLReq, - wbDESCReq, - wbXNAMs, - wbStruct(DATA, '', [ - wbArrayS('Skill Boosts', wbStructSK([0], 'Skill Boost', [ - wbInteger('Skill', itS8, wbActorValueEnum), - wbInteger('Boost', itS8) - ]), 7), - wbByteArray('Unused', 2), - wbFloat('Male Height'), - wbFloat('Female Height'), - wbFloat('Male Weight'), - wbFloat('Female Weight'), - wbInteger('Flags', itU32, wbFlags([ - 'Playable', - '', - 'Child' - ])) - ], cpNormal, True), - wbFormIDCk(ONAM, 'Older', [RACE]), - wbFormIDCk(YNAM, 'Younger', [RACE]), - wbEmpty(NAM2, 'Unknown Marker', cpNormal, True), - wbArray(VTCK, 'Voices', wbFormIDCk('Voice', [VTYP]), ['Male', 'Female'], cpNormal, True), - wbArray(DNAM, 'Default Hair Styles', wbFormIDCk('Default Hair Style', [HAIR, NULL]), ['Male', 'Female'], cpNormal, True), - wbArray(CNAM, 'Default Hair Colors', wbInteger('Default Hair Color', itU8, wbEnum([ - 'Bleached', - 'Brown', - 'Chocolate', - 'Platinum', - 'Cornsilk', - 'Suede', - 'Pecan', - 'Auburn', - 'Ginger', - 'Honey', - 'Gold', - 'Rosewood', - 'Black', - 'Chestnut', - 'Steel', - 'Champagne' - ])), ['Male', 'Female'], cpNormal, True), - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - wbByteArray(ATTR, 'Unused', 0, cpNormal, True), - wbRStruct('Head Data', [ - wbEmpty(NAM0, 'Head Data Marker', cpNormal, True), - wbRStruct('Male Head Data', [ - wbEmpty(MNAM, 'Male Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbHeadPartIndexEnum), - wbMODLReq, - wbICON - ], [], cpNormal, False, nil, False, nil, wbHeadPartsAfterSet), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Head Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbHeadPartIndexEnum), - wbMODLReq, - wbICON - ], [], cpNormal, False, nil, False, nil, wbHeadPartsAfterSet), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Body Data', [ - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbICON, - wbMODLReq - ], []), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbICON, - wbMODLReq - ], []), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbArrayS(HNAM, 'Hairs', wbFormIDCk('Hair', [HAIR]), 0, cpNormal, True), - wbArrayS(ENAM, 'Eyes', wbFormIDCk('Eye', [EYES]), 0, cpNormal, True), - wbRStruct('FaceGen Data', [ - wbRStruct('Male FaceGen Data', [ - wbEmpty(MNAM, 'Male Data Marker', cpNormal, True), - wbFaceGen, - wbUnknown(SNAM, cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female FaceGen Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbFaceGen, - wbUnknown(SNAM, cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(REFR, 'Placed Object', [ - wbEDID, - { - wbStruct(RCLR, 'Linked Reference Color (Old Format?)', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ], cpIgnore),} - wbByteArray(RCLR, 'Unused', 0, cpIgnore), - wbFormIDCk(NAME, 'Base', [TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, LVLN, LVLC, - MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, - MSTT, NOTE, PWAT, SCOL, TACT, TERM, TXST], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- ?? ---} - wbXRGD, - wbXRGB, - - {--- Primitive ---} - wbStruct(XPRM, 'Primitive', [ - wbStruct('Bounds', [ - wbFloat('X', cpNormal, True, 2, 4), - wbFloat('Y', cpNormal, True, 2, 4), - wbFloat('Z', cpNormal, True, 2, 4) - ]), - wbStruct('Color', [ - {84} wbFloat('Red', cpNormal, False, 255, 0), - {88} wbFloat('Green', cpNormal, False, 255, 0), - {92} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - wbFloat('Unknown'), - wbInteger('Type', itU32, wbEnum([ - 'None', - 'Box', - 'Sphere', - 'Portal Box' - ])) - ]), - wbInteger(XTRI, 'Collision Layer', itU32, wbEnum([ - 'Unidentified', - 'Static', - 'AnimStatic', - 'Transparent', - 'Clutter', - 'Weapon', - 'Projectile', - 'Spell', - 'Biped', - 'Trees', - 'Props', - 'Water', - 'Trigger', - 'Terrain', - 'Trap', - 'Non Collidable', - 'Cloud Trap', - 'Ground', - 'Portal', - 'Debris Small', - 'Debris Large', - 'Acustic Space', - 'Actor Zone', - 'Projectile Zone', - 'Gas Trap', - 'Shell Casing', - 'Transparent Small', - 'Invisible Wall', - 'Transparent Small Anim', - 'Dead Bip', - 'Char Controller', - 'Avoid Box', - 'Collision Box', - 'Camera Sphere', - 'Door Detection', - 'Camera Pick', - 'Item Pick', - 'Line Of Sight', - 'Path Pick', - 'Custom Pick 1', - 'Custom Pick 2', - 'Spell Explosion', - 'Dropping Pick' - ])), - wbEmpty(XMBP, 'MultiBound Primitive Marker'), - - {--- Bound Contents ---} - - {--- Bound Data ---} - wbStruct(XMBO, 'Bound Half Extents', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - - {--- Teleport ---} - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot, - wbInteger('Flags', itU32, wbFlags([ - 'No Alarm' - ])) - ]), - - {--- Map Data ---} - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Data'), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To', - {0x04} '"Show All" Hidden' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([ - 'None', - 'City', - 'Settlement', - 'Encampment', - 'Natural Landmark', - 'Cave', - 'Factory', - 'Monument', - 'Military', - 'Office', - 'Town Ruins', - 'Urban Ruins', - 'Sewer Ruins', - 'Metro', - 'Vault' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ], []), - - wbInteger(XSRF, 'Special Rendering Flags', itU32, wbFlags([ - 'Unknown 0', - 'Imposter', - 'Use Full Shader in LOD' - ])), - wbByteArray(XSRD, 'Special Rendering Data', 4), - - {--- X Target Data ---} - wbFormIDCk(XTRG, 'Target', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA], True), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbEmbeddedScriptReq, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal, True) - ], []), - - {--- Radio ---} - wbStruct(XRDO, 'Radio Data', [ - wbFloat('Range Radius'), - wbInteger('Broadcast Range Type', itU32, wbEnum([ - 'Radius', - 'Everywhere', - 'Worldspace and Linked Interiors', - 'Linked Interiors', - 'Current Cell Only' - ])), - wbFloat('Static Percentage'), - wbFormIDCkNoReach('Position Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, NULL]) - ]), - - {--- Ownership ---} - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32) - ], [XCMT, XCMO]), - - {--- Lock ---} - wbStruct(XLOC, 'Lock Data', [ - wbInteger('Level', itU8), - wbByteArray('Unused', 3), - wbFormIDCkNoReach('Key', [KEYM, NULL]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3), - wbByteArray('Unknown', 8) - ], cpNormal, False, nil, 5), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - wbFloat(XRAD, 'Radiation'), - wbFloat(XCHG, 'Charge'), - wbRStruct('Ammo', [ - wbFormIDCk(XAMT, 'Type', [AMMO], False, cpNormal, True), - wbInteger(XAMC, 'Count', itS32, nil, cpNormal, True) - ], []), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ]) - ), - - {--- Lit Water ---} - wbRArrayS('Lit Water', - wbFormIDCk(XLTW, 'Water', [REFR]) - ), - - {--- Decals ---} - wbRArrayS('Linked Decals', - wbStructSK(XDCR, [0], 'Decal', [ - wbFormIDCk('Reference', [REFR]), - wbUnknown - ]) - ), - - {--- Linked Ref ---} - wbFormIDCk(XLKR, 'Linked Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbStruct(XCLP, 'Linked Reference Color', [ - wbStruct('Link Start Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Link End Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]) - ]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [REFR, ACRE, ACHR, PGRE, PMIS, PBEA, PLYR]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Enable Parent ---} - wbXESP, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Flags ---} - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - wbEmpty(ONAM, 'Open by Default'), - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- Generated Data ---} - wbStruct(XNDP, 'Navigation Door Link', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbInteger('Teleport Marker Triangle', itS16, wbREFRNavmeshTriangleToStr, wbStringToInt), - wbByteArray('Unused', 2) - ]), - - wbArray(XPOD, 'Portal Data', wbFormIDCk('Room', [REFR, NULL]), 2), - wbStruct(XPTL, 'Portal Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - - wbInteger(XSED, 'SpeedTree Seed', itU8), - - wbRStruct('Room Data', [ - wbStruct(XRMR, 'Header', [ - wbInteger('Linked Rooms Count', itU16), - wbByteArray('Unknown', 2) - ]), - wbRArrayS('Linked Rooms', - wbFormIDCk(XLRM, 'Linked Room', [REFR]) - ) - ], []), - - wbStruct(XOCP, 'Occlusion Plane Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - wbArray(XORD, 'Linked Occlusion Planes', wbFormIDCk('Plane', [REFR, NULL]), [ - 'Right', - 'Left', - 'Bottom', - 'Top' - ]), - - wbXLOD, - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - - wbRecord(REGN, 'Region', [ - wbEDID, - wbICON, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCkNoReach(WNAM, 'Worldspace', [WRLD]), - - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad) - ], [])), - - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0}'', - {1}'', - {2}'Objects', - {3}'Weather', - {4}'Map', - {5}'Land', - {6}'Grass', - {7}'Sound', - {8}'', - {9}'' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused') - ], cpNormal, True), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, STAT, LTEX]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unused', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unused', 2), - wbByteArray('Unknown', 4) - ]), 0, nil, nil, cpNormal, False, wbREGNObjectsDontShow), - - {--- Map ---} - wbString(RDMP, 'Map Name', 0, cpTranslate, False, wbREGNMapDontShow), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unknown',4) - ]), 0, cpNormal, False, nil, nil, wbREGNGrassDontShow), - - {--- Sound ---} - wbInteger(RDMD, 'Music Type', itU32, wbMusicEnum, cpIgnore, False, False, wbNeverShow), - wbFormIDCk(RDMO, 'Music', [MUSC], False, cpNormal, False, wbREGNSoundDontShow), - wbArrayS(RDSD, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Flags', itU32, wbFlags([ - 'Pleasant', - 'Cloudy', - 'Rainy', - 'Snowy' - ])), - wbInteger('Chance', itU32, wbScaledInt4ToStr, wbScaledInt4ToInt) - ]), 0, cpNormal, False, nil, nil, wbREGNSoundDontShow), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32), - wbFormIDCk('Global', [GLOB, NULL]) - ]), 0, cpNormal, False, nil, nil, wbREGNWeatherDontShow) - ], [])) - ], True); - - wbRecord(SOUN, 'Sound', [ - wbEDIDReq, - wbOBNDReq, - wbString(FNAM, 'Sound Filename'), - wbRUnion('Sound Data', [ - wbStruct(SNDD, 'Sound Data', [ - wbInteger('Minimum Attentuation Distance', itU8, wbMul(5)), - wbInteger('Maximum Attentuation Distance', itU8, wbMul(100)), - wbInteger('Frequency Adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU32, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE', - {0x0100} 'Dialogue Sound', - {0x0200} 'Envelope Fast', - {0x0400} 'Envelope Slow', - {0x0800} '2D Radius', - {0x1000} 'Mute When Submerged' - ])), - wbInteger('Static attentuation cdB', itS16), - wbInteger('Stop time ', itU8), - wbInteger('Start time ', itU8), - wbArray('Attenuation Curve', wbInteger('Point', itS16), 5), - wbInteger('Reverb Attenuation Control', itS16), - wbInteger('Priority', itS32), - wbByteArray('Unknown', 8) - ], cpNormal, True), - wbStruct(SNDX, 'Sound Data', [ - wbInteger('Minimum attentuation distance', itU8, wbMul(5)), - wbInteger('Maximum attentuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU32, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE', - {0x0100} 'Dialogue Sound', - {0x0200} 'Envelope Fast', - {0x0400} 'Envelope Slow', - {0x0800} '2D Radius', - {0x1000} 'Mute When Submerged' - ])), - wbInteger('Static attentuation cdB', itS16), - wbInteger('Stop time ', itU8), - wbInteger('Start time ', itU8) - ], cpNormal, True) - ], [], cpNormal, True), - wbArray(ANAM, 'Attenuation Curve', wbInteger('Point', itS16), 5, nil, nil, cpNormal, False, wbNeverShow), - wbInteger(GNAM, 'Reverb Attenuation Control', itS16, nil, cpNormal, False, False, wbNeverShow), - wbInteger(HNAM, 'Priority', itS32, nil, cpNormal, False, False, wbNeverShow) - ], False, nil, cpNormal, False, wbSOUNAfterLoad); - - wbRecord(SPEL, 'Actor Effect', [ - wbEDIDReq, - wbFULL, - wbStruct(SPIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Actor Effect', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison', - {6} '', - {7} '', - {8} '', - {9} '', - {10} 'Addiction' - ])), - wbInteger('Cost (Unused)', itU32), - wbInteger('Level (Unused)', itU32, wbEnum([ - {0} 'Unused' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x00000001} 'No Auto-Calc', - {0x00000002} 'Immune to Silence 1?', - {0x00000004} 'PC Start Effect', - {0x00000008} 'Immune to Silence 2?', - {0x00000010} 'Area Effect Ignores LOS', - {0x00000020} 'Script Effect Always Applies', - {0x00000040} 'Disable Absorb/Reflect', - {0x00000080} 'Force Touch Explode' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffectsReq - ]); - - wbRecord(STAT, 'Static', [ - wbEDIDReq, - wbOBNDReq, - wbMODL - ]); - - wbRecord(TES4, 'Main File Header', [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), - wbByteArray(DELE, 'Unknown', 0, cpIgnore), - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - wbByteArray(DATA, 'Unused', 8, cpIgnore, True) - ], [ONAM])), - wbArray(ONAM, 'Overriden Forms', wbFormIDCk('Form', [REFR, ACHR, ACRE, PMIS, PBEA, PGRE, LAND, NAVM]), 0, nil, nil, cpNormal, False, wbTES4ONAMDontShow), - wbByteArray(SCRN, 'Screenshot') - ], True, nil, cpNormal, True, wbRemoveOFST); - - wbRecord(TREE, 'Tree', [ - wbEDIDReq, - wbOBNDReq, - wbMODLReq, - wbICONReq, - wbArrayS(SNAM, 'SpeedTree Seeds', wbInteger('SpeedTree Seed', itU32), 0, cpNormal, True), - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Leaf Curvature'), - wbFloat('Minimum Leaf Angle'), - wbFloat('Maximum Leaf Angle'), - wbFloat('Branch Dimming Value'), - wbFloat('Leaf Dimming Value'), - wbInteger('Shadow Radius', itS32), - wbFloat('Rock Speed'), - wbFloat('Rustle Speed') - ], cpNormal, True), - wbStruct(BNAM, 'Billboard Dimensions', [ - wbFloat('Width'), - wbFloat('Height') - ], cpNormal, True) - ]); -end; - -procedure DefineFO3f; -begin - wbRecord(WATR, 'Water', [ - wbEDIDReq, - wbFULL, - wbString(NNAM, 'Noise Map', 0, cpNormal, True), - wbInteger(ANAM, 'Opacity', itU8, nil, cpNormal, True), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0}'Causes Damage', - {1}'Reflective' - ]), cpNormal, True), - wbString(MNAM, 'Material ID', 0, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbFormIDCk(XNAM, 'Actor Effect', [SPEL]), - wbInteger(DATA, 'Damage', itU16, nil, cpNormal, True, True), - wbRUnion('Visual Data', [ - wbStruct(DNAM, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Water Properties - Sun Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unused', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbByteArray('Unused', 4), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Noise Properties - Normals - Noise Scale'), - wbFloat('Noise Properties - Noise Layer One - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Two - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Three - Wind Direction'), - wbFloat('Noise Properties - Noise Layer One - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Two - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Three - Wind Speed'), - wbFloat('Noise Properties - Normals - Depth Falloff Start'), - wbFloat('Noise Properties - Normals - Depth Falloff End'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Noise Properties - Normals - UV Scale'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Distortion Amount'), - wbFloat('Water Properties - Shininess'), - wbFloat('Water Properties - Reflection HDR Multiplier'), - wbFloat('Water Properties - Light Radius'), - wbFloat('Water Properties - Light Brightness'), - wbFloat('Noise Properties - Noise Layer One - UV Scale'), - wbFloat('Noise Properties - Noise Layer Two - UV Scale'), - wbFloat('Noise Properties - Noise Layer Three - UV Scale'), - wbFloat('Noise Properties - Noise Layer One - Amplitude Scale'), - wbFloat('Noise Properties - Noise Layer Two - Amplitude Scale'), - wbFloat('Noise Properties - Noise Layer Three - Amplitude Scale') - ], cpNormal, True, nil, 46), - wbStruct(DATA, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Water Properties - Sun Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unused', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbByteArray('Unused', 4), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Noise Properties - Normals - Noise Scale'), - wbFloat('Noise Properties - Noise Layer One - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Two - Wind Direction'), - wbFloat('Noise Properties - Noise Layer Three - Wind Direction'), - wbFloat('Noise Properties - Noise Layer One - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Two - Wind Speed'), - wbFloat('Noise Properties - Noise Layer Three - Wind Speed'), - wbFloat('Noise Properties - Normals - Depth Falloff Start'), - wbFloat('Noise Properties - Normals - Depth Falloff End'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Noise Properties - Normals - UV Scale'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Distortion Amount'), - wbFloat('Water Properties - Shininess'), - wbFloat('Water Properties - Reflection HDR Multiplier'), - wbFloat('Water Properties - Light Radius'), - wbFloat('Water Properties - Light Brightness'), - wbFloat('Noise Properties - Noise Layer One - UV Scale'), - wbFloat('Noise Properties - Noise Layer Two - UV Scale'), - wbFloat('Noise Properties - Noise Layer Three - UV Scale'), - wbEmpty('Noise Properties - Noise Layer One - Amplitude Scale'), - wbEmpty('Noise Properties - Noise Layer Two - Amplitude Scale'), - wbEmpty('Noise Properties - Noise Layer Three - Amplitude Scale'), - wbInteger('Damage (Old Format)', itU16) - ], cpNormal, True) - ], [], cpNormal, True), - wbStruct(GNAM, 'Related Waters (Unused)', [ - wbFormIDCk('Daytime', [WATR, NULL]), - wbFormIDCk('Nighttime', [WATR, NULL]), - wbFormIDCk('Underwater', [WATR, NULL]) - ], cpNormal, True) - ], False, nil, cpNormal, False, wbWATRAfterLoad); - - wbRecord(WEAP, 'Weapon', [ - wbEDIDReq, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbEITM, - wbInteger(EAMT, 'Enchantment Charge Amount', itS16), - wbFormIDCkNoReach(NAM0, 'Ammo', [AMMO, FLST]), - wbDEST, - wbREPL, - wbETYPReq, - wbBIPL, - wbYNAM, - wbZNAM, - wbRStruct('Shell Casing Model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore), - wbMO2S - ], []), - wbRStruct('Scope Model', [ - wbString(MOD3, 'Model Filename'), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore), - wbMO3S - ], []), - wbFormIDCK(EFSD, 'Scope Effect', [EFSH]), - wbRStruct('World Model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore), - wbMO4S - ], []), - wbString(NNAM, 'Embedded Weapon Node'), - wbFormIDCk(INAM, 'Impact DataSet', [IPDS]), - wbFormIDCk(WNAM, '1st Person Model', [STAT]), - wbFormIDCk(SNAM, 'Sound - Gun - Shoot 3D', [SOUN]), - wbFormIDCk(XNAM, 'Sound - Gun - Shoot 2D', [SOUN]), - wbFormIDCk(NAM7, 'Sound - Gun - Shoot 3D Looping', [SOUN]), - wbFormIDCk(TNAM, 'Sound - Melee - Swing / Gun - No Ammo', [SOUN]), - wbFormIDCk(NAM6, 'Sound - Block', [SOUN]), - wbFormIDCk(UNAM, 'Sound - Idle', [SOUN]), - wbFormIDCk(NAM9, 'Sound - Equip', [SOUN]), - wbFormIDCk(NAM8, 'Sound - Unequip', [SOUN]), - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbInteger('Health', itS32), - wbFloat('Weight'), - wbInteger('Base Damage', itS16), - wbInteger('Clip Size', itU8) - ], cpNormal, True), - wbStruct(DNAM, '', [ - {00} wbInteger('Animation Type', itU32, wbWeaponAnimTypeEnum), - {04} wbFloat('Animation Multiplier'), - {08} wbFloat('Reach'), - {12} wbInteger('Flags 1', itU8, wbFlags([ - 'Ignores Normal Weapon Resistance', - 'Is Automatic', - 'Has Scope', - 'Can''t Drop', - 'Hide Backpack', - 'Embedded Weapon', - 'Don''t Use 1st Person IS Animations', - 'Non-Playable' - ])), - {13} wbInteger('Grip Animation', itU8, wbEnum([ - ], [ - 171, 'HandGrip1', - 172, 'HandGrip2', - 173, 'HandGrip3', - 255, 'DEFAULT' - ])), - {14} wbInteger('Ammo Use', itU8), - {15} wbInteger('Reload Animation', itU8, wbReloadAnimEnum), - {16} wbFloat('Min Spread'), - {20} wbFloat('Spread'), - {24} wbFloat('Unknown'), - {28} wbFloat('Sight FOV'), - {32} wbByteArray('Unused', 4), - {36} wbFormIDCk('Projectile', [PROJ, NULL]), - {40} wbInteger('Base VATS To-Hit Chance', itU8), - {41} wbInteger('Attack Animation', itU8, wbEnum([ - ], [ - 26, 'AttackLeft', - 32, 'AttackRight', - 38, 'Attack3', - 44, 'Attack4', - 50, 'Attack5', - 56, 'Attack6', - 62, 'Attack7', - 68, 'Attack8', - 74, 'AttackLoop', - 80, 'AttackSpin', - 86, 'AttackSpin2', - 97, 'PlaceMine', - 103, 'PlaceMine2', - 109, 'AttackThrow', - 115, 'AttackThrow2', - 121, 'AttackThrow3', - 127, 'AttackThrow4', - 133, 'AttackThrow5', - 255, 'DEFAULT' - ])), - {42} wbInteger('Projectile Count', itU8), - {43} wbInteger('Embedded Weapon - Actor Value', itU8, wbEnum([ - {00} 'Perception', - {01} 'Endurance', - {02} 'Left Attack', - {03} 'Right Attack', - {04} 'Left Mobility', - {05} 'Right Mobilty', - {06} 'Brain' - ])), - {44} wbFloat('Min Range'), - {48} wbFloat('Max Range'), - {52} wbInteger('On Hit', itU32, wbEnum([ - 'Normal formula behavior', - 'Dismember Only', - 'Explode Only', - 'No Dismember/Explode' - ])), - {56} wbInteger('Flags 2', itU32, wbFlags([ - {0x00000001}'Player Only', - {0x00000002}'NPCs Use Ammo', - {0x00000004}'No Jam After Reload', - {0x00000008}'Override - Action Points', - {0x00000010}'Minor Crime', - {0x00000020}'Range - Fixed', - {0x00000040}'Not Used In Normal Combat', - {0x00000080}'Override - Damage to Weapon Mult', - {0x00000100}'Don''t Use 3rd Person IS Animations', - {0x00000200}'Short Burst', - {0x00000400}'Rumble Alternate', - {0x00000800}'Long Burst' - ])), - {60} wbFloat('Animation Attack Multiplier'), - {64} wbFloat('Fire Rate'), - {68} wbFloat('Override - Action Points'), - {72} wbFloat('Rumble - Left Motor Strength'), - {76} wbFloat('Rumble - Right Motor Strength'), - {80} wbFloat('Rumble - Duration'), - {84} wbFloat('Override - Damage to Weapon Mult'), - {88} wbFloat('Attack Shots/Sec'), - {92} wbFloat('Reload Time'), - {96} wbFloat('Jam Time'), - {100} wbFloat('Aim Arc'), - {104} wbInteger('Skill', itS32, wbActorValueEnum), - {108} wbInteger('Rumble - Pattern', itU32, wbEnum([ - 'Constant', - 'Square', - 'Triangle', - 'Sawtooth' - ])), - {112} wbFloat('Rumble - Wavelength'), - {116} wbFloat('Limb Dmg Mult'), - {120} wbInteger('Resist Type', itS32, wbActorValueEnum), - {124} wbFloat('Sight Usage'), - {128} wbFloat('Semi-Automatic Fire Delay Min'), - {132} wbFloat('Semi-Automatic Fire Delay Max') - ], cpNormal, True, nil, 36), - - wbStruct(CRDT, 'Critical Data', [ - {00} wbInteger('Critical Damage', itU16), - {09} wbByteArray('Unused', 2), - {04} wbFloat('Crit % Mult'), - {08} wbInteger('Flags', itU8, wbFlags([ - 'On Death' - ])), - {09} wbByteArray('Unused', 3), - {12} wbFormIDCk('Effect', [SPEL, NULL]) - ], cpNormal, True), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ], False, nil, cpNormal, False, wbWEAPAfterLoad); - - if wbSimpleRecords then - wbRecord(WRLD, 'Worldspace', [ - wbEDIDReq, - wbFULL, - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbStruct(PNAM, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x00000001}'Use Land Data', - {0x00000002}'Use LOD Data', - {0x00000004}'Use Map Data', - {0x00000008}'Use Water Data', - {0x00000010}'Use Climate Data', - {0x00000020}'Use Image Space Data', - {0x00000040}'', - {0x00000080}'Needs Water Adjustment' - ], True)), - wbByteArray('Unknown', 1) - ], cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset') - ], cpNormal, True), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} '', - {0x08} '', - {0x10} 'No LOD Water', - {0x20} 'No LOD Noise', - {0x40} 'Don''t Allow NPC Fall Damage', - {0x80} 'Needs Water Adjustment' - ]), cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow', 0, cpNormal, True), - wbString(XNAM, 'Water Noise Texture', 0, cpNormal, True), - wbRArrayS('Swapped Impacts', wbStructExSK(IMPS, [0, 1], [2], 'Swapped Impact', [ - wbInteger('Material Type', itU32, wbImpactMaterialTypeEnum), - wbFormIDCkNoReach('Old', [IPCT]), - wbFormIDCk('New', [IPCT, NULL]) - ])), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbByteArray(OFST, 'Offset Data') - ], False, nil, cpNormal, False, wbRemoveOFST) - else - wbRecord(WRLD, 'Worldspace', [ - wbEDIDReq, - wbFULL, - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbStruct(PNAM, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x00000001}'Use Land Data', - {0x00000002}'Use LOD Data', - {0x00000004}'Use Map Data', - {0x00000008}'Use Water Data', - {0x00000010}'Use Climate Data', - {0x00000020}'Use Image Space Data', - {0x00000040}'', - {0x00000080}'Needs Water Adjustment' - ], True)), - wbByteArray('Unknown', 1) - ], cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset') - ], cpNormal, True), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} '', - {0x08} '', - {0x10} 'No LOD Water', - {0x20} 'No LOD Noise', - {0x40} 'Don''t Allow NPC Fall Damage', - {0x80} 'Needs Water Adjustment' - ]), cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow', 0, cpNormal, True), - wbString(XNAM, 'Water Noise Texture', 0, cpNormal, True), - wbRArrayS('Swapped Impacts', wbStructExSK(IMPS, [0, 1], [2], 'Swapped Impact', [ - wbInteger('Material Type', itU32, wbImpactMaterialTypeEnum), - wbFormIDCkNoReach('Old', [IPCT]), - wbFormIDCk('New', [IPCT, NULL]) - ])), - wbArray(IMPF, 'Footstep Materials', wbString('Unknown', 30), [ - 'ConcSolid', - 'ConcBroken', - 'MetalSolid', - 'MetalHollow', - 'MetalSheet', - 'Wood', - 'Sand', - 'Dirt', - 'Grass', - 'Water' - ]), - wbArray(OFST, 'Offset Data', wbArray('Rows', wbInteger('Offset', itU32), wbOffsetDataColsCounter), 0) - ], False, nil, cpNormal, False, wbRemoveOFST); - - wbRecord(WTHR, 'Weather', [ - wbEDIDReq, - wbFormIDCk(_0_IAD, 'Sunrise Image Space Modifier', [IMAD]), - wbFormIDCk(_1_IAD, 'Day Image Space Modifier', [IMAD]), - wbFormIDCk(_2_IAD, 'Sunset Image Space Modifier', [IMAD]), - wbFormIDCk(_3_IAD, 'Night Image Space Modifier', [IMAD]), - wbString(DNAM, 'Cloud Textures - Layer 0', 0, cpNormal, True), - wbString(CNAM, 'Cloud Textures - Layer 1', 0, cpNormal, True), - wbString(ANAM, 'Cloud Textures - Layer 2', 0, cpNormal, True), - wbString(BNAM, 'Cloud Textures - Layer 3', 0, cpNormal, True), - wbMODL, - wbByteArray(LNAM, 'Unknown', 4, cpNormal, True), - wbArray(ONAM, 'Cloud Speed', wbInteger('Layer', itU8{, wbDiv(2550)}), 4, nil, nil, cpNormal, True), - wbArray(PNAM, 'Cloud Layer Colors', - wbArray('Layer', - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night'] - ), - 4), - wbArray(NAM0, 'Colors by Types/Times', - wbArray('Type', - wbStruct('Time', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night'] - ), - ['Sky-Upper','Fog','Unused','Ambient','Sunlight','Sun','Stars','Sky-Lower','Horizon','Unused'] - , cpNormal, True), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day - Near'), - wbFloat('Day - Far'), - wbFloat('Night - Near'), - wbFloat('Night - Far'), - wbFloat('Day - Power'), - wbFloat('Night - Fower') - ], cpNormal, True), - wbByteArray(INAM, 'Unused', 304, cpIgnore, True), - wbStruct(DATA, '', [ - wbInteger('Wind Speed', itU8), - wbInteger('Cloud Speed (Lower)', itU8), - wbInteger('Cloud Speed (Upper)', itU8), - wbInteger('Trans Delta', itU8), - wbInteger('Sun Glare', itU8), - wbInteger('Sun Damage', itU8), - wbInteger('Precipitation - Begin Fade In', itU8), - wbInteger('Precipitation - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Weather Classification', itU8, wbWthrDataClassification), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]) - ], cpNormal, True), - wbRArray('Sounds', wbStruct(SNAM, 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Type', itU32, wbEnum([ - {0}'Default', - {1}'Precip', - {2}'Wind', - {3}'Thunder' - ])) - ])) - ]); - - wbAddGroupOrder(GMST); - wbAddGroupOrder(TXST); - wbAddGroupOrder(MICN); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HDPT); - wbAddGroupOrder(HAIR); - wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(ASPC); - wbAddGroupOrder(MGEF); - wbAddGroupOrder(SCPT); - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(TACT); - wbAddGroupOrder(TERM); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(STAT); - wbAddGroupOrder(SCOL); - wbAddGroupOrder(MSTT); - wbAddGroupOrder(PWAT); - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(CREA); - wbAddGroupOrder(LVLC); - wbAddGroupOrder(LVLN); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(IDLM); - wbAddGroupOrder(NOTE); - wbAddGroupOrder(PROJ); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(COBJ); - wbAddGroupOrder(REGN); - wbAddGroupOrder(NAVI); - wbAddGroupOrder(CELL); - wbAddGroupOrder(WRLD); - wbAddGroupOrder(DIAL); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); - wbAddGroupOrder(EXPL); - wbAddGroupOrder(DEBR); - wbAddGroupOrder(IMGS); - wbAddGroupOrder(IMAD); - wbAddGroupOrder(FLST); - wbAddGroupOrder(PERK); - wbAddGroupOrder(BPTD); - wbAddGroupOrder(ADDN); - wbAddGroupOrder(AVIF); - wbAddGroupOrder(RADS); - wbAddGroupOrder(CAMS); - wbAddGroupOrder(CPTH); - wbAddGroupOrder(VTYP); - wbAddGroupOrder(IPCT); - wbAddGroupOrder(IPDS); - wbAddGroupOrder(ARMA); - wbAddGroupOrder(ECZN); - wbAddGroupOrder(MESG); - wbAddGroupOrder(RGDL); - wbAddGroupOrder(DOBJ); - wbAddGroupOrder(LGTM); - wbAddGroupOrder(MUSC); -end; - -procedure DefineFO3; -begin - DefineFO3a; - DefineFO3b; - DefineFO3c; - DefineFO3d; - DefineFO3e; - DefineFO3f; -end; - -end. diff --git a/lib/xedit/wbDefinitionsFO4.pas b/lib/xedit/wbDefinitionsFO4.pas deleted file mode 100644 index 20aa7fa..0000000 --- a/lib/xedit/wbDefinitionsFO4.pas +++ /dev/null @@ -1,16450 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbDefinitionsFO4; - -{$I wbDefines.inc} - -interface - -uses - wbInterface; - -var - wbBipedObjectFlags: IwbFlagsDef; - wbEquipType: IwbFlagsDef; - wbFurnitureEntryTypeFlags: IwbFlagsDef; - wbPKDTFlags: IwbFlagsDef; - wbPKDTInterruptFlags: IwbFlagsDef; - wbSMNodeFlags: IwbFlagsDef; - - wbActorPropertyEnum: IwbEnumDef; - wbAdvanceActionEnum: IwbEnumDef; - wbStaggerEnum: IwbEnumDef; - wbAlignmentEnum: IwbEnumDef; - wbArmorPropertyEnum: IwbEnumDef; - wbAxisEnum: IwbEnumDef; - wbBipedObjectEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbBodyPartIndexEnum: IwbEnumDef; - wbCastEnum: IwbEnumDef; - wbCastingSourceEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbCriticalStageEnum: IwbEnumDef; - wbEmotionTypeEnum: IwbEnumDef; - wbEntryPointsEnum: IwbEnumDef; - wbEventFunctionEnum: IwbEnumDef; - wbEventMemberEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFurnitureAnimTypeEnum: IwbEnumDef; - wbLocationEnum: IwbEnumDef; - wbMiscStatEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbObjectModProperties: IwbArrayDef; - wbObjectTypeEnum: IwbEnumDef; - wbPropTypeEnum: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoulGemEnum: IwbEnumDef; - wbSoundLevelEnum: IwbEnumDef; - wbTargetEnum: IwbEnumDef; - wbVatsValueFunctionEnum: IwbEnumDef; - wbWardStateEnum: IwbEnumDef; - wbWeaponAnimTypeEnum: IwbEnumDef; - wbWeaponPropertyEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - wbKeywordTypeEnum: IwbEnumDef; - wbReverbClassEnum: IwbEnumDef; - wbHitBehaviourEnum: IwbEnumDef; - wbBoolEnum: IwbEnumDef; - -procedure DefineFO4; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants, - wbHelpers; - -const - _00_IAD: TwbSignature = #$00'IAD'; - _01_IAD: TwbSignature = #$01'IAD'; - _02_IAD: TwbSignature = #$02'IAD'; - _03_IAD: TwbSignature = #$03'IAD'; - _04_IAD: TwbSignature = #$04'IAD'; - _05_IAD: TwbSignature = #$05'IAD'; - _06_IAD: TwbSignature = #$06'IAD'; - _07_IAD: TwbSignature = #$07'IAD'; - _08_IAD: TwbSignature = #$08'IAD'; - _09_IAD: TwbSignature = #$09'IAD'; - _0A_IAD: TwbSignature = #$0A'IAD'; - _0B_IAD: TwbSignature = #$0B'IAD'; - _0C_IAD: TwbSignature = #$0C'IAD'; - _0D_IAD: TwbSignature = #$0D'IAD'; - _0E_IAD: TwbSignature = #$0E'IAD'; - _0F_IAD: TwbSignature = #$0F'IAD'; - _10_IAD: TwbSignature = #$10'IAD'; - _11_IAD: TwbSignature = #$11'IAD'; - _12_IAD: TwbSignature = #$12'IAD'; - _13_IAD: TwbSignature = #$13'IAD'; - _14_IAD: TwbSignature = #$14'IAD'; - _40_IAD: TwbSignature = #$40'IAD'; - _41_IAD: TwbSignature = #$41'IAD'; - _42_IAD: TwbSignature = #$42'IAD'; - _43_IAD: TwbSignature = #$43'IAD'; - _44_IAD: TwbSignature = #$44'IAD'; - _45_IAD: TwbSignature = #$45'IAD'; - _46_IAD: TwbSignature = #$46'IAD'; - _47_IAD: TwbSignature = #$47'IAD'; - _48_IAD: TwbSignature = #$48'IAD'; - _49_IAD: TwbSignature = #$49'IAD'; - _4A_IAD: TwbSignature = #$4A'IAD'; - _4B_IAD: TwbSignature = #$4B'IAD'; - _4C_IAD: TwbSignature = #$4C'IAD'; - _4D_IAD: TwbSignature = #$4D'IAD'; - _4E_IAD: TwbSignature = #$4E'IAD'; - _4F_IAD: TwbSignature = #$4F'IAD'; - _50_IAD: TwbSignature = #$50'IAD'; - _51_IAD: TwbSignature = #$51'IAD'; - _52_IAD: TwbSignature = #$52'IAD'; - _53_IAD: TwbSignature = #$53'IAD'; - _54_IAD: TwbSignature = #$54'IAD'; - -{00TX} _00_0TX: TwbSignature = #$30'0TX'; -{10TX} _10_0TX: TwbSignature = #$31'0TX'; -{20TX} _20_0TX: TwbSignature = #$32'0TX'; -{30TX} _30_0TX: TwbSignature = #$33'0TX'; -{40TX} _40_0TX: TwbSignature = #$34'0TX'; -{50TX} _50_0TX: TwbSignature = #$35'0TX'; -{60TX} _60_0TX: TwbSignature = #$36'0TX'; -{70TX} _70_0TX: TwbSignature = #$37'0TX'; -{80TX} _80_0TX: TwbSignature = #$38'0TX'; -{90TX} _90_0TX: TwbSignature = #$39'0TX'; -{:0TX} _3A_0TX: TwbSignature = #$3A'0TX'; -{;0TX} _3B_0TX: TwbSignature = #$3B'0TX'; -{<0TX} _3C_0TX: TwbSignature = #$3C'0TX'; -{=0TX} _3D_0TX: TwbSignature = #$3D'0TX'; -{>0TX} _3E_0TX: TwbSignature = #$3E'0TX'; -{?0TX} _3F_0TX: TwbSignature = #$3F'0TX'; -{@0TX} _40h_0TX: TwbSignature = #$40'0TX'; -{A0TX} A0TX: TwbSignature = 'A0TX'; -{B0TX} B0TX: TwbSignature = 'B0TX'; -{C0TX} C0TX: TwbSignature = 'C0TX'; -{D0TX} D0TX: TwbSignature = 'D0TX'; -{E0TX} E0TX: TwbSignature = 'E0TX'; -{F0TX} F0TX: TwbSignature = 'F0TX'; -{G0TX} G0TX: TwbSignature = 'G0TX'; -{H0TX} H0TX: TwbSignature = 'H0TX'; -{I0TX} I0TX: TwbSignature = 'I0TX'; -{J0TX} J0TX: TwbSignature = 'J0TX'; -{K0TX} K0TX: TwbSignature = 'K0TX'; -{L0TX} L0TX: TwbSignature = 'L0TX'; - - AACT : TwbSignature = 'AACT'; - ACBS : TwbSignature = 'ACBS'; - ACEC : TwbSignature = 'ACEC'; { New To Dawnguard } - ACEP : TwbSignature = 'ACEP'; { New To Dawnguard } - ACHR : TwbSignature = 'ACHR'; - ACID : TwbSignature = 'ACID'; { New To Dawnguard } - ACPR : TwbSignature = 'ACPR'; { New To Skyrim } - ACSR : TwbSignature = 'ACSR'; { New To Dawnguard } - ACTI : TwbSignature = 'ACTI'; - ACTV : TwbSignature = 'ACTV'; { New To Fallout 4 } - ACUN : TwbSignature = 'ACUN'; { New To Dawnguard } - ADDN : TwbSignature = 'ADDN'; - AECH : TwbSignature = 'AECH'; { New To Fallout 4 } - AHCF : TwbSignature = 'AHCF'; { New To Skyrim } - AHCM : TwbSignature = 'AHCM'; { New To Skyrim } - AIDT : TwbSignature = 'AIDT'; - ALCA : TwbSignature = 'ALCA'; { New To Skyrim } - ALCC : TwbSignature = 'ALCC'; { New To Fallout 4 } - ALCH : TwbSignature = 'ALCH'; - ALCL : TwbSignature = 'ALCL'; { New To Skyrim } - ALCO : TwbSignature = 'ALCO'; { New To Skyrim } - ALCS : TwbSignature = 'ALCS'; { New To Fallout 4 } - ALDI : TwbSignature = 'ALDI'; { New To Fallout 4 } - ALDN : TwbSignature = 'ALDN'; { New To Skyrim } - ALEA : TwbSignature = 'ALEA'; { New To Skyrim } - ALED : TwbSignature = 'ALED'; { New To Skyrim } - ALEQ : TwbSignature = 'ALEQ'; { New To Skyrim } - ALFA : TwbSignature = 'ALFA'; { New To Skyrim } - ALFC : TwbSignature = 'ALFC'; { New To Skyrim } - ALFD : TwbSignature = 'ALFD'; { New To Skyrim } - ALFE : TwbSignature = 'ALFE'; { New To Skyrim } - ALFI : TwbSignature = 'ALFI'; { New To Skyrim } - ALFL : TwbSignature = 'ALFL'; { New To Skyrim } - ALFR : TwbSignature = 'ALFR'; { New To Skyrim } - ALFV : TwbSignature = 'ALFV'; { New To Fallout 4 } - ALID : TwbSignature = 'ALID'; { New To Skyrim } - ALLA : TwbSignature = 'ALLA'; { New To Fallout 4 } - ALLS : TwbSignature = 'ALLS'; { New To Skyrim } - ALMI : TwbSignature = 'ALMI'; { New To Fallout 4 } - ALNA : TwbSignature = 'ALNA'; { New To Skyrim } - ALNT : TwbSignature = 'ALNT'; { New To Skyrim } - ALPC : TwbSignature = 'ALPC'; { New To Skyrim } - ALRT : TwbSignature = 'ALRT'; { New To Skyrim } - ALSP : TwbSignature = 'ALSP'; { New To Skyrim } - ALST : TwbSignature = 'ALST'; { New To Skyrim } - ALUA : TwbSignature = 'ALUA'; { New To Skyrim } - AMDL : TwbSignature = 'AMDL'; { New To Fallout 4 } - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - AOR2 : TwbSignature = 'AOR2'; { New To Fallout 4 } - AORU : TwbSignature = 'AORU'; { New To Fallout 4 } - APPR : TwbSignature = 'APPR'; { New To Fallout 4 } - ARMA : TwbSignature = 'ARMA'; - ARMO : TwbSignature = 'ARMO'; - ARTO : TwbSignature = 'ARTO'; - ASPC : TwbSignature = 'ASPC'; - ASTP : TwbSignature = 'ASTP'; - ATKD : TwbSignature = 'ATKD'; { New to Skyrim } - ATKE : TwbSignature = 'ATKE'; { New to Skyrim } - ATKR : TwbSignature = 'ATKR'; { New to Skyrim } - ATKT : TwbSignature = 'ATKT'; { New To Fallout 4 } - ATKS : TwbSignature = 'ATKS'; { New To Fallout 4 } - ATKW : TwbSignature = 'ATKW'; { New To Fallout 4 } - ATTN : TwbSignature = 'ATTN'; { New To Fallout 4 } - ATTX : TwbSignature = 'ATTX'; { New To Fallout 4 } - ATXT : TwbSignature = 'ATXT'; - AVFL : TwbSignature = 'AVFL'; { New To Fallout 4 } - AVIF : TwbSignature = 'AVIF'; - AVSK : TwbSignature = 'AVSK'; { New to Skyrim } - BAMT : TwbSignature = 'BAMT'; { New to Skyrim } - BCLF : TwbSignature = 'BCLF'; { New to Fallout 4 } - BIDS : TwbSignature = 'BIDS'; { New to Skyrim } - BIPL : TwbSignature = 'BIPL'; - BMCT : TwbSignature = 'BMCT'; - BMMP : TwbSignature = 'BMMP'; { New to Fallout 4 } - BNAM : TwbSignature = 'BNAM'; - BNDS : TwbSignature = 'BNDS'; { New to Fallout 4 } - BOD2 : TwbSignature = 'BOD2'; { New to Skyrim 1.6.91 CK} - BODT : TwbSignature = 'BODT'; { New to Skyrim } - BOOK : TwbSignature = 'BOOK'; - BPND : TwbSignature = 'BPND'; - BPNI : TwbSignature = 'BPNI'; - BPNN : TwbSignature = 'BPNN'; - BPNT : TwbSignature = 'BPNT'; - BPTD : TwbSignature = 'BPTD'; - BPTN : TwbSignature = 'BPTN'; - BSIZ : TwbSignature = 'BSIZ'; { New to Fallout 4 } - BSMB : TwbSignature = 'BSMB'; { New to Fallout 4 } - BSMP : TwbSignature = 'BSMP'; { New to Fallout 4 } - BSMS : TwbSignature = 'BSMS'; { New to Fallout 4 } - BTXT : TwbSignature = 'BTXT'; - CAMS : TwbSignature = 'CAMS'; - CDIX : TwbSignature = 'CDIX'; { New to Fallout 4 } - CELL : TwbSignature = 'CELL'; - CIS1 : TwbSignature = 'CIS1'; { New to Skyrim } - CIS2 : TwbSignature = 'CIS2'; { New to Skyrim } - CITC : TwbSignature = 'CITC'; { New to Skyrim } - CLAS : TwbSignature = 'CLAS'; - CLFM : TwbSignature = 'CLFM'; - CLMT : TwbSignature = 'CLMT'; - CLSZ : TwbSignature = 'CLSZ'; { New to Fallout 4 } - CMPO : TwbSignature = 'CMPO'; { New to Fallout 4 } - CNAM : TwbSignature = 'CNAM'; - CNTO : TwbSignature = 'CNTO'; - COBJ : TwbSignature = 'COBJ'; - COCT : TwbSignature = 'COCT'; { New to Skyrim 'Count'} - COED : TwbSignature = 'COED'; - COLL : TwbSignature = 'COLL'; - CONT : TwbSignature = 'CONT'; - CPTH : TwbSignature = 'CPTH'; - CRDT : TwbSignature = 'CRDT'; - CRGR : TwbSignature = 'CRGR'; { New to Skyrim } - CRIF : TwbSignature = 'CRIF'; { New to Skyrim } - CRIS : TwbSignature = 'CRIS'; { New to Fallout 4 } - CRVA : TwbSignature = 'CRVA'; { New to Skyrim } - CS2H : TwbSignature = 'CS2H'; { New To Fallout 4 } - CS2D : TwbSignature = 'CS2D'; { New To Fallout 4 } - CS2E : TwbSignature = 'CS2E'; { New To Fallout 4 } - CS2F : TwbSignature = 'CS2F'; { New To Fallout 4 } - CS2K : TwbSignature = 'CS2K'; { New To Fallout 4 } - CSCR : TwbSignature = 'CSCR'; - CSCV : TwbSignature = 'CSCV'; { New To Fallout 4 } - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSFL : TwbSignature = 'CSFL'; { New to Skyrim } - CSGD : TwbSignature = 'CSGD'; { New to Skyrim } - CSLR : TwbSignature = 'CSLR'; { New to Skyrim } - CSMD : TwbSignature = 'CSMD'; { New to Skyrim } - CSME : TwbSignature = 'CSME'; { New to Skyrim } - CSRA : TwbSignature = 'CSRA'; { New To Fallout 4 } - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - CUSD : TwbSignature = 'CUSD'; { New to Fallout 4 } - CVPA : TwbSignature = 'CVPA'; { New to Fallout 4 } - DALC : TwbSignature = 'DALC'; { New to Skyrim } - DAMA : TwbSignature = 'DAMA'; { New to Fallout 4 } - DAMC : TwbSignature = 'DAMC'; { New to Fallout 4 } - DATA : TwbSignature = 'DATA'; - DEBR : TwbSignature = 'DEBR'; - DELE : TwbSignature = 'DELE'; - DEMO : TwbSignature = 'DEMO'; { New to Skyrim } - DESC : TwbSignature = 'DESC'; - DEST : TwbSignature = 'DEST'; - DEVA : TwbSignature = 'DEVA'; { New to Skyrim } - DFOB : TwbSignature = 'DFOB'; { New to Fallout 4 } - DFTF : TwbSignature = 'DFTF'; { New To Skyrim } - DFTM : TwbSignature = 'DFTM'; { New To Skyrim } - DIAL : TwbSignature = 'DIAL'; - DLBR : TwbSignature = 'DLBR'; - DLVW : TwbSignature = 'DLVW'; - DMAX : TwbSignature = 'DMAX'; { New to Skyrim } - DMDC : TwbSignature = 'DMDC'; { New to Fallout 4 } - DMDL : TwbSignature = 'DMDL'; - DMDS : TwbSignature = 'DMDS'; { New to Skyrim } - DMDT : TwbSignature = 'DMDT'; - DMGT : TwbSignature = 'DMGT'; { New to Fallout 4 } - DMIN : TwbSignature = 'DMIN'; { New to Skyrim } - DNAM : TwbSignature = 'DNAM'; - DOBJ : TwbSignature = 'DOBJ'; - DODT : TwbSignature = 'DODT'; - DOFT : TwbSignature = 'DOFT'; { New to Skyrim } - DOOR : TwbSignature = 'DOOR'; - DPLT : TwbSignature = 'DPLT'; { New to Skyrim } - DSTA : TwbSignature = 'DSTA'; { New To Fallout 4 } - DSTD : TwbSignature = 'DSTD'; - DSTF : TwbSignature = 'DSTF'; - DTGT : TwbSignature = 'DTGT'; { New To Fallout 4 } - DTID : TwbSignature = 'DTID'; { New To Fallout 4 } - DUAL : TwbSignature = 'DUAL'; - EAMT : TwbSignature = 'EAMT'; - ECOR : TwbSignature = 'ECOR'; { New to Skyrim } - ECZN : TwbSignature = 'ECZN'; - EDID : TwbSignature = 'EDID'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - EFSH : TwbSignature = 'EFSH'; - EITM : TwbSignature = 'EITM'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - EPF2 : TwbSignature = 'EPF2'; - EPF3 : TwbSignature = 'EPF3'; - EPFB : TwbSignature = 'EPFB'; { New To Fallout 4 } - EPFD : TwbSignature = 'EPFD'; - EPFT : TwbSignature = 'EPFT'; - EQUP : TwbSignature = 'EQUP'; - ESCE : TwbSignature = 'ESCE'; - ETYP : TwbSignature = 'ETYP'; - EXPL : TwbSignature = 'EXPL'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FCHT : TwbSignature = 'FCHT'; { New to Skyrim } - FCPL : TwbSignature = 'FCPL'; { New To Fallout 4 } - FFFF : TwbSignature = 'FFFF'; - FIMD : TwbSignature = 'FIMD'; { New To Fallout 4 } - FLMV : TwbSignature = 'FLMV'; { New to Skyrim } - FLOR : TwbSignature = 'FLOR'; - FLST : TwbSignature = 'FLST'; - FLTR : TwbSignature = 'FLTR'; { New to Skyrim } - FLTV : TwbSignature = 'FLTV'; - FMIN : TwbSignature = 'FMIN'; { New To Fallout 4 } - FMRI : TwbSignature = 'FMRI'; { New To Fallout 4 } - FMRN : TwbSignature = 'FMRN'; { New To Fallout 4 } - FMRS : TwbSignature = 'FMRS'; { New To Fallout 4 } - FNAM : TwbSignature = 'FNAM'; - FNMK : TwbSignature = 'FNMK'; { New to Skyrim } - FNPR : TwbSignature = 'FNPR'; { New to Skyrim } - FPRT : TwbSignature = 'FPRT'; { New to Skyrim } - FSTP : TwbSignature = 'FSTP'; - FSTS : TwbSignature = 'FSTS'; - FTSF : TwbSignature = 'FTSF'; { New to Skyrim } - FTSM : TwbSignature = 'FTSM'; { New to Skyrim } - FTST : TwbSignature = 'FTST'; { New to Skyrim } - FTYP : TwbSignature = 'FTYP'; { New To Fallout 4 } - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - FVPA : TwbSignature = 'FVPA'; { New To Fallout 4 } - GDRY : TwbSignature = 'GDRY'; { New to Fallout 4 } - GLOB : TwbSignature = 'GLOB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - GREE : TwbSignature = 'GREE'; { New to Fallout 4 } - GWOR : TwbSignature = 'GWOR'; { New to Skyrim } - HAZD : TwbSignature = 'HAZD'; - HCLF : TwbSignature = 'HCLF'; { New to Skyrim } - HDPT : TwbSignature = 'HDPT'; - HEAD : TwbSignature = 'HEAD'; { New to Skyrim } - HEDR : TwbSignature = 'HEDR'; - HLTX : TwbSignature = 'HLTX'; { New to Fallout 4 } - HNAM : TwbSignature = 'HNAM'; - HTID : TwbSignature = 'HTID'; { New to Skyrim } - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLA : TwbSignature = 'IDLA'; - IDLB : TwbSignature = 'IDLB'; - IDLC : TwbSignature = 'IDLC'; - IDLE : TwbSignature = 'IDLE'; - IDLF : TwbSignature = 'IDLF'; - IDLM : TwbSignature = 'IDLM'; - IDLT : TwbSignature = 'IDLT'; - IMAD : TwbSignature = 'IMAD'; - IMGS : TwbSignature = 'IMGS'; - IMSP : TwbSignature = 'IMSP'; { New to Skyrim } - INAM : TwbSignature = 'INAM'; - INCC : TwbSignature = 'INCC'; { New to Skyrim } - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - INNR : TwbSignature = 'INNR'; { New To Fallout 4 } - INRD : TwbSignature = 'INRD'; { New To Fallout 4 } - INTT : TwbSignature = 'INTT'; { New To Fallout 4 } - INTV : TwbSignature = 'INTV'; - IOVR : TwbSignature = 'IOVR'; { New To Fallout 4 } - IPCT : TwbSignature = 'IPCT'; - IPDS : TwbSignature = 'IPDS'; - ISIZ : TwbSignature = 'ISIZ'; { New To Fallout 4 } - ITID : TwbSignature = 'ITID'; { New To Fallout 4 } - ITMC : TwbSignature = 'ITMC'; { New To Fallout 4 } - ITME : TwbSignature = 'ITME'; { New To Fallout 4 } - ITMS : TwbSignature = 'ITMS'; { New To Fallout 4 } - ITXT : TwbSignature = 'ITXT'; - JAIL : TwbSignature = 'JAIL'; { New To Skyrim } - JNAM : TwbSignature = 'JNAM'; - JOUT : TwbSignature = 'JOUT'; { New To Skyrim } - KEYM : TwbSignature = 'KEYM'; - KNAM : TwbSignature = 'KNAM'; - KSIZ : TwbSignature = 'KSIZ'; - KSSM : TwbSignature = 'KSSM'; { New To Fallout 4 } - KWDA : TwbSignature = 'KWDA'; - KYWD : TwbSignature = 'KYWD'; - LAND : TwbSignature = 'LAND'; - LAYR : TwbSignature = 'LAYR'; { New to Fallout 4 } - LCEC : TwbSignature = 'LCEC'; { New to Skyrim } - LCEP : TwbSignature = 'LCEP'; { New to Skyrim } - LCID : TwbSignature = 'LCID'; { New to Skyrim } - LCPR : TwbSignature = 'LCPR'; { New to Skyrim } - LCRT : TwbSignature = 'LCRT'; - LCSR : TwbSignature = 'LCSR'; { New to Skyrim } - LCTN : TwbSignature = 'LCTN'; - LCUN : TwbSignature = 'LCUN'; { New to Skyrim } - LENS : TwbSignature = 'LENS'; { New to Fallout 4 } - LFSD : TwbSignature = 'LFSD'; { New to Fallout 4 } - LFSP : TwbSignature = 'LFSP'; { New to Fallout 4 } - LGTM : TwbSignature = 'LGTM'; - LIGH : TwbSignature = 'LIGH'; - LLCT : TwbSignature = 'LLCT'; {New to Skyrim, part of LVLI 'Count'} - LLKC : TwbSignature = 'LLKC'; { New to Fallout 4 } - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LSPR : TwbSignature = 'LSPR'; { New to Fallout 4 } - LTEX : TwbSignature = 'LTEX'; - LTMP : TwbSignature = 'LTMP'; - LTPT : TwbSignature = 'LTPT'; { New to Fallout 4 } - LTPC : TwbSignature = 'LTPC'; { New to Fallout 4 } - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLG : TwbSignature = 'LVLG'; - LVLI : TwbSignature = 'LVLI'; - LVLM : TwbSignature = 'LVLM'; { New to Fallout 4 } - LVLN : TwbSignature = 'LVLN'; - LVLO : TwbSignature = 'LVLO'; - LVSG : TwbSignature = 'LVSG'; { New to Fallout 4 } - LVSP : TwbSignature = 'LVSP'; - MASE : TwbSignature = 'MASE'; { New To Fallout 4 } - MAST : TwbSignature = 'MAST'; - MATO : TwbSignature = 'MATO'; - MATT : TwbSignature = 'MATT'; - MCHT : TwbSignature = 'MCHT'; { New to Skyrim } - MDOB : TwbSignature = 'MDOB'; - MESG : TwbSignature = 'MESG'; - MGEF : TwbSignature = 'MGEF'; - MHDT : TwbSignature = 'MHDT'; { New to Skyrim } - MIC2 : TwbSignature = 'MIC2'; - MICN : TwbSignature = 'MICN'; { New to Fallout 4 } - MICO : TwbSignature = 'MICO'; - MISC : TwbSignature = 'MISC'; - MLSI : TwbSignature = 'MLSI'; { New to Fallout 4 } - MNAM : TwbSignature = 'MNAM'; - MO2C : TwbSignature = 'MO2C'; { New to Fallout 4 } - MO2F : TwbSignature = 'MO2F'; { New to Fallout 4 } - MO2S : TwbSignature = 'MO2S'; - MO2T : TwbSignature = 'MO2T'; - MO3C : TwbSignature = 'MO3C'; { New to Fallout 4 } - MO3F : TwbSignature = 'MO3F'; { New to Fallout 4 } - MO3S : TwbSignature = 'MO3S'; - MO3T : TwbSignature = 'MO3T'; - MO4C : TwbSignature = 'MO4C'; { New to Fallout 4 } - MO4F : TwbSignature = 'MO4F'; { New to Fallout 4 } - MO4S : TwbSignature = 'MO4S'; - MO4T : TwbSignature = 'MO4T'; - MO5C : TwbSignature = 'MO5C'; { New to Fallout 4 } - MO5F : TwbSignature = 'MO5F'; { New to Fallout 4 } - MO5S : TwbSignature = 'MO5S'; { New to Skyrim } - MO5T : TwbSignature = 'MO5T'; { New to Skyrim } - MOD2 : TwbSignature = 'MOD2'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MOD5 : TwbSignature = 'MOD5'; { New to Skyrim } - MODC : TwbSignature = 'MODC'; { New to Fallout 4 } - MODF : TwbSignature = 'MODF'; { New to Fallout 4 } - MODL : TwbSignature = 'MODL'; - MODS : TwbSignature = 'MODS'; - MODT : TwbSignature = 'MODT'; - MODQ : TwbSignature = 'MODQ'; { New to Fallout 4 } - MOVT : TwbSignature = 'MOVT'; - MPAI : TwbSignature = 'MPAI'; { New To Skyrim } - MPAV : TwbSignature = 'MPAV'; { New To Skyrim } - MPCD : TwbSignature = 'MPCD'; { New to Fallout 4 } - MPGN : TwbSignature = 'MPGN'; { New to Fallout 4 } - MPGS : TwbSignature = 'MPGS'; { New to Fallout 4 } - MPPC : TwbSignature = 'MPPC'; { New to Fallout 4 } - MPPF : TwbSignature = 'MPPF'; { New to Fallout 4 } - MPPI : TwbSignature = 'MPPI'; { New to Fallout 4 } - MPPK : TwbSignature = 'MPPK'; { New to Fallout 4 } - MPPM : TwbSignature = 'MPPM'; { New to Fallout 4 } - MPPN : TwbSignature = 'MPPN'; { New to Fallout 4 } - MPPT : TwbSignature = 'MPPT'; { New to Fallout 4 } - MPRT : TwbSignature = 'MPRT'; { New to Skyrim } - MRSV : TwbSignature = 'MRSV'; { New to Fallout 4 } - MSDK : TwbSignature = 'MSDK'; { New to Fallout 4 } - MSDV : TwbSignature = 'MSDV'; { New to Fallout 4 } - MSID : TwbSignature = 'MSID'; { New to Fallout 4 } - MSM0 : TwbSignature = 'MSM0'; { New to Fallout 4 } - MSM1 : TwbSignature = 'MSM1'; { New to Fallout 4 } - MSTT : TwbSignature = 'MSTT'; - MSWP : TwbSignature = 'MSWP'; { New to Fallout 4 } - MTNM : TwbSignature = 'MTNM'; { New to Skyrim } - MTYP : TwbSignature = 'MTYP'; { New To Skyrim } - MUSC : TwbSignature = 'MUSC'; - MUST : TwbSignature = 'MUST'; - MWGT : TwbSignature = 'MWGT'; { New to Fallout 4 } - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM3 : TwbSignature = 'NAM3'; - NAM4 : TwbSignature = 'NAM4'; - NAM5 : TwbSignature = 'NAM5'; - NAM6 : TwbSignature = 'NAM6'; - NAM7 : TwbSignature = 'NAM7'; - NAM8 : TwbSignature = 'NAM8'; - NAM9 : TwbSignature = 'NAM9'; - NAMA : TwbSignature = 'NAMA'; { New to Skyrim } - NAME : TwbSignature = 'NAME'; - NAVI : TwbSignature = 'NAVI'; - NAVM : TwbSignature = 'NAVM'; - NETO : TwbSignature = 'NETO'; { New to Fallout 4 } - NEXT : TwbSignature = 'NEXT'; - NNAM : TwbSignature = 'NNAM'; - NNGT : TwbSignature = 'NNGT'; { New to Fallout 4 } - NNGS : TwbSignature = 'NNGS'; { New to Fallout 4 } - NNUS : TwbSignature = 'NNUS'; { New to Fallout 4 } - NNUT : TwbSignature = 'NNUT'; { New to Fallout 4 } - NOCM : TwbSignature = 'NOCM'; { New to Fallout 4 } - NONE : TwbSignature = 'NONE'; { New to Fallout 4, used in OMOD Form Type } - NOTE : TwbSignature = 'NOTE'; { New to Fallout 4 } - NPC_ : TwbSignature = 'NPC_'; - NPOS : TwbSignature = 'NPOS'; { New to Fallout 4 } - NPOT : TwbSignature = 'NPOT'; { New to Fallout 4 } - NQUS : TwbSignature = 'NQUS'; { New to Fallout 4 } - NQUT : TwbSignature = 'NQUT'; { New to Fallout 4 } - NTOP : TwbSignature = 'NTOP'; { New to Fallout 4 } - NTRM : TwbSignature = 'NTRM'; { New to Fallout 4 } - NULL : TwbSignature = 'NULL'; - NVER : TwbSignature = 'NVER'; - NVMI : TwbSignature = 'NVMI'; - NVNM : TwbSignature = 'NVNM'; { New to Skyrim } - NVPP : TwbSignature = 'NVPP'; { New to Skyrim } - NVSI : TwbSignature = 'NVSI'; { New to Dawnguard } - OBND : TwbSignature = 'OBND'; - OBTE : TwbSignature = 'OBTE'; { New to Fallout 4 } - OBTF : TwbSignature = 'OBTF'; { New to Fallout 4 } - OBTS : TwbSignature = 'OBTS'; { New to Fallout 4 } - OCOR : TwbSignature = 'OCOR'; { New to Skyrim } - OFST : TwbSignature = 'OFST'; - OMOD : TwbSignature = 'OMOD'; { New to Fallout 4 } - ONAM : TwbSignature = 'ONAM'; - OTFT : TwbSignature = 'OTFT'; - OVIS : TwbSignature = 'OVIS'; { New to Fallout 4 } - PACK : TwbSignature = 'PACK'; - PARW : TwbSignature = 'PARW'; { New to Skyrim } - PBAR : TwbSignature = 'PBAR'; { New to Skyrim } - PBEA : TwbSignature = 'PBEA'; { New to Skyrim } - PCMB : TwbSignature = 'PCMB'; { New to Fallout 4 } - PCON : TwbSignature = 'PCON'; { New to Skyrim } - PDTO : TwbSignature = 'PDTO'; { New to Skyrim } - PERK : TwbSignature = 'PERK'; - PFIG : TwbSignature = 'PFIG'; - PFLA : TwbSignature = 'PFLA'; { New to Skyrim } - PFO2 : TwbSignature = 'PFO2'; { New to Skyrim } - PFOR : TwbSignature = 'PFOR'; { New to Skyrim } - PFPC : TwbSignature = 'PFPC'; - PFRN : TwbSignature = 'PFRN'; { New to Fallout 4 } - PGRE : TwbSignature = 'PGRE'; - PHTN : TwbSignature = 'PHTN'; { New to Skyrim } - PHWT : TwbSignature = 'PHWT'; { New to Skyrim } - PHZD : TwbSignature = 'PHZD'; - PKC2 : TwbSignature = 'PKC2'; { New to Skyrim } - PKCU : TwbSignature = 'PKCU'; { New to Skyrim } - PKDT : TwbSignature = 'PKDT'; - PKID : TwbSignature = 'PKID'; - PKIN : TwbSignature = 'PKIN'; { New to Fallout 4 } - PLCN : TwbSignature = 'PLCN'; { New to Skyrim } - PLDT : TwbSignature = 'PLDT'; - PLVD : TwbSignature = 'PLVD'; { New to Skyrim } - PLYR : TwbSignature = 'PLYR'; - PMIS : TwbSignature = 'PMIS'; - PNAM : TwbSignature = 'PNAM'; - POBA : TwbSignature = 'POBA'; - POCA : TwbSignature = 'POCA'; - POEA : TwbSignature = 'POEA'; - PRCB : TwbSignature = 'PRCB'; { New to Skyrim } - PRKC : TwbSignature = 'PRKC'; - PRKE : TwbSignature = 'PRKE'; - PRKF : TwbSignature = 'PRKF'; - PRKR : TwbSignature = 'PRKR'; { New to Skyrim } - PRKZ : TwbSignature = 'PRKZ'; { New to Skyrim } - PROJ : TwbSignature = 'PROJ'; - PRPS : TwbSignature = 'PRPS'; { New to Fallout 4 } - PSDT : TwbSignature = 'PSDT'; - PTDA : TwbSignature = 'PTDA'; { New to Skyrim } - PTOP : TwbSignature = 'PTOP'; { New to Fallout 4 } - PTRN : TwbSignature = 'PTRN'; { New to Fallout 4 } - QNAM : TwbSignature = 'QNAM'; - QOBJ : TwbSignature = 'QOBJ'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QSTI : TwbSignature = 'QSTI'; { New to Fallout 4 } - QTGL : TwbSignature = 'QTGL'; { New To Skyrim } - QTOP : TwbSignature = 'QTOP'; { New to Fallout 4 } - QUAL : TwbSignature = 'QUAL'; { New To Skyrim } - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RADR : TwbSignature = 'RADR'; { New To Fallout 4 } - RBPC : TwbSignature = 'RBPC'; { New To Fallout 4 } - RCEC : TwbSignature = 'RCEC'; { New To Skyrim } - RCLR : TwbSignature = 'RCLR'; - RCPR : TwbSignature = 'RCPR'; { New to Dawnguard } - RCSR : TwbSignature = 'RCSR'; { New To Skyrim } - RCUN : TwbSignature = 'RCUN'; { New To Skyrim } - RDAT : TwbSignature = 'RDAT'; - RDGS : TwbSignature = 'RDGS'; - RDMO : TwbSignature = 'RDMO'; - RDMP : TwbSignature = 'RDMP'; - RDOT : TwbSignature = 'RDOT'; - RDSA : TwbSignature = 'RDSA'; { New to Skyrim } - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - REGN : TwbSignature = 'REGN'; - RELA : TwbSignature = 'RELA'; - REPL : TwbSignature = 'REPL'; - REPT : TwbSignature = 'REPT'; { New To Fallout 4 } - REVB : TwbSignature = 'REVB'; - RFCT : TwbSignature = 'RFCT'; - RFGP : TwbSignature = 'RFGP'; { New to Fallout 4 } - RGDL : TwbSignature = 'RGDL'; { Unused in Skyrim, but contained in Skyrim.esm } - RLDM : TwbSignature = 'RLDM'; { New to Fallout 4 } - RNAM : TwbSignature = 'RNAM'; - RNMV : TwbSignature = 'RNMV'; { New to Skyrim } - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - RPRF : TwbSignature = 'RPRF'; { New To Skyrim } - RPRM : TwbSignature = 'RPRM'; { New To Skyrim } - RVIS : TwbSignature = 'RVIS'; { New to Fallout 4 } - SADD : TwbSignature = 'SADD'; { New To Fallout 4 } - SAKD : TwbSignature = 'SAKD'; { New To Fallout 4 } - SAPT : TwbSignature = 'SAPT'; { New To Fallout 4 } - SCCO : TwbSignature = 'SCCO'; { New To Fallout 4 } - SCDA : TwbSignature = 'SCDA'; - SCEN : TwbSignature = 'SCEN'; - SCHR : TwbSignature = 'SCHR'; - SCOL : TwbSignature = 'SCOL'; { Unused in Skyrim, but contained in Skyrim.esm } - SCPT : TwbSignature = 'SCPT'; { Unused in Skyrim, but contained in Skyrim.esm } - SCQS : TwbSignature = 'SCQS'; { New To Fallout 4 } - SCRL : TwbSignature = 'SCRL'; - SCRN : TwbSignature = 'SCRN'; - SCRO : TwbSignature = 'SCRO'; - SCSN : TwbSignature = 'SCSN'; { New To Fallout 4 } - SCTX : TwbSignature = 'SCTX'; - SDSC : TwbSignature = 'SDSC'; { New to Skyrim } - SGNM : TwbSignature = 'SGNM'; { New to Fallout 4 } - SHOU : TwbSignature = 'SHOU'; - SHRT : TwbSignature = 'SHRT'; { New to Skyrim } - SKIL : TwbSignature = 'SKIL'; { New to Fallout 4 } - SLCP : TwbSignature = 'SLCP'; - SLGM : TwbSignature = 'SLGM'; - SMBN : TwbSignature = 'SMBN'; - SMEN : TwbSignature = 'SMEN'; - SMQN : TwbSignature = 'SMQN'; - SNAM : TwbSignature = 'SNAM'; - SNCT : TwbSignature = 'SNCT'; - SNDD : TwbSignature = 'SNDD'; - SNDR : TwbSignature = 'SNDR'; - SNMV : TwbSignature = 'SNMV'; { New to Skyrim } - SOFT : TwbSignature = 'SOFT'; { New to Skyrim } - SOPM : TwbSignature = 'SOPM'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPCT : TwbSignature = 'SPCT'; { New to Skyrim } - SPED : TwbSignature = 'SPED'; { New To Skyrim } - SPEL : TwbSignature = 'SPEL'; - SPGD : TwbSignature = 'SPGD'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - SPMV : TwbSignature = 'SPMV'; { New To Skyrim } - SPOR : TwbSignature = 'SPOR'; { New to Skyrim } - SRAC : TwbSignature = 'SRAC'; { New to Fallout 4 } - SRAF : TwbSignature = 'SRAF'; { New to Fallout 4 } - SSPN : TwbSignature = 'SSPN'; { New to Fallout 4 } - STAG : TwbSignature = 'STAG'; { New to Fallout 4 } - STAT : TwbSignature = 'STAT'; - STCP : TwbSignature = 'STCP'; { New to Fallout 4 } - STKD : TwbSignature = 'STKD'; { New to Fallout 4 } - STOL : TwbSignature = 'STOL'; { New to Skyrim } - STOP : TwbSignature = 'STOP'; { New to Fallout 4 } - STSC : TwbSignature = 'STSC'; { New to Fallout 4 } - SWMV : TwbSignature = 'SWMV'; { New to Skyrim } - TACT : TwbSignature = 'TACT'; - TCLT : TwbSignature = 'TCLT'; - TERM : TwbSignature = 'TERM'; { New to Fallout 4 } - TES4 : TwbSignature = 'TES4'; - TETI : TwbSignature = 'TETI'; { New to Fallout 4 } - TEND : TwbSignature = 'TEND'; { New to Fallout 4 } - TIAS : TwbSignature = 'TIAS'; { New to Skyrim } - TIFC : TwbSignature = 'TIFC'; { New To Skyrim } - TINC : TwbSignature = 'TINC'; { New to Skyrim } - TIND : TwbSignature = 'TIND'; { New to Skyrim } - TINI : TwbSignature = 'TINI'; { New to Skyrim } - TINL : TwbSignature = 'TINL'; { New to Skyrim } - TINP : TwbSignature = 'TINP'; { New to Skyrim } - TINT : TwbSignature = 'TINT'; { New to Skyrim } - TINV : TwbSignature = 'TINV'; { New to Skyrim } - TIQS : TwbSignature = 'TIQS'; { New to Fallout 4 } - TIRS : TwbSignature = 'TIRS'; { New to Skyrim } - TLOD : TwbSignature = 'TLOD'; { New to Fallout 4 } - TNAM : TwbSignature = 'TNAM'; - TOFT : TwbSignature = 'TOFT'; { New to Fallout 4 } - TPIC : TwbSignature = 'TPIC'; - TPLT : TwbSignature = 'TPLT'; - TPTA : TwbSignature = 'TPTA'; { New To Fallout 4 } - TRDA : TwbSignature = 'TRDA'; { New To Fallout 4 } - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - TRNS : TwbSignature = 'TRNS'; { New To Fallout 4 } - TSCE : TwbSignature = 'TSCE'; { New To Fallout 4 } - TTEB : TwbSignature = 'TTEB'; { New To Fallout 4 } - TTEC : TwbSignature = 'TTEC'; { New To Fallout 4 } - TTED : TwbSignature = 'TTED'; { New To Fallout 4 } - TTEF : TwbSignature = 'TTEF'; { New To Fallout 4 } - TTET : TwbSignature = 'TTET'; { New To Fallout 4 } - TTGE : TwbSignature = 'TTGE'; { New To Fallout 4 } - TTGP : TwbSignature = 'TTGP'; { New To Fallout 4 } - TVDT : TwbSignature = 'TVDT'; { New To Skyrim } - TWAT : TwbSignature = 'TWAT'; { New To Skyrim } - TX00 : TwbSignature = 'TX00'; - TX01 : TwbSignature = 'TX01'; - TX02 : TwbSignature = 'TX02'; - TX03 : TwbSignature = 'TX03'; - TX04 : TwbSignature = 'TX04'; - TX05 : TwbSignature = 'TX05'; - TX06 : TwbSignature = 'TX06'; { New To Skyrim } - TX07 : TwbSignature = 'TX07'; { New To Skyrim } - TXST : TwbSignature = 'TXST'; - UNAM : TwbSignature = 'UNAM'; - UNES : TwbSignature = 'UNES'; { New To Skyrim } - UNWP : TwbSignature = 'UNWP'; { New To Fallout 4 } - VATS : TwbSignature = 'VATS'; - VCLR : TwbSignature = 'VCLR'; - VENC : TwbSignature = 'VENC'; { New To Skyrim } - VEND : TwbSignature = 'VEND'; { New To Skyrim } - VENV : TwbSignature = 'VENV'; { New To Skyrim } - VHGT : TwbSignature = 'VHGT'; - VISI : TwbSignature = 'VISI'; { New To Fallout 4 } - VMAD : TwbSignature = 'VMAD'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VTCK : TwbSignature = 'VTCK'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - VTYP : TwbSignature = 'VTYP'; - WAIT : TwbSignature = 'WAIT'; { New To Skyrim } - WAMD : TwbSignature = 'WAMD'; { New To Fallout 4 } - WATR : TwbSignature = 'WATR'; - WBDT : TwbSignature = 'WBDT'; { New to Skyrim } - WCTR : TwbSignature = 'WCTR'; { New To Skyrim } - WEAP : TwbSignature = 'WEAP'; - WGDR : TwbSignature = 'WGDR'; { New To Fallout 4 } - WKMV : TwbSignature = 'WKMV'; { New to Skyrim } - WLEV : TwbSignature = 'WLEV'; { New To Fallout 4 } - WLST : TwbSignature = 'WLST'; - WMAP : TwbSignature = 'WMAP'; { New To Fallout 4 } - WNAM : TwbSignature = 'WNAM'; - WOOP : TwbSignature = 'WOOP'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - WZMD : TwbSignature = 'WZMD'; { New To Fallout 4 } - XACT : TwbSignature = 'XACT'; - XALP : TwbSignature = 'XALP'; { New To Skyrim } - XAMC : TwbSignature = 'XAMC'; { New To Fallout 4 } - XAPD : TwbSignature = 'XAPD'; - XAPR : TwbSignature = 'XAPR'; - XASP : TwbSignature = 'XASP'; { New To Fallout 4 } - XATP : TwbSignature = 'XATP'; { New To Fallout 4 } - XATR : TwbSignature = 'XATR'; { New To Dawnguard } - XBSD : TwbSignature = 'XBSD'; { New To Fallout 4 } - XCAS : TwbSignature = 'XCAS'; - XCCM : TwbSignature = 'XCCM'; - XCHG : TwbSignature = 'XCHG'; - XCIM : TwbSignature = 'XCIM'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLP : TwbSignature = 'XCLP'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMO : TwbSignature = 'XCMO'; - XCNT : TwbSignature = 'XCNT'; - XCRI : TwbSignature = 'XCRI'; { New To Fallout 4 } - XCVL : TwbSignature = 'XCVL'; { New To Skyrim } - XCVR : TwbSignature = 'XCVR'; { New To Fallout 4 } - XCWT : TwbSignature = 'XCWT'; - XCZA : TwbSignature = 'XCZA'; { New To Skyrim } - XCZC : TwbSignature = 'XCZC'; { New To Skyrim } - XCZR : TwbSignature = 'XCZR'; { New To Skyrim } - XDCR : TwbSignature = 'XDCR'; - XEMI : TwbSignature = 'XEMI'; - XESP : TwbSignature = 'XESP'; - XEZN : TwbSignature = 'XEZN'; - XFVC : TwbSignature = 'XFVC'; { New To Skyrim } - XGDR : TwbSignature = 'XGDR'; { New To Fallout 4 } - XGLB : TwbSignature = 'XGLB'; - XHLP : TwbSignature = 'XHLP'; - XHLT : TwbSignature = 'XHLT'; { New To Fallout 4 } - XHOR : TwbSignature = 'XHOR'; { New To Skyrim } - XHTW : TwbSignature = 'XHTW'; { New To Skyrim } - XIBS : TwbSignature = 'XIBS'; - XILL : TwbSignature = 'XILL'; { New To Skyrim } - XILW : TwbSignature = 'XILW'; { New To Fallout 4 } - XIS2 : TwbSignature = 'XIS2'; { New To Skyrim } - XLCM : TwbSignature = 'XLCM'; - XLCN : TwbSignature = 'XLCN'; { New To Skyrim } - XLIB : TwbSignature = 'XLIB'; { New To Skyrim } - XLIG : TwbSignature = 'XLIG'; { New To Skyrim } - XLKR : TwbSignature = 'XLKR'; - XLKT : TwbSignature = 'XLKT'; { New To Fallout 4 } - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XLRL : TwbSignature = 'XLRL'; { New To Skyrim } - XLRM : TwbSignature = 'XLRM'; - XLRT : TwbSignature = 'XLRT'; { New To Skyrim } - XLTW : TwbSignature = 'XLTW'; - XLYR : TwbSignature = 'XLYR'; { New To Fallout 4 } - XMBO : TwbSignature = 'XMBO'; - XMBP : TwbSignature = 'XMBP'; - XMBR : TwbSignature = 'XMBR'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XMSP : TwbSignature = 'XMSP'; { New To Fallout 4 } - XNAM : TwbSignature = 'XNAM'; - XNDP : TwbSignature = 'XNDP'; - XOCP : TwbSignature = 'XOCP'; - XORD : TwbSignature = 'XORD'; - XOWN : TwbSignature = 'XOWN'; - XPDD : TwbSignature = 'XPDD'; { New To Fallout 4 } - XPLK : TwbSignature = 'XPLK'; { New To Fallout 4 } - XPOD : TwbSignature = 'XPOD'; - XPPA : TwbSignature = 'XPPA'; - XPRD : TwbSignature = 'XPRD'; - XPRI : TwbSignature = 'XPRI'; { New To Fallout 4 } - XPRM : TwbSignature = 'XPRM'; - XPTL : TwbSignature = 'XPTL'; - XPWR : TwbSignature = 'XPWR'; - XRDO : TwbSignature = 'XRDO'; { New To Fallout 4 } - XRDS : TwbSignature = 'XRDS'; - XRFG : TwbSignature = 'XRFG'; { New To Fallout 4 } - XRGB : TwbSignature = 'XRGB'; - XRGD : TwbSignature = 'XRGD'; - XRMR : TwbSignature = 'XRMR'; - XRNK : TwbSignature = 'XRNK'; - XSCL : TwbSignature = 'XSCL'; - XSPC : TwbSignature = 'XSPC'; { New To Skyrim } - XTEL : TwbSignature = 'XTEL'; - XTNM : TwbSignature = 'XTNM'; { New To Skyrim } - XTRI : TwbSignature = 'XTRI'; - XWCN : TwbSignature = 'XWCN'; { New To Skyrim } - XWCS : TwbSignature = 'XWCS'; { New To Skyrim } - XWCU : TwbSignature = 'XWCU'; { New To Skyrim } - XWEM : TwbSignature = 'XWEM'; { New To Skyrim } - XWPG : TwbSignature = 'XWPG'; { New To Fallout 4 } - XWPN : TwbSignature = 'XWPN'; { New To Fallout 4 } - XXXX : TwbSignature = 'XXXX'; - YNAM : TwbSignature = 'YNAM'; - ZNAM : TwbSignature = 'ZNAM'; - ZOOM : TwbSignature = 'ZOOM'; { New To Fallout 4 } - - // signatures of reference records - sigReferences : array [0..11] of TwbSignature = ( - 'NULL', 'PLYR', 'ACHR', 'REFR', 'PGRE', 'PHZD', - 'PMIS', 'PARW', 'PBAR', 'PBEA', 'PCON', 'PFLA' - ); - - // signatures of referenceable records (placed by references or constructable) - sigBaseObjects : array [0..43] of TwbSignature = ( - 'NULL', 'ACTI', 'ADDN', 'ALCH', 'AMMO', 'ARMO', - 'ARTO', 'ASPC', 'BNDS', 'BOOK', 'CMPO', 'COBJ', - 'CONT', 'DEBR', 'DOOR', 'EXPL', 'FLST', 'FLOR', - 'FURN', 'HAZD', 'IDLM', 'INGR', 'KEYM', 'LIGH', - 'LVLI', 'LVLN', 'LVSP', 'MISC', 'MSTT', 'NOTE', - 'NPC_', 'OMOD', 'PROJ', 'SCOL', 'SCRL', 'SOUN', - 'SPEL', 'STAT', 'TACT', 'TERM', 'TREE', 'TXST', - 'WATR', 'WEAP' - ); - -var - wbPKDTSpecificFlagsUnused : Boolean; - wbEDID: IwbSubRecordDef; - wbCOED: IwbSubRecordDef; - wbXLCM: IwbSubRecordDef; - wbEITM: IwbSubRecordDef; - wbOBND: IwbSubRecordDef; - wbOBNDReq: IwbSubRecordDef; - wbDEST: IwbSubRecordStructDef; - wbDESTActor: IwbSubRecordStructDef; - wbDODT: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbXRGB: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordStructDef; - wbCNTOs: IwbSubRecordArrayDef; - wbAIDT: IwbSubRecordDef; - wbFULL: IwbSubRecordDef; - wbFULLActor: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbDESC: IwbSubRecordDef; - wbDESCReq: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot: IwbSubRecordDef; - wbPosRot: IwbStructDef; - wbMODC: IwbSubRecordDef; - wbMODF: IwbSubRecordDef; - wbMODL: IwbSubRecordStructDef; - wbMODS: IwbSubRecordDef; - wbMO2S: IwbSubRecordDef; - wbMO3S: IwbSubRecordDef; - wbMO4S: IwbSubRecordDef; - wbMO2F: IwbSubRecordDef; - wbMO3F: IwbSubRecordDef; - wbMO4F: IwbSubRecordDef; - wbMO5F: IwbSubRecordDef; - wbMO2C: IwbSubRecordDef; - wbMO3C: IwbSubRecordDef; - wbMO4C: IwbSubRecordDef; - wbMO5C: IwbSubRecordDef; - wbMODLActor: IwbSubRecordStructDef; - wbMODLReq: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordStructDef; - wbCTDAs: IwbSubRecordArrayDef; - wbCTDAsReq: IwbSubRecordArrayDef; - wbCTDAsCount: IwbSubRecordArrayDef; - wbCTDAsReqCount: IwbSubRecordArrayDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordDef; - wbMICO: IwbSubRecordDef; - wbActorValue: IwbIntegerDef; - wbETYP: IwbSubRecordDef; - wbETYPReq: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEffectsReq: IwbSubRecordArrayDef; - wbFirstPersonFlagsU32: IwbIntegerDef; - wbBOD2: IwbSubRecordDef; - wbScriptEntry: IwbStructDef; - wbScriptFlags: IwbIntegerDef; - wbScriptPropertyObject: IwbUnionDef; - wbScriptPropertyStruct: IwbArrayDef; - wbScriptProperties: IwbArrayDef; - wbScriptFragments: IwbStructDef; - wbScriptFragmentsQuest: IwbStructDef; - wbScriptFragmentsInfo: IwbStructDef; - wbScriptFragmentsPack: IwbStructDef; - wbScriptFragmentsScen: IwbStructDef; - wbPLDT: IwbSubRecordDef; - wbPLVD: IwbSubRecordDef; - wbTargetData: IwbStructDef; - wbAttackData: IwbSubRecordStructDef; - wbLLCT: IwbSubRecordDef; - wbLVLD: IwbSubRecordDef; - wbVMAD: IwbSubRecordDef; - wbVMADFragmentedPERK: IwbSubRecordDef; - wbVMADFragmentedPACK: IwbSubRecordDef; - wbVMADFragmentedQUST: IwbSubRecordDef; - wbVMADFragmentedSCEN: IwbSubRecordDef; - wbVMADFragmentedINFO: IwbSubRecordDef; - wbCOCT: IwbSubRecordDef; - wbKSIZ: IwbSubRecordDef; - wbKWDAs: IwbSubRecordDef; - wbReqKWDAs: IwbSubRecordDef; - wbKeywords: IwbSubRecordStructDef; - wbCNAM: IwbSubRecordDef; - wbCITC: IwbSubRecordDef; - wbMGEFData: IwbSubRecordStructDef; - wbMGEFType: IwbIntegerDef; - wbMDOB: IwbSubRecordDef; - wbSPIT: IwbSubRecordDef; - wbDMDC: IwbSubRecordDef; - wbDMDS: IwbSubRecordDef; - wbMO5S: IwbSubRecordDef; - wbSPCT: IwbSubRecordDef; - wbMODT: IwbSubRecordDef; - wbDMDT: IwbSubRecordDef; - wbXOWN: IwbSubRecordDef; - wbXRNK: IwbSubRecordDef; - wbPhonemeTargets: IwbSubRecordDef; - wbPHWT: IwbSubRecordStructDef; - wbHeadPart: IwbSubRecordStructDef; - wbQUSTAliasFlags: IwbSubRecordDef; - wbPDTO: IwbSubRecordDef; - wbPDTOs: IwbSubRecordArrayDef; - wbUNAMs: IwbSubRecordArrayDef; - wbNull: IwbValueDef; - wbTimeInterpolator: IwbStructDef; - wbColorInterpolator: IwbStructDef; - wbYNAM: IwbSubRecordDef; - wbZNAM: IwbSubRecordDef; - wbSPED: IwbSubRecordDef; - wbCUSD: IwbSubRecordDef; - wbINRD: IwbSubRecordDef; - wbPTRN: IwbSubRecordDef; - wbNTRM: IwbSubRecordDef; - wbPRPS: IwbSubRecordDef; - wbFLTR: IwbSubRecordDef; - wbAPPR: IwbSubRecordDef; - wbObjectTemplate: IwbSubRecordStructDef; - wbBSMPSequence: IwbSubRecordArrayDef; - wbFTYP: IwbSubRecordDef; - wbATTX: IwbSubRecordDef; - wbMNAMFurnitureMarker: IwbSubRecordDef; - wbSNAMMarkerParams: IwbSubRecordDef; - wbOBTSReq: IwbSubRecordDef; - //wbTintTemplateGroups: IwbSubrecordArrayDef; - //wbMorphGroups: IwbSubrecordArrayDef; - //wbRaceFRMI: IwbSubrecordArrayDef; - wbRaceRBPC: IwbSubRecordDef; - wbNVNM: IwbSubRecordDef; - wbMaxHeightDataCELL: IwbSubRecordDef; - wbMaxHeightDataWRLD: IwbSubRecordDef; - wbOFST: IwbSubRecordDef; - -function Sig2Int(aSignature: TwbSignature): Cardinal; inline; -begin - Result := PCardinal(@aSignature)^; -end; - -function wbEPFDActorValueToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsCardinal := aInt; - AsFloat := PSingle(@AsCardinal)^; - aInt := Round(AsFloat); - case aType of - ctToStr: Result := wbActorValueEnum.ToString(aInt, aElement); - ctToSortKey: Result := wbActorValueEnum.ToSortKey(aInt, aElement); - ctCheck: Result := wbActorValueEnum.Check(aInt, aElement); - ctToEditValue: Result := wbActorValueEnum.ToEditValue(aInt, aElement); - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := wbActorValueEnum.EditInfo[aInt, aElement]; - end; -end; - -function wbEPFDActorValueToInt(const aString: string; const aElement: IwbElement): Int64; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsFloat := wbActorValueEnum.FromEditValue(aString, aElement); - PSingle(@AsCardinal)^ := AsFloat; - Result := AsCardinal; -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - // get winning quest override except for partial forms - if MainRecord.WinningOverride.Flags._Flags and $00004000 = 0 then - MainRecord := MainRecord.WinningOverride - else if MainRecord.Flags._Flags and $00004000 <> 0 then - MainRecord := MainRecord.MasterOrSelf; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX\Stage Index']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbPerkDATAQuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Quest']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - // get winning quest override except for partial forms - if MainRecord.WinningOverride.Flags._Flags and $00004000 = 0 then - MainRecord := MainRecord.WinningOverride - else if MainRecord.Flags._Flags and $00004000 <> 0 then - MainRecord := MainRecord.MasterOrSelf; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX\Stage Index']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -function wbREFRNavmeshTriangleToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Navmesh : IwbElement; - MainRecord : IwbMainRecord; - Triangles : IwbContainerElementRef; -begin - case aType of - ctToStr: Result := IntToStr(aInt); - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Navmesh := Container.Elements[0]; - - if not Assigned(Navmesh) then - Exit; - - if not Supports(Navmesh.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> NAVM then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if Supports(MainRecord.ElementByPath['NVNM\Triangles'], IwbContainerElementRef, Triangles) and (aType = ctCheck) then - if aInt >= Triangles.ElementCount then - Result := ''; -end; - -function wbStringToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToIntDef(aString, 0); -end; - -{ Alias to string conversion, requires quest reference or quest record specific to record that references alias } -function wbAliasToStr(aInt: Int64; const aQuestRef: IwbElement; aType: TwbCallbackType): string; -var - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Aliases : IwbContainerElementRef; - Alias : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: if aInt = -1 then - Result := 'None' - else if aInt = -2 then - Result := 'Player' - else - Result := IntToStr(aInt) + ' '; - ctToEditValue: if aInt = -1 then Result := 'None' else - Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: if (aInt = -1) or (aInt = -2) then Result := '' else - Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if ((aInt = -1) or (aInt = -2)) and (aType <> ctEditType) and (aType <> ctEditInfo) then - Exit; - - if not Assigned(aQuestRef) then - Exit; - - // aQuestRef can be a QUST record or reference to QUST record - if not Supports(aQuestRef, IwbMainRecord, MainRecord) then - if not Supports(aQuestRef.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - // get winning quest override except for partial forms - if MainRecord.WinningOverride.Flags._Flags and $00004000 = 0 then - MainRecord := MainRecord.WinningOverride - else if MainRecord.Flags._Flags and $00004000 <> 0 then - MainRecord := MainRecord.MasterOrSelf; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: begin - EditInfos := TStringList.Create; - end; - else - EditInfos := nil; - end; - - try - if Supports(MainRecord.ElementByName['Aliases'], IwbContainerElementRef, Aliases) then begin - for i := 0 to Pred(Aliases.ElementCount) do - if Supports(Aliases.Elements[i], IwbContainerElementRef, Alias) then begin - // skip alias collection - if Assigned(Alias.ElementBySignature['ALCS']) then - Continue; - j := Alias.Elements[0].NativeValue; - s := Alias.ElementEditValues['ALID']; - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.Add(t) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Add('None'); - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbStrToAlias(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - Result := -1; - - if aString = 'None' then - Exit - else if aString = 'Player' then begin - Result := -2; - Exit; - end; - - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['-', '0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToIntDef(s, -1); -end; - -function wbScriptObjectAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementByName['FormID'], aType); -end; - -function wbPackageLocationAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementBySignature['QNAM'], aType); -end; - -function wbQuestAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container, aType); -end; - -function wbQuestExternalAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := aElement.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementBySignature['ALEQ'] , aType); -end; - -function wbConditionAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; - MainRecord : IwbMainRecord; - GroupRecord : IwbGroupRecord; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - if not Supports(Container, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.Signature = QUST then - Result := wbAliasToStr(aInt, Container, aType) - else if MainRecord.Signature = SCEN then - Result := wbAliasToStr(aInt, Container.ElementBySignature['PNAM'], aType) - else if MainRecord.Signature = PACK then - Result := wbAliasToStr(aInt, Container.ElementBySignature['QNAM'], aType) - else if MainRecord.Signature = INFO then begin - // get DIAL for INFO - if Supports(MainRecord.Container, IwbGroupRecord, GroupRecord) then - if Supports(GroupRecord.ChildrenOf, IwbMainRecord, MainRecord) then - Result := wbAliasToStr(aInt, MainRecord.ElementBySignature['QNAM'], aType); - end else - // this should never be called since aliases in conditions can be in the forms above only - // but just in case - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; -end; - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ) - else - Result := ''; -end; - - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaTypeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Use aliases', - {0x04} 'Use global', - {0x08} 'Use packdata', - {0x10} 'Swap Subject and Target' - ]); -{ - Compare operator (upper 3 bits) - LGE - 000 0=Equal to - 001 1=Not equal to - 010 2=Greater than - 011 3=Greater than or equal to - 100 4=Less than - 101 5=Less than or equal to - - Flags (lower 5 bits) - 0x01=OR (default is to AND conditions together) - 0x02=Parameters (use aliases) : Force function parameters to use quest alias data (exclusive with "use pack data") - 0x04=Use global - 0x08=Use Pack Data : Force function parameters to use pack data (exclusive with "use aliases") - 0x10=Swap Subject and Target -} - case aType of - ctEditType: - Result := 'CheckComboBox'; - ctEditInfo: - Result := 'Equal,Greater,Lesser,Or,"Use Aliases","Use Global","Use Packdata","Swap Subject and Target"'; - ctToEditValue: begin - Result := '00000000'; - case aInt and $E0 of - $00 : Result[1] := '1'; - $40 : Result[2] := '1'; - $60 : begin - Result[1] := '1'; - Result[2] := '1'; - end; - $80 : Result[3] := '1'; - $A0 : begin - Result[1] := '1'; - Result[3] := '1'; - end; - end; - if (aInt and $01) <> 0 then // Or - Result[4] := '1'; - if (aInt and $02) <> 0 then // Use aliases - Result[5] := '1'; - if (aInt and $04) <> 0 then // Use global - Result[6] := '1'; - if (aInt and $08) <> 0 then // Use packdata - Result[7] := '1'; - if (aInt and $10) <> 0 then // Swap Subject and Target - Result[8] := '1'; - end; - ctToStr: begin - case aInt and $E0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - s := wbCtdaTypeFlags.ToString(aInt and $1F, aElement); - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $E0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - s := wbCtdaTypeFlags.Check(aInt and $1F, aElement); - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbCtdaTypeToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; -begin - s := aString + '00000000'; - if s[1] = '1' then begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $00; - end else begin - Result := $60; - end; - end else begin - if s[3] = '1' then begin - Result := $A0; - end else begin - Result := $00; - end; - end; - end else begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $20; - end else begin - Result := $40; - end; - end else begin - if s[3] = '1' then begin - Result := $80; - end else begin - Result := $20; - end; - end; - end; - // Or - if s[4] = '1' then - Result := Result or $01; - // Use aliases - if s[5] = '1' then - Result := Result or $02; - // Use global - if s[6] = '1' then - Result := Result or $04; - // Use packdata - if s[7] = '1' then - Result := Result or $08; - // Swap Subject and Target - if s[8] = '1' then - Result := Result or $10; -end; - -var - wbEventFunctionAndMemberEditInfo: string; - -function wbEventFunctionAndMemberToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - EventFunction, EventMember: Integer; - i, j: Integer; - s1, s2: string; - slMember: TStringList; -begin - Result := ''; - EventFunction := aInt and $FFFF; - EventMember := aInt shr 16; - case aType of - ctToStr, ctToEditValue: begin - Result := wbEventFunctionEnum.ToEditValue(EventFunction, nil); - Result := Result + ':' + wbEventMemberEnum.ToEditValue(EventMember, nil); - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - s1 := wbEventFunctionEnum.Check(EventFunction, nil); - if s1 <> '' then - s1 := 'EventFunction' + s1; - s2 := wbEventMemberEnum.Check(EventMember, nil); - if s2 <> '' then - s2 := 'EventMember' + s2; - if (s1 <> '') or (s2 <> '') then - Result := s1 + ':' + s2; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbEventFunctionAndMemberEditInfo; - if Result = '' then try - slMember := TStringList.Create; - slMember.CommaText := wbEventMemberEnum.EditInfo[0, nil]; - with TStringList.Create do try - for i := 0 to Pred(wbEventFunctionEnum.NameCount) do - for j := 0 to Pred(slMember.Count) do - Add(wbEventFunctionEnum.Names[i] + ':' + slMember[j]); - Sort; - Result := CommaText; - finally - Free; - end; - wbEventFunctionAndMemberEditInfo := Result; - finally - FreeAndNil(slMember); - end - end; - end; -end; - -function wbEventFunctionAndMemberToInt(const aString: string; const aElement: IwbElement): Int64; -var - EventFunction, EventMember, i: Integer; -begin - i := Pos(':', aString); - if i > 0 then begin - EventFunction := wbEventFunctionEnum.FromEditValue(Copy(aString, 1, i-1), nil); - EventMember := wbEventMemberEnum.FromEditValue(Copy(aString, i+1, Length(aString)), nil); - end - else begin - EventFunction := 0; - EventMember := 0; - end; - Result := EventMember shl 16 + EventFunction; -end; - -procedure wbMESGDNAMAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : Integer; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := Integer(aOldValue) and 1; - NewValue := Integer(aNewValue) and 1; - if NewValue = OldValue then - Exit; - if NewValue = 1 then - Container.RemoveElement('TNAM') - else - Container.Add('TNAM', True); - end; -end; - -procedure wbGMSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - if (Length(OldValue) < 1) or (Length(OldValue) < 1) or (OldValue[1] <> NewValue[1]) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - end; - end; -end; - -procedure wbFLSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - OldOrdered, NewOrdered : Boolean; - Container : IwbContainerElementRef; -const - OrderedList = 'OrderedList'; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - - if Length(OldValue) > Length(OrderedList) then - Delete(OldValue, 1, Length(OldValue)-Length(OrderedList)); - if Length(NewValue) > Length(OrderedList) then - Delete(NewValue, 1, Length(NewValue)-Length(OrderedList)); - - OldOrdered := SameText(OldValue, OrderedList); - NewOrdered := SameText(NewValue, OrderedList); - - if OldOrdered <> NewOrdered then - Container.RemoveElement('FormIDs'); - end; -end; - -procedure wbCtdaTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - // reset value if "use global" has changed - OldValue := aOldValue and $04; - NewValue := aNewValue and $04; - if OldValue <> NewValue then - Container.ElementNativeValues['..\Comparison Value'] := 0; - - {>>> "run on target", no such flag in Skyrim <<<} -// if aNewValue and $02 then begin -// Container.ElementNativeValues['..\Run On'] := 1; -// if Integer(Container.ElementNativeValues['..\Run On']) = 1 then -// aElement.NativeValue := Byte(aNewValue) and not $02; -// end; -end; - -procedure wbAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - Exit; -end; - -function wbMODTCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Strings: TDynStrings; - i: Integer; -begin - Result := ''; - if wbLoaderDone and (aType in [ctToStr, ctToSortKey] ) then begin - Strings := wbContainerHandler.ResolveHash(aInt); - for i := Low(Strings) to High(Strings) do - Result := Result + Strings[i] + ', '; - SetLength(Result, Length(Result) -2 ); - end; -end; - -{>>> Needs revision for Skyrim <<<} -//function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -//begin -// Result := ''; -// case aType of -// ctToStr: begin -// case aInt and not $C0 of -// 0: Result := 'Idle'; -// 1: Result := 'Movement'; -// 2: Result := 'Left Arm'; -// 3: Result := 'Left Hand'; -// 4: Result := 'Weapon'; -// 5: Result := 'Weapon Up'; -// 6: Result := 'Weapon Down'; -// 7: Result := 'Special Idle'; -// 20: Result := 'Whole Body'; -// 21: Result := 'Upper Body'; -// else -// Result := ''; -// end; -// -// if (aInt and $80) = 0 then -// Result := Result + ', Must return a file'; -// if (aInt and $40) = 1 then -// Result := Result + ', Unknown Flag'; -// end; -// ctToSortKey: begin -// Result := IntToHex64(aInt, 2); -// end; -// ctCheck: begin -// case aInt and not $C0 of -// 0..7, 20, 21: Result := ''; -// else -// Result := ''; -// end; -// end; -// end; -//end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbCloudSpeedToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF((aInt - 127)/127/10, ffFixed, 99, 4); - ctCheck: Result := ''; - end; -end; - -function wbCloudSpeedToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f*10*127 + 127; - Result := Min(Round(f), 254); -end; - -function wbShortXYtoStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - x, y: SmallInt; -begin - y := aInt and $FFFF; - x := aInt shr 16 and $FFFF; - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := Format('%d, %d', [x, y]); - ctCheck: Result := ''; - end; -end; - -function wbStrToShortXY(const aString: string; const aElement: IwbElement): Int64; -var - x, y: SmallInt; - Value: Cardinal; -begin - y := StrToIntDef(Copy(aString, 1, Pred(Pos(', ', aString))), 0); - x := StrToIntDef(Copy(aString, Pos(', ', aString) + 2, Length(aString)), 0); - PWord(@Value)^ := x; - PWord(Cardinal(@Value) + SizeOf(SmallInt))^ := y; - Result := Value; -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; - Cell: IwbMainRecord; - Position: TwbVector; - Grid: TwbGridCell; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - - // grid position of persistent reference in exterior persistent cell (interior cells are not persistent) - if Supports(aMainRecord.Container, IwbGroupRecord, Container) then - Cell := IwbGroupRecord(Container).ChildrenOf; - if Assigned(Cell) and Cell.IsPersistent and (Cell.Signature = 'CELL') then - if aMainRecord.GetPosition(Position) then begin - Grid := wbPositionToGridCell(Position); - Result := Result + ' at ' + IntToStr(Grid.x) + ',' + IntToStr(Grid.y); - end; - - // in precombined mesh - if aMainRecord.HasPrecombinedMesh then - Result := Result + ' in ' + aMainRecord.PrecombinedMesh; - end; - end; -end; - -function wbINFOAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := Trim(aMainRecord.ElementValues['Responses\Response\NAM1']); - if Result <> '' then - Result := '''' + Result + ''''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; - - s := Trim(aMainRecord.ElementValues['QNAM']); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'for ' + s; - end; -end; - -function wbNAVMAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := ''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; -end; - -//function wbNAVMAddInfo(const aMainRecord: IwbMainRecord): string; -//var -// Rec : IwbRecord; -// Element : IwbElement; -// s : string; -//begin -// Result := ''; -// -// Rec := aMainRecord.RecordBySignature['DATA']; -// if Assigned(Rec) then begin -// Element := Rec.ElementByName['Cell']; -// if Assigned(Element) then -// Element := Element.LinksTo; -// if Assigned(Element) then -// s := Trim(Element.Name); -// if s <> '' then -// Result := 'for ' + s; -// end; -//end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - if not aMainRecord.IsPersistent then begin - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -procedure wbCTDARunOnAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - if aOldValue <> aNewValue then - if aNewValue <> 2 then - aElement.Container.ElementNativeValues['Reference'] := 0; -end; - -{>>> Needs revision for Skyrim <<<} -procedure wbPERKPRKETypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -// rDATA : IwbRecord; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - if Supports(Container.Container, IwbContainerElementRef, Container) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - Container.RemoveElement('Perk Conditions'); - Container.RemoveElement('Entry Point Function Parameters'); - if aNewValue = 2 then begin - Container.Add('EPFT', True); - Container.ElementNativeValues['DATA\Entry Point\Function'] := 2; - end; - end; - end; -end; - -function wbNPCLevelDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - i := Container.ElementByName['Flags'].NativeValue; - if i and $00000080 <> 0 then - Result := 1; -end; - -function wbMGEFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Archtype : Variant; - DataContainer : IwbDataContainer; - Element : IwbElement; -const - OffsetArchtype = 56; - -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - VarClear(ArchType); - Element := Container.ElementByName['Archetype']; - if Assigned(Element) then - ArchType := Element.NativeValue - else if Supports(Container, IwbDataContainer, DataContainer) and - DataContainer.IsValidOffset(aBasePtr, aEndPtr, OffsetArchtype) then begin // we are part a proper structure - aBasePtr := Pointer(Cardinal(aBasePtr) + OffsetArchtype); - ArchType := PCardinal(aBasePtr)^; - end; - - if not VarIsEmpty(ArchType) then - case Integer(ArchType) of - 12: Result := 1; // Light - 17: Result := 2; // Bound Item - 18: Result := 3; // Summon Creature - 25: Result := 4; // Guide - 34: Result := 8; // Peak Mod - 35: Result := 5; // Cloak - 36: Result := 6; // Werewolf - 39: Result := 7; // Enhance Weapon - 40: Result := 4; // Spawn Hazard - 46: Result := 6; // Vampire Lord - end; -end; - -procedure wbMGEFAssocItemAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0) then begin - Element := Container.ElementByName['Archetype']; - if Assigned(Element) and (Element.NativeValue = 0) then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - // I assume this will alo protect Second AV Weight (The two actor values are after ArchType) - end; -end; - -procedure wbMGEFAV2WeightAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0.0) then begin - Element := Container.ElementByName['Archetype']; - if Assigned(Element) and (Element.NativeValue = 0) then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - end; -end; - -procedure wbMGEFArchtypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if (aNewValue < $FF) and (aOldValue < $FF) then begin - Container.ElementNativeValues['..\Assoc. Item'] := 0; - case Integer(aNewValue) of - 06: Container.ElementNativeValues['..\Actor Value'] := 00;//Agression - 07: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 08: Container.ElementNativeValues['..\Actor Value'] := 00;//Agression - 11: Container.ElementNativeValues['..\Actor Value'] := 54;//Invisibility - 21: Container.ElementNativeValues['..\Actor Value'] := 53;//Paralysis - 24: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 38: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 42: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - else - Container.ElementNativeValues['..\Actor Value'] := -1; - end; - Container.ElementNativeValues['..\Second Actor Value'] := -1; - Container.ElementNativeValues['..\Second AV Weight'] := 0.0; - end; -end; - -function wbCTDAReferenceDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementNativeValues['Run On']) = 2 then - Result := 1; -end; - -function wbNAVIIslandDataDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbMainRecord; - Element : IwbElement; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etSubRecord) do - Container := Container.Container; - - if not Supports(Container, IwbSubRecord, SubRecord) then - Exit; - - Element := SubRecord.ElementByName['Is Island']; - if not Assigned(Element) then - Exit; - - Result := Element.NativeValue; -end; - -function wbNAVIParentDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbMainRecord; - Element : IwbElement; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etsubRecord) do - Container := Container.Container; - - if not Supports(Container, IwbSubRecord, SubRecord) then - Exit; - - Element := SubRecord.ElementByName['Parent Worldspace']; - if not Assigned(Element) then - Exit; - - if (Element.NativeValue = 0) then - Result := 1; -end; - -function wbNVNMParentDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Parent : IwbElement; - i : integer; -begin // Could be simplified by checking if Parent Worldspace is NULL, that's what the runtime does :) - Result := 0; - - Container := aElement.Container; - - Parent := Container.ElementByName['Parent Worldspace']; - - if not Assigned(Parent) then - Exit; - - i := Parent.NativeValue; - - // is interior cell? - if i = 0 then - Result := 1; -end; - -function wbDoorTriangleDoorTriangleDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Parent : IwbElement; - i : int64; -begin - Result := 0; - - Container := aElement.Container; - - Parent := Container.ElementByName['DTUnknown']; - - if not Assigned(Parent) then - Exit; - - i := Parent.NativeValue; - - // not sure if it would be an error in the file or if it really possible - if i <> 0 then - Result := 1; -end; - -function wbSubrecordSizeDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - - if Supports(aElement, IwbSubRecord, SubRecord) then - if SubRecord.DataSize > 0 then - Result := 1; -end; - -function wbCOEDOwnerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - LinksTo : IwbElement; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - LinksTo := Container.ElementByName['Owner'].LinksTo; - - if Supports(LinksTo, IwbMainRecord, MainRecord) then - if MainRecord.Signature = 'NPC_' then - Result := 1 - else if MainRecord.Signature = 'FACT' then - Result := 2; -end; - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; {String} {>>> Localization Strings <<<} - 'i': Result := 1; {intS32} - 'f': Result := 2; {Float} - 'b': Result := 3; {Boolean} - end; - end; -end; - -function wbFLSTLNAMIsSorted(const aContainer: IwbContainer): Boolean; -var - rEDID : IwbRecord; - s : string; -const - OrderedList = 'OrderedList'; -begin - Result := False; {>>> Should not be sorted according to Arthmoor and JustinOther <<<} - rEDID := aContainer.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > Length(OrderedList) then - Delete(s, 1, Length(s)-Length(OrderedList)); - if SameText(s, OrderedList) then - Result := False; - end; -end; - -function wbPerkDATADecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rPRKE: IwbRecord; - eType: IwbElement; -begin - Result := 0; - rPRKE := aElement.Container.RecordBySignature[PRKE]; - if Assigned(rPRKE) then begin - eType := rPRKE.ElementByName['Type']; - if Assigned(eType) then begin - Result := eType.NativeValue; - end; - end; -end; - -function wbEPFDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['EPFT']; - if Result = 2 then - case Integer(Container.ElementNativeValues['..\DATA\Entry Point\Function']) of - 5, 12, 13, 14: Result := 8; - end; -end; - -function wbSceneActionSoundDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - if Container.ElementNativeValues['ANAM'] <> 4 then - Result := 1; -end; - -function wbEFSHFormatDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - MainRecord: IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Version < 102 then - Result := 1; -end; - -function wbDeciderFormVersion99(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := wbFormVerDecider(aBasePtr, aEndPtr, aElement, 99); -end; - -function wbAECHDataDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - rKNAM : IwbElement; - s: string; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Container := Container.Container; - if not Assigned(Container) then Exit; - - rKNAM := Container.ElementBySignature['KNAM']; - if not Assigned(rKNAM) then Exit; - - s := rKNAM.EditValue; - - if s = 'BSOverdrive' then - Result := 0 - else if s = 'BSStateVariableFilter' then - Result := 1 - else if s = 'BSDelayEffect' then - Result := 2; -end; - -function wbCLFMColorDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - rFNAM : IwbElement; - i : Integer; -begin - Result := 0; - - // resolving to a float causes data loss when copying - // since deciding field FNAM comes after a value CNAM - Exit; - - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Container := Container.Container; - if not Assigned(Container) then Exit; - - rFNAM := Container.ElementBySignature['FNAM']; - if not Assigned(rFNAM) then Exit; - - i := rFNAM.NativeValue; - - if i and 2 <> 0 then - Result := 1; -end; - -function wbCLFMColorToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; - rFNAM : IwbElement; - i : Integer; - s : string; -begin - i := 0; - Container := aElement.Container; - if Assigned(Container) then begin - rFNAM := Container.ElementBySignature['FNAM']; - if Assigned(rFNAM) then - i := rFNAM.NativeValue; - end; - - if i and 2 <> 0 then - s := FloatToStrF(PSingle(@aInt)^, ffFixed, 99, wbFloatDigits) - else - s := 'rgba(' + IntToStr(aInt and $FF) + ', ' + - IntToStr(aInt shr 8 and $FF) + ', ' + - IntToStr(aInt shr 16 and $FF) + ', ' + - IntToStr(aInt shr 24 and $FF) + ')'; - - case aType of - ctToStr: Result := s; - ctToSortKey: Result := IntToHex(aInt, 8); - ctToEditValue: Result := s; - end; -end; - -function wbCLFMColorToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; - value: Single; -begin - if SameText(Copy(aString, 1, 5), 'rgba(') then begin - s := Copy(aString, 6, Pos(')', aString) - 6); - with TStringList.Create do try - Delimiter := ','; - StrictDelimiter := True; - DelimitedText := s; - Result := 0; - if Count = 4 then begin - PByte(@Result)[0] := StrToIntDef(Strings[0], 0); - PByte(@Result)[1] := StrToIntDef(Strings[1], 0); - PByte(@Result)[2] := StrToIntDef(Strings[2], 0); - PByte(@Result)[3] := StrToIntDef(Strings[3], 0); - end; - finally - Free; - end; - end - else begin - try value := StrToFloat(aString) except value := 0.0 end; - Result := PInteger(@value)^; - end; -end; - -function wbNOTEDataDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - rDNAM : IwbElement; - i : Integer; -begin - Result := 0; - - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Container := Container.Container; - if not Assigned(Container) then Exit; - - rDNAM := Container.ElementBySignature['DNAM']; - if not Assigned(rDNAM) then Exit; - - i := rDNAM.NativeValue; - - case i of - 0: Result := 1; - 1: Result := 2; - 3: Result := 3; - end; -end; - -function wbSNDRDataDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - rCNAM : IwbElement; -begin - Result := 0; - - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Container := Container.Container; - if not Assigned(Container) then Exit; - - rCNAM := Container.ElementBySignature['CNAM']; - if not Assigned(rCNAM) then Exit; - - if rCNAM.EditValue = 'AutoWeapon' then - Result := 1; -end; - - -{>>> For VMAD <<<} -function wbScriptObjFormatDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ObjFormat: Integer; - Container: IwbContainer; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etSubRecord) do - Container := Container.Container; - - if not Assigned(Container) then Exit; - - ObjFormat := Container.ElementNativeValues['Object Format']; - - if ObjFormat = 1 then - Result := 1; -end; - -{>>> For VMAD <<<} -function wbScriptPropertyDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - case Integer(Container.ElementNativeValues['Type']) of - 1: Result := 1; - 2: Result := 2; - 3: Result := 3; - 4: Result := 4; - 5: Result := 5; - 6: Result := 6; - 7: Result := 7; - 11: Result := 8; - 12: Result := 9; - 13: Result := 10; - 14: Result := 11; - 15: Result := 12; - 17: Result := 13; - end; -end; - -function wbScriptPropertyStructMemberDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - case Integer(Container.ElementNativeValues['Type']) of - 1: Result := 1; - 2: Result := 2; - 3: Result := 3; - 4: Result := 4; - 5: Result := 5; - 11: Result := 6; - 12: Result := 7; - 13: Result := 8; - 14: Result := 9; - 15: Result := 10; - end; -end; - -procedure wbScriptPropertyTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then - Container.ElementByName['Value'].SetToDefault; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - if not Assigned(Container) then Exit; - - Supports(Container, IwbMainRecord, MainRecord); - if MainRecord.Signature = PERK then - Result := 1 - else if MainRecord.Signature = TERM then - Result := 1 - else if MainRecord.Signature = INFO then - Result := 2 - else if MainRecord.Signature = PACK then - Result := 3 - else if MainRecord.Signature = QUST then - Result := 4 - else if MainRecord.Signature = SCEN then - Result := 5; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsQuestCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - Result := Cardinal(Container.ElementNativeValues['fragmentCount']); -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsInfoCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 2 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; - for i := 3 to 7 do begin - if (F and 1) = 1 then begin - Inc(Result); - if Assigned(wbProgressCallback) then - wbProgressCallback('==='+aElement.Name+' ['+Container.Name+':'+Container.Path+'] = unknown info VMAD flag bit '+IntToStr(i)); - end; - F := F shr 1; - end; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsSceneCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 2 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; - for i := 3 to 7 do begin - if (F and 1) = 1 then begin - Inc(Result); - if Assigned(wbProgressCallback) then - wbProgressCallback('==='+aElement.Name+' ['+Container.Name+':'+Container.Path+'] = unknown scene VMAD flag bit '+IntToStr(i)); - end; - F := F shr 1; - end; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsPackCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 7 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsEmptyScriptDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Container.ElementEditValues['scriptName'] = '' then - Result := 1; -end; - -function wbBOOKTeachesDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - i := Container.ElementByName['Flags'].NativeValue; - if i and $01 <> 0 then - Result := 1 - else if i and $04 <> 0 then - Result := 2 - else if i and $10 <> 0 then - Result := 3 - else - Result := 0; -end; - -type - TCTDAFunctionParamType = ( - { 0} ptNone, - { 1} ptInteger, - { 2} ptFloat, - { 3} ptActor, // ACHR - { 4} ptActorBase, // NPC_ - { 5} ptActorValue, // Enum: wbActorValue - { 6} ptAdvanceAction, // ?? Enum - { 7} ptAlias, // index into QUST quest aliases - { 8} ptAlignment, // ?? Enum - { 9} ptAssociationType, // ASTP - {10} ptAxis, // ?? Char - {11} ptCastingSource, // ?? Enum - {12} ptCell, // CELL - {13} ptClass, // CLAS - {14} ptCrimeType, // ?? Enum - {15} ptCriticalStage, // ?? Enum - {16} ptEncounterZone, // ECZN - {17} ptEquipType, // ?? Enum - {18} ptEvent, // Struct - {19} ptEventData, // LCTN, KYWD or FLST - {20} ptFaction, // FACT - {21} ptFormList, // FLST - {22} ptFormType, // ?? Enum - {23} ptFurniture, // FURN - {24} ptFurnitureAnim, // enum - {25} ptFurnitureEntry, // flags - {26} ptGlobal, // GLOB - {27} ptIdleForm, // IDLE - {28} ptInventoryObject, // ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, ARMA, LIGH, LVLI, COBJ - {29} ptKeyword, // KYWD - {30} ptLocation, // LCTN - {31} ptMagicEffect, // MGEF - {32} ptMagicItem, // SPEL - {33} ptMiscStat, // ?? Enum - {34} ptObjectReference, // REFR, ACHR - {35} ptOwner, // FACT, NPC_ - {36} ptPackage, // PACK - {37} ptPackdata, // index into PACK package data inputs - {38} ptPerk, // PERK - {39} ptQuest, // QUST - {40} ptQuestStage, // ?? Integer - {41} ptRace, // RACE - {42} ptReferencableObject, - {43} ptRefType, // LCRT - {44} ptRegion, // REGN - {45} ptScene, // SCEN - {46} ptSex, // Enum: Male, Female - {47} ptShout, // SHOU - {48} ptVariableName, // Integer - {49} ptVATSValueFunction, // - {50} ptVATSValueParam, - {51} ptVoiceType, // VTYP - {52} ptWardState, // enum - {53} ptWeather, // WTHR - {54} ptWorldspace, // WRLD - {55} ptDamageType // DMGT - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - ParamType3: TCTDAFunctionParamType; - end; - -const - wbCTDAFunctions : array[0..514] of TCTDAFunction = ( - (Index: 0; Name: 'GetWantBlocking'), - (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), - (Index: 5; Name: 'GetLocked'), - (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), - (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), - (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), - (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), - (Index: 12; Name: 'GetSecondsPassed'), - (Index: 14; Name: 'GetValue'; ParamType1: ptActorValue), - (Index: 18; Name: 'GetCurrentTime'), - (Index: 24; Name: 'GetScale'), - (Index: 25; Name: 'IsMoving'), - (Index: 26; Name: 'IsTurning'), - (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), - (Index: 31; Name: 'GetButtonPressed'), - (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), - (Index: 35; Name: 'GetDisabled'), - (Index: 39; Name: 'GetDisease'), - (Index: 41; Name: 'GetClothingValue'), - (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), - (Index: 43; Name: 'SameRace'; ParamType1: ptActor), - (Index: 44; Name: 'SameSex'; ParamType1: ptActor), - (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), - (Index: 46; Name: 'GetDead'), - (Index: 47; Name: 'GetItemCount'; ParamType1: ptReferencableObject), - (Index: 48; Name: 'GetGold'), - (Index: 49; Name: 'GetSleeping'), - (Index: 50; Name: 'GetTalkedToPC'), - (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), - (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), - (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), - (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), - (Index: 61; Name: 'GetAlarmed'), - (Index: 62; Name: 'IsRaining'), - (Index: 63; Name: 'GetAttacked'), - (Index: 64; Name: 'GetIsCreature'), - (Index: 65; Name: 'GetLockLevel'), - (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), - (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), - (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), - (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), - (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), - (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), - (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), - (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), - (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), - (Index: 75; Name: 'IsSnowing'), - (Index: 77; Name: 'GetRandomPercent'), - (Index: 79; Name: 'WouldBeStealing'; ParamType1: ptObjectReference), - (Index: 80; Name: 'GetLevel'), - (Index: 81; Name: 'IsRotating'), - (Index: 83; Name: 'GetLeveledEncounterValue'; ParamType1: ptInteger), - (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), - (Index: 91; Name: 'GetIsAlerted'), - (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), - (Index: 101; Name: 'IsWeaponMagicOut'), - (Index: 102; Name: 'IsTorchOut'), - (Index: 103; Name: 'IsShieldOut'), - (Index: 105; Name: 'IsActionRef'; ParamType1: ptObjectReference), - (Index: 106; Name: 'IsFacingUp'), - (Index: 107; Name: 'GetKnockedState'), - (Index: 108; Name: 'GetWeaponAnimType'), - (Index: 109; Name: 'IsWeaponSkillType'; ParamType1: ptActorValue), - (Index: 110; Name: 'GetCurrentAIPackage'), - (Index: 111; Name: 'IsWaiting'), - (Index: 112; Name: 'IsIdlePlaying'), - (Index: 116; Name: 'IsIntimidatedbyPlayer'), - (Index: 117; Name: 'IsPlayerInRegion'; ParamType1: ptRegion), - (Index: 118; Name: 'GetActorAggroRadiusViolated'), - (Index: 119; Name: 'GetCrimeKnown'; ParamType1: ptCrimeType; ParamType2: ptActor; ParamType3: ptActor), - (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), - (Index: 123; Name: 'IsGreetingPlayer'), - (Index: 125; Name: 'IsGuard'), - (Index: 127; Name: 'HasBeenEaten'), - (Index: 128; Name: 'GetStaminaPercentage'), - (Index: 129; Name: 'HasBeenRead'), - (Index: 130; Name: 'GetDying'), - (Index: 131; Name: 'GetSceneActionPercent'; ParamType1: ptScene; ParamType2: ptInteger), - (Index: 132; Name: 'WouldRefuseCommand'; ParamType1: ptObjectReference), - (Index: 133; Name: 'SameFactionAsPC'), - (Index: 134; Name: 'SameRaceAsPC'), - (Index: 135; Name: 'SameSexAsPC'), - (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), - (Index: 141; Name: 'IsTalking'), - (Index: 142; Name: 'GetComponentCount'; ParamType1: ptReferencableObject), - (Index: 143; Name: 'GetCurrentAIProcedure'), - (Index: 144; Name: 'GetTrespassWarningLevel'), - (Index: 145; Name: 'IsTrespassing'), - (Index: 146; Name: 'IsInMyOwnedCell'), - (Index: 147; Name: 'GetWindSpeed'), - (Index: 148; Name: 'GetCurrentWeatherPercent'), - (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), - (Index: 150; Name: 'IsContinuingPackagePCNear'), - (Index: 152; Name: 'GetIsCrimeFaction'; ParamType1: ptFaction), - (Index: 153; Name: 'CanHaveFlames'), - (Index: 154; Name: 'HasFlames'), - (Index: 157; Name: 'GetOpenState'), - (Index: 159; Name: 'GetSitting'), - (Index: 160; Name: 'GetFurnitureMarkerID'), - (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), - (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), - (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), - (Index: 167; Name: 'GetFactionReaction'; ParamType1: ptFaction; ParamType2: ptFaction), - (Index: 170; Name: 'GetDayOfWeek'), - (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), - (Index: 175; Name: 'IsPCSleeping'), - (Index: 176; Name: 'IsPCAMurderer'), - (Index: 180; Name: 'HasSameEditorLocationAsRef'; ParamType1: ptObjectReference; ParamType2: ptKeyword), - (Index: 181; Name: 'HasSameEditorLocationAsRefAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), - (Index: 182; Name: 'GetEquipped'; ParamType1: ptReferencableObject), - (Index: 185; Name: 'IsSwimming'), - (Index: 186; Name: 'ScriptEffectElapsedSeconds'), - (Index: 188; Name: 'GetPCSleepHours'), - (Index: 190; Name: 'GetAmountSoldStolen'), - (Index: 192; Name: 'GetIgnoreCrime'), - (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), - (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), - (Index: 197; Name: 'GetPCEnemyofFaction'; ParamType1: ptFaction), - (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), - (Index: 203; Name: 'GetDestroyed'), - (Index: 205; Name: 'GetActionRef'), - (Index: 206; Name: 'GetSelf'), - (Index: 207; Name: 'GetContainer'), - (Index: 208; Name: 'GetForceRun'), - (Index: 210; Name: 'GetForceSneak'), - (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), - (Index: 215; Name: 'GetDefaultOpen'), - (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), - (Index: 224; Name: 'GetVATSMode'), - (Index: 225; Name: 'GetPersuasionNumber'), - (Index: 226; Name: 'GetVampireFeed'), - (Index: 227; Name: 'GetCannibal'), - (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), - (Index: 229; Name: 'GetClassDefaultMatch'), - (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), - (Index: 231; Name: 'GetPlayerDialogueInput'), - (Index: 232; Name: 'GetCombatTarget'), - (Index: 233; Name: 'GetPackageTarget'), - (Index: 235; Name: 'GetVatsTargetHeight'), - (Index: 237; Name: 'GetIsGhost'), - (Index: 242; Name: 'GetUnconscious'), - (Index: 244; Name: 'GetRestrained'), - (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), - (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), - (Index: 248; Name: 'IsScenePlaying'; ParamType1: ptScene), - (Index: 249; Name: 'IsInDialogueWithPlayer'), - (Index: 250; Name: 'GetLocationCleared'; ParamType1: ptLocation), - (Index: 254; Name: 'GetIsPlayableRace'), - (Index: 255; Name: 'GetOffersServicesNow'), - (Index: 256; Name: 'GetGameSetting'; ParamType1: ptNone), - (Index: 258; Name: 'HasAssociationType'; ParamType1: ptActor; ParamType2: ptAssociationType), - (Index: 259; Name: 'HasFamilyRelationship'; ParamType1: ptActor), - (Index: 261; Name: 'HasParentRelationship'; ParamType1: ptActor), - (Index: 262; Name: 'IsWarningAbout'; ParamType1: ptFormList), - (Index: 263; Name: 'IsWeaponOut'), - (Index: 264; Name: 'HasSpell'; ParamType1: ptMagicItem), - (Index: 265; Name: 'IsTimePassing'), - (Index: 266; Name: 'IsPleasant'), - (Index: 267; Name: 'IsCloudy'), - (Index: 274; Name: 'IsSmallBump'), - (Index: 275; Name: 'GetParentRef'), - (Index: 277; Name: 'GetBaseValue'; ParamType1: ptActorValue), - (Index: 278; Name: 'IsOwner'; ParamType1: ptOwner), - (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwner), - (Index: 282; Name: 'IsHorseStolen'), - (Index: 285; Name: 'IsLeftUp'), - (Index: 286; Name: 'IsSneaking'), - (Index: 287; Name: 'IsRunning'), - (Index: 288; Name: 'GetFriendHit'), - (Index: 289; Name: 'IsInCombat'; ParamType1: ptInteger), - (Index: 296; Name: 'IsAnimPlaying'; ParamType1: ptReferencableObject), - (Index: 300; Name: 'IsInInterior'), - (Index: 303; Name: 'IsActorsAIOff'), - (Index: 304; Name: 'IsWaterObject'), - (Index: 305; Name: 'GetPlayerAction'), - (Index: 306; Name: 'IsActorUsingATorch'), - (Index: 309; Name: 'IsXBox'), - (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldspace), - (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptMiscStat), - (Index: 313; Name: 'GetPairedAnimation'), - (Index: 314; Name: 'IsActorAVictim'), - (Index: 315; Name: 'GetTotalPersuasionNumber'), - (Index: 318; Name: 'GetIdleDoneOnce'), - (Index: 320; Name: 'GetNoRumors'), - (Index: 323; Name: 'GetCombatState'), - (Index: 325; Name: 'GetWithinPackageLocation'; ParamType1: ptPackdata), - (Index: 327; Name: 'IsRidingMount'), - (Index: 329; Name: 'IsFleeing'), - (Index: 332; Name: 'IsInDangerousWater'), - (Index: 338; Name: 'GetIgnoreFriendlyHits'), - (Index: 339; Name: 'IsPlayersLastRiddenMount'), - (Index: 344; Name: 'ReleaseWeatherOverride'), - (Index: 348; Name: 'SendTrespassAlarm'; ParamType1: ptActor), - (Index: 353; Name: 'IsActor'), - (Index: 354; Name: 'IsEssential'), - (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), - (Index: 359; Name: 'GetInCurrentLocation'; ParamType1: ptLocation), - (Index: 360; Name: 'GetInCurrentLocationAlias'; ParamType1: ptAlias), - (Index: 361; Name: 'GetTimeDead'), - (Index: 362; Name: 'HasLinkedRef'; ParamType1: ptKeyword), - (Index: 363; Name: 'GetLinkedRef'; ParamType1: ptKeyword), - (Index: 365; Name: 'IsChild'), - (Index: 366; Name: 'GetStolenItemValueNoCrime'; ParamType1: ptFaction), - (Index: 367; Name: 'GetLastPlayerAction'), - (Index: 368; Name: 'IsPlayerActionActive'; ParamType1: ptInteger), - (Index: 370; Name: 'IsTalkingActivatorActor'; ParamType1: ptActor), - (Index: 372; Name: 'IsInList'; ParamType1: ptFormList), - (Index: 373; Name: 'GetStolenItemValue'; ParamType1: ptFaction), - (Index: 375; Name: 'GetCrimeGoldViolent'; ParamType1: ptFaction), - (Index: 376; Name: 'GetCrimeGoldNonviolent'; ParamType1: ptFaction), - (Index: 378; Name: 'IsOwnedBy'; ParamType1: ptActor), - (Index: 380; Name: 'GetCommandDistance'), - (Index: 381; Name: 'GetCommandLocationDistance'), - (Index: 387; Name: 'GetObjectiveFailed'; ParamType1: ptQuest; ParamType2: ptInteger), - (Index: 390; Name: 'GetHitLocation'), - (Index: 391; Name: 'IsPC1stPerson'), - (Index: 396; Name: 'GetCauseofDeath'), - (Index: 397; Name: 'IsLimbGone'; ParamType1: ptInteger), - (Index: 398; Name: 'IsWeaponInList'; ParamType1: ptFormList), - (Index: 402; Name: 'IsBribedbyPlayer'), - (Index: 403; Name: 'GetRelationshipRank'; ParamType1: ptActor), - (Index: 407; Name: 'GetVATSValue'; ParamType1: ptInteger; ParamType2: ptInteger), - (Index: 408; Name: 'IsKiller'; ParamType1: ptActor), - (Index: 409; Name: 'IsKillerObject'; ParamType1: ptFormList), - (Index: 410; Name: 'GetFactionCombatReaction'; ParamType1: ptFaction; ParamType2: ptFaction), - (Index: 414; Name: 'Exists'; ParamType1: ptObjectReference), - (Index: 415; Name: 'GetGroupMemberCount'), - (Index: 416; Name: 'GetGroupTargetCount'), - (Index: 419; Name: 'GetObjectiveCompleted'; ParamType1: ptQuest; ParamType2: ptInteger), - (Index: 420; Name: 'GetObjectiveDisplayed'; ParamType1: ptQuest; ParamType2: ptInteger), - (Index: 425; Name: 'GetIsFormType'), - (Index: 426; Name: 'GetIsVoiceType'; ParamType1: ptVoiceType), - (Index: 427; Name: 'GetPlantedExplosive'), - (Index: 429; Name: 'IsScenePackageRunning'), - (Index: 430; Name: 'GetHealthPercentage'), - (Index: 432; Name: 'GetIsObjectType'; ParamType1: ptFormType), - (Index: 437; Name: 'GetIsCreatureType'; ParamType1: ptInteger), - (Index: 438; Name: 'HasKey'; ParamType1: ptObjectReference), - (Index: 439; Name: 'IsFurnitureEntryType'; ParamType1: ptReferencableObject), - (Index: 444; Name: 'GetInCurrentLocationFormList'; ParamType1: ptFormList), - (Index: 445; Name: 'GetInZone'; ParamType1: ptEncounterZone), - (Index: 446; Name: 'GetVelocity'; ParamType1: ptAxis), - (Index: 447; Name: 'GetGraphVariableFloat'), - (Index: 448; Name: 'HasPerk'; ParamType1: ptPerk), - (Index: 449; Name: 'GetFactionRelation'; ParamType1: ptActor), - (Index: 450; Name: 'IsLastIdlePlayed'; ParamType1: ptIdleForm), - (Index: 453; Name: 'GetPlayerTeammate'), - (Index: 454; Name: 'GetPlayerTeammateCount'), - (Index: 458; Name: 'GetActorCrimePlayerEnemy'), - (Index: 459; Name: 'GetCrimeGold'; ParamType1: ptFaction), - (Index: 462; Name: 'GetPlayerGrabbedRef'), - (Index: 463; Name: 'IsPlayerGrabbedRef'; ParamType1: ptObjectReference), - (Index: 465; Name: 'GetKeywordItemCount'; ParamType1: ptKeyword), - (Index: 467; Name: 'GetBroadcastState'), - (Index: 470; Name: 'GetDestructionStage'), - (Index: 473; Name: 'GetIsAlignment'; ParamType1: ptAlignment), - (Index: 476; Name: 'IsProtected'), - (Index: 477; Name: 'GetThreatRatio'; ParamType1: ptActor), - (Index: 479; Name: 'GetIsUsedItemEquipType'; ParamType1: ptEquipType), - (Index: 480; Name: 'GetPlayerName'), - (Index: 483; Name: 'GetPlayerActivated'), - (Index: 485; Name: 'GetFullyEnabledActorsInHigh'), - (Index: 487; Name: 'IsCarryable'), - (Index: 488; Name: 'GetConcussed'), - (Index: 489; Name: 'SetZoneRespawns'; ParamType1: ptEncounterZone; ParamType2: ptInteger), - (Index: 490; Name: 'SetVATSTarget'; ParamType1: ptInteger), - (Index: 491; Name: 'GetMapMarkerVisible'), - (Index: 493; Name: 'PlayerKnows'; ParamType1: ptReferencableObject), - (Index: 494; Name: 'GetPermanentValue'; ParamType1: ptActorValue), - (Index: 495; Name: 'GetKillingBlowLimb'), - (Index: 497; Name: 'CanPayCrimeGold'; ParamType1: ptFaction), - (Index: 499; Name: 'GetDaysInJail'), - (Index: 500; Name: 'EPAlchemyGetMakingPoison'), - (Index: 501; Name: 'EPAlchemyEffectHasKeyword'; ParamType1: ptKeyword), - (Index: 503; Name: 'GetAllowWorldInteractions'), - (Index: 506; Name: 'DialogueGetAv'; ParamType1: ptActorValue), - (Index: 507; Name: 'DialogueHasPerk'; ParamType1: ptPerk), - (Index: 508; Name: 'GetLastHitCritical'), - (Index: 510; Name: 'DialogueGetItemCount'; ParamType1: ptReferencableObject), - (Index: 511; Name: 'LastCrippledCondition'; ParamType1: ptActorValue), - (Index: 512; Name: 'HasSharedPowerGrid'; ParamType1: ptObjectReference), - (Index: 513; Name: 'IsCombatTarget'; ParamType1: ptActor), - (Index: 515; Name: 'GetVATSRightAreaFree'; ParamType1: ptObjectReference), - (Index: 516; Name: 'GetVATSLeftAreaFree'; ParamType1: ptObjectReference), - (Index: 517; Name: 'GetVATSBackAreaFree'; ParamType1: ptObjectReference), - (Index: 518; Name: 'GetVATSFrontAreaFree'; ParamType1: ptObjectReference), - (Index: 519; Name: 'GetIsLockBroken'), - (Index: 520; Name: 'IsPS3'), - (Index: 521; Name: 'IsWindowsPC'), - (Index: 522; Name: 'GetVATSRightTargetVisible'; ParamType1: ptObjectReference), - (Index: 523; Name: 'GetVATSLeftTargetVisible'; ParamType1: ptObjectReference), - (Index: 524; Name: 'GetVATSBackTargetVisible'; ParamType1: ptObjectReference), - (Index: 525; Name: 'GetVATSFrontTargetVisible'; ParamType1: ptObjectReference), - (Index: 528; Name: 'IsInCriticalStage'; ParamType1: ptCriticalStage), - (Index: 530; Name: 'GetXPForNextLevel'), - (Index: 533; Name: 'GetInfamy'; ParamType1: ptFaction), - (Index: 534; Name: 'GetInfamyViolent'; ParamType1: ptFaction), - (Index: 535; Name: 'GetInfamyNonViolent'; ParamType1: ptFaction), - (Index: 536; Name: 'GetTypeCommandPerforming'), - (Index: 543; Name: 'GetQuestCompleted'; ParamType1: ptQuest), - (Index: 544; Name: 'GetSpeechChallengeSuccessLevel'), - (Index: 545; Name: 'PipBoyRadioOff'), - (Index: 547; Name: 'IsGoreDisabled'), - (Index: 550; Name: 'IsSceneActionComplete'; ParamType1: ptScene; ParamType2: ptInteger), - (Index: 552; Name: 'GetSpellUsageNum'; ParamType1: ptMagicItem), - (Index: 554; Name: 'GetActorsInHigh'), - (Index: 555; Name: 'HasLoaded3D'), - (Index: 559; Name: 'IsImageSpaceActive'; ParamType1: ptReferencableObject), - (Index: 560; Name: 'HasKeyword'; ParamType1: ptKeyword), - (Index: 561; Name: 'HasRefType'; ParamType1: ptRefType), - (Index: 562; Name: 'LocationHasKeyword'; ParamType1: ptKeyword), - (Index: 563; Name: 'LocationHasRefType'; ParamType1: ptRefType), - (Index: 565; Name: 'GetIsEditorLocation'; ParamType1: ptLocation), - (Index: 566; Name: 'GetIsAliasRef'; ParamType1: ptAlias), - (Index: 567; Name: 'GetIsEditorLocationAlias'; ParamType1: ptAlias), - (Index: 568; Name: 'IsSprinting'), - (Index: 569; Name: 'IsBlocking'), - (Index: 570; Name: 'HasEquippedSpell'; ParamType1: ptCastingSource), - (Index: 571; Name: 'GetCurrentCastingType'; ParamType1: ptCastingSource), - (Index: 572; Name: 'GetCurrentDeliveryType'; ParamType1: ptCastingSource), - (Index: 574; Name: 'GetAttackState'), - (Index: 575; Name: 'GetAliasedRef'; ParamType1: ptAlias), - (Index: 576; Name: 'GetEventData'; ParamType1: ptEvent; ParamType2: ptEventData; ParamType3: ptNone), // fireundubh: Event Function, Event Member, Data (FO4) - (Index: 577; Name: 'IsCloserToAThanB'; ParamType1: ptObjectReference; ParamType2: ptObjectReference), - (Index: 578; Name: 'LevelMinusPCLevel'), - (Index: 580; Name: 'IsBleedingOut'), - (Index: 584; Name: 'GetRelativeAngle'; ParamType1: ptObjectReference; ParamType2: ptAxis), - (Index: 589; Name: 'GetMovementDirection'), - (Index: 590; Name: 'IsInScene'), - (Index: 591; Name: 'GetRefTypeDeadCount'; ParamType1: ptLocation; ParamType2: ptRefType), - (Index: 592; Name: 'GetRefTypeAliveCount'; ParamType1: ptLocation; ParamType2: ptRefType), - (Index: 594; Name: 'GetIsFlying'), - (Index: 595; Name: 'IsCurrentSpell'; ParamType1: ptMagicItem; ParamType2: ptCastingSource), - (Index: 596; Name: 'SpellHasKeyword'; ParamType1: ptCastingSource; ParamType2: ptKeyword), - (Index: 597; Name: 'GetEquippedItemType'; ParamType1: ptCastingSource), - (Index: 598; Name: 'GetLocationAliasCleared'; ParamType1: ptAlias), - (Index: 600; Name: 'GetLocationAliasRefTypeDeadCount'; ParamType1: ptAlias; ParamType2: ptRefType), - (Index: 601; Name: 'GetLocationAliasRefTypeAliveCount'; ParamType1: ptAlias; ParamType2: ptRefType), - (Index: 602; Name: 'IsWardState'; ParamType1: ptWardState), - (Index: 603; Name: 'IsInSameCurrentLocationAsRef'; ParamType1: ptObjectReference; ParamType2: ptKeyword), - (Index: 604; Name: 'IsInSameCurrentLocationAsRefAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), - (Index: 605; Name: 'LocationAliasIsLocation'; ParamType1: ptAlias; ParamType2: ptLocation), - (Index: 606; Name: 'GetKeywordDataForLocation'; ParamType1: ptLocation; ParamType2: ptKeyword), - (Index: 608; Name: 'GetKeywordDataForAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), - (Index: 610; Name: 'LocationAliasHasKeyword'; ParamType1: ptAlias; ParamType2: ptKeyword), - (Index: 611; Name: 'IsNullPackageData'; ParamType1: ptPackdata), - (Index: 612; Name: 'GetNumericPackageData'; ParamType1: ptPackdata), - (Index: 613; Name: 'IsPlayerRadioOn'), - (Index: 614; Name: 'GetPlayerRadioFrequency'), - (Index: 615; Name: 'GetHighestRelationshipRank'), - (Index: 616; Name: 'GetLowestRelationshipRank'), - (Index: 617; Name: 'HasAssociationTypeAny'; ParamType1: ptAssociationType), - (Index: 618; Name: 'HasFamilyRelationshipAny'), - (Index: 619; Name: 'GetPathingTargetOffset'; ParamType1: ptAxis), - (Index: 620; Name: 'GetPathingTargetAngleOffset'; ParamType1: ptAxis), - (Index: 621; Name: 'GetPathingTargetSpeed'), - (Index: 622; Name: 'GetPathingTargetSpeedAngle'; ParamType1: ptAxis), - (Index: 623; Name: 'GetMovementSpeed'), - (Index: 624; Name: 'GetInContainer'; ParamType1: ptObjectReference), - (Index: 625; Name: 'IsLocationLoaded'; ParamType1: ptLocation), - (Index: 626; Name: 'IsLocationAliasLoaded'; ParamType1: ptAlias), - (Index: 627; Name: 'IsDualCasting'), - (Index: 629; Name: 'GetVMQuestVariable'; ParamType1: ptQuest; ParamType2: ptNone), - (Index: 630; Name: 'GetCombatAudioDetection'), - (Index: 631; Name: 'GetCombatVisualDetection'), - (Index: 632; Name: 'IsCasting'), - (Index: 633; Name: 'GetFlyingState'), - (Index: 635; Name: 'IsInFavorState'), - (Index: 636; Name: 'HasTwoHandedWeaponEquipped'), - (Index: 637; Name: 'IsFurnitureExitType'; ParamType1: ptReferencableObject), - (Index: 638; Name: 'IsInFriendStatewithPlayer'), - (Index: 639; Name: 'GetWithinDistance'; ParamType1: ptObjectReference; ParamType2: ptFloat), - (Index: 640; Name: 'GetValuePercent'; ParamType1: ptActorValue), - (Index: 641; Name: 'IsUnique'), - (Index: 642; Name: 'GetLastBumpDirection'), - (Index: 644; Name: 'GetInfoChallangeSuccess'), - (Index: 645; Name: 'GetIsInjured'), - (Index: 646; Name: 'GetIsCrashLandRequest'), - (Index: 647; Name: 'GetIsHastyLandRequest'), - (Index: 650; Name: 'IsLinkedTo'; ParamType1: ptObjectReference; ParamType2: ptKeyword), - (Index: 651; Name: 'GetKeywordDataForCurrentLocation'; ParamType1: ptKeyword), - (Index: 652; Name: 'GetInSharedCrimeFaction'; ParamType1: ptObjectReference), - (Index: 653; Name: 'GetBribeAmount'), - (Index: 654; Name: 'GetBribeSuccess'), - (Index: 655; Name: 'GetIntimidateSuccess'), - (Index: 656; Name: 'GetArrestedState'), - (Index: 657; Name: 'GetArrestingActor'), - (Index: 659; Name: 'HasVMScript'; ParamType1: ptNone), - (Index: 660; Name: 'GetVMScriptVariable'; ParamType1: ptNone; ParamType2: ptNone), - (Index: 661; Name: 'GetWorkshopResourceDamage'; ParamType1: ptActorValue), - (Index: 664; Name: 'HasValidRumorTopic'; ParamType1: ptQuest), - (Index: 672; Name: 'IsAttacking'), - (Index: 673; Name: 'IsPowerAttacking'), - (Index: 674; Name: 'IsLastHostileActor'), - (Index: 675; Name: 'GetGraphVariableInt'; ParamType1: ptNone), - (Index: 678; Name: 'ShouldAttackKill'; ParamType1: ptActor), - (Index: 680; Name: 'GetActivationHeight'), - (Index: 682; Name: 'WornHasKeyword'; ParamType1: ptKeyword), - (Index: 683; Name: 'GetPathingCurrentSpeed'), - (Index: 684; Name: 'GetPathingCurrentSpeedAngle'; ParamType1: ptAxis), - (Index: 691; Name: 'GetWorkshopObjectCount'; ParamType1: ptReferencableObject), - (Index: 693; Name: 'EPMagic_SpellHasKeyword'; ParamType1: ptKeyword), - (Index: 694; Name: 'GetNoBleedoutRecovery'), - (Index: 696; Name: 'EPMagic_SpellHasSkill'; ParamType1: ptActorValue), - (Index: 697; Name: 'IsAttackType'; ParamType1: ptKeyword), - (Index: 698; Name: 'IsAllowedToFly'), - (Index: 699; Name: 'HasMagicEffectKeyword'; ParamType1: ptKeyword), - (Index: 700; Name: 'IsCommandedActor'), - (Index: 701; Name: 'IsStaggered'), - (Index: 702; Name: 'IsRecoiling'), - (Index: 703; Name: 'HasScopeWeaponEquipped'), - (Index: 704; Name: 'IsPathing'), - (Index: 705; Name: 'GetShouldHelp'; ParamType1: ptActor), - (Index: 706; Name: 'HasBoundWeaponEquipped'; ParamType1: ptCastingSource), - (Index: 707; Name: 'GetCombatTargetHasKeyword'; ParamType1: ptKeyword), - (Index: 709; Name: 'GetCombatGroupMemberCount'), - (Index: 710; Name: 'IsIgnoringCombat'), - (Index: 711; Name: 'GetLightLevel'), - (Index: 713; Name: 'SpellHasCastingPerk'; ParamType1: ptPerk), - (Index: 714; Name: 'IsBeingRidden'), - (Index: 715; Name: 'IsUndead'), - (Index: 716; Name: 'GetRealHoursPassed'), - (Index: 718; Name: 'IsUnlockedDoor'), - (Index: 719; Name: 'IsHostileToActor'; ParamType1: ptActor), - (Index: 720; Name: 'GetTargetHeight'; ParamType1: ptObjectReference), - (Index: 721; Name: 'IsPoison'), - (Index: 722; Name: 'WornApparelHasKeywordCount'; ParamType1: ptKeyword), - (Index: 723; Name: 'GetItemHealthPercent'), - (Index: 724; Name: 'EffectWasDualCast'), - (Index: 725; Name: 'GetKnockStateEnum'), - (Index: 726; Name: 'DoesNotExist'), - (Index: 728; Name: 'GetPlayerWalkAwayFromDialogueScene'), - (Index: 729; Name: 'GetActorStance'), - (Index: 734; Name: 'CanProduceForWorkshop'), - (Index: 735; Name: 'CanFlyHere'), - (Index: 736; Name: 'EPIsDamageType'; ParamType1: ptDamageType), - (Index: 738; Name: 'GetActorGunState'), - (Index: 739; Name: 'GetVoiceLineLength'), - (Index: 741; Name: 'ObjectTemplateItem_HasKeyword'; ParamType1: ptKeyword), - (Index: 742; Name: 'ObjectTemplateItem_HasUniqueKeyword'; ParamType1: ptKeyword), - (Index: 743; Name: 'ObjectTemplateItem_GetLevel'), - (Index: 744; Name: 'MovementIdleMatches'; ParamType1: ptInteger; ParamType2: ptInteger), // TODO: determine correct param types (2) - (Index: 745; Name: 'GetActionData'), - (Index: 746; Name: 'GetActionDataShort'; ParamType1: ptInteger), - (Index: 747; Name: 'GetActionDataByte'; ParamType1: ptInteger), - (Index: 748; Name: 'GetActionDataFlag'; ParamType1: ptInteger), - (Index: 749; Name: 'ModdedItemHasKeyword'; ParamType1: ptKeyword), - (Index: 750; Name: 'GetAngryWithPlayer'), - (Index: 751; Name: 'IsCameraUnderWater'), - (Index: 753; Name: 'IsActorRefOwner'; ParamType1: ptActor), - (Index: 754; Name: 'HasActorRefOwner'; ParamType1: ptActor), - (Index: 756; Name: 'GetLoadedAmmoCount'), - (Index: 757; Name: 'IsTimeSpanSunrise'), - (Index: 758; Name: 'IsTimeSpanMorning'), - (Index: 759; Name: 'IsTimeSpanAfternoon'), - (Index: 760; Name: 'IsTimeSpanEvening'), - (Index: 761; Name: 'IsTimeSpanSunset'), - (Index: 762; Name: 'IsTimeSpanNight'), - (Index: 763; Name: 'IsTimeSpanMidnight'), - (Index: 764; Name: 'IsTimeSpanAnyDay'), - (Index: 765; Name: 'IsTimeSpanAnyNight'), - (Index: 766; Name: 'CurrentFurnitureHasKeyword'; ParamType1: ptKeyword), - (Index: 767; Name: 'GetWeaponEquipIndex'), - (Index: 769; Name: 'IsOverEncumbered'), - (Index: 770; Name: 'IsPackageRequestingBlockedIdles'), - (Index: 771; Name: 'GetActionDataInt'), - (Index: 772; Name: 'GetVATSRightMinusLeftAreaFree'; ParamType1: ptObjectReference), - (Index: 773; Name: 'GetInIronSights'; ParamType1: ptObjectReference), - (Index: 774; Name: 'GetActorStaggerDirection'), - (Index: 775; Name: 'GetActorStaggerMagnitude'), - (Index: 776; Name: 'WornCoversBipedSlot'; ParamType1: ptInteger), - (Index: 777; Name: 'GetInventoryValue'), - (Index: 778; Name: 'IsPlayerInConversation'), - (Index: 779; Name: 'IsInDialogueCamera'), - (Index: 780; Name: 'IsMyDialogueTargetPlayer'), - (Index: 781; Name: 'IsMyDialogueTargetActor'), - (Index: 782; Name: 'GetMyDialogueTargetDistance'), - (Index: 783; Name: 'IsSeatOccupied'; ParamType1: ptKeyword), - (Index: 784; Name: 'IsPlayerRiding'), - (Index: 785; Name: 'IsTryingEventCamera'), - (Index: 786; Name: 'UseLeftSideCamera'), - (Index: 787; Name: 'GetNoteType'), - (Index: 788; Name: 'LocationHasPlayerOwnedWorkshop'), - (Index: 789; Name: 'IsStartingAction'), - (Index: 790; Name: 'IsMidAction'), - (Index: 791; Name: 'IsWeaponChargeAttack'), - (Index: 792; Name: 'IsInWorkshopMode'), - (Index: 793; Name: 'IsWeaponChargingHoldAttack'), - (Index: 794; Name: 'IsEncounterAbovePlayerLevel'), - (Index: 795; Name: 'IsMeleeAttacking'), - (Index: 796; Name: 'GetVATSQueuedTargetsUnique'), - (Index: 797; Name: 'GetCurrentLocationCleared'), - (Index: 798; Name: 'IsPowered'), - (Index: 799; Name: 'GetTransmitterDistance'), - (Index: 800; Name: 'GetCameraPlaybackTime'), - (Index: 801; Name: 'IsInWater'), - (Index: 802; Name: 'GetWithinActivateDistance'; ParamType1: ptObjectReference), - (Index: 803; Name: 'IsUnderWater'), - (Index: 804; Name: 'IsInSameSpace'; ParamType1: ptObjectReference), - (Index: 805; Name: 'LocationAllowsReset'), - (Index: 806; Name: 'GetVATSBackRightAreaFree'; ParamType1: ptObjectReference), - (Index: 807; Name: 'GetVATSBackLeftAreaFree'; ParamType1: ptObjectReference), - (Index: 808; Name: 'GetVATSBackRightTargetVisible'; ParamType1: ptObjectReference), - (Index: 809; Name: 'GetVATSBackLeftTargetVisible'; ParamType1: ptObjectReference), - (Index: 810; Name: 'GetVATSTargetLimbVisible'; ParamType1: ptObjectReference), - (Index: 811; Name: 'IsPlayerListening'; ParamType1: ptFloat), - (Index: 812; Name: 'GetPathingRequestedQuickTurn'), - (Index: 813; Name: 'EPIsCalculatingBaseDamage'), - (Index: 814; Name: 'GetReanimating'), - (Index: 817; Name: 'IsInRobotWorkbench'), - - // F4SE - (Index: 1024; Name: 'GetSKSEVersion'; ), - (Index: 1025; Name: 'GetSKSEVersionMinor'; ), - (Index: 1026; Name: 'GetSKSEVersionBeta'; ), - (Index: 1027; Name: 'GetSKSERelease'; ), - (Index: 1028; Name: 'ClearInvalidRegistrations'; ) - ); -var - wbCTDAFunctionEditInfo: string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - // "use global" flag - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; - ParamFlag: Byte; - ParamType: TCTDAFunctionParamType; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - - if Assigned(Desc) then begin - ParamType := Desc.ParamType1; - ParamFlag := Container.ElementByName['Type'].NativeValue; - if ParamType in [ptObjectReference, ptActor, ptPackage] then begin - if ParamFlag and $02 > 0 then begin - // except for this func when Run On = Quest Alias, then alias is param3 and package is param1 - // [INFO:00020D3C] - if not ((Container.ElementByName['Run On'].NativeValue = 5) and (Desc.Name = 'GetIsCurrentPackage')) then - ParamType := ptAlias {>>> 'use aliases' is set <<<} - end - else if ParamFlag and $08 > 0 then - ParamType := ptPackdata; {>>> 'use packdata' is set <<<} - end; - Result := Succ(Integer(ParamType)); - end; -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; - ParamFlag: Byte; - ParamType: TCTDAFunctionParamType; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - - if Assigned(Desc) then begin - ParamType := Desc.ParamType2; - ParamFlag := Container.ElementByName['Type'].NativeValue; - if ParamType in [ptObjectReference, ptActor, ptPackage] then begin - if ParamFlag and $02 > 0 then ParamType := ptAlias else {>>> 'use aliases' is set <<<} - if ParamFlag and $08 > 0 then ParamType := ptPackdata; {>>> 'use packdata' is set <<<} - end; - Result := Succ(Integer(ParamType)); - end; -end; - -function wbCTDAParam2VATSValueParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Parameter #1'].NativeValue; -end; - -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -function wbNeverShow(const aElement: IwbElement): Boolean; -begin - Result := wbHideNeverShow; -end; - -function GetREGNType(aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := -1; - if not Assigned(aElement) then - Exit; - while aElement.Name <> 'Region Data Entry' do begin - aElement := aElement.Container; - if not Assigned(aElement) then - Exit; - end; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['RDAT\Type']; -end; - -function wbREGNObjectsDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 2; -end; - -function wbREGNWeatherDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 3; -end; - -function wbREGNMapDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 4; -end; - -function wbREGNLandDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 5; -end; - -function wbREGNGrassDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 6; -end; - -function wbREGNSoundDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 7; -end; - -function wbREGNImposterDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 8; -end; - -function wbMESGTNAMDontShow(const aElement: IwbElement): Boolean; -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - Result := False; - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['DNAM']) and 1 <> 0 then - Result := True; -end; - -function wbEPFDDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [1..3]) then - Result := True; -end; - -function wbTES4ONAMDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := False; - if not Assigned(aElement) then - Exit; - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - if not MainRecord.IsESM then - Result := True; -end; - -function wbEPF2DontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [4]) then - Result := True; -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if not wbRemoveOffsetData then - Exit; - - if Supports(aElement, IwbContainer, Container) then begin - if wbBeginInternalEdit then try - Container.RemoveElement(OFST); - finally - wbEndInternalEdit; - end else begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; - end; -end; - -procedure wbWRLDAfterLoad(const aElement: IwbElement); - function OutOfRange(aValue: Integer; aRange: Integer = 256): Boolean; - begin - Result := (aValue < -aRange) or (aValue > aRange); - end; -var - MainRecord: IwbMainRecord; - Container: IwbContainer; -begin - wbRemoveOFST(aElement); - - if wbBeginInternalEdit then try - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.ElementExists['Unused RNAM'] then - MainRecord.RemoveElement('Unused RNAM'); - - //if MainRecord.ElementExists['World Default Level Data'] then - // MainRecord.RemoveElement('World Default Level Data'); - - //if MainRecord.ElementExists['MHDT'] then - // MainRecord.RemoveElement('MHDT'); - - if MainRecord.ElementExists['CLSZ'] then - MainRecord.RemoveElement('CLSZ'); - - // large values in object bounds cause stutter and performance issues in game (reported by Arthmoor) - // CK can occasionally set them wrong, so make a warning - if Supports(MainRecord.ElementByName['Object Bounds'], IwbContainer, Container) then - if OutOfRange(StrToIntDef(Container.ElementEditValues['NAM0\X'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM0\Y'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM9\X'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM9\Y'], 0)) - then - wbProgressCallback(''); - - finally - wbEndInternalEdit; - end; -end; - -procedure wbDOBJObjectsAfterLoad(const aElement: IwbElement); -var - ObjectsContainer : IwbContainerElementRef; - i : Integer; - ObjectContainer : IwbContainerElementRef; -begin - wbRemoveOFST(aElement); - - if wbBeginInternalEdit then try - - if not Supports(aElement, IwbContainerElementRef, ObjectsContainer) then - Exit; - - for i := Pred(ObjectsContainer.ElementCount) downto 0 do - if Supports(ObjectsContainer.Elements[i], IwbContainerElementRef, ObjectContainer) then - if ObjectContainer.ElementNativeValues['Use'] = 0 then - ObjectsContainer.RemoveElement(i, True); - finally - wbEndInternalEdit; - end; -end; - -function wbActorTemplateUseTraits(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000001) <> 0; - end; -end; - -function wbActorTemplateUseStats(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000002) <> 0; - end; -end; - -function wbActorAutoCalcDontShow(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseStatsAutoCalc(const aElement: IwbElement): Boolean; -begin - Result := wbActorTemplateUseStats(aElement) or wbActorAutoCalcDontShow(aElement); -end; - -function wbActorTemplateUseFactions(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000004) <> 0; - end; -end; - -function wbActorTemplateUseActorEffectList(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000008) <> 0; - end; -end; - -function wbActorTemplateUseAIData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseAIPackages(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000020) <> 0; - end; -end; - -function wbActorTemplateUseModelAnimation(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000040) <> 0; - end; -end; - -function wbActorTemplateUseBaseData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000080) <> 0; - end; -end; - -function wbActorTemplateUseInventory(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000100) <> 0; - end; -end; - -function wbActorTemplateUseScript(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000200) <> 0; - end; -end; - -function wbActorTemplatesUseTemplate0(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 0 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate1(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 1 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate2(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 2 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate3(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 3 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate4(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 4 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate5(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 5 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate6(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 6 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate7(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 7 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate8(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 8 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate9(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 9 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate10(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 10 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate11(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 11 and 1) = 0 - else - Result := False; -end; - -function wbActorTemplatesUseTemplate12(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - MainRecord := aElement.ContainingMainRecord; - if Assigned(MainRecord) then - Result := (Cardinal(MainRecord.ElementNativeValues['ACBS\Use Template Actors']) shr 12 and 1) = 0 - else - Result := False; -end; - -procedure wbRemoveEmptyKWDA(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Assigned(Container.ElementBySignature['KSIZ']) then - if Assigned(Container.ElementBySignature['KWDA']) then - Container.ElementBySignature['KWDA'].Remove; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbReplaceBODTwithBOD2(const aElement: IwbElement); -var - MainRecord : IwbMainRecord; - ContainerBOD2 : IwbContainerElementRef; - ContainerBODT : IwbContainerElementRef; -begin - Exit; {>>> Looks like causes problems with Dawnguard.esm <<<} - - if wbBeginInternalEdit then try - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if not Supports(MainRecord.ElementBySignature[BODT], IwbContainerElementRef, ContainerBODT) then - Exit; - - if Supports(MainRecord.Add('BOD2', True), IwbContainerElementRef, ContainerBOD2) then begin - ContainerBOD2.ElementNativeValues['First Person Flags'] := ContainerBODT.ElementNativeValues['First Person Flags']; - ContainerBOD2.ElementNativeValues['Armor Type'] := ContainerBODT.ElementNativeValues['Armor Type']; - MainRecord.RemoveElement(BODT); - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbARMOAfterLoad(const aElement: IwbElement); -begin - wbRemoveEmptyKWDA(aElement); - wbReplaceBODTwithBOD2(aElement); -end; - -procedure wbARMAAfterLoad(const aElement: IwbElement); -{var - MainRecord : IwbMainRecord;} -begin - wbReplaceBODTwithBOD2(aElement); - {if wbBeginInternalEdit then try - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.ElementNativeValues['DNAM\Weight slider - Male'] = 0 then - MainRecord.ElementNativeValues['DNAM\Weight slider - Male'] := 2; - if MainRecord.ElementNativeValues['DNAM\Weight slider - Female'] = 0 then - MainRecord.ElementNativeValues['DNAM\Weight slider - Female'] := 2; - finally - wbEndInternalEdit; - end;} -end; - -procedure wbNPCAfterLoad(const aElement: IwbElement); -begin - wbRemoveEmptyKWDA(aElement); -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['XLOC'] then begin - if Container.ElementNativeValues['XLOC - Lock Data\Level'] = 0 then - Container.ElementNativeValues['XLOC - Lock Data\Level'] := 1; - end; - - Container.RemoveElement('XPTL'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbWEAPAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Flags : Cardinal; -begin - wbRemoveEmptyKWDA(aElement); - - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - // clear IronSights flags which are randomly assigned in CK - if Container.ElementExists['DNAM'] then begin - Flags := Container.ElementNativeValues['DNAM - Data\Flags']; - Flags := Flags and ($FFFF xor $0040); - Container.ElementNativeValues['DNAM - Data\Flags'] := Flags; - Flags := Container.ElementNativeValues['DNAM - Data\Flags2']; - Flags := Flags and ($FFFFFFFF xor $0100); - Container.ElementNativeValues['DNAM - Data\Flags2'] := Flags; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbCELLXCLWGetConflictPriority(const aElement: IwbElement; var aCP: TwbConflictPriority); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - DataRec : IwbElement; - Flags : Cardinal; -begin - if not Assigned(aElement) then - Exit; - - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(Container, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - DataRec := MainRecord.ElementBySignature[DATA]; - - if not Assigned(DataRec) then - Exit; - - Flags := DataRec.NativeValue; - - {0x0001 Is Interior Cell} - if (Flags and 1) = 1 then - {Interior cells don't use water level in Skyrim at all} - aCP := cpIgnore; -end; - -procedure wbCELLDATAAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; -begin - if not Assigned(aElement) then - Exit; - Container := aElement.Container; - while Assigned(Container) and not (Container.Def.DefType = dtRecord) do - Container := Container.Container; - if Assigned(Container) then - Container.ResetConflict; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; -// Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; - DataSubRec : IwbSubrecord; - Flags : Byte; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Supports(Container.ElementBySignature['DATA'] , IwbSubRecord, DataSubRec) then begin - // expand itU8 flags to itU16 - if DataSubRec.SubRecordHeaderSize = 1 then begin - Flags := PByte(DataSubRec.DataBasePtr)^; - DataSubRec.SetToDefault; - DataSubRec.NativeValue := Flags; - end; - // 'Default' water height for exterior cells if not set (so water height will be taken from WRLD by game) - if (not Container.ElementExists['XCLW']) and ((Integer(DataSubRec.NativeValue) and $02) <> 0) then begin - Container.Add('XCLW', True); - Container.ElementEditValues['XCLW'] := 'Default'; - end; - end; - - // Min (-0 as in CK) water height is set to 0 when saving in CK - if Container.ElementEditValues['XCLW'] = 'Min' then - Container.ElementEditValues['XCLW'] := '0.0'; - -// if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin -// for i := Pred(Container2.ElementCount) downto 0 do -// if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then -// Container2.RemoveElement(i); -// if Container2.ElementCount < 1 then -// Container2.Remove; -// end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - IsMessageBox : Boolean; - HasTimeDelay : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - IsMessageBox := (Integer(Container.ElementNativeValues['DNAM']) and 1) = 1; - HasTimeDelay := Container.ElementExists['TNAM']; - - if IsMessageBox = HasTimeDelay then - if IsMessageBox then - Container.RemoveElement('TNAM') - else begin - if not Container.ElementExists['DNAM'] then - Container.Add('DNAM', True); - Container.ElementNativeValues['DNAM'] := Integer(Container.ElementNativeValues['DNAM']) or 1; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['FNAM'] then begin - Container.Add('FNAM', True); - Container.ElementNativeValues['FNAM'] := 1.0; - end; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - MainRecord := Container.ContainingMainRecord; - if not Assigned(MainRecord) or MainRecord.IsDeleted then - Exit; - - Element := Container.ElementByPath['..\EFID']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Actor Value']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container: IwbContainer; - a, b: Single; - NeedsFlip: Boolean; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[0].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].Value); - case CompareValue(a, b) of - EqualsValue: begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[1].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].Value); - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbLLEAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Entries : IwbContainerElementRef; - MainRecord : IwbMainRecord; - i : integer; -begin - if wbBeginInternalEdit then try - // zero entries' Chance None if Form Version < 69 - if wbFormVerDecider(nil, nil, aElement, 69) = 1 then - Exit; - - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Supports(MainRecord.ElementByName['Leveled List Entries'], IwbContainerElementRef, Entries) then - Exit; - - - for i := 0 to Pred(Entries.ElementCount) do begin - if not Supports(Entries.Elements[i], IwbContainerElementRef, Container) then - Exit; - Container.ElementNativeValues['LVLO\Chance None'] := 0; - end; - - finally - wbEndInternalEdit; - end; -end; - -function wbPubPackCNAMDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rANAM: IwbRecord; - ctype: string; -begin - Result := 0; - rANAM := aElement.Container.RecordBySignature[ANAM]; - if Assigned(rANAM) then begin - ctype := rANAM.NativeValue; - if ctype = 'Bool' then Result := 1 else - if ctype = 'Int' then Result := 2 else - if ctype = 'Float' then Result := 3 else - if ctype = 'ObjectList' then Result := 3; - end; -end; - -function wbTypeDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Element : IwbElement; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Element := Container.ElementByName['Type']; - if Assigned(Element) then - Result := Element.NativeValue - else if wbMoreInfoForDecider then - wbProgressCallback('"'+Container.Name+'" does not contain an element named Type'); -end; - -procedure wbCNTOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('COCT - Count', aElement); -end; - -procedure wbContainerAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('COCT - Count', 'Items', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbSPLOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('SPCT - Count', aElement); -end; - -procedure wbKWDAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('KSIZ - Keyword Count', aElement); -end; - -procedure wbNPCAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('COCT - Count', 'Items', aElement); - wbCounterContainerAfterSet('SPCT - Count', 'Actor Effects', aElement); - wbCounterContainerAfterSet('LLCT - Count', 'Leveled List Entries', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); - wbCounterContainerAfterSet('PRKZ - Perk Count', 'Perks', aElement); -end; - -procedure wbRaceAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('SPCT - Count', 'Actor Effects', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbKeywordsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbLVLOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('LLCT - Count', aElement); -end; - -procedure wbLLEAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('LLCT - Count', 'Leveled List Entries', aElement); -end; - -procedure wbPRKRsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('PRKZ - Perk Count', aElement); -end; - -procedure wbSMQNQuestsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('QNAM - Quest Count', aElement); -end; - -procedure wbCTDAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('CITC - Condition Count', aElement); -end; - -procedure wbConditionsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('CITC - Condition Count', 'Conditions', aElement); -end; - -procedure wbCounterEffectsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - // if it is really possible to have both counter effects and multiple data, this is going to be tricky. - wbCounterByPathAfterSet('Magic Effect Data\DATA - Data\Counter effect count', aElement); -end; - -procedure wbMGEFAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbKeywordsAfterSet(aElement, aOldValue, aNewValue); - wbCounterContainerByPathAfterSet('Magic Effect Data\DATA - Data\Counter effect count', 'Counter Effects', aElement); -end; - -procedure wbTERMDisplayItemsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('BSIZ - Count', aElement); -end; - -procedure wbTERMMenuItemsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('ISIZ - Count', aElement); -end; - -procedure wbSNDRRatesOfFireAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('ITMC - Count', aElement); -end; - -procedure wbNPCActorSoundsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('CS2H - Count', aElement); -end; - -procedure wbMorphPresetsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('MPPC - Count', aElement); -end; - -procedure wbLENSAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('LFSP - Count', aElement); -end; - - -procedure wbIDLAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - if wbBeginInternalEdit then try - if not wbCounterAfterSet('IDLC - Animation Count', aElement) then - if Supports(aElement.Container, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC']; - if Assigned(Element) and Supports(aElement, IwbContainer, SelfAsContainer) and - (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbAnimationsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - if wbBeginInternalEdit then try - if not wbCounterContainerAfterSet('IDLC - Animation Count', 'IDLA - Animations', aElement) then - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - Elems := Container.ElementByName['IDLA - Animations']; - if Assigned(Element) and not Assigned(Elems) then - if Element.GetNativeValue<>0 then - Element.SetNativeValue(0); - end; - finally - wbEndInternalEdit; - end; -end; - -function wbOffsetDataColsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbDataContainer; - Element : IwbElement; - fResult : Extended; -begin - Result := 0; - - if Supports(aElement.Container, IwbDataContainer, Container) and (Container.Name = 'OFST - Offset Data') and - Supports(Container.Container, IwbDataContainer, Container) then begin - Element := Container.ElementByPath['Object Bounds\NAM0 - Min\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 0 - else - Result := Trunc(fResult); - Element := Container.ElementByPath['Object Bounds\NAM9 - Max\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 1 - else - Result := Trunc(fResult) - Result + 1; - end; - end; - end; -end; - -procedure wbOMODpropertyAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('Property Count', aElement); -end; - -procedure wbOMODincludeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('Include Count', aElement); -end; - -procedure wbOMODdataAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('Property Count', 'Properties', aElement); - wbCounterContainerAfterSet('Include Count', 'Includes', aElement); -end; - -function wbOMODDataIncludeCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; -begin - if Supports(aElement.Container, IwbContainer, Container) then - Result := Container.ElementNativeValues['Include Count'] - else - Result := 0; -end; - -function wbOMODDataPropertyCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; -begin - if Supports(aElement.Container, IwbContainer, Container) then - Result := Container.ElementNativeValues['Property Count'] - else - Result := 0; -end; - -function GetObjectModPropertyEnum(const aElement: IwbElement): IwbEnumDef; -var - MainRecord: IwbMainRecord; - rDATA: IwbContainer; - Signature: TwbSignature; - FormType: Cardinal; -begin - Result := nil; - - MainRecord := aElement.ContainingMainRecord; - - if not Assigned(MainRecord) then - Exit; - - Signature := MainRecord.Signature; - - if Signature = OMOD then - if Supports(MainRecord.ElementBySignature['DATA'], IwbContainer, rDATA) then begin - FormType := rDATA.ElementNativeValues['Form Type']; - Signature := PwbSignature(@FormType)^; - end; - - if Signature = ARMO then - Result := wbArmorPropertyEnum - else if Signature = WEAP then - Result := wbWeaponPropertyEnum - else if Signature = NPC_ then - Result := wbActorPropertyEnum; -end; - -function wbObjectModPropertyToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PropEnum: IwbEnumDef; -begin - Result := ''; - - PropEnum := GetObjectModPropertyEnum(aElement); - - if not Assigned(PropEnum) then - case aType of - ctToStr, ctToSortKey, ctToEditValue: Result := IntToStr(aInt); - end - else - case aType of - ctToStr: Result := PropEnum.ToString(aInt, aElement); - ctToSortKey: Result := PropEnum.ToSortKey(aInt, aElement); - ctCheck: Result := PropEnum.Check(aInt, aElement); - ctToEditValue: Result := PropEnum.ToEditValue(aInt, aElement); - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := PropEnum.EditInfo[aInt, aElement]; - end; -end; - -function wbObjectModPropertyToInt(const aString: string; const aElement: IwbElement): Int64; -var - PropEnum: IwbEnumDef; -begin - PropEnum := GetObjectModPropertyEnum(aElement); - - if not Assigned(PropEnum) then - Result := StrToIntDef(aString, 0) - else - Result := PropEnum.FromEditValue(aString, aElement); -end; - -function wbOMODDataFunctionTypeDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - ValueType : Integer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ValueType := Container.ElementNativeValues['Value Type']; - - case ValueType of - 0: Result := 0; - 1: Result := 0; - 2: Result := 1; - 4: Result := 3; - 5: Result := 2; - 6: Result := 3; - end; -end; - -function wbOMODDataPropertyValue1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - ValueType : Integer; - PropName : string; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ValueType := Container.ElementNativeValues['Value Type']; - PropName := Container.ElementEditValues['Property']; - - case ValueType of - 0: Result := 1; - 1: Result := 2; - 2: Result := 3; - 4, 6: Result := 4; - 5: begin - if PropName = 'SoundLevel' then Result := 6 else - if PropName = 'StaggerValue' then Result := 7 else - if PropName = 'HitBehaviour' then Result := 8 else - Result := 5; - end; - end; -end; - -function wbOMODDataPropertyValue2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - ValueType : Integer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ValueType := Container.ElementNativeValues['Value Type']; - - case ValueType of - 0: Result := 1; - 1: Result := 2; - 2: Result := 3; - 4: Result := 1; - 6: Result := 2; - end; -end; - -procedure wbOBTSCombinationsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('OBTE - Count', aElement); -end; - -procedure wbINNRAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('VNAM - Count', aElement); -end; - -function wbCELLCombinedMeshesCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; -begin - if Supports(aElement.Container, IwbContainer, Container) then - Result := Container.ElementNativeValues['Meshes Count'] - else - Result := 0; -end; - -procedure wbCELLCombinedMeshesAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('Meshes Count', aElement); -end; - -function wbCELLCombinedRefsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; -begin - // the counter is double of entries (each member of struct is counted) - if Supports(aElement.Container, IwbContainer, Container) then - Result := Container.ElementNativeValues['References Count'] div 2 - else - Result := 0; -end; - -procedure wbCELLCombinedRefsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - // the counter is double of entries (each member of struct is counted) - if wbBeginInternalEdit then try - if Supports(aElement.Container, IwbContainer, Container) and - Supports(aElement, IwbContainer, SelfAsContainer) then begin - Element := Container.ElementByName['References Count']; - if Assigned(Element) then try - if (Element.GetNativeValue <> (SelfAsContainer.GetElementCount * 2)) then - Element.SetNativeValue(SelfAsContainer.GetElementCount * 2); - except end; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbCombinedMeshIDToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Cell: IwbMainRecord; -begin - Result := IntToHex(aInt, 8); - - Cell := aElement.ContainingMainRecord; - if not Assigned(Cell) then - Exit; - - case aType of - ctToStr, ctToEditValue: begin - Result := 'Precombined\' + IntToHex(Cell.FormID and $00FFFFFF, 8) + '_' + Result + '_OC.nif'; - end; - ctCheck: Result := ''; - end; -end; - -function wbCombinedMeshIDToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; - i: Integer; -begin - Result := 0; - // hex number between first and second underscope - i := Pos('_', aString); - if i <> 0 then begin - s := Copy(aString, i + 1, Length(aString) - i); - i := Pos('_', s); - if i <> 0 then begin - s := Copy(s, 1, i - 1); - if Length(s) = 8 then try - Result := StrToInt64('$' + s); - except end; - end; - end; -end; - -function wbREFRRecordFlagsDecider(const aElement: IwbElement): Integer; -var - MainRecord : IwbMainRecord; - NameRec : IwbElement; -begin - Result := 0; - - if not Assigned(aElement) then - Exit; - - MainRecord := aElement.ContainingMainRecord; - - if not Assigned(MainRecord) then - Exit; - - NameRec := MainRecord.ElementBySignature[NAME]; - if not Assigned(NameRec) then - Exit; - - if not Supports(NameRec.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - if (MainRecord.Signature = ACTI) or - (MainRecord.Signature = STAT) or - (MainRecord.Signature = SCOL) or - (MainRecord.Signature = TREE) - then - Result := 1 - else if - (MainRecord.Signature = CONT) or - (MainRecord.Signature = TERM) - then - Result := 2 - else if MainRecord.Signature = DOOR then - Result := 3 - else if MainRecord.Signature = LIGH then - Result := 4 - else if MainRecord.Signature = MSTT then - Result := 5 - else if MainRecord.Signature = ADDN then - Result := 6 - else if - (MainRecord.Signature = SCRL) or - (MainRecord.Signature = AMMO) or - (MainRecord.Signature = ARMO) or - (MainRecord.Signature = BOOK) or - (MainRecord.Signature = INGR) or - (MainRecord.Signature = KEYM) or - (MainRecord.Signature = MISC) or - (MainRecord.Signature = FURN) or - (MainRecord.Signature = WEAP) or - (MainRecord.Signature = ALCH) - then - Result := 7; -end; - -function wbByteColors(const aName: string = 'Color'): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]); -end; - -function wbFloatColors(const aName: string = 'Color'): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0) - ]); -end; - -function wbWeatherColors(const aName: string): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbByteColors('Sunrise'), - wbByteColors('Day'), - wbByteColors('Sunset'), - wbByteColors('Night'), - wbByteColors('EarlySunrise'), - wbByteColors('LateSunrise'), - wbByteColors('EarlySunset'), - wbByteColors('LateSunset') - ], cpNormal, True, nil, 4); -end; - -function wbAmbientColors(const aSignature: TwbSignature; const aName: string = 'Directional Ambient Lighting Colors'): IwbSubRecordDef; overload; -begin - Result := wbStruct(aSignature, aName, [ - wbStruct('Directional', [ - wbByteColors('X+'), - wbByteColors('X-'), - wbByteColors('Y+'), - wbByteColors('Y-'), - wbByteColors('Z+'), - wbByteColors('Z-') - ]), - wbByteColors('Specular'), - wbFloat('Scale') - ]) -end; - -function wbAmbientColors(const aName: string = 'Directional Ambient Lighting Colors'): IwbStructDef; overload; -begin - Result := wbStruct(aName, [ - wbStruct('Directional', [ - wbByteColors('X+'), - wbByteColors('X-'), - wbByteColors('Y+'), - wbByteColors('Y-'), - wbByteColors('Z+'), - wbByteColors('Z-') - ]), - wbByteColors('Specular'), - wbFloat('Scale', cpIgnore) - ]); -end; - -function wbIntToHexStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - case aType of - ctToStr, ctToSortKey, ctToEditValue: Result := IntToHex(aInt, 8); - else - Result := ''; - end; -end; - -function wbStrToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; - i: integer; -begin - // ignore anything after space or : - i := Pos(' ', aString); - if i = 0 then - i := Pos(':', aString); - - if i <> 0 then - s := Copy(aString, 1, i - 1) - else - s := aString; - - try - Result := StrToInt64(s) - except - Result := 0; - end; -end; - -function wbHexStrToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; - i: integer; -begin - // ignore anything after space or : - i := Pos(' ', aString); - if i = 0 then - i := Pos(':', aString); - - if i <> 0 then - s := Copy(aString, 1, i - 1) - else - s := aString; - - try - Result := StrToInt64('$' + s) - except - Result := 0; - end; -end; - -type - TFaceGenFeature = record - RaceID : String; - Female : Boolean; - Entries : array of record - Index: Cardinal; - Name : String; - end; - end; - PFaceGenFeature = ^TFaceGenFeature; - -var - // cache of race specific face morphs - FaceMorphs: array of TFaceGenFeature; - // cache of race specific tint layers - TintLayers: array of TFaceGenFeature; - // cache of race specific morph groups/presets and values - MorphValues: array of TFaceGenFeature; - - -function wbMorphValueToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; - - function GetCached(const aRaceID: string; aFemale: boolean): PFaceGenFeature; - var - i: integer; - begin - Result := nil; - if Length(MorphValues) <> 0 then - for i := Low(MorphValues) to High(MorphValues) do - if (MorphValues[i].Female = aFemale) and (MorphValues[i].RaceID = aRaceID) then begin - Result := @MorphValues[i]; - Break; - end; - end; - -var - Actor, Race : IwbMainRecord; - Element : IwbElement; - Container, Entry : IwbContainerElementRef; - Container2, Entry2: IwbContainerElementRef; - Female, Female2 : Boolean; - RaceID, EntryName : string; - Cache : PFaceGenFeature; - Index : Cardinal; - i, j, k : integer; - slList : TStringList; -begin - // defaults - case aType of - ctToStr, ctToEditValue: Result := IntToHex64(aInt, 8); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - Actor := aElement.ContainingMainRecord; - if not Assigned(Actor) then - Exit; - - Female := Actor.ElementEditValues['ACBS\Flags\Female'] = '1'; - - Element := Actor.ElementBySignature['RNAM']; - if not Assigned(Element) then - Exit; - - Element := Element.LinksTo; - if not Supports(Element, IwbMainRecord, Race) then - Exit; - - Race := Race.WinningOverride; - RaceID := Race.EditorID; - - Cache := GetCached(RaceID, Female); - - // cache not found, fill with data from RACE - if not Assigned(Cache) then begin - - slList := TStringList.Create; - - for i := 0 to 1 do begin - - Female2 := i = 1; - SetLength(MorphValues, Succ(Length(MorphValues))); - Cache := @MorphValues[Pred(Length(MorphValues))]; - Cache.RaceID := RaceID; - Cache.Female := Female2; - - slList.Clear; - - if not Female2 then - Element := Race.ElementByName['Male Morph Groups'] - else - Element := Race.ElementByName['Female Morph Groups']; - - // iterate over morph groups - if Supports(Element, IwbContainerElementRef, Container) then - for j := 0 to Pred(Container.ElementCount) do begin - if not Supports(Container.Elements[j], IwbContainerElementRef, Entry) then - Break; - - // group name - EntryName := Entry.ElementEditValues['MPGN']; - - // iterate over morph group presets - if not Supports(Entry.ElementByName['Morph Presets'], IwbContainerElementRef, Container2) then - Continue; - - for k := 0 to Pred(Container2.ElementCount) do - if Supports(Container2.Elements[k], IwbContainerElementRef, Entry2) then - slList.AddObject( - EntryName + ' - ' + Entry2.ElementEditValues['MPPN'], - TObject(Cardinal(Entry2.ElementNativeValues['MPPI'])) - ); - end; - - // append morph values, same for both sexes - if Supports(Race.ElementByName['Morph Values'], IwbContainerElementRef, Container) then - for j := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[j], IwbContainerElementRef, Entry) then - slList.AddObject( - Entry.ElementEditValues['MSM0'] + '/' + Entry.ElementEditValues['MSM1'], - TObject(Cardinal(Entry.ElementNativeValues['MSID'])) - ); - - SetLength(Cache.Entries, slList.Count); - - for j := 0 to Pred(slList.Count) do begin - Cache.Entries[j].Index := Cardinal(slList.Objects[j]); - Cache.Entries[j].Name := slList[j]; - end; - - end; - - slList.Free; - - Cache := GetCached(RaceID, Female); - end; - - if not Assigned(Cache) then - Exit; - - EntryName := ''; - Index := Cardinal(aInt); - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do - if Cache.Entries[i].Index = Index then begin - EntryName := Cache.Entries[i].Name; - Break; - end; - - case aType of - ctToStr: begin - if EntryName <> '' then - Result := IntToHex64(aInt, 8) + ' ' + EntryName - else - Result := IntToHex64(aInt, 8) + ' '; - end; - ctCheck: begin - if EntryName = '' then - Result := '' - else - Result := ''; - end; - ctEditType: Result := 'ComboBox'; - ctEditInfo: begin - Result := ''; - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do begin - if Result <> '' then Result := Result + ','; - Result := Result + '"' + IntToHex(Cache.Entries[i].Index, 8) + ' ' + Cache.Entries[i].Name + '"'; - end; - end; - end; -end; - - - -function wbFaceMorphToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; - - function GetCached(const aRaceID: string; aFemale: boolean): PFaceGenFeature; - var - i: integer; - begin - Result := nil; - if Length(FaceMorphs) <> 0 then - for i := Low(FaceMorphs) to High(FaceMorphs) do - if (FaceMorphs[i].Female = aFemale) and (FaceMorphs[i].RaceID = aRaceID) then begin - Result := @FaceMorphs[i]; - Break; - end; - end; - -var - Actor, Race : IwbMainRecord; - Element : IwbElement; - Container, Entry : IwbContainerElementRef; - Female, Female2 : Boolean; - RaceID, EntryName : string; - Cache : PFaceGenFeature; - Index : Cardinal; - i, j : integer; -begin - // defaults - case aType of - ctToStr, ctToEditValue: Result := IntToHex64(aInt, 8); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - Actor := aElement.ContainingMainRecord; - if not Assigned(Actor) then - Exit; - - Female := Actor.ElementEditValues['ACBS\Flags\Female'] = '1'; - - Element := Actor.ElementBySignature['RNAM']; - if not Assigned(Element) then - Exit; - - Element := Element.LinksTo; - if not Supports(Element, IwbMainRecord, Race) then - Exit; - - Race := Race.WinningOverride; - RaceID := Race.EditorID; - - Cache := GetCached(RaceID, Female); - - // cache not found, fill with data from RACE - if not Assigned(Cache) then begin - - for i := 0 to 1 do begin - - Female2 := i = 1; - SetLength(FaceMorphs, Succ(Length(FaceMorphs))); - Cache := @FaceMorphs[Pred(Length(FaceMorphs))]; - Cache.RaceID := RaceID; - Cache.Female := Female2; - - if not Female2 then - Element := Race.ElementByName['Male Face Morphs'] - else - Element := Race.ElementByName['Female Face Morphs']; - - if not Supports(Element, IwbContainerElementRef, Container) then - Continue; - - SetLength(Cache.Entries, Container.ElementCount); - - for j := 0 to Pred(Container.ElementCount) do begin - if not Supports(Container.Elements[j], IwbContainerElementRef, Entry) then - Break; - Cache.Entries[j].Index := Entry.ElementNativeValues['FMRI']; - Cache.Entries[j].Name := Entry.ElementEditValues['FMRN']; - end; - end; - - Cache := GetCached(RaceID, Female); - end; - - if not Assigned(Cache) then - Exit; - - EntryName := ''; - Index := Cardinal(aInt); - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do - if Cache.Entries[i].Index = Index then begin - EntryName := Cache.Entries[i].Name; - Break; - end; - - case aType of - ctToStr: begin - if EntryName <> '' then - Result := IntToHex64(aInt, 8) + ' ' + EntryName - else - Result := IntToHex64(aInt, 8) + ' '; - end; - ctCheck: begin - if EntryName = '' then - Result := '' - else - Result := ''; - end; - ctEditType: Result := 'ComboBox'; - ctEditInfo: begin - Result := ''; - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do begin - if Result <> '' then Result := Result + ','; - Result := Result + '"' + IntToHex(Cache.Entries[i].Index, 8) + ' ' + Cache.Entries[i].Name + '"'; - end; - end; - end; -end; - -function wbTintLayerToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; - - function GetCached(const aRaceID: string; aFemale: boolean): PFaceGenFeature; - var - i: integer; - begin - Result := nil; - if Length(TintLayers) <> 0 then - for i := Low(TintLayers) to High(TintLayers) do - if (TintLayers[i].Female = aFemale) and (TintLayers[i].RaceID = aRaceID) then begin - Result := @TintLayers[i]; - Break; - end; - end; - -var - Actor, Race : IwbMainRecord; - Element : IwbElement; - Container, Entry : IwbContainerElementRef; - Container2, Entry2: IwbContainerElementRef; - Female, Female2 : Boolean; - RaceID, EntryName : string; - Cache : PFaceGenFeature; - Index : Cardinal; - i, j, k : integer; - slList : TStringList; -begin - // defaults - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - Actor := aElement.ContainingMainRecord; - if not Assigned(Actor) then - Exit; - - Female := Actor.ElementEditValues['ACBS\Flags\Female'] = '1'; - - Element := Actor.ElementBySignature['RNAM']; - if not Assigned(Element) then - Exit; - - Element := Element.LinksTo; - if not Supports(Element, IwbMainRecord, Race) then - Exit; - - Race := Race.WinningOverride; - RaceID := Race.EditorID; - - Cache := GetCached(RaceID, Female); - - // cache not found, fill with data from RACE - if not Assigned(Cache) then begin - - slList := TStringList.Create; - - for i := 0 to 1 do begin - - Female2 := i = 1; - SetLength(TintLayers, Succ(Length(TintLayers))); - Cache := @TintLayers[Pred(Length(TintLayers))]; - Cache.RaceID := RaceID; - Cache.Female := Female2; - - if not Female2 then - Element := Race.ElementByName['Male Tint Layers'] - else - Element := Race.ElementByName['Female Tint Layers']; - - if not Supports(Element, IwbContainerElementRef, Container) then - Continue; - - slList.Clear; - - // iterate over tint groups - for j := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[j], IwbContainerElementRef, Entry) then - // iterate over tint group options - if Supports(Entry.ElementByName['Options'], IwbContainerElementRef, Container2) then - for k := 0 to Pred(Container2.ElementCount) do - if Supports(Container2.Elements[k], IwbContainerElementRef, Entry2) then - slList.AddObject( - Entry.ElementEditValues['TTGP'] + ' - ' + Entry2.ElementEditValues['TTGP'], - TObject(Cardinal(Entry2.ElementNativeValues['TETI\Index'])) - ); - - SetLength(Cache.Entries, slList.Count); - - for j := 0 to Pred(slList.Count) do begin - Cache.Entries[j].Index := Cardinal(slList.Objects[j]); - Cache.Entries[j].Name := slList[j]; - end; - end; - - slList.Free; - - Cache := GetCached(RaceID, Female); - end; - - if not Assigned(Cache) then - Exit; - - EntryName := ''; - Index := Cardinal(aInt); - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do - if Cache.Entries[i].Index = Index then begin - EntryName := Cache.Entries[i].Name; - Break; - end; - - case aType of - ctToStr: begin - if EntryName <> '' then - Result := IntToStr(aInt) + ' ' + EntryName - else - Result := IntToStr(aInt) + ' '; - end; - ctCheck: begin - if EntryName = '' then - Result := '' - else - Result := ''; - end; - ctEditType: Result := 'ComboBox'; - ctEditInfo: begin - Result := ''; - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do begin - if Result <> '' then Result := Result + ','; - Result := Result + '"' + IntToStr(Cache.Entries[i].Index) + ' ' + Cache.Entries[i].Name + '"'; - end; - end; - end; -end; - - -var - wbRecordFlagsFlags : IwbFlagsDef; - -procedure DefineFO4a; - -begin - wbNull := wbByteArray('Unused', -255); - wbBoolEnum := wbEnum(['False', 'True']); - wbLLCT := wbInteger(LLCT, 'Count', itU8, nil, cpBenign); - wbCITC := wbInteger(CITC, 'Condition Count', itU32, nil, cpBenign); - wbLVLD := wbInteger(LVLD, 'Chance None', itU8, nil, cpNormal, True); - - wbSPCT := wbInteger(SPCT, 'Count', itU32, nil, cpBenign); - wbSPLO := wbFormIDCk(SPLO, 'Actor Effect', [SPEL, LVSP]); - wbSPLOs := wbRArrayS('Actor Effects', wbSPLO, cpNormal, False, nil, wbSPLOsAfterSet, nil{wbActorTemplateUseActorEffectList}); - - wbKSIZ := wbInteger(KSIZ, 'Keyword Count', itU32, nil, cpBenign); - wbKWDAs := wbArrayS(KWDA, 'Keywords', wbFormIDCk('Keyword', [KYWD, NULL]), 0, cpNormal, False, nil, wbKWDAsAfterSet); - wbReqKWDAs := wbArrayS(KWDA, 'Keywords', wbFormIDCk('Keyword', [KYWD, NULL]), 0, cpNormal, True, nil, wbKWDAsAfterSet); - - wbKeywords := wbRStruct('Keywords', [ - wbKSIZ, - wbReqKWDAs - ], []); - - //wbActorValue := wbInteger('Actor Value', itS32, wbActorValueEnum); - wbActorValue := wbFormIDCkNoReach('Actor Value', [AVIF, NULL]); - - wbCOED := wbStructExSK(COED, [2], [0, 1], 'Extra Data', [ - {00} wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - {04} wbUnion('Global Variable / Required Rank', wbCOEDOwnerDecider, [ - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCk('Global Variable', [GLOB, NULL]), - wbInteger('Required Rank', itS32) - ]), - {08} wbFloat('Item Condition') - ]); - - wbCNTO := - wbRStructExSK([0], [1], 'Item', [ - wbStructExSK(CNTO, [0], [1], 'Item', [ - wbFormIDCk('Item', sigBaseObjects), - wbInteger('Count', itS32) - ]), - wbCOED - ], []); - wbCOCT := wbInteger(COCT, 'Count', itU32, nil, cpBenign); - wbCNTOs := wbRArrayS('Items', wbCNTO, cpNormal, False, nil, wbCNTOsAfterSet); - - {>>> When NAME is user defined these will be incorrect <<<} - wbBipedObjectEnum := wbEnum([ - '30 - Hair Top', - '31 - Hair Long', - '32 - FaceGen Head', - '33 - BODY', - '34 - L Hand', - '35 - R Hand', - '36 - [U] Torso', - '37 - [U] L Arm', - '38 - [U] R Arm', - '39 - [U] L Leg', - '40 - [U] R Leg', - '41 - [A] Torso', - '42 - [A] L Arm', - '43 - [A] R Arm', - '44 - [A] L Leg', - '45 - [A] R Leg', - '46 - Headband', - '47 - Eyes', - '48 - Beard', - '49 - Mouth', - '50 - Neck', - '51 - Ring', - '52 - Scalp', - '53 - Decapitation', - '54 - Unnamed', - '55 - Unnamed', - '56 - Unnamed', - '57 - Unnamed', - '58 - Unnamed', - '59 - Shield', - '60 - Pipboy', - '61 - FX' - ], [ - -1, 'None' - ]); - - wbBipedObjectFlags := wbFlags([ - {0x00000001} '30 - Hair Top', - {0x00000002} '31 - Hair Long', - {0x00000004} '32 - FaceGen Head', - {0x00000008} '33 - BODY', - {0x00000010} '34 - L Hand', - {0x00000020} '35 - R Hand', - {0x00000040} '36 - [U] Torso', - {0x00000080} '37 - [U] L Arm', - {0x00000100} '38 - [U] R Arm', - {0x00000200} '39 - [U] L Leg', - {0x00000400} '40 - [U] R Leg', - {0x00000800} '41 - [A] Torso', - {0x00001000} '42 - [A] L Arm', - {0x00002000} '43 - [A] R Arm', - {0x00004000} '44 - [A] L Leg', - {0x00008000} '45 - [A] R Leg', - {0x00010000} '46 - Headband', - {0x00020000} '47 - Eyes', - {0x00040000} '48 - Beard', - {0x00080000} '49 - Mouth', - {0x00100000} '50 - Neck', - {0x00200000} '51 - Ring', - {0x00400000} '52 - Scalp', - {0x00800000} '53 - Decapitation', - {0x01000000} '54 - Unnamed', - {0x02000000} '55 - Unnamed', - {0x04000000} '56 - Unnamed', - {0x08000000} '57 - Unnamed', - {0x10000000} '58 - Unnamed', - {0x20000000} '59 - Shield', - {0x40000000} '60 - Pipboy', - {0x80000000} '61 - FX' - ], True); - - wbFirstPersonFlagsU32 := wbInteger('First Person Flags', itU32, wbBipedObjectFlags); - - wbBOD2 := wbStruct(BOD2, 'Biped Body Template', [ - wbFirstPersonFlagsU32 - ], cpNormal, False); - - wbMDOB := wbFormID(MDOB, 'Menu Display Object', cpNormal, False); - wbCNAM := wbStruct(CNAM, 'Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unknown', 1) - ]); - - wbDODT := wbStruct(DODT, 'Decal Data', [ - wbFloat('Min Width'), - wbFloat('Max Width'), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Depth'), - wbFloat('Shininess'), - wbStruct('Parallax', [ - wbFloat('Scale'), - wbInteger('Passes', itU8) {>>> This can't be higher than 30 <<<} - ]), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'POM Shadows', - {0x02} 'Alpha - Blending', - {0x04} 'Alpha - Testing', - {0x08} 'No Subtextures' - ], True)), - wbInteger('Alpha Threshold?', itU16), - wbByteColors('Color') - ]); - -// wbRecordFlagsFlags := wbFlags([ -// {>>> 0x00000000 ACTI: Collision Geometry (default) <<<} -// {0x00000001}'ESM', -// {0x00000002}'Unknown 2', -// {>>> 0x00000004 ARMO: Not playable <<<} -// {0x00000004}'NotPlayable', -// {0x00000008}'Unknown 4', -// {0x00000010}'Unknown 5', -// {0x00000020}'Deleted', -// {>>> 0x00000040 ACTI: Has Tree LOD <<<} -// {>>> 0x00000040 REGN: Border Region <<<} -// {>>> 0x00000040 STAT: Has Tree LOD <<<} -// {>>> 0x00000040 REFR: Hidden From Local Map <<<} -// {0x00000040}'Constant HiddenFromLocalMap BorderRegion HasTreeLOD', -// {>>> 0x00000080 TES4: Localized <<<} -// {>>> 0x00000080 PHZD: Turn Off Fire <<<} -// {>>> 0x00000080 SHOU: Treat Spells as Powers <<<} -// {>>> 0x00000080 STAT: Add-on LOD Object <<<} -// {0x00000080}'Localized IsPerch AddOnLODObject TurnOffFire TreatSpellsAsPowers', -// {>>> 0x00000100 ACTI: Must Update Anims <<<} -// {>>> 0x00000100 REFR: Inaccessible <<<} -// {>>> 0x00000100 REFR for LIGH: Doesn't light water <<<} -// {0x00000100}'MustUpdateAnims Inaccessible DoesntLightWater', -// {>>> 0x00000200 ACTI: Local Map - Turns Flag Off, therefore it is Hidden <<<} -// {>>> 0x00000200 REFR: MotionBlurCastsShadows <<<} -// {0x00000200}'HiddenFromLocalMap StartsDead MotionBlurCastsShadows', -// {>>> 0x00000400 LSCR: Displays in Main Menu <<<} -// {0x00000400}'PersistentReference QuestItem DisplaysInMainMenu', -// {0x00000800}'InitiallyDisabled', -// {0x00001000}'Ignored', -// {0x00002000}'ActorChanged', -// {0x00004000}'Unknown 15', -// {>>> 0x00008000 STAT: Has Distant LOD <<<} -// {0x00008000}'VWD', -// {>>> 0x00010000 ACTI: Random Animation Start <<<} -// {>>> 0x00010000 REFR light: Never fades <<<} -// {0x00010000}'RandomAnimationStart NeverFades', -// {>>> 0x00020000 ACTI: Dangerous <<<} -// {>>> 0x00020000 REFR light: Doesn't light landscape <<<} -// {>>> 0x00020000 SLGM: Can hold NPC's soul <<<} -// {>>> 0x00020000 STAT: Use High-Detail LOD Texture <<<} -// {0x00020000}'Dangerous OffLimits DoesntLightLandscape HighDetailLOD CanHoldNPC', -// {0x00040000}'Compressed', -// {>>> 0x00080000 STAT: Has Currents <<<} -// {0x00080000}'CantWait HasCurrents', -// {>>> 0x00100000 ACTI: Ignore Object Interaction <<<} -// {0x00100000}'IgnoreObjectInteraction', -// {0x00200000}'(Used in Memory Changed Form)', -// {0x00400000}'Unknown 23', -// {>>> 0x00800000 ACTI: Is Marker <<<} -// {0x00800000}'IsMarker', -// {0x01000000}'Unknown 25', -// {>>> 0x02000000 ACTI: Obstacle <<<} -// {>>> 0x02000000 REFR: No AI Acquire <<<} -// {0x02000000}'Obstacle NoAIAcquire', -// {>>> 0x04000000 ACTI: Filter <<<} -// {0x04000000}'NavMeshFilter', -// {>>> 0x08000000 ACTI: Bounding Box <<<} -// {0x08000000}'NavMeshBoundingBox', -// {>>> 0x10000000 STAT: Show in World Map <<<} -// {0x10000000}'MustExitToTalk ShowInWorldMap', -// {>>> 0x20000000 ACTI: Child Can Use <<<} -// {>>> 0x20000000 REFR: Don't Havok Settle <<<} -// {0x20000000}'ChildCanUse DontHavokSettle', -// {>>> 0x40000000 ACTI: GROUND <<<} -// {>>> 0x40000000 REFR: NoRespawn <<<} -// {0x40000000}'NavMeshGround NoRespawn', -// {>>> 0x80000000 REFR: MultiBound <<<} -// {0x80000000}'MultiBound' -// ], [18]); - - wbRecordFlagsFlags := wbFlags(wbRecordFlagsFlags, [ - {0x00000001} { 0} 'Unknown 0', - {0x00000002} { 1} 'Unknown 1', - {0x00000004} { 2} 'Unknown 2', - {0x00000008} { 3} 'Unknown 3', - {0x00000010} { 4} 'Unknown 4', - {0x00000020} { 4} 'Unknown 5', - {0x00000040} { 6} 'Unknown 6', - {0x00000080} { 7} 'Unknown 7', - {0x00000100} { 8} 'Unknown 8', - {0x00000200} { 9} 'Unknown 9', - {0x00000400} {10} 'Unknown 10', - {0x00000800} {11} 'Unknown 11', - {0x00001000} {12} 'Unknown 12', - {0x00002000} {13} 'Unknown 13', - {0x00004000} {14} 'Unknown 14', - {0x00008000} {15} 'Unknown 15', - {0x00010000} {16} 'Unknown 16', - {0x00020000} {17} 'Unknown 17', - {0x00040000} {18} 'Unknown 18', - {0x00080000} {19} 'Unknown 19', - {0x00100000} {20} 'Unknown 20', - {0x00200000} {21} 'Unknown 21', - {0x00400000} {22} 'Unknown 22', - {0x00800000} {23} 'Unknown 23', - {0x01000000} {24} 'Unknown 24', - {0x02000000} {25} 'Unknown 25', - {0x04000000} {26} 'Unknown 26', - {0x08000000} {27} 'Unknown 27', - {0x10000000} {28} 'Unknown 28', - {0x20000000} {29} 'Unknown 29', - {0x40000000} {30} 'Unknown 30', - {0x80000000} {31} 'Unknown 31' - ]); - - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags(wbRecordFlagsFlags, wbFlagsList([]))); - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbByteArray('Version Control Info 1', 4, cpIgnore), - wbInteger('Form Version', itU16, nil, cpIgnore), - wbByteArray('Version Control Info 2', 2, cpIgnore) - ]); - - wbSizeOfMainRecordStruct := 24; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - wbXRGB := wbByteArray(XRGB, 'Ragdoll Biped Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - wbSoundLevelEnum := wbEnum([ - 'Loud', - 'Normal', - 'Silent', - 'Very Loud', - 'Quiet' - ]); - - wbEntryPointsEnum := wbEnum([ - { 0} 'Mod Breath Timer', - { 1} 'Mod My Critical Hit Chance', - { 2} 'Mod My Critical Hit Damage Mult', - { 3} 'Mod Mine Explode Chance', - { 4} 'Mod Incoming Limb Damage', - { 5} 'Mod Book Actor Value Bonus', - { 6} 'Mod Recovered Health', - { 7} 'Set Should Attack', - { 8} 'Mod Buy Prices', - { 9} 'Add Leveled List On Death', - {10} 'Set Max Carry Weight', - {11} 'Mod Addiction Chance', - {12} 'Mod Addiction Duration', - {13} 'Mod Positive Chem Duration', - {14} 'Activate', - {15} 'Ignore Running During Detection', - {16} 'Ignore Broken Lock', - {17} 'Mod Enemy Critical Hit Chance', - {18} 'Mod Sneak Attack Mult', - {19} 'Mod Max Placeable Mines', - {20} 'Mod Bow Zoom', - {21} 'Mod Recover Arrow Chance', - {22} 'Mod Exp', - {23} 'Mod Telekinesis Distance', - {24} 'Mod Telekinesis Damage Mult', - {25} 'Mod Telekinesis Damage', - {26} 'Mod Bashing Damage', - {27} 'Mod Power Attack Action Points', - {28} 'Mod Power Attack Damage', - {29} 'Mod Spell Magnitude', - {30} 'Mod Spell Duration', - {31} 'Mod Secondary Value Weight', - {32} 'Mod Armor Weight', - {33} 'Mod Incoming Stagger', - {34} 'Mod Target Stagger', - {35} 'Mod Weapon Attack Damage', - {36} 'Mod Incoming Weapon Damage', - {37} 'Mod Target Damage Resistance', - {38} 'Mod Spell Cost', - {39} 'Mod Percent Blocked', - {40} 'Mod Shield Deflect Arrow Chance', - {41} 'Mod Incoming Spell Magnitude', - {42} 'Mod Incoming Spell Duration', - {43} 'Mod Player Intimidation', - {44} 'Mod Ricochet Chance', - {45} 'Mod Ricochet Damage', - {46} 'Mod Bribe Amount', - {47} 'Mod Detection Light', - {48} 'Mod Detection Movement', - {49} 'Mod Scrap Reward Mult', - {50} 'Set Sweep Attack', - {51} 'Apply Combat Hit Spell', - {52} 'Apply Bashing Spell', - {53} 'Apply Reanimate Spell', - {54} 'Set Boolean Graph Variable', - {55} 'Mod Spell Casting Sound Event', - {56} 'Mod Pickpocket Chance', - {57} 'Mod Detection Sneak Skill', - {58} 'Mod Falling Damage', - {59} 'Mod Lockpick Sweet Spot', - {60} 'Mod Sell Prices', - {61} 'Set Pickpocket Equipped Item', - {62} 'Set Player Gate Lockpick', - {63} 'Set Lockpick Starting Arc', - {64} 'Set Progression Picking', - {65} 'Set Lockpicks Unbreakable', - {66} 'Mod Alchemy Effectiveness', - {67} 'Apply Weapon Swing Spell', - {68} 'Mod Commanded Actor Limit', - {69} 'Apply Sneaking Spell', - {70} 'Mod Player Magic Slowdown', - {71} 'Mod Ward Magicka Absorption Pct', - {72} 'Mod Initial Ingredient Effects Learned', - {73} 'Purify Alchemy Ingredients', - {74} 'Set Filter Activation', - {75} 'Set Dual Cast', - {76} 'Mod Outgoing Explosion Limb Damage', - {77} 'Mod Enchantment Power', - {78} 'Mod Soul Pct Captured to Weapon', - {79} 'Mod VATS Attack Action Points', - {80} 'Mod Reflect Damage Chance', - {81} 'Set Activate Label', - {82} 'Mod Kill Experience', - {83} 'Mod Poison Dose Count', - {84} 'Set Apply Placed Item', - {85} 'Mod Armor Rating', - {86} 'Mod lockpicking crime chance', - {87} 'Mod ingredients harvested', - {88} 'Mod Spell Range (Target Loc.)', - {89} 'Mod Critical Charge Mult on Ricochet', - {90} 'Mod lockpicking key reward chance', - {91} 'Mod Auto Lockpicking Chance', - {92} 'Mod Auto Hacking Chance', - {93} 'Mod Typed Weapon Attack Damage', - {94} 'Mod Typed Incoming Weapon Damage', - {95} 'Mod Charisma Challenge Chance', - {96} 'Mod Sprint AP Drain Rate', - {97} 'Mod Drawn Weapon Weight Speed Effect', - {98} 'Set Player Gate Hacking', - {99} 'Mod Player Explosion Damage', - {100} 'Mod Player Explosion Scale', - {101} 'Set Rads To Health Mult', - {102} 'Mod Actor Scope Stability', - {103} 'Mod Actor Grenade Speed Mult', - {104} 'Mod Explosion Force', - {105} 'Mod VATS Penetration Min Visibility', - {106} 'Mod Rads for Rad Health Max', - {107} 'Mod VATS Player AP On Kill Chance', - {108} 'Set VATS Fill Critical Bar On Hit', - {109} 'Mod VATS Concentrated Fire Chance Bonus', - {110} 'Mod VATS Critical Count', - {111} 'Mod VATS Hold Em Steady Bonus', - {112} 'Mod Typed Spell Magnitude', - {113} 'Mod Typed Incoming Spell Magnitude', - {114} 'Set VATS Gun-Fu Num Targets For Crits', - {115} 'Mod Outgoing Limb Damage', - {116} 'Mod Restore Action Cost Value', - {117} 'Mod VATS Reload Action Points', - {118} 'Mod Incoming Battery Damage', - {119} 'Mod VATS Critical Charge', - {120} 'Mod Exp Location', - {121} 'Mod Exp Speech', - {122} 'Mod VATS Head Shot Chance', - {123} 'Mod VATS Hit Chance', - {124} 'Mod Incoming Explosion Damage', - {125} 'Mod Ammo Health Mult', - {126} 'Mod Hacking Guesses', - {127} 'Mod Terminal Lockout Time', - {128} 'Set Undetectable', - {129} 'Invest In Vendor', - {130} 'Mod Outgoing Limb Bash Damage', - {131} 'Set Run While Over Encumbered', - {132} 'Get Component Radar Distance', - {133} 'Show Grenade Trajectory', - {134} 'Mod Cone-of-fire Mult', - {135} 'Mod VATS Concentrated Fire Damage Mult', - {136} 'Apply Bloody Mess Spell', - {137} 'Mod VATS Critical Fill Chance On Bank', - {138} 'Mod VATS Critical Fill Chance On Use', - {139} 'Set VATS Critical Fill On AP Reward', - {140} 'Set VATS Critical Fill On Stranger', - {141} 'Mod Gun Range Mult', - {142} 'Mod Scope Hold Breath AP Drain Mult', - {143} 'Set Force Decapitate', - {144} 'Mod VATS Shoot Explosive Damage Mult', - {145} 'Mod Scrounger Fill Ammo Chance', - {146} 'Set Can Explode Pants', - {147} 'Set VATS Penetration Full Damage', - {148} 'Mod VATS Gun-Fu 2nd Target Dmg Mult', - {149} 'Mod VATS Gun-Fu 3rd Target Dmg Mult', - {150} 'Mod VATS Gun-Fu 4th+ Target Dmg Mult', - {151} 'Mod VATS Blitz Max Distance', - {152} 'Set VATS Blitz Max Dmg Mult', - {153} 'Mod VATS Blitz Dmg Bonus Dist', - {154} 'Mod Bash Critical Chance', - {155} 'VATS Apply Paralyzing Palm Spell', - {156} 'Null Function' - ]); - - wbEquipType := wbFlags([ - {0x00000001} 'Hand To Hand Melee', - {0x00000002} 'One Hand Sword', - {0x00000004} 'One Hand Dagger', - {0x00000008} 'One Hand Axe', - {0x00000010} 'One Hand Mace', - {0x00000020} 'Two Hand Sword', - {0x00000040} 'Two Hand Axe', - {0x00000080} 'Bow', - {0x00000100} 'Staff', - {0x00000200} 'Gun', - {0x00000400} 'Grenade', - {0x00000800} 'Mine', - {0x00001000} 'Spell', - {0x00002000} 'Shield', - {0x00004000} 'Torch' - ], True); - - wbEmotionTypeEnum := wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise', - {7} 'Puzzled' - ]); - - wbFurnitureAnimTypeEnum := wbEnum([ - {0} '', - {1} 'Sit', - {2} 'Lay', - {3} '', - {4} 'Lean' - ]); - - wbFurnitureEntryTypeFlags := wbFlags([ - {0x01} 'Front', - {0x02} 'Behind', - {0x04} 'Right', - {0x08} 'Left', - {0x10} 'Up' - ]); - - wbWardStateEnum := wbEnum([ - 'None', - 'Absorb', - 'Break' - ]); - - wbEventFunctionEnum := wbEnum([ - 'GetIsID', - 'IsInList', - 'GetValue', - 'HasKeyword', - 'GetItemValue' - ]); - - // Event member names and availability are different depending on event type - // Using generic names for the last 3 of them: Form, Value1, Value2 - wbEventMemberEnum := wbEnum([], [ - $0000, 'None', - $314F, 'CreatedObject', - $314C, '(Old)Location', - $324C, '(New)Location', - $314B, 'Keyword', - $3146, 'Form', - $3156, 'Value1', - $3256, 'Value2' - ]); - - wbWeaponAnimTypeEnum := wbEnum([ - {0} 'HandToHandMelee', - {1} 'OneHandSword', - {2} 'OneHandDagger', - {3} 'OneHandAxe', - {4} 'OneHandMace', - {5} 'TwoHandSword', - {6} 'TwoHandAxe', - {7} 'Bow', - {8} 'Staff', - {9} 'Crossbow' - ]); - - wbReverbClassEnum := wbEnum([ - 'Default', - 'Class A', - 'Class B', - 'Class C', - 'Class D', - 'Class E' - ]); - - wbHitBehaviourEnum := wbEnum([ - 'Normal formula behaviour', - 'Dismember only', - 'Explode only', - 'No dismember/explode' - ]); - - wbEDID := wbString(EDID, 'Editor ID', 0, cpNormal); // not cpBenign according to Arthmoor - wbFULL := wbLStringKC(FULL, 'Name', 0, cpTranslate); - wbFULLActor := wbLStringKC(FULL, 'Name', 0, cpTranslate, False, nil{wbActorTemplateUseBaseData}); - wbFULLReq := wbLStringKC(FULL, 'Name', 0, cpTranslate, True); - wbDESC := wbLStringKC(DESC, 'Description', 0, cpTranslate); - wbDESCReq := wbLStringKC(DESC, 'Description', 0, cpTranslate, True); - wbXSCL := wbFloat(XSCL, 'Scale'); - - wbOBND := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ]); - - wbOBNDReq := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ], cpNormal, True); - - wbPropTypeEnum := wbEnum([ - {00} 'None', - {01} 'Object', - {02} 'String', - {03} 'Int32', - {04} 'Float', - {05} 'Bool', - {06} 'Variable', - {07} 'Struct', - {08} '', - {09} '', - {10} '', - {11} 'Array of Object', - {12} 'Array of String', - {13} 'Array of Int32', - {14} 'Array of Float', - {15} 'Array of Bool', - {16} 'Array of Variable', - {17} 'Array of Struct' - ]); - - wbScriptFlags := wbInteger('Flags', itU8, wbEnum([ - {0x00} 'Local', - {0x01} 'Inherited', - {0x02} 'Removed', - {0x03} 'Inherited and Removed' - ])); - - wbScriptPropertyObject := wbUnion('Object Union', wbScriptObjFormatDecider, [ - wbStructSK([1], 'Object v2', [ - wbInteger('Unused', itU16, nil, cpIgnore), - wbInteger('Alias', itS16, wbScriptObjectAliasToStr, wbStrToAlias), - wbFormID('FormID') - ], [2, 1, 0]), - wbStructSK([1], 'Object v1', [ - wbFormID('FormID'), - wbInteger('Alias', itS16, wbScriptObjectAliasToStr, wbStrToAlias), - wbInteger('Unused', itU16, nil, cpIgnore) - ]) - ]); - - wbScriptPropertyStruct := - wbArrayS('Struct', wbStructSK([0], 'Member', [ - wbLenString('memberName', 2), - wbInteger('Type', itU8, wbPropTypeEnum, cpNormal, False, nil, wbScriptPropertyTypeAfterSet), - wbInteger('Flags', itU8, wbEnum([ - {0x00} '', - {0x01} 'Edited', - {0x02} '', - {0x03} 'Removed' - ])), - wbUnion('Value', wbScriptPropertyStructMemberDecider, [ - {00} wbNull, - {01} wbScriptPropertyObject, - {02} wbLenString('String', 2), - {03} wbInteger('Int32', itS32), - {04} wbFloat('Float'), - {05} wbInteger('Bool', itU8, wbBoolEnum), - {11} wbArray('Array of Object', wbScriptPropertyObject, -1), - {12} wbArray('Array of String', wbLenString('Element', 2), -1), - {13} wbArray('Array of Int32', wbInteger('Element', itS32), -1), - {14} wbArray('Array of Float', wbFloat('Element'), -1), - {15} wbArray('Array of Bool', wbInteger('Element', itU8, wbBoolEnum), -1) - ]) - ]), -1, cpNormal, False); - - wbScriptProperties := - wbArrayS('Properties', wbStructSK([0], 'Property', [ - wbLenString('propertyName', 2), - wbInteger('Type', itU8, wbPropTypeEnum, cpNormal, False, nil, wbScriptPropertyTypeAfterSet), - wbInteger('Flags', itU8, wbEnum([ - {0x00} '', - {0x01} 'Edited', - {0x02} '', - {0x03} 'Removed' - ])), - wbUnion('Value', wbScriptPropertyDecider, [ - {00} wbNull, - {01} wbScriptPropertyObject, - {02} wbLenString('String', 2), - {03} wbInteger('Int32', itS32), - {04} wbFloat('Float'), - {05} wbInteger('Bool', itU8, wbBoolEnum), - {06} wbScriptPropertyStruct, // Variable. No idea if possible or how to decode, leaving like that for the moment - {07} wbScriptPropertyStruct, - {11} wbArray('Array of Object', wbScriptPropertyObject, -1), - {12} wbArray('Array of String', wbLenString('Element', 2), -1), - {13} wbArray('Array of Int32', wbInteger('Element', itS32), -1), - {14} wbArray('Array of Float', wbFloat('Element'), -1), - {15} wbArray('Array of Bool', wbInteger('Element', itU8, wbBoolEnum), -1), - {17} wbArray('Array of Struct', wbScriptPropertyStruct, -1) - ]) - ]), -2, cpNormal, False, nil, nil, nil, False); - - wbScriptEntry := wbStructSK([0], 'Script', [ - wbLenString('scriptName', 2), - wbScriptFlags, - wbScriptProperties - ]); - - wbScriptFragmentsInfo := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd' - ])), - wbScriptEntry, - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsInfoCounter) - ]); - - wbScriptFragmentsPack := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd', - {4} 'OnChange' - ])), - wbScriptEntry, - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd, OnChange - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsPackCounter) - ]); - - wbScriptFragmentsQuest := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('fragmentCount', itU16), - wbLenString('scriptName', 2), - // if scriptName = "" then no Flags and Properties - wbUnion('Script', wbScriptFragmentsEmptyScriptDecider, [ - wbStruct('Script Data', [ - wbScriptFlags, - wbScriptProperties - ]), -// Quest [000179EF] -// Quest [000792CA] "Merchant Dialogue System" -// Quest [00091FE1] -// MQ101KelloggSequence "Kellogg Sequence in Vault 111" [QUST:000D3997] -// DialogueGlowingSeaAtom "Children of the Atom Dialogue" [QUST:0012DB31] -// BoSIdleHandlerQuest [QUST:00157460] - wbNull - ]), - wbArrayS('Fragments', - wbStructSK([0, 2], 'Fragment', [ - wbInteger('Quest Stage', itU16), - wbInteger('Unknown', itS16), - wbInteger('Quest Stage Index', itS32), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), - wbScriptFragmentsQuestCounter) - ]); - - wbScriptFragmentsScen := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd' - ])), - wbScriptEntry, - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsSceneCounter), - wbArray('Phase Fragments', - wbStructSK([0, 1], 'Phase Fragment', [ - wbInteger('Phase Flag', itU8, wbFlags([ - {1} 'OnStart', - {2} 'OnCompletion' - ])), - wbInteger('Phase Index', itU8), - wbInteger('Unknown', itS16), - wbInteger('Unknown', itS8), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), -2) - ]); - - wbScriptFragments := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbScriptEntry, - wbArrayS('Fragments', - wbStructSK([0], 'Fragment', [ - wbInteger('Fragment Index', itU16), - wbInteger('Unknown', itS16), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), -2) - ]); - - {>>> http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format/VMAD_Field <<<} - - wbVMAD := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False) - ]); - - wbVMADFragmentedPERK := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragments - ], cpNormal, False, nil, 3); - - wbVMADFragmentedPACK := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsPack - ], cpNormal, False, nil, 3); - - wbVMADFragmentedQUST := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsQuest, - wbArrayS('Aliases', wbStructSK([0], 'Alias', [ - wbScriptPropertyObject, - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Alias Scripts', wbScriptEntry, -2) - ]), -2) - ], cpNormal, False, nil, 3); - - wbVMADFragmentedSCEN := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsScen - ], cpNormal, False, nil, 3); - - wbVMADFragmentedINFO := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsInfo - ], cpNormal, False, nil, 3); - - wbAttackData := wbRStructSK([1], 'Attack', [ - wbStruct(ATKD, 'Attack Data', [ - wbFloat('Damage Mult'), - wbFloat('Attack Chance'), - wbFormIDCk('Attack Spell', [SPEL, NULL]), - wbInteger('Attack Flags', itU32, wbFlags([ - {0x00000001} 'Ignore Weapon', - {0x00000002} 'Bash Attack', - {0x00000004} 'Power Attack', - {0x00000008} 'Charge Attack', - {0x00000010} 'Rotating Attack', - {0x00000020} 'Continuous Attack', - {0x00000040} 'Unknown 6', - {0x00000080} 'Unknown 7', - {0x00000100} 'Unknown 8', - {0x00000200} 'Unknown 9', - {0x00000400} 'Unknown 10', - {0x00000800} 'Unknown 11', - {0x00001000} 'Unknown 12', - {0x00002000} 'Unknown 13', - {0x00004000} 'Unknown 14', - {0x00008000} 'Unknown 15', - {0x00010000} 'Unknown 16', - {0x00020000} 'Unknown 17', - {0x00040000} 'Unknown 18', - {0x00080000} 'Unknown 19', - {0x00100000} 'Unknown 20', - {0x00200000} 'Unknown 21', - {0x00400000} 'Unknown 22', - {0x00800000} 'Unknown 23', - {0x01000000} 'Unknown 24', - {0x02000000} 'Unknown 25', - {0x04000000} 'Unknown 26', - {0x08000000} 'Unknown 27', - {0x10000000} 'Unknown 28', - {0x20000000} 'Unknown 29', - {0x40000000} 'Unknown 30', - {0x80000000} 'Override Data' - ])), - wbFloat('Attack Angle'), - wbFloat('Strike Angle'), - wbFloat('Stagger'), - wbFloat('Knockdown'), - wbFloat('Recovery Time'), - wbFloat('Action Points Mult'), - wbInteger('Stagger Offset', itS32) - ]), - wbString(ATKE, 'Attack Event'), - wbFormIDCk(ATKW, 'Weapon Slot', [EQUP]), - wbFormIDCk(ATKS, 'Required Slot', [EQUP]), - wbString(ATKT, 'Description') - ], []); - - wbLocationEnum := wbEnum([ - {0} 'Near reference', // string dump: '%s' in '%s' radius %u - {1} 'In cell', // string dump: In cell '%s' - {2} 'Near package start location', // string dump: Near package start location, radius %u - {3} 'Near editor location', // string dump: Near editor location, radius %u - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', // string dump: Near linked reference, radius %u%s%s - {7} 'At package location', // string dump: At package location, radius %u - {8} 'Alias (reference)', // string dump: Alias: %s [item #%u], radius %u - {9} 'Alias (location)', // string dump: Alias: %s, radius %u - {10} 'Target', // string dump: - {11} 'Target (location)', // string dump: Target: %s, radius %u - {12} 'Near self', // Near Self, radius %u - {13} 'Near Editor Location Cell', - {14} 'Alias (ref collection)' - ]); - - wbObjectTypeEnum := wbEnum([ - { 0} ' NONE', - { 1} 'Activators', - { 2} 'Armor', - { 3} 'Books', - { 4} 'Containers', - { 5} 'Doors', - { 6} 'Ingredients', - { 7} 'Lights', - { 8} 'Miscellaneous', - { 9} 'Flora', - {10} 'Furniture', - {11} 'Weapons: Any', - {12} 'Ammo', - {13} 'Keys', - {14} 'Alchemy', - {15} 'Food', - {16} 'Clothing', - {17} 'All: Wearable', - {18} 'Weapons: NONE', - {19} 'Weapons: Melee', - {20} 'Weapons: Ranged', - {21} 'Spells: Any', - {22} 'Spells: Range Target', - {23} 'Spells: Range Touch', - {24} 'Spells: Range Self', - {25} 'Actors: Any', - {26} 'Furniture: Beds', - {27} 'Furniture: Chairs', - {28} 'Shouts', - {29} 'Headtrack Markers' - ]); - - wbPLDT := wbStruct(PLDT, 'Location', [ - wbInteger('Type', itS32, wbLocationEnum), - wbUnion('Location Value', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', sigReferences), - {1} wbFormIDCkNoReach('Cell', [NULL, CELL]), - {2} wbByteArray('Near Package Start Location', 4, cpIgnore), - {3} wbByteArray('Near Editor Location', 4, cpIgnore), - {4} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, OMOD, BOOK, NOTE, KEYM, ALCH, INGR, LIGH, FACT, FLST, IDLM, TXST, PROJ]), - {5} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {6} wbFormIDCk('Keyword', [NULL, KYWD]), - {7} wbByteArray('Unused', 4, cpIgnore), - {8} wbInteger('Ref Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {9} wbInteger('Loc Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {10} wbInteger('Interrupt Data', itU32), - {11} wbInteger('Packdata Target', itU32), - {12} wbByteArray('Unknown', 4, cpIgnore), - {13} wbByteArray('Unknown', 4), - {14} wbInteger('Ref Collection Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias) - ]), - wbInteger('Radius', itS32), - wbInteger('Collection Index', itU32) - ], cpNormal, False, nil, 3); - - wbPLVD := wbStruct(PLVD, 'Location', [ - wbInteger('Type', itS32, wbLocationEnum), - wbUnion('Location Value', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', sigReferences), - {1} wbFormIDCkNoReach('Cell', [NULL, CELL]), - {2} wbByteArray('Near Package Start Location', 4, cpIgnore), - {3} wbByteArray('Near Editor Location', 4, cpIgnore), - {4} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, OMOD, BOOK, NOTE, KEYM, ALCH, INGR, LIGH, FACT, FLST, IDLM, TXST, PROJ]), - {5} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {6} wbFormIDCk('Keyword', [NULL, KYWD]), - {7} wbByteArray('Unused', 4, cpIgnore), - {8} wbInteger('Ref Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {9} wbInteger('Loc Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {10} wbInteger('Interrupt Data', itU32), - {11} wbInteger('Packdata Target', itU32), - {12} wbByteArray('Unknown', 4, cpIgnore), - {13} wbByteArray('Unknown', 4), - {14} wbInteger('Ref Collection Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias) - ]), - wbInteger('Radius', itS32), - wbInteger('Collection Index', itU32) - ], cpNormal, False, nil, 3); - - wbTargetData := wbStruct('Target Data', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific Reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference', - {4} 'Ref Alias', - {5} 'Interrupt Data', - {6} 'Self', - {7} 'Keyword', - {8} 'Unknown 8' - ]), cpNormal, False, nil, nil, 2), - wbUnion('Target', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', sigReferences, True), - {1} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, OMOD, BOOK, NOTE, KEYM, ALCH, INGR, LIGH, FACT, FLST, IDLM, TXST, PROJ]), - {2} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {3} wbFormIDCk('Keyword', [KYWD, NULL]), - {4} wbInteger('Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {5} wbInteger('Interrupt Data', itU32), - {6} wbByteArray('Unknown', 4, cpIgnore), - {7} wbFormIDCk('Keyword', [KYWD, NULL]), - {8} wbByteArray('Unknown', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32) - ]); - - wbEITM := wbFormIDCk(EITM, 'Object Effect', [ENCH, SPEL]); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMODS := wbFormIDCk(MODS, 'Material Swap', [MSWP]); - wbMO2S := wbFormIDCk(MO2S, 'Material Swap', [MSWP]); - wbMO3S := wbFormIDCk(MO3S, 'Material Swap', [MSWP]); - wbMO4S := wbFormIDCk(MO4S, 'Material Swap', [MSWP]); - wbMO5S := wbFormIDCk(MO5S, 'Material Swap', [MSWP]); - - wbMODF := wbUnknown(MODF); - wbMO2F := wbUnknown(MO2F); - wbMO3F := wbUnknown(MO3F); - wbMO4F := wbUnknown(MO4F); - wbMO5F := wbUnknown(MO5F); - - wbMODC := wbFloat(MODC, 'Color Remapping Index'); - wbMO2C := wbFloat(MO2C, 'Color Remapping Index'); - wbMO3C := wbFloat(MO3C, 'Color Remapping Index'); - wbMO4C := wbFloat(MO4C, 'Color Remapping Index'); - wbMO5C := wbFloat(MO5C, 'Color Remapping Index'); - - wbMODT := wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow); - wbDMDT := wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow); - {wbMODT := wbStruct(MODT, 'Texture Files Hashes', [ - wbInteger('Number of headers', itU32), - wbInteger('Textures count', itU32), - wbByteArray('Unused', 4), - wbInteger('Unique textures count', itU32), - wbInteger('Materials count', itU32), - wbArray('Hashes', wbStruct('Hash', [ - wbByteArray('Flags', 4), - wbString('Type', 4), - wbByteArray('Texture hash', 4) - ])) - ]);} - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS, - wbMODC, - wbMODF - ], [], cpNormal, False, nil, True); - - wbMODLActor := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS - ], [], cpNormal, False, nil{wbActorTemplateUseModelAnimation}, True); - - wbMODLReq := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS, - wbMODC, - wbMODF - ], [], cpNormal, True, nil, True); - - wbDMDS := wbFormIDCk(DMDS, 'Material Swap', [MSWP]); - wbDMDC := wbFloat(DMDC, 'Color Remapping Index'); - - wbDEST := wbRStruct('Destructible', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('DEST Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'VATS Targetable', - 'Large Actor Destroys' - ])), - wbByteArray('Unknown', 2) - ]), - wbArrayS(DAMC, 'Resistances', wbStructSK([0], 'Resistance', [ - wbFormIDCk('Damage Type', [DMGT]), - wbInteger('Value', itU32) - ])), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Model Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy', - 'Ignore External Dmg', - 'Becomes Dynamic' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbString(DSTA, 'Sequence Name'), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename', 0, cpNormal, True), - wbDMDT, - wbDMDC, - wbDMDS - ], [], cpNormal, False, nil, True), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], [], cpNormal, False, nil) - ) - ], [], cpNormal, False, nil); - - wbDESTActor := wbRStruct('Destructible', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('VATS Targetable', itU8, wbBoolEnum), - wbByteArray('Unknown', 2) - ]), - wbRArray('Stages', // Begin Stage Array - wbRStruct('Stage', [ // Begin Stage RStruct - wbStruct(DSTD, 'Destruction Stage Data', [ // Begin DSTD - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), // End DSTD - wbRStructSK([0], 'Model', [ // Begin DMDL - wbString(DMDL, 'Model Filename') - ], []), // End DMDL - wbDMDT, - wbDMDC, - wbDMDS, - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) // Begin Stage RStruct - ) // End Stage Array - ], [], cpNormal, False, nil{wbActorTemplateUseModelAnimation}); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', sigReferences), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent', - 'Pop In' - ])), - wbByteArray('Unused', 3, cpIgnore) - ]); - - wbPDTO := - wbStruct(PDTO, 'Topic Data', [ - wbInteger('Type', itU32, wbEnum([ - 'Topic Ref', - 'Topic Subtype' - ])), - wbUnion('Data', wbTypeDecider, [ - wbFormIDCk('Topic', [DIAL, NULL]), - wbString('Subtype', 4) - ]) - ]); - - wbPDTOs := wbRArray('Topic', wbPDTO, cpNormal, False, nil); - - wbXLCM := wbInteger(XLCM, 'Level Modifier', itS32, wbEnum([ - 'Easy', - 'Medium', - 'Hard', - 'Very Hard' - ])); - - if wbSimpleRecords then begin - wbMaxHeightDataCELL := wbByteArray(MHDT, 'Max Height Data', 0, cpNormal); - wbMaxHeightDataWRLD := wbByteArray(MHDT, 'Max Height Data', 0, cpNormal); - end - else begin - wbMaxHeightDataCELL := wbStruct(MHDT, 'Max Height Data', [ - wbFloat('Offset'), - wbArray('Rows', - wbByteArray('Columns', 32) - // way too verbose for no practical use - //wbStruct('Row', [ wbArray('Columns', wbInteger('Column', itU8), 32) ]) - , 32) - ]); - wbMaxHeightDataWRLD := wbStruct(MHDT, 'Max Height Data', [ - wbStruct('Min', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('Max', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbByteArray('Cell Data', 0) - // way too verbose for no practical use - {wbArray('Cell Data', wbStruct('Quad Height', [ - wbInteger('Bottom Left', itU8), - wbInteger('Bottom Right', itU8), - wbInteger('Top Left', itU8), - wbInteger('Top Right', itU8) - ]))} - ]); - end; - - if wbSimpleRecords then - wbOFST := wbByteArray(OFST, 'Offset Data') - else - wbOFST := wbArray(OFST, 'Offset Data', wbArray('Rows', wbInteger('Offset', itU32), wbOffsetDataColsCounter), 0); - - wbXOWN := wbStruct(XOWN, 'Owner', [ - wbFormIDCkNoReach('Owner', [FACT, ACHR, NPC_]), - wbByteArray('Unknown', 4), - wbInteger('Flags', itU8, wbFlags(['No Crime'])), - wbByteArray('Unknown', 3) - ]); - wbXRNK := wbInteger(XRNK, 'Owner Faction Rank', itS32); - - if wbSimpleRecords then - wbNVNM := wbStruct(NVNM, 'Navmesh Geometry', [ - wbInteger('Version', itU32), - wbByteArray('Magic', 4), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNVNMParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]), - wbByteArray('Vertices and Triangles') - ]) - else - wbNVNM := wbStruct(NVNM, 'Navmesh Geometry', [ - wbInteger('Version', itU32), // Changes how the struct is loaded, should be 15 in FO4 - wbStruct('Pathing Cell', [ - wbInteger('Magic', itU32), // This looks like a magic number (always $A5E9A03C), loaded with the parents - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNVNMParentDecider, [ // same as TES5 cell if worldspace is null or Grid X Y - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]) - ]), - wbArray('Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), -1), - wbArray('Triangles', - wbStruct('Triangle', [ - wbInteger('Vertex 0', itS16), - wbInteger('Vertex 1', itS16), - wbInteger('Vertex 2', itS16), - wbInteger('Edge 0-1', itS16), - wbInteger('Edge 1-2', itS16), - wbInteger('Edge 2-0', itS16), - wbFloat('Height'), // this and next if form ver > 57 - wbInteger('Unknown', itU8, wbFlags([])), // flags - wbInteger('Unknown', itU32) // encoding or flags - ]) - , -1), - wbArray('Edge Links', - wbStruct('Edge Link', [ - wbInteger('Unknown', itU32), - wbFormIDCk('Mesh', [NAVM]), // those last three are a structure - wbInteger('Triangle', itS16), - wbInteger('Unknown', itU8) // if form ver > 127 - ]) - , -1), - wbArray('Door Triangles', - wbStruct('Door Triangle', [ - wbInteger('Triangle before door', itU16), // I would say itU16 - wbInteger('DTUnknown', itU32), // used as a key to lookup in a map of PathingDoor - wbUnion('Door', wbDoorTriangleDoorTriangleDecider, [wbNull, wbFormIDCk('Door', [REFR])]) - ]) - , -1), - wbArray('Unknown 5', // if navmesh version gt 12 - wbStruct('Unknown', [ - wbInteger('Unknown', itU16), - wbInteger('Unknown', itU16), - wbInteger('Unknown', itU32 {, wbFlags([]) ? }) - ]) - , -1), - wbArray('Unknown 6', - wbStruct('Uknown', [ - wbInteger('Unknown', itU16), - wbInteger('Unknown', itU16) - ]) - , -1), - wbArray('Unknown 7', // if navmesh version gt 11 - wbStruct('Unknown', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbInteger('Unknown', itU16), - wbInteger('Unknown', itU32) - ]) - , -1), - wbStruct('Navmesh Grid', [ - wbInteger('Navmesh Grid Size', itU32), // max 12 - wbFloat('Max X Distance'), - wbFloat('Max Y Distance'), - wbFloat('Min X'), - wbFloat('Min Y'), - wbFloat('Min Z'), - wbFloat('Max X'), - wbFloat('Max Y'), - wbFloat('Max Z'), - wbArray('NavMesh Grid Arrays', wbArray('NavMeshGridCell', wbInteger('Triangle', itS16), -1)) // There are NavMeshGridSize^2 arrays to load - ]) - ]); - -end; - -procedure DefineFO4b; -begin - - wbRecord(ACHR, 'Placed NPC', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Starts Dead', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x02000000} 25, 'No AI Acquire', - {0x20000000} 29, 'Don''t Havok Settle' - ], True, True)), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Ragdoll ---} - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbPDTOs, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbInteger(XHLT, 'Health %', itU32), - - wbRArrayS('Linked References', wbStructSK(XLKR, [0], 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', sigReferences) - ], cpNormal, False, nil, 1)), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', sigReferences), - wbFloat('Delay') - ]) - ) - ], []), - - wbEmpty(XLKT, 'Linked Ref Transient'), - wbFormIDCk(XRFG, 'Reference Group', [RFGP]), - wbFormIDCk(XLYR, 'Layer', [LAYR]), - wbFormIDCk(XMSP, 'Material Swap', [MSWP]), - - wbFormIDCk(XLCN, 'Persistent Location', [LCTN]), - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - - wbEmpty(XIS2, 'Ignored by Sandbox'), - wbRArray('Spline Connection', wbStruct(XPLK, 'Link', [ - wbFormIDCk('Ref', [REFR, ACHR]), - wbUnknown // always 00 00 00 00 so far in DLCWorkshop03.esm - ])), - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - - {--- Enable Parent ---} - wbXESP, - - {--- Ownership ---} - wbXOWN, - wbXRNK, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', sigReferences), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot, - wbString(MNAM, 'Comments') - ], True, wbPlacedAddInfo); - - wbVatsValueFunctionEnum := - wbEnum([ - { 0} 'Weapon Is', - { 1} 'Weapon In List', - { 2} 'Target Is', - { 3} 'Target In List', - { 4} 'Target Distance', - { 5} 'Target Part', - { 6} 'VATS Action', - { 7} 'Is Success', - { 8} 'Is Critical', - { 9} 'Critical Effect Is', - {10} 'Critical Effect In List', - {11} 'Is Fatal', - {12} 'Explode Part', - {13} 'Dismember Part', - {14} 'Cripple Part', - {15} 'Weapon Type Is', - {16} 'Is Stranger', - {17} 'Is Paralyzing Palm', - {18} 'Projectile Type Is', - {19} 'Delivery Type Is', - {20} 'Casting Type Is' - ]); - - wbActorValueEnum := - wbEnum([ - {00} 'Aggression', - {01} 'Confidence', - {02} 'Energy', - {03} 'Morality', - {04} 'Mood', - {05} 'Assistance', - {06} 'One-Handed', - {07} 'Two-Handed', - {08} 'Archery', - {09} 'Block', - {10} 'Smithing', - {11} 'Heavy Armor', - {12} 'Light Armor', - {13} 'Pickpocket', - {14} 'Lockpicking', - {15} 'Sneak', - {16} 'Alchemy', - {17} 'Speech', - {18} 'Alteration', - {19} 'Conjuration', - {20} 'Destruction', - {21} 'Illusion', - {22} 'Restoration', - {23} 'Enchanting', - {24} 'Health', - {25} 'Magicka', - {26} 'Stamina', - {27} 'Heal Rate', - {28} 'Magicka Rate', - {29} 'Stamina Rate', - {30} 'Speed Mult', - {31} 'Inventory Weight', - {32} 'Carry Weight', - {33} 'Critical Chance', - {34} 'Melee Damage', - {35} 'Unarmed Damage', - {36} 'Mass', - {37} 'Voice Points', - {38} 'Voice Rate', - {39} 'Damage Resist', - {40} 'Poison Resist', - {41} 'Resist Fire', - {42} 'Resist Shock', - {43} 'Resist Frost', - {44} 'Resist Magic', - {45} 'Resist Disease', - {46} 'Unknown 46', - {47} 'Unknown 47', - {48} 'Unknown 48', - {49} 'Unknown 49', - {50} 'Unknown 50', - {51} 'Unknown 51', - {52} 'Unknown 52', - {53} 'Paralysis', - {54} 'Invisibility', - {55} 'Night Eye', - {56} 'Detect Life Range', - {57} 'Water Breathing', - {58} 'Water Walking', - {59} 'Unknown 59', - {60} 'Fame', - {61} 'Infamy', - {62} 'Jumping Bonus', - {63} 'Ward Power', - {64} 'Right Item Charge', - {65} 'Armor Perks', - {66} 'Shield Perks', - {67} 'Ward Deflection', - {68} 'Variable01', - {69} 'Variable02', - {70} 'Variable03', - {71} 'Variable04', - {72} 'Variable05', - {73} 'Variable06', - {74} 'Variable07', - {75} 'Variable08', - {76} 'Variable09', - {77} 'Variable10', - {78} 'Bow Speed Bonus', - {79} 'Favor Active', - {80} 'Favors Per Day', - {81} 'Favors Per Day Timer', - {82} 'Left Item Charge', - {83} 'Absorb Chance', - {84} 'Blindness', - {85} 'Weapon Speed Mult', - {86} 'Shout Recovery Mult', - {87} 'Bow Stagger Bonus', - {88} 'Telekinesis', - {89} 'Favor Points Bonus', - {90} 'Last Bribed Intimidated', - {91} 'Last Flattered', - {92} 'Movement Noise Mult', - {93} 'Bypass Vendor Stolen Check', - {94} 'Bypass Vendor Keyword Check', - {95} 'Waiting For Player', - {96} 'One-Handed Modifier', - {97} 'Two-Handed Modifier', - {98} 'Marksman Modifier', - {99} 'Block Modifier', - {100} 'Smithing Modifier', - {101} 'Heavy Armor Modifier', - {102} 'Light Armor Modifier', - {103} 'Pickpocket Modifier', - {104} 'Lockpicking Modifier', - {105} 'Sneaking Modifier', - {106} 'Alchemy Modifier', - {107} 'Speechcraft Modifier', - {108} 'Alteration Modifier', - {109} 'Conjuration Modifier', - {110} 'Destruction Modifier', - {111} 'Illusion Modifier', - {112} 'Restoration Modifier', - {113} 'Enchanting Modifier', - {114} 'One-Handed Skill Advance', - {115} 'Two-Handed Skill Advance', - {116} 'Marksman Skill Advance', - {117} 'Block Skill Advance', - {118} 'Smithing Skill Advance', - {119} 'Heavy Armor Skill Advance', - {120} 'Light Armor Skill Advance', - {121} 'Pickpocket Skill Advance', - {122} 'Lockpicking Skill Advance', - {123} 'Sneaking Skill Advance', - {124} 'Alchemy Skill Advance', - {125} 'Speechcraft Skill Advance', - {126} 'Alteration Skill Advance', - {127} 'Conjuration Skill Advance', - {128} 'Destruction Skill Advance', - {129} 'Illusion Skill Advance', - {130} 'Restoration Skill Advance', - {131} 'Enchanting Skill Advance', - {132} 'Left Weapon Speed Multiply', - {133} 'Dragon Souls', - {134} 'Combat Health Regen Multiply', - {135} 'One-Handed Power Modifier', - {136} 'Two-Handed Power Modifier', - {137} 'Marksman Power Modifier', - {138} 'Block Power Modifier', - {139} 'Smithing Power Modifier', - {140} 'Heavy Armor Power Modifier', - {141} 'Light Armor Power Modifier', - {142} 'Pickpocket Power Modifier', - {143} 'Lockpicking Power Modifier', - {144} 'Sneaking Power Modifier', - {145} 'Alchemy Power Modifier', - {146} 'Speechcraft Power Modifier', - {147} 'Alteration Power Modifier', - {148} 'Conjuration Power Modifier', - {149} 'Destruction Power Modifier', - {150} 'Illusion Power Modifier', - {151} 'Restoration Power Modifier', - {152} 'Enchanting Power Modifier', - {153} 'Dragon Rend', - {154} 'Attack Damage Mult', - {155} 'Heal Rate Mult', - {156} 'Magicka Rate Mult', - {157} 'Stamina Rate Mult', - {158} 'Werewolf Perks', - {159} 'Vampire Perks', - {160} 'Grab Actor Offset', - {161} 'Grabbed', - {162} 'Unknown 162', - {163} 'Reflect Damage' - ], [ - -1, 'None' - ]); - - wbSkillEnum := - wbEnum([ - 'Unknown 1', - 'Unknown 2', - 'Unknown 3', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'One Handed', - 'Two Handed', - 'Archery', - 'Block', - 'Smithing', - 'Heavy Armor', - 'Light Armor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speech', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ], [ - -1, 'None' - ]); - - wbCastEnum := wbEnum([ - {0} 'Constant Effect', - {1} 'Fire and Forget', - {2} 'Concentration', - {3} 'Scroll' - ]); - - wbTargetEnum := wbEnum([ - {0} 'Self', - {1} 'Touch', - {2} 'Aimed', - {3} 'Target Actor', - {4} 'Target Location' - ]); - - wbCastingSourceEnum := wbEnum([ - 'Left', - 'Right', - 'Voice', - 'Instant' - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder', - 'Escape Jail', - 'Werewolf Transformation' - ], [ - -1, 'None' - ]); - - wbKeywordTypeEnum := - wbEnum([ - {00} 'None', - {01} 'Component Tech Level', - {02} 'Attach Point', - {03} 'Component Property', - {04} 'Instantiation Filter', - {05} 'Mod Association', - {06} 'Sound', - {07} 'Anim Archetype', - {08} 'Function Call', - {09} 'Recipe Filter', - {10} 'Attraction Type', - {11} 'Dialogue Subtype', - {12} 'Quest Target', - {13} 'Anim Flavor', - {14} 'Anim Gender', - {15} 'Anim Face', - {16} 'Quest Group', - {17} 'Anim Injured', - {18} 'Dispel Effect' - ]); - - wbETYP := wbFormIDCk(ETYP, 'Equipment Type', [EQUP, NULL]); - wbETYPReq := wbFormIDCk(ETYP, 'Equipment Type', [EQUP, NULL], False, cpNormal, True); - - wbFormTypeEnum := wbEnum([], [ - 0, 'Activator', - 1, 'Armor', - 2, 'Book', - 3, 'Container', - 4, 'Door', - 5, 'Ingredient', - 6, 'Light', - 7, 'MiscItem', - 8, 'Static', - 9, 'Grass', - 10, 'Tree', - 12, 'Weapon', - 13, 'Actor', - 14, 'LeveledCharacter', - 15, 'Spell', - 16, 'Enchantment', - 17, 'Potion', - 18, 'LeveledItem', - 19, 'Key', - 20, 'Ammo', - 21, 'Flora', - 22, 'Furniture', - 23, 'Sound Marker', - 24, 'LandTexture', - 25, 'CombatStyle', - 26, 'LoadScreen', - 27, 'LeveledSpell', - 28, 'AnimObject', - 29, 'WaterType', - 30, 'IdleMarker', - 31, 'EffectShader', - 32, 'Projectile', - 33, 'TalkingActivator', - 34, 'Explosion', - 35, 'TextureSet', - 36, 'Debris', - 37, 'MenuIcon', - 38, 'FormList', - 39, 'Perk', - 40, 'BodyPartData', - 41, 'AddOnNode', - 42, 'MovableStatic', - 43, 'CameraShot', - 44, 'ImpactData', - 45, 'ImpactDataSet', - 46, 'Quest', - 47, 'Package', - 48, 'VoiceType', - 49, 'Class', - 50, 'Race', - 51, 'Eyes', - 52, 'HeadPart', - 53, 'Faction', - 54, 'Note', - 55, 'Weather', - 56, 'Climate', - 57, 'ArmorAddon', - 58, 'Global', - 59, 'Imagespace', - 60, 'Imagespace Modifier', - 61, 'Encounter Zone', - 62, 'Message', - 63, 'Constructible Object', - 64, 'Acoustic Space', - 65, 'Ragdoll', - 66, 'Script', - 67, 'Magic Effect', - 68, 'Music Type', - 69, 'Static Collection', - 70, 'Keyword', - 71, 'Location', - 72, 'Location Ref Type', - 73, 'Footstep', - 74, 'Footstep Set', - 75, 'Material Type', - 76, 'Actor Action', - 77, 'Music Track', - 78, 'Word of Power', - 79, 'Shout', - 80, 'Relationship', - 81, 'Equip Slot', - 82, 'Association Type', - 83, 'Outfit', - 84, 'Art Object', - 85, 'Material Object', - 87, 'Lighting Template', - 88, 'Shader Particle Geometry', - 89, 'Visual Effect', - 90, 'Apparatus', - 91, 'Movement Type', - 92, 'Hazard', - 93, 'SM Event Node', - 94, 'Sound Descriptor', - 95, 'Dual Cast Data', - 96, 'Sound Category', - 97, 'Soul Gem', - 98, 'Sound Output Model', - 99, 'Collision Layer', - 100, 'Scroll', - 101, 'ColorForm', - 102, 'Reverb Parameters', - 116, 'Terminal' - ]); - - wbMiscStatEnum := wbEnum([], [ - Int64($1EE71DBC), 'Animals Friended', - Int64($FCDD5011), 'Animals Killed', - Int64($366D84CF), 'Armor Improved', - Int64($8E20D7C9), 'Assaults', - Int64($B9B50725), 'Backstabs', - Int64($EA01A954), 'Bobbleheads Collected', - Int64($6932624D), 'Bright Ideas', - Int64($7FF0CC3B), 'Brotherhood of Steel Quests Completed', - Int64($FEA920AA), 'Buildings', - Int64($1F84743B), 'Caps Found', - Int64($9360004C), 'Chems Crafted', - Int64($B2A78B7A), 'Chems Taken', - Int64($53D9E9B5), 'Chests Looted', - Int64($1E258BEE), 'Computers Hacked', - Int64($3DE99B41), 'Cores Ejected', - Int64($737EAA97), 'Corpses Eaten', - Int64($40B11EFE), 'Creatures Killed', - Int64($4C4B8DF3), 'Creatures Killed DLC03', - Int64($22D5BA38), 'Critical Strikes', - Int64($3C626A90), 'Days Passed', - Int64($C5A52FD0), 'Days Survived', - Int64($45FDBB1C), 'DLC01 Quests Completed', - Int64($FA7CC7F9), 'DLC03 Locations Discovered', - Int64($AA444695), 'Dungeons Cleared', - Int64($F4E8FFD6), 'Fatman Deaths', - Int64($66DAF3CF), 'Fits of Rage', - Int64($554E59D5), 'Food', - Int64($E1EB3490), 'Food Cooked', - Int64($9311B22B), 'Food Eaten', - Int64($F947D866), 'Four Leaf Clovers', - Int64($7C586E7A), 'Fusion Cores Consumed', - Int64($2826309E), 'Game Difficulty', - Int64($A5EA7ABC), 'Grand Slams', - Int64($F5A36770), 'Grim Reaper Sprints', - Int64($52984AA4), 'Happiness', - Int64($FA024018), 'Hours Slept', - Int64($CAD2ECA1), 'Hours Waiting', - Int64($8CC5DAB6), 'HSAtomicCommand', - Int64($A2E4C1F2), 'HSAutomatron', - Int64($20F9993D), 'HSGrognak', - Int64($8D882844), 'HSJangles', - Int64($910B02C0), 'HSPipfall', - Int64($860E0723), 'HSRedMenace', - Int64($3FFA8658), 'HSZetaInvaders', - Int64($40CA9C83), 'Institute Quests Completed', - Int64($7D2E57C0), 'Intimidations', - Int64($FFE8010B), 'Investments Made', - Int64($9AF17D9D), 'Items Crafted DLC03', - Int64($CF48C0B9), 'Items Scrapped', - Int64($82F190C2), 'Items Stolen', - Int64($6D8671DD), 'Junk Collected', - Int64($110B8D2F), 'Legendary Enemies Killed', - Int64($8A24FDE2), 'Locations Discovered', - Int64($5829CC2E), 'Locks Picked', - Int64($7EA26C2D), 'Main Quests Completed', - Int64($493B803C), 'Mines Disarmed', - Int64($B1511B82), 'Minuteman Quests Completed', - Int64($98EE55DC), 'Misc Objectives Completed', - Int64($0F3315AC), 'Money Shots', - Int64($5E457DAC), 'Most Caps Carried', - Int64($D37C6909), 'Murders', - Int64($B91253A4), 'Mysterious Strabger Visits', - Int64($1DEEA18A), 'Nuka Cola Flavors Created', - Int64($9CE72536), 'Nuka World Creatures Killed', - Int64($EB0D60AC), 'Objects Built', - Int64($73AD915B), 'Pants Exploded', - Int64($53706A04), 'Paralyzing Punches', - Int64($9E78CEB3), 'People', - Int64($F22A8133), 'People Killed', - Int64($D3F632FF), 'Plants Harvested', - Int64($856FA4C1), 'PlayedFutureRetroHolotape', - Int64($F2BAC234), 'Pockets Picked', - Int64($AC69D9B9), 'Power', - Int64($0D7B8B16), 'Quests Completed', - Int64($0580BB9F), 'RadAway Taken', - Int64($D2960073), 'Rad-X Taken', - Int64($FDE20426), 'Railroad Quests Completed', - Int64($3CBF7E59), 'Ricochets', - Int64($01E1BC85), 'Robots Disabled', - Int64($2CA4ECC0), 'Robots Improved', - Int64($C8BC93BE), 'Robots Killed', - Int64($98D5710C), 'Sandman Kills', - Int64($B1AE4792), 'Side Quests Completed', - Int64($ACE470D7), 'Skill Books Read', - Int64($B556CC52), 'Sneak Attacks', - Int64($32D1B38F), 'Speach Successes', - Int64($5D6B18F1), 'Stimpacks Taken', - Int64($C5321BC5), 'Supply Lines Created', - Int64($3869002E), 'Survival Denied', - Int64($F9DEC209), 'Survival Level-Ups', - Int64($69AF5B9A), 'Synths Killed', - Int64($0A872FA3), 'Times Addicted', - Int64($7AEA9C2B), 'Trespasses', - Int64($13752285), 'Turrets Killed', - Int64($0B479511), 'Wasteland Whispers', - Int64($FCD0CCC3), 'Water', - Int64($61A5C5A9), 'Weapons Disarmed', - Int64($1D3BA844), 'Weapons Improved', - Int64($60A11697), 'Workshops Unlocked' - ]); - - wbAdvanceActionEnum := wbEnum([ - 'Normal Usage', - 'Power Attack', - 'Bash', - 'Lockpick Success', - 'Lockpick Broken' - ]); - - wbAlignmentEnum := - wbEnum([ - 'Good', - 'Neutral', - 'Evil', - 'Very Good', - 'Very Evil' - ]); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCriticalStageEnum := - wbEnum([ - 'None', - 'Goo Start', - 'Goo End', - 'Disintegrate Start', - 'Disintegrate End' - ]); - - wbStaggerEnum := wbEnum([ - 'None', - 'Small', - 'Medium', - 'Large', - 'Extra Large' - ]); - - wbSexEnum := wbEnum(['Male','Female']); - - wbEFID := wbFormIDCk(EFID, 'Base Effect', [MGEF]); - - wbEFIT := - wbStructSK(EFIT, [3, 4], '', [ - wbFloat('Magnitude', cpNormal, True), - wbInteger('Area', itU32), - wbInteger('Duration', itU32) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbCTDA := wbRStruct('Condition', [ - wbStruct(CTDA, '', [ - wbInteger('Type', itU8, wbCtdaTypeToStr, wbCtdaTypeToInt, cpNormal, False, nil, wbCtdaTypeAfterSet), - wbByteArray('Unused', 3, cpIgnore, False, wbNeverShow), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU16, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbByteArray('Unused', 2, cpIgnore, False, wbNeverShow), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - { unknown } - wbByteArray('Unknown', 4), - { 0 ptNone} - wbByteArray('None', 4, cpIgnore), - { 1 ptInteger} - wbInteger('Integer', itS32), - { 2 ptFloat} - wbFloat('Float'), - { 3 ptActor} - wbFormIDCkNoReach('Actor', [NULL, PLYR, ACHR, REFR]), - { 4 ptActorBase} - wbFormIDCkNoReach('Actor Base', [NPC_]), - { 5 ptActorValue} - wbActorValue, - { 6 ptAdvanceAction} - wbInteger('Player Action', itU32, wbAdvanceActionEnum), - { 7 ptAlias} - wbInteger('Alias', itS32, wbConditionAliasToStr, wbStrToAlias), - { 8 ptAlignment} - wbInteger('Alignment', itU32, wbAlignmentEnum), - { 9 ptAssociationType} - wbFormIDCk('Association Type', [ASTP]), - {10 ptAxis} - wbInteger('Axis', itU32, wbAxisEnum), - {11 ptCastingSource} - wbInteger('Casting Type', itU32, wbCastingSourceEnum), - {12 ptCell} - wbFormIDCkNoReach('Cell', [CELL]), - {13 ptClass} - wbFormIDCkNoReach('Class', [CLAS]), - {14 ptCrimeType} - wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {15 ptCriticalStage} - wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {16 ptEncounterZone} - wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {17 ptEquipType} - wbFormIDCkNoReach('Equip Type', [EQUP]), - {18 ptEvent} - wbInteger('Event', itU32, wbEventFunctionAndMemberToStr, wbEventFunctionAndMemberToInt), - {19 ptEventData} - wbFormID('Event Data'), - {20 ptFaction} - wbFormIDCkNoReach('Faction', [FACT]), - {21 ptFormList} - wbFormIDCkNoReach('Form List', [FLST]), - {22 ptFormType} - wbInteger('Form Type', itU32, wbFormTypeEnum), - {23 ptFurniture} - wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {24 ptFurnitureAnim} - wbInteger('Furniture Anim', itU32, wbFurnitureAnimTypeEnum), - {25 ptFurnitureEntry} - wbInteger('Furniture Entry', itU32, wbEnum([], [$010000, 'Front', $020000, 'Behind', $040000, 'Right', $80000, 'Left', $100000, 'Up'])), - {26 ptGlobal} - wbFormIDCkNoReach('Global', [GLOB]), - {27 ptIdleForm} - wbFormIDCkNoReach('Idle', [IDLE]), - {28 ptInventoryObject} - wbFormIDCkNoReach('Inventory Object', sigBaseObjects), - {29 ptKeyword} - wbFormIDCkNoReach('Keyword', [KYWD, FLST, NULL]), - {30 ptLocation} - wbFormIDCkNoReach('Location', [LCTN]), - {31 ptMagicEffect} - wbFormIDCkNoReach('Base Effect', [MGEF]), - {32 ptMagicItem} - wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR, SCRL]), - {33 ptMiscStat} - wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {34 ptObjectReference} - wbFormIDCkNoReach('Object Reference', sigReferences), - {35 ptOwner} - wbFormIDCkNoReach('Owner', [NULL, FACT, NPC_]), - {36 ptPackage} - wbFormIDCkNoReach('Package', [PACK]), - {37 ptPackdata} - wbInteger('Packdata ID', itU32), - {38 ptPerk} - wbFormIDCkNoReach('Perk', [PERK]), - {39 ptQuest} - wbFormIDCkNoReach('Quest', [QUST]), - {40 ptQuestStage} - wbInteger('Quest Stage', itU32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {41 ptRace} - wbFormIDCkNoReach('Race', [RACE]), - {42 ptReferencableObject} - wbFormIDCkNoReach('Referenceable Object', sigBaseObjects), - {43 ptRefType} - wbFormIDCkNoReach('Location Ref Type', [LCRT]), - {44 ptRegion} - wbFormIDCkNoReach('Region', [REGN]), - {45 ptScene} - wbFormIDCk('Scene', [NULL, SCEN]), - {46 ptSex} - wbInteger('Sex', itU32, wbSexEnum), - {47 ptShout} - wbFormIDCkNoReach('Shout', [SHOU]), - {48 ptVariableName} - wbByteArray('Variable Name (unused)', 4, cpIgnore), - {49 ptVATSValueFunction} - wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - {50 ptVATSValueParam} - wbInteger('VATS Value Param (unused)', itU32), - {51 ptVoiceType} - wbFormIDCkNoReach('Voice Type', [VTYP, FLST]), - {52 ptWardState} - wbInteger('Ward State', itU32, wbWardStateEnum), - {53 ptWeather} - wbFormIDCkNoReach('Weather', [WTHR]), - {54 ptWorldspace} - wbFormIDCkNoReach('Worldspace', [WRLD, FLST]), - {55 ptDamageType} - wbFormIDCkNoReach('Damage Type', [DMGT, FLST]) - ]), - - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - { unknown } - wbByteArray('Unknown', 4), - { 0 ptNone} - wbByteArray('None', 4, cpIgnore), - { 1 ptInteger} - wbInteger('Integer', itS32), - { 2 ptFloat} - wbFloat('Float'), - { 3 ptActor} - wbFormIDCkNoReach('Actor', [NULL, PLYR, ACHR, REFR]), - { 4 ptActorBase} - wbFormIDCkNoReach('Actor Base', [NPC_]), - { 5 ptActorValue} - wbActorValue, - { 6 ptAdvanceAction} - wbInteger('Player Action', itU32, wbAdvanceActionEnum), - { 7 ptAlias} - wbInteger('Alias', itS32, wbConditionAliasToStr, wbStrToAlias), - { 8 ptAlignment} - wbInteger('Alignment', itU32, wbAlignmentEnum), - { 9 ptAssociationType} - wbFormIDCk('Association Type', [ASTP]), - {10 ptAxis} - wbInteger('Axis', itU32, wbAxisEnum), - {11 ptCastingSource} - wbInteger('Casting Type', itU32, wbCastingSourceEnum), - {12 ptCell} - wbFormIDCkNoReach('Cell', [CELL]), - {13 ptClass} - wbFormIDCkNoReach('Class', [CLAS]), - {14 ptCrimeType} - wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {15 ptCriticalStage} - wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - {16 ptEncounterZone} - wbFormIDCkNoReach('Encounter Zone', [ECZN]), - {17 ptEquipType} - wbFormIDCkNoReach('Equip Type', [EQUP]), - {18 ptEvent} - wbInteger('Event', itU32, wbEventFunctionAndMemberToStr, wbEventFunctionAndMemberToInt), - {19 ptEventData} - wbFormID('Event Data'), - {20 ptFaction} - wbFormIDCkNoReach('Faction', [FACT]), - {21 ptFormList} - wbFormIDCkNoReach('Form List', [FLST]), - {22 ptFormType} - wbInteger('Form Type', itU32, wbFormTypeEnum), - {23 ptFurniture} - wbFormIDCkNoReach('Furniture', [FURN, FLST]), - {24 ptFurnitureAnim} - wbInteger('Furniture Anim', itU32, wbFurnitureAnimTypeEnum), - {25 ptFurnitureEntry} - wbInteger('Furniture Entry', itU32, wbEnum([], [$010000, 'Front', $020000, 'Behind', $040000, 'Right', $80000, 'Left', $100000, 'Up'])), - {26 ptGlobal} - wbFormIDCkNoReach('Global', [GLOB]), - {27 ptIdleForm} - wbFormIDCkNoReach('Idle', [IDLE]), - {28 ptInventoryObject} - wbFormIDCkNoReach('Inventory Object', sigBaseObjects), - {29 ptKeyword} - wbFormIDCkNoReach('Keyword', [KYWD, FLST, NULL]), - {30 ptLocation} - wbFormIDCkNoReach('Location', [LCTN]), - {31 ptMagicEffect} - wbFormIDCkNoReach('Base Effect', [MGEF]), - {32 ptMagicItem} - wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR, SCRL]), - {33 ptMiscStat} - wbInteger('Misc Stat', itU32, wbMiscStatEnum), - {34 ptObjectReference} - wbFormIDCkNoReach('Object Reference', sigReferences), - {35 ptOwner} - wbFormIDCkNoReach('Owner', [NULL, FACT, NPC_]), - {36 ptPackage} - wbFormIDCkNoReach('Package', [PACK]), - {37 ptPackdata} - wbInteger('Packdata ID', itU32), - {38 ptPerk} - wbFormIDCkNoReach('Perk', [PERK]), - {39 ptQuest} - wbFormIDCkNoReach('Quest', [QUST]), - {40 ptQuestStage} - wbInteger('Quest Stage', itU32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {41 ptRace} - wbFormIDCkNoReach('Race', [RACE]), - {42 ptReferencableObject} - wbFormIDCkNoReach('Referenceable Object', sigBaseObjects), - {43 ptRefType} - wbFormIDCkNoReach('Location Ref Type', [LCRT]), - {44 ptRegion} - wbFormIDCkNoReach('Region', [REGN]), - {45 ptScene} - wbFormIDCk('Scene', [NULL, SCEN]), - {46 ptSex} - wbInteger('Sex', itU32, wbSexEnum), - {47 ptShout} - wbFormIDCkNoReach('Shout', [SHOU]), - {48 ptVariableName} - wbByteArray('Variable Name (unused)', 4, cpIgnore), - {49 ptVATSValueFunction} - wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - {50 ptVATSValueParam} - wbUnion('VATS Value Param', wbCTDAParam2VATSValueParamDecider, [ - { 0} wbFormIDCkNoReach('Weapon', [WEAP]), - { 1} wbFormIDCkNoReach('Weapon List', [FLST], [WEAP]), - { 2} wbFormIDCkNoReach('Target', [NPC_]), - { 3} wbFormIDCkNoReach('Target List', [FLST], [NPC_]), - { 4} wbByteArray('Unknown', 4, cpIgnore), - { 5} wbInteger('Target Part', itS32, wbActorValueEnum), - { 6} wbInteger('VATS Action', itU32, wbEnum([ - 'Unarmed Attack', - 'One Hand Melee Attack', - 'Two Hand Melee Attack', - 'Magic Attack', - 'Ranged Attack', - 'Reload', - 'Crouch', - 'Stand', - 'Switch Weapon', - 'Toggle Weapon Drawn', - 'Heal', - 'Player Death' - ])), - { 7} wbByteArray('Unknown', 4, cpIgnore), - { 8} wbByteArray('Unknown', 4, cpIgnore), - { 9} wbFormIDCkNoReach('Critical Effect', [SPEL]), - {10} wbFormIDCkNoReach('Critical Effect List', [FLST], [SPEL]), - {11} wbByteArray('Unknown', 4, cpIgnore), - {12} wbByteArray('Unknown', 4, cpIgnore), - {13} wbByteArray('Unknown', 4, cpIgnore), - {14} wbByteArray('Unknown', 4, cpIgnore), - {15} wbInteger('Weapon Type', itU32, wbWeaponAnimTypeEnum), - {16} wbByteArray('Unknown', 4, cpIgnore), - {17} wbByteArray('Unknown', 4, cpIgnore), - {18} wbInteger('Projectile Type', itU32, wbEnum([ - 'Missile', - 'Lobber', - 'Beam', - 'Flame', - 'Cone', - 'Barrier', - 'Arrow' - ])), - {19} wbInteger('Delivery Type', itU32, wbTargetEnum), - {20} wbInteger('Casting Type', itU32, wbCastEnum) - ]), - {51 ptVoiceType} - wbFormIDCkNoReach('Voice Type', [VTYP, FLST]), - {52 ptWardState} - wbInteger('Ward State', itU32, wbWardStateEnum), - {53 ptWeather} - wbFormIDCkNoReach('Weather', [WTHR]), - {54 ptWorldspace} - wbFormIDCkNoReach('Worldspace', [WRLD, FLST]), - {55 ptDamageType} - wbFormIDCkNoReach('Damage Type', [DMGT, FLST]) - ]), - wbInteger('Run On', itU32, wbEnum([ - { 0} 'Subject', - { 1} 'Target', - { 2} 'Reference', - { 3} 'Combat Target', - { 4} 'Linked Reference', - { 5} 'Quest Alias', - { 6} 'Package Data', - { 7} 'Event Data', - { 9} 'Command Target', - {10} 'Event Camera Ref', - {11} 'My Killer' - ]), cpNormal, False, nil, wbCTDARunOnAfterSet), - wbUnion('Reference', wbCTDAReferenceDecider, [ - wbInteger('Unused', itU32, nil, cpIgnore), - wbFormIDCkNoReach('Reference', sigReferences, False) - ]), - wbInteger('Parameter #3', itS32, nil, cpNormal, False, nil, nil, -1) - ], cpNormal, False{, nil, 0, wbCTDAAfterLoad}), - wbString(CIS1, 'Parameter #1'), - wbString(CIS2, 'Parameter #2') - ], [], cpNormal); - - wbCTDAs := wbRArray('Conditions', wbCTDA, cpNormal, False); - wbCTDAsCount := wbRArray('Conditions', wbCTDA, cpNormal, False, nil, wbCTDAsAfterSet); - wbCTDAsReq := wbRArray('Conditions', wbCTDA, cpNormal, True); - wbCTDAsReqCount := wbRArray('Conditions', wbCTDA, cpNormal, True, nil, wbCTDAsAfterSet); - - wbICON := wbString(ICON, 'Inventory Image'); - wbMICO := wbString(MICO, 'Message Icon'); - wbPTRN := wbFormIDCk(PTRN, 'Preview Transform', [TRNS]); - wbNTRM := wbFormIDCk(NTRM, 'Native Terminal', [TERM]); - wbYNAM := wbFormIDCk(YNAM, 'Sound - Pick Up', [SNDR]); - wbZNAM := wbFormIDCk(ZNAM, 'Sound - Put Down', [SNDR]); - wbCUSD := wbFormIDCk(CUSD, 'Sound - Crafting', [SNDR]); - wbINRD := wbFormIDCk(INRD, 'Instance Naming', [INNR]); - wbPRPS := wbArrayS(PRPS, 'Properties', wbStructSK([0], 'Property', [ - wbActorValue, - wbFloat('Value') - ])); - wbFLTR := wbString(FLTR, 'Filter'); - wbAPPR := wbArray(APPR, 'Attach Parent Slots', wbFormIDCk('Keyword', [KYWD])); - wbFTYP := wbFormIDCk(FTYP, 'Forced Loc Ref Type', [LCRT]); - wbATTX := wbLString(ATTX, 'Activate Text Override', 0, cpTranslate); - - wbMNAMFurnitureMarker := wbInteger(MNAM, 'Active Markers / Flags', itU32, wbFlags([ - {0x00000001} 'Interaction Point 0', - {0x00000002} 'Interaction Point 1', - {0x00000004} 'Interaction Point 2', - {0x00000008} 'Interaction Point 3', - {0x00000010} 'Interaction Point 4', - {0x00000020} 'Interaction Point 5', - {0x00000040} 'Interaction Point 6', - {0x00000080} 'Interaction Point 7', - {0x00000100} 'Interaction Point 8', - {0x00000200} 'Interaction Point 9', - {0x00000400} 'Interaction Point 10', - {0x00000800} 'Interaction Point 11', - {0x00001000} 'Interaction Point 12', - {0x00002000} 'Interaction Point 13', - {0x00004000} 'Interaction Point 14', - {0x00008000} 'Interaction Point 15', - {0x00010000} 'Interaction Point 16', - {0x00020000} 'Interaction Point 17', - {0x00040000} 'Interaction Point 18', - {0x00080000} 'Interaction Point 19', - {0x00100000} 'Interaction Point 20', - {0x00200000} 'Interaction Point 21', - {0x00400000} 'Allow Awake Sound', - {0x00800000} 'Enter With Weapon Drawn', - {0x01000000} 'Play Anim When Full', - {0x02000000} 'Disables Activation', - {0x04000000} 'Is Perch', - {0x08000000} 'Must Exit to Talk', - {0x10000000} 'Use Static Avoid Node', - {0x20000000} 'Unknown 29', - {0x40000000} 'Has Model?', - {0x80000000} 'Unknown 31' - ])); - - wbSNAMMarkerParams := - wbArray(SNAM, 'Marker Paramaters', wbStruct('Marker', [ - wbFloat('Offset X'), - wbFloat('Offset Y'), - wbFloat('Offset Z'), - wbFloat('Rotation Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFormIDCk('Keyword', [KYWD, NULL]), - wbInteger('Entry Types', itU8, wbFlags([ - 'Front', - 'Rear', - 'Right', - 'Left', - 'Other', - 'Unused 5', - 'Unused 6', - 'Unused 7' - ])), - wbByteArray('Unknown', 3) - ], cpNormal, False, nil, 4)); - - wbArmorPropertyEnum := wbEnum([ - { 0} 'Enchantments', - { 1} 'BashImpactDataSet', - { 2} 'BlockMaterial', - { 3} 'Keywords', - { 4} 'Weight', - { 5} 'Value', - { 6} 'Rating', - { 7} 'AddonIndex', - { 8} 'BodyPart', - { 9} 'DamageTypeValue', - {10} 'ActorValues', - {11} 'Health', - {12} 'ColorRemappingIndex', - {13} 'MaterialSwaps' - ]); - - wbActorPropertyEnum := wbEnum([ - { 0} 'Keywords', - { 1} 'ForcedInventory', - { 2} 'XPOffset', - { 3} 'Enchantments', - { 4} 'ColorRemappingIndex', - { 5} 'MaterialSwaps' - ]); - - wbWeaponPropertyEnum := wbEnum([ - { 0} 'Speed', - { 1} 'Reach', - { 2} 'MinRange', - { 3} 'MaxRange', - { 4} 'AttackDelaySec', - { 5} 'Unknown 5', - { 6} 'OutOfRangeDamageMult', - { 7} 'SecondaryDamage', - { 8} 'CriticalChargeBonus', - { 9} 'HitBehaviour', - {10} 'Rank', - {11} 'Unknown 11', - {12} 'AmmoCapacity', - {13} 'Unknown 13', - {14} 'Unknown 14', - {15} 'Type', - {16} 'IsPlayerOnly', - {17} 'NPCsUseAmmo', - {18} 'HasChargingReload', - {19} 'IsMinorCrime', - {20} 'IsFixedRange', - {21} 'HasEffectOnDeath', - {22} 'HasAlternateRumble', - {23} 'IsNonHostile', - {24} 'IgnoreResist', - {25} 'IsAutomatic', - {26} 'CantDrop', - {27} 'IsNonPlayable', - {28} 'AttackDamage', - {29} 'Value', - {30} 'Weight', - {31} 'Keywords', - {32} 'AimModel', - {33} 'AimModelMinConeDegrees', - {34} 'AimModelMaxConeDegrees', - {35} 'AimModelConeIncreasePerShot', - {36} 'AimModelConeDecreasePerSec', - {37} 'AimModelConeDecreaseDelayMs', - {38} 'AimModelConeSneakMultiplier', - {39} 'AimModelRecoilDiminishSpringForce', - {40} 'AimModelRecoilDiminishSightsMult', - {41} 'AimModelRecoilMaxDegPerShot', - {42} 'AimModelRecoilMinDegPerShot', - {43} 'AimModelRecoilHipMult', - {44} 'AimModelRecoilShotsForRunaway', - {45} 'AimModelRecoilArcDeg', - {46} 'AimModelRecoilArcRotateDeg', - {47} 'AimModelConeIronSightsMultiplier', - {48} 'HasScope', - {49} 'ZoomDataFOVMult', - {50} 'FireSeconds', - {51} 'NumProjectiles', - {52} 'AttackSound', - {53} 'AttackSound2D', - {54} 'AttackLoop', - {55} 'AttackFailSound', - {56} 'IdleSound', - {57} 'EquipSound', - {58} 'UnEquipSound', - {59} 'SoundLevel', - {50} 'ImpactDataSet', - {61} 'Ammo', - {62} 'CritEffect', - {63} 'BashImpactDataSet', - {64} 'BlockMaterial', - {65} 'Enchantments', - {66} 'AimModelBaseStability', - {67} 'ZoomData', - {68} 'ZoomDataOverlay', - {69} 'ZoomDataImageSpace', - {70} 'ZoomDataCameraOffsetX', - {71} 'ZoomDataCameraOffsetY', - {72} 'ZoomDataCameraOffsetZ', - {73} 'EquipSlot', - {74} 'SoundLevelMult', - {75} 'NPCAmmoList', - {76} 'ReloadSpeed', - {77} 'DamageTypeValues', - {78} 'AccuracyBonus', - {79} 'AttackActionPointCost', - {80} 'OverrideProjectile', - {81} 'HasBoltAction', - {82} 'StaggerValue', - {83} 'SightedTransitionSeconds', - {84} 'FullPowerSeconds', - {85} 'HoldInputToPower', - {86} 'HasRepeatableSingleFire', - {87} 'MinPowerPerShot', - {88} 'ColorRemappingIndex', - {89} 'MaterialSwaps', - {90} 'CriticalDamageMult', - {91} 'FastEquipSound', - {92} 'DisableShells', - {93} 'HasChargingAttack', - {94} 'ActorValues' - ]); - - wbObjectModProperties := - wbArrayS('Properties', wbStructSK([4], 'Property', [ - wbInteger('Value Type', itU8, wbEnum([ - {0} 'Int', - {1} 'Float', - {2} 'Bool', - {3} 'Unknown 3', - {4} 'FormID,Int', - {5} 'Enum', - {6} 'FormID,Float' - ])), - wbByteArray('Unused', 3, cpIgnore), - wbUnion('Function Type', wbOMODDataFunctionTypeDecider, [ - { Float } wbInteger('Function Type', itU8, wbEnum(['SET', 'MUL+ADD', 'ADD'])), - { Bool } wbInteger('Function Type', itU8, wbEnum(['SET', 'AND', 'OR'])), - { Enum } wbInteger('Function Type', itU8, wbEnum(['SET'])), - { FormID } wbInteger('Function Type', itU8, wbEnum(['SET', 'REM', 'ADD'])) - ]), - wbByteArray('Unused', 3, cpIgnore), - wbInteger('Property', itU16, wbObjectModPropertyToStr, wbObjectModPropertyToInt), - wbByteArray('Unused', 2, cpIgnore), - wbUnion('Value 1', wbOMODDataPropertyValue1Decider, [ - { 0} wbByteArray('Value 1 - Unknown', 4), - { 1} wbInteger('Value 1 - Int', itU32), - { 2} wbFloat('Value 1 - Float'), - { 3} wbInteger('Value 1 - Bool', itU32, wbBoolEnum), - { 4} wbFormID('Value 1 - FormID'), - { 5} wbInteger('Value 1 - Enum', itU32), - { 6} wbInteger('Sound Level', itU32, wbSoundLevelEnum), - { 7} wbInteger('Stagger Value', itU32, wbStaggerEnum), - { 8} wbInteger('Hit Behaviour', itU32, wbHitBehaviourEnum) - ]), - wbUnion('Value 2', wbOMODDataPropertyValue2Decider, [ - wbByteArray('Unused', 4, cpIgnore), - wbInteger('Value 2 - Int', itU32), - wbFloat('Value 2 - Float'), - wbInteger('Value 2 - Bool', itU32, wbBoolEnum) - ]), - wbFloat('Step') - ]), wbOMODDataPropertyCounter, cpNormal, False, nil, wbOMODpropertyAfterSet); - - wbOBTSReq := wbStruct(OBTS, 'Object Mod Template Item', [ - wbInteger('Include Count', itU32), // fixed name for wbOMOD* handlers - wbInteger('Property Count', itU32), // fixed name for wbOMOD* handlers - wbInteger('Level Min', itU8), - wbByteArray('Unused', 1), - wbInteger('Level Max', itU8), - wbByteArray('Unused', 1), - wbInteger('ID', itS16), - wbInteger('Default', itU8, wbBoolEnum), - wbArray('Keywords', wbFormIDCk('Keyword', [KYWD, NULL]), -4), - wbInteger('Min Level For Ranks', itU8), - wbInteger('Alt Levels Per Tier', itU8), - wbArray('Includes', wbStruct('Include', [ - wbFormIDCk('Mod', [OMOD]), - wbInteger('Attach Point Index', itU8), - wbInteger('Optional', itU8, wbBoolEnum), - wbInteger('Don''t Use All', itU8, wbBoolEnum) - ]), wbOMODDataIncludeCounter, cpNormal, False, nil, wbOMODincludeAfterSet), - wbObjectModProperties - ], cpNormal, True); - - wbObjectTemplate := wbRStruct('Object Template', [ - wbInteger(OBTE, 'Count', itU32, nil, cpBenign), - wbRArray('Combinations', - wbRStruct('Combination', [ - wbEmpty(OBTF, 'Editor Only'), - wbFULL, - wbOBTSReq - ], [], cpNormal, False, nil, True), - cpNormal, False, nil, wbOBTSCombinationsAfterSet), - wbEmpty(STOP, 'Marker', cpNormal, True) - ], []); - - wbBSMPSequence := wbRStructs('Bone Data', 'Data', [ - wbInteger(BSMP, 'Gender', itU32, wbEnum(['Male', 'Female'])), - // should not be sorted!!! - wbRArray('Bones', - wbRStruct('Bone', [ - wbString(BSMB, 'Name'), - wbArray(BSMS, 'Values', wbFloat('Value')), - wbUnknown(BMMP) - ], []) - ) - ], []); - - wbEffectsReq := - wbRStructs('Effects', 'Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], [], cpNormal, True); - - wbRecord(ACTI, 'Activator', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000002} 2, 'Never Fades', - {0x00000004} 4, 'Non Occluder', - {0x00000040} 6, 'Unknown 6', - {0x00000080} 7, 'Heading Marker', - {0x00000100} 8, 'Must Update Anims', - {0x00000200} 9, 'Hidden From Local Map', - {0x00000400} 10, 'Headtrack Marker', - {0x00000800} 11, 'Used as Platform', - {0x00001000} 13, 'Pack-In Use Only', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Dangerous', - {0x00100000} 20, 'Ignore Object Interaction', - {0x00800000} 23, 'Is Marker', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x20000000} 29, 'Child Can Use', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFormIDCk(STCP, 'Sound', [STAG]), - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbNTRM, - wbFTYP, - wbStruct(PNAM, 'Marker Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbFormIDCk(SNAM, 'Sound - Looping', [SNDR]), - wbFormIDCk(VNAM, 'Sound - Activation', [SNDR]), - wbFormIDCk(WNAM, 'Water Type', [WATR]), - wbATTX, - wbInteger(FNAM, 'Flags', itU16, wbFlags([ - 'No Displacement', - 'Ignored by Sandbox', - 'Unknown 2', - 'Unknown 3', - 'Is a Radio' - ])), - wbFormIDCk(KNAM, 'Interaction Keyword', [KYWD]), - wbStruct(RADR, 'Radio Receiver', [ - wbFormIDCk('Sound Model', [SOPM, NULL]), - wbFloat('Frequency'), - wbFloat('Volume'), - wbInteger('Starts Active', itU8, wbBoolEnum), - wbInteger('No Signal Static', itU8, wbBoolEnum) - ], cpNormal, False, nil, 4), - wbCITC, - wbCTDAs, - wbNVNM - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(TACT, 'Talking Activator', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Hidden From Local Map', - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Radio Station' - ]), [17]), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbUnknown(PNAM, cpIgnore, True), - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]), - wbUnknown(FNAM, cpIgnore, True), - wbFormIDCk(VNAM, 'Voice Type', [VTYP]) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(ALCH, 'Ingestible', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x20000000} 29, 'Medicine' - ])), [ - wbEDID, - wbOBNDReq, - wbPTRN, - wbFULL, - wbKSIZ, - wbKWDAs, - wbMODL, - wbICON, - wbMICO, - wbYNAM, - wbZNAM, - wbETYP, - wbCUSD, - wbDEST, - wbDESC, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'No Auto-Calc', - {0x00000002} 'Food Item', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Unknown 9', - {0x00000200} 'Unknown 10', - {0x00000400} 'Unknown 11', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Unknown 14', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Medicine', - {0x00020000} 'Poison' - ])), - wbFormID('Addiction'), - wbFloat('Addiction Chance'), - wbFormIDCk('Sound - Consume', [SNDR, NULL]) - ], cpNormal, True), - wbLString(DNAM, 'Addiction Name', 0, cpTranslate), - wbEffectsReq - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(AMMO, 'Ammunition', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbDEST, - wbYNAM, - wbZNAM, - wbDESC, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True, nil, 1), - wbStruct(DNAM, '', [ - wbFormIDCk('Projectile', [PROJ, NULL]), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Ignores Normal Weapon Resistance', - {0x02} 'Non-Playable', - {0x04} 'Has Count Based 3D' - ])), - wbByteArray('Unused', 3), - wbFloat('Damage'), - wbInteger('Health', itU32) - ], cpNormal, True), - wbLStringKC(ONAM, 'Short Name', 0, cpTranslate), - wbString(NAM1, 'Casing Model'), - wbByteArray(NAM2, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow) - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(ANIO, 'Animated Object', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Unknown 9' - ]), [9]), [ - wbEDID, - wbMODL, - wbString(BNAM, 'Unload Event') - ]); - - wbRecord(ARMO, 'Armor', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable', - {0x00000040} 6, 'Shield', - {0x00000400} 10, 'Unknown 10', - {0x00008000} 15, 'Unknown 15' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbEITM, - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO2S - ], []), - wbString(ICON, 'Male Inventory Image'), - wbString(MICO, 'Male Message Icon'), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO4S - ], []), - wbString(ICO2, 'Female Inventory Image'), - wbString(MIC2, 'Female Message Icon'), - wbBOD2, - wbDEST, - wbYNAM, - wbZNAM, - wbETYP, - wbFormIDCk(BIDS, 'Block Bash Impact Data Set', [IPDS, NULL]), - wbFormIDCk(BAMT, 'Alternate Block Material', [MATT, NULL]), - wbFormIDCk(RNAM, 'Race', [RACE]), - wbKSIZ, - wbKWDAs, - wbDESC, - wbINRD, - wbRArray('Models', - wbRStruct('Model', [ - wbInteger(INDX, 'Addon Index', itU16), - wbFormIDCk(MODL, 'Armor Addon', [ARMA]) - ], []) - ), - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight'), - wbInteger('Health', itU32) - ], cpNormal, True), - wbStruct(FNAM, '', [ - wbInteger('Armor Rating', itU16), - wbInteger('Base Addon Index', itU16), - wbInteger('Stagger Rating', itU8, wbStaggerEnum), - wbUnknown - ]), - wbArrayS(DAMA, 'Resistances', wbStructSK([0], 'Resistance', [ - wbFormIDCk('Damage Type', [DMGT]), - wbInteger('Value', itU32) - ])), - wbFormIDCk(TNAM, 'Template Armor', [ARMO]), - wbAPPR, - wbObjectTemplate - ], False, nil, cpNormal, False, wbARMOAfterLoad, wbKeywordsAfterSet); - - wbRecord(ARMA, 'Armor Addon', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'No Underarmor Scaling', - {0x00000200} 9, 'Unknown 9', - {0x40000000} 30, 'Hi-Res 1st Person Only' - ])), [ - wbEDID, - wbBOD2, - wbFormIDCk(RNAM, 'Race', [RACE]), - wbStruct(DNAM, 'Data', [ - wbInteger('Male Priority', itU8), - wbInteger('Female Priority', itU8), - // essentialy a number of world models for different weights (Enabled = 2 models _0.nif and _1.nif) - wbInteger('Weight slider - Male', itU8, wbFlags([ - {0x01} 'Unknown 0', - {0x02} 'Enabled' - ])), - wbInteger('Weight slider - Female', itU8, wbFlags([ - {0x01} 'Unknown 0', - {0x02} 'Enabled' - ])), - wbByteArray('Unknown', 2), - wbInteger('Detection Sound Value', itU8), - wbByteArray('Unknown', 1), - wbFloat('Weapon Adjust') - ], cpNormal, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO2S, - wbMO2C, - wbMO2F - ], [], cpNormal, False), - wbRStruct('Female world model', [ - wbString(MOD3, 'Model Filename'), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO3S, - wbMO3C, - wbMO3F - ], []), - wbRStruct('Male 1st Person', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO4S, - wbMO4C, - wbMO4F - ], []), - wbRStruct('Female 1st Person', [ - wbString(MOD5, 'Model Filename'), - wbByteArray(MO5T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO5S, - wbMO5C, - wbMO5F - ], []), - wbFormIDCK(NAM0, 'Male Skin Texture', [TXST, NULL]), - wbFormIDCK(NAM1, 'Female Skin Texture', [TXST, NULL]), - wbFormIDCK(NAM2, 'Male Skin Texture Swap List', [FLST, NULL]), - wbFormIDCK(NAM3, 'Female Skin Texture Swap List', [FLST, NULL]), - wbRArrayS('Additional Races', wbFormIDCK(MODL, 'Race', [RACE, NULL])), - wbFormIDCk(SNDD, 'Footstep Sound', [FSTS, NULL]), - wbFormIDCk(ONAM, 'Art Object', [ARTO]), - wbBSMPSequence - ], False, nil, cpNormal, False, wbARMAAfterLoad); - - wbRecord(BOOK, 'Book', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbICON, - wbMICO, - wbDESCreq, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbFormIDCk(FIMD, 'Featured Item Message', [MESG]), - wbStruct(DATA, 'Data', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(DNAM, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Advance Actor Value', - {0x02} 'Can''t be Taken', - {0x04} 'Add Spell', - {0x08} 'Unknown 3', - {0x10} 'Add Perk' - ])), - wbUnion('Teaches', wbBOOKTeachesDecider, [ - wbByteArray('Unused', 4), - wbFormIDCk('Actor Value', [AVIF, NULL]), - wbFormIDCk('Spell', [SPEL, NULL]), - wbFormIDCk('Perk', [PERK, NULL]) - ]), - wbStruct('Text Offset' , [ - wbInteger('X', itU32), - wbInteger('Y', itU32) - ]) - ], cpNormal, True), - wbLString(CNAM, 'Description', 0, cpTranslate), - wbFormIDCk(INAM, 'Inventory Art', [STAT]) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); -end; - -procedure DefineFO4c; - - procedure ReferenceRecord(aSignature: TwbSignature; const aName: string); - begin - wbRecord(aSignature, aName, - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000080} 7, 'Turn Off Fire', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn' - ], True, True)), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Projectile', [PROJ, HAZD]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ], cpNormal, False, nil, 1) - ), - wbRArrayS('Linked References', wbStructSK(XLKR, [0], 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', sigReferences) - ], cpNormal, False, nil, 1)), - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', sigReferences), - wbFloat('Delay') - ]) - ) - ], []), - - wbFormIDCk(XASP, 'Unknown', [REFR]), - wbUnknown(XATP), - wbInteger(XAMC, 'Ammo Count', itU32), - wbEmpty(XLKT, 'Linked Ref Transient'), - wbFormIDCk(XLYR, 'Layer', [LAYR]), - wbFormIDCk(XMSP, 'Material Swap', [MSWP]), - wbFormIDCk(XRFG, 'Reference Group', [RFGP]), - wbUnknown(XCVR), - wbXESP, - wbXOWN, - wbXRNK, - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - wbEmpty(XIS2, 'Ignored by Sandbox'), - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - wbXSCL, - wbXLOD, - wbDataPosRot, - wbString(MNAM, 'Comments') - ], True, wbPlacedAddInfo); - end; - -begin -{>>> - Skrim has its own ref record for every projectile type - PARW 'Arrow' - PBEA 'Beam' - PFLA 'Flame' - PCON 'Cone' (voice) - PBAR 'Barrier' - PGRE 'Traps' - PHZD 'Hazards' - I guess all of them have the same structure -<<<} - ReferenceRecord(PARW, 'Placed Arrow'); - ReferenceRecord(PBAR, 'Placed Barrier'); - ReferenceRecord(PBEA, 'Placed Beam'); - ReferenceRecord(PCON, 'Placed Cone/Voice'); - ReferenceRecord(PFLA, 'Placed Flame'); - ReferenceRecord(PGRE, 'Placed Projectile'); - ReferenceRecord(PHZD, 'Placed Hazard'); - ReferenceRecord(PMIS, 'Placed Missile'); - - wbRecord(CELL, 'Cell', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 7, 'No Pre Vis', - {0x00000400} 10, 'Persistent', - {0x00020000} 17, 'Off Limits', - {0x00040000} 18, 'Compressed', - {0x00080000} 19, 'Can''t Wait' - ]), [18]), [ - wbEDID, - wbFULL, - wbInteger(DATA, 'Flags', itU16, wbFlags([ - {0x0001} 'Is Interior Cell', - {0x0002} 'Has Water', - {0x0004} 'Can''t Travel From Here', - {0x0008} 'No LOD Water', - {0x0010} 'Unknown 5', - {0x0020} 'Public Area', - {0x0040} 'Hand Changed', - {0x0080} 'Show Sky', - {0x0100} 'Use Sky Lighting', - {0x0200} 'Unknown 10', - {0x0400} 'Unknown 11', - {0x0800} 'Sunlight Shadows', - {0x1000} 'Distant LOD only', - {0x2000} 'Player Followers Can''t Travel Here', - {0x4000} 'Unknown 15', - {0x8000} 'Unknown 16' - ]), cpNormal, True, False, nil, wbCELLDATAAfterSet), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32), - wbInteger('Force Hide Land', itU32, wbFlags([ - 'Quad 1', - 'Quad 2', - 'Quad 3', - 'Quad 4' - ], True)) - ], cpNormal, False, nil, 2), - - wbByteArray(VISI, 'PreVis Files Timestamp', 2), - wbFormIDCk(RVIS, 'In PreVis File Of', [CELL]), - wbByteArray(PCMB, 'PreCombined Files Timestamp', 2), - - wbStruct(XCLL, 'Lighting', [ - wbByteColors('Ambient Color'), - wbByteColors('Directional Color'), - wbByteColors('Fog Color Near'), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Distance'), - wbFloat('Fog Power'), - wbAmbientColors, - wbByteColors('Fog Color Far'), - wbFloat('Fog Max'), - wbFloat('Light Fade Begin'), - wbFloat('Light Fade End'), - wbInteger('Inherits', itU32, wbFlags([ - {0x00000001} 'Ambient Color', - {0x00000002} 'Directional Color', - {0x00000004} 'Fog Color', - {0x00000008} 'Fog Near', - {0x00000010} 'Fog Far', - {0x00000020} 'Directional Rotation', - {0x00000040} 'Directional Fade', - {0x00000080} 'Clip Distance', - {0x00000100} 'Fog Power', - {0x00000200} 'Fog Max', - {0x00000400} 'Light Fade Distances' - ])), - wbFloat('Near Height Mid'), - wbFloat('Near Height Range'), - wbByteColors('Fog Color High Near'), - wbByteColors('Fog Color High Far'), - wbFloat('High Density Scale'), - wbFloat('Fog Near Scale'), - wbFloat('Fog Far Scale'), - wbFloat('Fog High Near Scale'), - wbFloat('Fog High Far Scale'), - wbFloat('Far Height Mid'), - wbFloat('Far Height Range') - ], cpNormal, False, nil, 11), - - wbInteger(CNAM, 'Precombined Object Level XY', itU8), - wbInteger(ZNAM, 'Precombined Object Level Z', itU8), - wbByteArray(TVDT, 'Unknown', 0, cpNormal), - wbMaxHeightDataCELL, - wbFormIDCk(LTMP, 'Lighting Template', [LGTM, NULL], False, cpNormal, True), - - {>>> XCLW sometimes has $FF7FFFFF and causes invalid floation point <<<} - wbFloat(XCLW, 'Water Height', cpNormal, False, 1, -1, nil, nil, 0, wbCELLXCLWGetConflictPriority), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbFormIDCk(XLCN, 'Location', [LCTN]), - wbByteArray(XWCN, 'Unknown', 0, cpIgnore), // leftover - wbStruct(XWCU, 'Water Velocity', [ - wbFloat('X Offset'), - wbFloat('Y Offset'), - wbFloat('Z Offset'), - wbByteArray('Unknown', 4), - wbFloat('X Angle'), - wbFloat('Y Angle'), - wbFloat('Z Angle'), - wbByteArray('Unknown', 0) - ]), - wbFormIDCk(XCWT, 'Water', [WATR]), - - {--- Ownership ---} - wbXOWN, - wbXRNK, - - wbFormIDCk(XILL, 'Lock List', [FLST, NPC_]), - - wbStruct(XILW, 'Exterior LOD', [ - wbFormIDCk('Worldspace', [WRLD]), - wbFloat('Offset X'), - wbFloat('Offset Y'), - wbFloat('Offset Z') - ]), - wbString(XWEM, 'Water Environment Map'), - wbFormIDCk(XCCM, 'Sky/Weather from Region', [REGN]), - wbFormIDCk(XCAS, 'Acoustic Space', [ASPC]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbFormIDCk(XCMO, 'Music Type', [MUSC]), - wbFormIDCk(XCIM, 'Image Space', [IMGS]), - wbFormIDCk(XGDR, 'God Rays', [GDRY]), - - // those can be sorted I think, but makes copying records very slow since some cells have over 22000+ entries - // DLC01Lair01 "The Mechanist's Lair" [CELL:010008A3] - wbArrayS(XPRI, 'Physics References', wbFormIDCk('Reference', [REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA])), - wbStruct(XCRI, 'Combined References', [ - wbInteger('Meshes Count', itU32), - wbInteger('References Count', itU32), - wbArrayS('Meshes', wbInteger('Combined Mesh', itU32, wbCombinedMeshIDToStr, wbCombinedMeshIDToInt), wbCELLCombinedMeshesCounter, cpNormal, False, nil, wbCELLCombinedMeshesAfterSet), - wbArrayS('References', wbStructSK([1, 0], 'Reference', [ - wbFormIDCk('Reference', [REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbInteger('Combined Mesh', itU32, wbCombinedMeshIDToStr, wbCombinedMeshIDToInt) - ]), wbCELLCombinedRefsCounter, cpNormal, False, nil, wbCELLCombinedRefsAfterSet) - ]) - ], True, wbCellAddInfo, cpNormal, False{, wbCELLAfterLoad}); - - wbRecord(CLAS, 'Class', [ - wbEDID, - wbFULLReq, - wbDESCReq, - wbICON, - wbPRPS, - wbStruct(DATA, 'Data', [ - wbByteArray('Unknown', 4), - wbFloat('Bleedout Default') - ]) - ]); - - wbRecord(CLMT, 'Climate', [ - wbEDID, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR, NULL]), - wbInteger('Chance', itS32), - wbFormIDCk('Global', [GLOB, NULL]) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbRecord(SPGD, 'Shader Particle Geometry', [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbFloat('Gravity Velocity'), - wbByteArray('Unknown', 4), - wbFloat('Rotation Velocity'), - wbByteArray('Unknown', 4), - wbFloat('Particle Size X'), - wbFloat('Center Offset Min'), - wbFloat('Particle Size Y'), - wbByteArray('Unknown', 4), - wbFloat('Center Offset Min'), - wbByteArray('Unknown', 4), - wbFloat('Center Offset Max'), - wbByteArray('Unknown', 4), - wbFloat('Initial Rotation'), - wbByteArray('Unknown', 4), - wbInteger('# of Subtextures X', itU32), - wbByteArray('Unknown', 4), - wbInteger('# of Subtextures Y', itU32), - wbByteArray('Unknown', 4), - wbInteger('Type', itU32, wbEnum([ - 'Rain', - 'Snow' - ])), - wbByteArray('Unknown', 4), - wbInteger('Box Size', itU32), - wbByteArray('Unknown', 4), - wbFloat('Particle Density'), - wbUnknown - ], cpNormal, True, nil, 10), - wbString(MNAM, 'Particle Texture') - ]); - - wbRecord(RFCT, 'Visual Effect', [ - wbEDID, - wbStruct(DATA, 'Effect Data', [ - wbFormIDCK('Effect Art', [ARTO, NULL]), - wbFormIDCK('Shader', [EFSH, NULL]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Rotate to Face Target', - {0x00000002} 'Attach to Camera', - {0x00000004} 'Inherit Rotation' - ])) - ], cpNormal, True) - ]); - - wbRecord(CONT, 'Container', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbCOCT, - wbCNTOs, - wbDEST, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Allow Sounds When Animation', - {0x02} 'Respawns', - {0x04} 'Show Owner' - ])), - wbFloat('Weight') - ], cpNormal, True), - wbKSIZ, - wbKWDAs, - wbFTYP, - wbPRPS, - wbNTRM, - wbFormIDCk(SNAM, 'Sound - Open', [SNDR]), - wbFormIDCk(QNAM, 'Sound - Close', [SNDR]), - wbFormIDCk(TNAM, 'Sound - Take All', [SNDR]), - wbFormIDCk(ONAM, 'Filter List', [FLST]) - ], True, nil, cpNormal, False, nil, wbContainerAfterSet); - - wbAIDT := - wbStruct(AIDT, 'AI Data', [ - {00} wbInteger('Aggression', itU8, wbEnum([ - 'Unaggressive', - 'Aggressive', - 'Very Aggressive', - 'Frenzied' - ])), - {01} wbInteger('Confidence', itU8, wbEnum([ - 'Cowardly', - 'Cautious', - 'Average', - 'Brave', - 'Foolhardy' - ])), - {02} wbInteger('Energy Level', itU8), - {03} wbInteger('Responsibility', itU8, wbEnum([ - 'Any crime', - 'Violence against enemies', - 'Property crime only', - 'No crime' - ])), - {04} wbInteger('Mood', itU8, wbEnum([ - 'Neutral', - 'Angry', - 'Fear', - 'Happy', - 'Sad', - 'Surprised', - 'Puzzled', - 'Disgusted' - ])), - wbInteger('Assistance', itU8, wbEnum([ - 'Helps Nobody', - 'Helps Allies', - 'Helps Friends and Allies' - ])), - wbStruct('Aggro', [ - wbInteger('Aggro Radius Behavior', itU8, wbBoolEnum), - wbInteger('Unknown', itU8), - wbInteger('Warn', itU32), - wbInteger('Warn/Attack', itU32), - wbInteger('Attack', itU32) - ]), - wbByteArray('Unknown', 4) - ], cpNormal, True, nil{wbActorTemplateUseAIData}); - - wbRecord(CSTY, 'Combat Style', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Allow Dual Wielding' - ])), [ - wbEDID, - wbStruct(CSGD, 'General', [ - wbFloat('Offensive Mult'), - wbFloat('Defensive Mult'), - wbFloat('Group Offensive Mult'), - wbFloat('Equipment Score Mult - Melee'), - wbFloat('Equipment Score Mult - Magic'), - wbFloat('Equipment Score Mult - Ranged'), - wbFloat('Equipment Score Mult - Shout'), - wbFloat('Equipment Score Mult - Unarmed'), - wbFloat('Equipment Score Mult - Staff'), - wbFloat('Avoid Threat Chance'), - wbFloat('Dodge Threat Chance'), - wbFloat('Evade Threat Chance') - ], cpNormal, True), - wbUnknown(CSMD, cpIgnore), - wbStruct(CSME, 'Melee', [ - wbFloat('Attack Staggered Mult'), - wbFloat('Power Attack Staggered Mult'), - wbFloat('Power Attack Blocking Mult'), - wbFloat('Bash Mult'), - wbFloat('Bash Recoil Mult'), - wbFloat('Bash Attack Mult'), - wbFloat('Bash Power Attack Mult'), - wbFloat('Special Attack Mult'), - wbFloat('Block When Staggered Mult'), - wbFloat('Attack When Staggered Mult') - ], cpNormal, True, nil, 9), - wbFloat(CSRA, 'Ranged Accuracy Mult', cpNormal, True), - wbStruct(CSCR, 'Close Range', [ - wbFloat('Dueling - Circle Mult'), - wbFloat('Dueling - Fallback Mult'), - wbFloat('Flanking - Flank Distance'), - wbFloat('Flanking - Stalk Time'), - wbFloat('Charging - Charge Distance'), - wbFloat('Charging - Throw Probability'), - wbFloat('Charging - Sprint Fast Probability'), - wbFloat('Charging - Sideswipe Probability'), - wbFloat('Charging - Disengane Probability'), - wbInteger('Charging - Throw Max Targets', itU32), - wbFloat('Flanking - Flank Variance') - ], cpNormal, True), - wbStruct(CSLR, 'Long Range', [ - wbFloat('Strafe Mult'), - wbFloat('Adjust Range Mult'), - wbFloat('Crouch Mult'), - wbFloat('Wait Mult'), - wbFloat('Range Mult') - ], cpNormal, True, nil, 3), - wbFloat(CSCV, 'Cover Search Distance Mult', cpNormal, True), - wbStruct(CSFL, 'Flight', [ - wbFloat('Hover Chance'), - wbFloat('Dive Bomb Chance'), - wbFloat('Ground Attack Chance'), - wbFloat('Hover Time'), - wbFloat('Ground Attack Time'), - wbFloat('Perch Attack Chance'), - wbFloat('Perch Attack Time'), - wbFloat('Flying Attack Chance') - ], cpNormal, True), - wbInteger(DATA, 'Flags', itU32, wbFlags([ - {0x01} 'Dueling', - {0x02} 'Flanking', - {0x04} 'Allow Dual Wielding', - {0x08} 'Charging', - {0x10} 'Retarget Any Nearby Melee Target', - {0x20} 'Unknown 5' - ]), cpNormal, True) - ]); -end; - -procedure DefineFO4d; -begin - wbRecord(DIAL, 'Dialog Topic', [ - wbEDID, - wbFULL, - wbFloat(PNAM, 'Priority', cpNormal, True, 1, -1, nil, nil, 50.0), - wbFormIDCk(BNAM, 'Branch', [DLBR]), - wbFormIDCk(QNAM, 'Quest', [QUST], False, cpNormal, False), - wbFormIDCk(KNAM, 'Keyword', [KYWD]), - wbStruct(DATA, 'Data', [ - // this should not be named Flags since TwbFile.BuildReachable - // expects Top-Level flag here from FNV - wbInteger('Topic Flags', itU8, wbFlags([ - 'Do All Before Repeating', - 'Unknown 1', - 'Unknown 2' - ]), cpNormal, True), - wbInteger('Category', itU8, wbEnum([ - {0} 'Player', - {1} 'Command', - {2} 'Scene', - {3} 'Combat', - {4} 'Favor', - {5} 'Detection', - {6} 'Service', - {7} 'Miscellaneous' - ])), - wbInteger('Subtype', itU16, wbEnum([ - { 0} 'Custom', - { 1} 'ForceGreet', - { 2} 'Rumors', - { 3} 'Custom', - { 4} 'Call', - { 5} 'Follow', - { 6} 'Move', - { 7} 'Attack', - { 8} 'Inspect', - { 9} 'Retrieve', - {10} 'Stay', - {11} 'Release', - {12} 'ShowRelationships', - {13} 'Reject', - {14} 'Heal', - {15} 'Assign', - {16} 'Enter', - {17} 'Custom', - {18} 'Show', - {19} 'Agree', - {20} 'Refuse', - {21} 'ExitFavorState', - {22} 'MoralRefusal', - {23} 'Trade', - {24} 'PathingRefusal', - {25} 'Attack', - {26} 'PowerAttack', - {27} 'Bash', - {28} 'Hit', - {29} 'Flee', - {30} 'BleedOut', - {31} 'AvoidThreat', - {32} 'Death', - {33} 'Block', - {34} 'Taunt', - {35} 'ThrowGrenade', - {36} 'AllyKilled', - {37} 'OrderFallback', - {38} 'OrderMoveUp', - {39} 'OrderFlank', - {40} 'OrderTakeCover', - {41} 'Retreat', - {42} 'CoverMe', - {43} 'SuppressiveFire', - {44} 'CrippledLimb', - {45} 'PairedAttack', - {46} 'Steal', - {47} 'Yield', - {48} 'AcceptYield', - {49} 'PickpocketCombat', - {50} 'Assault', - {51} 'Murder', - {52} 'AssaultNC', - {53} 'MurderNC', - {54} 'PickpocketNC', - {55} 'StealFromNC', - {56} 'TrespassAgainstNC', - {57} 'Trespass', - {58} 'UNUSED01', - {59} 'VoicePowerStartShort', - {60} 'VoicePowerStartLong', - {61} 'VoicePowerEndShort', - {62} 'VoicePowerEndLong', - {63} 'AlertIdle', - {64} 'LostIdle', - {65} 'NormalToAlert', - {66} 'NormalToCombat', - {67} 'NormalToLost', - {68} 'AlertToNormal', - {69} 'AlertToCombat', - {70} 'CombatToNormal', - {71} 'CombatToLost', - {72} 'LostToNormal', - {73} 'LostToCombat', - {74} 'DetectFriendDie', - {75} 'ServiceRefusal', - {76} 'Repair', - {77} 'Travel', - {78} 'Training', - {79} 'BarterExit', - {80} 'RepairExit', - {81} 'Recharge', - {82} 'RechargeExit', - {83} 'TrainingExit', - {84} 'ObserveCombat', - {85} 'NoticeCorpse', - {86} 'TimeToGo', - {87} 'Goodbye', - {88} 'Hello', - {89} 'SwingMeleeWeapon', - {90} 'ShootBow', - {91} 'ZKeyObject', - {92} 'Jump', - {93} 'KnockOverObject', - {94} 'DestroyObject', - {95} 'StandonFurniture', - {96} 'LockedObject', - {97} 'PickpocketTopic', - {98} 'PursueIdleTopic', - {99} 'SharedInfo', - {100} 'SceneChoice', - {101} 'PlayerCastProjectileSpell', - {102} 'PlayerCastSelfSpell', - {103} 'PlayerShout', - {104} 'Idle', - {105} 'EnterSprintBreath', - {106} 'EnterBowZoomBreath', - {107} 'ExitBowZoomBreath', - {108} 'ActorCollidewithActor', - {109} 'PlayerinIronSights', - {110} 'OutofBreath', - {111} 'CombatGrunt', - {112} 'LeaveWaterBreath', - {113} 'ImpatientPostitive', - {114} 'ImpatientNegative', - {115} 'ImpatientNeutral', - {116} 'ImpatientQuestion', - {117} 'WaitingForPlayerInput', - {118} 'Greeting', - {119} 'PlayerActivateDoor', - {120} 'PlayerActivateTerminals', - {121} 'PlayerActivateFurniture', - {122} 'PlayerActivateActivators', - {123} 'PlayerActivateContainer', - {124} 'PlayerAquireFeaturedItem' - ])) - ]), - wbString(SNAM, 'Subtype Name', 4), - wbInteger(TIFC, 'Info Count', itU32, nil, cpBenign) - ]); - - wbRecord(DOOR, 'Door', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Non Occluder', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00800000} 23, 'Is Marker' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbNTRM, - wbFormIDCk(SNAM, 'Sound - Open', [SNDR]), - wbFormIDCk(ANAM, 'Sound - Close', [SNDR]), - wbFormIDCk(BNAM, 'Sound - Loop', [SNDR]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - '', - 'Automatic', - 'Hidden', - 'Minimal Use', - 'Sliding', - 'Do Not Open in Combat Search', - 'No "To" Text' - ]), cpNormal, True), - wbLStringKC(ONAM, 'Alternate Text - Open', 0, cpTranslate), - wbLStringKC(CNAM, 'Alternate Text - Close', 0, cpTranslate) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - '', - 'Greater Than', - '', - 'Greater Than or Equal To' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbString(NAM7, 'Holes Texture'), - wbString(NAM8, 'Membrane Palette Texture'), - wbString(NAM9, 'Particle Palette Texture'), - wbUnknown(DATA), // if form version < 62, ignored otherwise - // format depends on Form Version (appear with form version 62, changed in form version 106), different for older records starting from the first field - wbUnion(DNAM, '', wbEFSHFormatDecider, [ - wbStruct('Data', [ - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbByteColors('Fill/Texture Effect - Color Key 1'), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbByteColors('Edge Effect - Color'), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Holes Animation - Start Time'), - wbFloat('Holes Animation - End Time'), - wbFloat('Holes Animation - Start Value'), - wbFloat('Holes Animation - End Value'), - wbFormIDCk('Ambient Sound', [SNDR, NULL]), - wbByteColors('Fill/Texture Effect - Color Key 2'), - wbByteColors('Fill/Texture Effect - Color Key 3'), - wbInteger('Unknown', itU8), - wbStruct('Fill/Texture Effect - Color Key Scale/Time', [ - wbFloat('Color Key 1 - Scale'), - wbFloat('Color Key 2 - Scale'), - wbFloat('Color Key 3 - Scale'), - wbFloat('Color Key 1 - Time'), - wbFloat('Color Key 2 - Time'), - wbFloat('Color Key 3 - Time') - ]), - wbInteger('Flags', itU32, wbFlags([ - 'No Membrane Shader', - 'Membrane Grayscale Color', - 'Membrane Grayscale Alpha', - 'No Particle Shader', - 'Edge Effect - Inverse', - 'Affect Skin Only', - 'Texture Effect - Ignore Alpha', - 'Texture Effect - Project UVs', - 'Ignore Base Geometry Alpha', - 'Texture Effect - Lighting', - 'Texture Effect - No Weapons', - 'Use Alpha Sorting', - 'Prefer Dismembered Limbs', - 'Unknown 13', - 'Unknown 14', - 'Particle Animated', - 'Particle Grayscale Color', - 'Particle Grayscale Alpha', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Unknown 21', - 'Unknown 22', - 'Unknown 23', - 'Use Blood Geometry (Weapons Only)' - ])), - wbFloat('Fill/Texture Effect - Texture Scale (U)'), - wbFloat('Fill/Texture Effect - Texture Scale (V)') - ]), - wbStruct('Data (old format)', [ - wbByteArray('Unknown', 1), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbByteColors('Fill/Texture Effect - Color Key 1'), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbByteColors('Edge Effect - Color'), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Count'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbByteColors('Color Key 1 - Color'), - wbByteColors('Color Key 2 - Color'), - wbByteColors('Color Key 3 - Color'), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time'), - wbFloat('Particle Shader - Initial Speed Along Normal +/-'), - wbFloat('Particle Shader - Initial Rotation (deg)'), - wbFloat('Particle Shader - Initial Rotation (deg) +/-'), - wbFloat('Particle Shader - Rotation Speed (deg/sec)'), - wbFloat('Particle Shader - Rotation Speed (deg/sec) +/-'), - wbFormIDCk('Addon Models', [DEBR, NULL]), - wbFloat('Holes - Start Time'), - wbFloat('Holes - End Time'), - wbFloat('Holes - Start Val'), - wbFloat('Holes - End Val'), - wbFloat('Edge Width (alpha units)'), - wbByteColors('Edge Color'), - wbFloat('Explosion Wind Speed'), - wbInteger('Texture Count U', itU32), - wbInteger('Texture Count V', itU32), - wbFloat('Addon Models - Fade In Time'), - wbFloat('Addon Models - Fade Out Time'), - wbFloat('Addon Models - Scale Start'), - wbFloat('Addon Models - Scale End'), - wbFloat('Addon Models - Scale In Time'), - wbFloat('Addon Models - Scale Out Time'), - wbFormIDCk('Ambient Sound', [SNDR, NULL]), - wbByteColors('Fill/Texture Effect - Color Key 2'), - wbByteColors('Fill/Texture Effect - Color Key 3'), - wbStruct('Fill/Texture Effect - Color Key Scale/Time', [ - wbFloat('Color Key 1 - Scale'), - wbFloat('Color Key 2 - Scale'), - wbFloat('Color Key 3 - Scale'), - wbFloat('Color Key 1 - Time'), - wbFloat('Color Key 2 - Time'), - wbFloat('Color Key 3 - Time') - ]), - wbFloat('Color Scale'), - wbFloat('Birth Position Offset'), - wbFloat('Birth Position Offset Range +/-'), - wbStruct('Particle Shader Animated', [ - wbInteger('Start Frame', itU32), - wbInteger('Start Frame Variation', itU32), - wbInteger('End Frame', itU32), - wbInteger('Loop Start Frame', itU32), - wbInteger('Loop Start Variation', itU32), - wbInteger('Frame Count', itU32), - wbInteger('Frame Count Variation', itU32) - ]), - wbInteger('Flags', itU32, wbFlags([ - 'No Membrane Shader', - 'Membrane Grayscale Color', - 'Membrane Grayscale Alpha', - 'No Particle Shader', - 'Edge Effect Inverse', - 'Affect Skin Only', - 'Ignore Alpha', - 'Project UVs', - 'Ignore Base Geometry Alpha', - 'Lighting', - 'No Weapons', - 'Unknown 11', - 'Unknown 12', - 'Unknown 13', - 'Unknown 14', - 'Particle Animated', - 'Particle Grayscale Color', - 'Particle Grayscale Alpha', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Unknown 21', - 'Unknown 22', - 'Unknown 23', - 'Use Blood Geometry' - ])), - wbFloat('Fill/Texture Effect - Texture Scale (U)'), - wbFloat('Fill/Texture Effect - Texture Scale (V)'), - wbInteger('Scene Graph Emit Depth Limit (unused)', itU16) - ]) - ], cpNormal, True), - wbMODL - ]); - - wbRecord(ENCH, 'Object Effect', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Enchantment Cost', itS32), - wbInteger('Flags', itU32, wbFlags([ - 'No Auto-Calc', - '', - 'Extend Duration On Recast' - ])), - wbInteger('Cast Type', itU32, wbCastEnum), - wbInteger('Enchantment Amount', itS32), - wbInteger('Target Type', itU32, wbTargetEnum), - wbInteger('Enchant Type', itU32, wbEnum([], [ - $06, 'Enchantment', - $0C, 'Staff Enchantment' - ])), - wbFloat('Charge Time'), - wbFormIDCk('Base Enchantment', [ENCH, NULL]), - wbFormIDCk('Worn Restrictions', [FLST, NULL]) - ], cpNormal, True, nil, 8), - wbEffectsReq - ]); - - {wbRecord(EYES, 'Eyes', [ - wbEDID - ]);} - - wbRecord(FACT, 'Faction', [ - wbEDID, - wbFULL, - wbRArrayS('Relations', - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCkNoReach('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32), - wbInteger('Group Combat Reaction', itU32, wbEnum([ - {0x00000001} 'Neutral', - {0x00000002} 'Enemy', - {0x00000004} 'Ally', - {0x00000008} 'Friend' - ])) - ])), - wbStruct(DATA, 'Flags', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hidden From NPC', - {0x00000002} 'Special Combat', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Track Crime', - {0x00000080} 'Ignore Crimes: Murder', - {0x00000100} 'Ignore Crimes: Assault', - {0x00000200} 'Ignore Crimes: Stealing', - {0x00000400} 'Ignore Crimes: Trespass', - {0x00000800} 'Do Not Report Crimes Against Members', - {0x00001000} 'Crime Gold - Use Defaults', - {0x00002000} 'Ignore Crimes: Pickpocket', - {0x00004000} 'Vendor', - {0x00008000} 'Can Be Owner', - {0x00010000} 'Ignore Crimes: Werewolf (unused)' - ])) - ], cpNormal, True, nil, 1), - wbFormIDCk(JAIL, 'Exterior Jail Marker', [REFR]), - wbFormIDCk(WAIT, 'Follower Wait Marker', [REFR]), - wbFormIDCk(STOL, 'Stolen Goods Container', [REFR]), - wbFormIDCk(PLCN, 'Player Inventory Container', [REFR]), - wbFormIDCk(CRGR, 'Shared Crime Faction List', [FLST]), - wbFormIDCk(JOUT, 'Jail Outfit', [OTFT]), - wbStruct(CRVA, 'Crime Values', [ - wbInteger('Arrest', itU8, wbBoolEnum), - wbInteger('Attack On Sight', itU8, wbBoolEnum), - wbInteger('Murder', itU16), - wbInteger('Assault', itU16), - wbInteger('Trespass', itU16), - wbInteger('Pickpocket', itU16), - wbInteger('Unknown', itU16), - wbFloat('Steal Multiplier'), - wbInteger('Escape', itU16), - wbInteger('Werewolf (unused)', itU16) - ], cpNormal, False, nil, 7), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itU32), - wbLString(MNAM, 'Male Title', 0, cpTranslate), - wbLString(FNAM, 'Female Title', 0, cpTranslate), - wbString(INAM, 'Insignia (unused)') - ], []), - wbFormIDCk(VEND, 'Vendor Buy/Sell List', [FLST]), - wbFormIDCk(VENC, 'Merchant Container', [REFR]), - wbStruct(VENV, 'Vendor Values', [ - wbInteger('Start Hour', itU16), - wbInteger('End Hour', itU16), - wbInteger('Radius', itU16), - wbByteArray('Unknown 1', 2), - wbInteger('Buys Stolen Items', itU8, wbBoolEnum), - wbInteger('Buy/Sell Everything Not In List?', itU8, wbBoolEnum), - wbInteger('Buys NonStolen Items', itU8, wbBoolEnum), - wbInteger('Unknown', itU8) - ]), - wbPLVD, - wbCITC, - wbCTDAsCount - ], False, nil, cpNormal, False, nil {wbFACTAfterLoad}, wbConditionsAfterSet); - - wbRecord(FURN, 'Furniture', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Unknown 2', - {0x00000010} 4, 'Unknown 4', - {0x00000080} 7, 'Is Perch', - {0x00002000} 13, 'Unknown 13', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00800000} 23, 'Is Marker', - {0x02000000} 25, 'Power Armor', - {0x10000000} 28, 'Must Exit To Talk', - {0x20000000} 29, 'Child Can Use' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbNTRM, - wbFTYP, - wbUnknown(PNAM), - wbFormIDCk(WNAM, 'Drinking Water Type', [WATR]), - wbATTX, - wbInteger(FNAM, 'Flags', itU16, wbFlags([ - {0x0001} 'Unknown 0', - {0x0002} 'Ignored By Sandbox' - ])), - wbCITC, - wbCTDAsCount, - wbCOCT, - wbCNTOs, - wbMNAMFurnitureMarker, - wbStruct(WBDT, 'Workbench Data', [ - wbInteger('Bench Type', itU8, wbEnum([ - {0} 'None', - {1} 'Create Object', // used only for MS11Workbench [FURN:00091FD5] - {2} 'Weapons', // used for the Weapons (plural) workbench - {3} 'Enchanting (unused)', // not used - {4} 'Enchanting Experiment (unused)', // not used - {5} 'Alchemy', // used for Chemistry and Cooking, so Alchemy is probably okay - {6} 'Alchemy Experiment (unused)', // not used - {7} 'Armor', // FO4 calls this the Armor workbench, no mention of Smithing - {8} 'Power Armor', // used for Power Armor stations - {9} 'Robot Mod' // used for Robot stations - ])), - wbInteger('Uses Skill', itS8, wbSkillEnum) - ], cpNormal, True, nil, 1), - wbFormIDCk(NAM1, 'Associated Form', [ARMO, WEAP, PERK, SPEL, HAZD]), - wbRArray('Markers', wbRStruct('Marker', [ - wbInteger(ENAM, 'Marker Index', itS32), - wbStruct(NAM0, 'Disabled Entry Points', [ - wbByteArray('Unknown', 2), - wbInteger('Disabled Points', itU16, wbFurnitureEntryTypeFlags) - ]) - //wbFormIDCk(FNMK, 'Marker Keyword', [KYWD, NULL]) - ], [])), - wbRArray('Marker Entry Points', wbStruct(FNPR, 'Marker', [ - wbInteger('Type', itU16, wbFurnitureAnimTypeEnum), - wbInteger('Entry Points', itU16, wbFurnitureEntryTypeFlags) - ])), - wbString(XMRK, 'Marker Model'), - wbSNAMMarkerParams, - wbNVNM, - wbAPPR, - wbObjectTemplate - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(GLOB, 'Global', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Constant' - ])), [ - wbEDID, - wbInteger(FNAM, 'Type', itU8, wbEnum([], [ - 0, 'Unknown 0', - Ord('s'), 'Short', - Ord('l'), 'Long', - Ord('f'), 'Float', - Ord('b'), 'Boolean' - ]), cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - wbRecord(GMST, 'Game Setting', [ - wbString(EDID, 'Editor ID', 0, cpCritical, True, nil, wbGMSTEDIDAfterSet), - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbLString('Name', 0, cpTranslate), - wbInteger('Int', itS32), - wbFloat('Float'), - wbInteger('Bool', itU32, wbBoolEnum) - ], cpNormal, True) - ]); - - wbRecord(KYWD, 'Keyword', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} {15} 15, 'Restricted' - ])), [ - wbEDID, - wbCNAM, - wbString(DNAM, 'Notes'), - wbInteger(TNAM, 'Type', itU32, wbKeywordTypeEnum), - wbFormIDCk(DATA, 'Attraction Rule', [AORU]), - wbFULL, - wbString(NNAM, 'Display Name') {Legacy record replaced with FULL} - ]); -end; - -procedure DefineFO4e; -begin - wbRecord(LCRT, 'Location Reference Type', [ - wbEDID, - wbCNAM, - wbUnknown(TNAM) - ]); - - wbRecord(AACT, 'Action', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} {15} 15, 'Restricted' - ])), [ - wbEDID, - wbCNAM, - wbString(DNAM, 'Notes'), - wbInteger(TNAM, 'Type', itU32, wbKeywordTypeEnum), - wbFormIDCk(DATA, 'Attraction Rule', [AORU]), - wbFULL - ]); - - wbRecord(TXST, 'Texture Set', [ - wbEDID, - wbOBNDReq, - wbRStruct('Textures (RGB/A)', [ - wbString(TX00, 'Difuse'), - wbString(TX01, 'Normal/Gloss'), - wbString(TX03, 'Glow'), - wbString(TX04, 'Height'), - wbString(TX05, 'Environment'), - wbString(TX02, 'Wrinkles'), {TX05 TX02 TX06 Yes this has to go here} - wbString(TX06, 'Multilayer'), - wbString(TX07, 'Smooth Spec') - ], []), - wbDODT, - wbInteger(DNAM, 'Flags', itU16, wbFlags([ - {0x0001} 'No Specular Map', - {0x0002} 'Facegen Textures', - {0x0004} 'Has Model Space Normal Map' - ]), cpNormal, True), - wbString(MNAM, 'Material') - ]); - - wbRecord(HDPT, 'Head Part', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbFULL, - wbMODL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Playable', - {0x02} 'Male', - {0x04} 'Female', - {0x10} 'Is Extra Part', - {0x20} 'Use Solid Tint', - {0x40} 'Uses Body Texture' - ]), cpNormal, True), - wbInteger(PNAM, 'Type', itU32, wbEnum([ - 'Misc', - 'Face', - 'Eyes', - 'Hair', - 'Facial Hair', - 'Scar', - 'Eyebrows', - 'Meatcaps', - 'Teeth', - 'Head Rear' - ])), - wbRArrayS('Extra Parts', - wbFormIDCk(HNAM, 'Part', [HDPT]) - ), - wbRStructs('Parts', 'Part', [ - wbInteger(NAM0, 'Part Type', itU32, wbEnum([ - 'Race Morph', - 'Tri', - 'Chargen Morph' - ])), - wbString(NAM1, 'Filename', 0, cpTranslate, True) - ], []), - wbFormIDCk(TNAM, 'Texture Set', [TXST]), - wbFormIDCk(CNAM, 'Color', [CLFM]), - wbFormIDCk(RNAM, 'Valid Races', [FLST]), - wbCTDAs - ]); - - wbRecord(ASPC, 'Acoustic Space', [ - wbEDID, - wbOBNDReq, - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]), - wbFormIDCk(RDAT, 'Use Sound from Region (Interiors Only)', [REGN]), - wbFormIDCk(BNAM, 'Environment Type', [REVB]), - wbInteger(XTRI, 'Is Interior', itU8, wbBoolEnum, cpNormal, True), - wbInteger(WNAM, 'Weather Attenuation (dB)', itU16, wbDiv(100)) - ]); - - wbRecord(MSTT, 'Moveable Static', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000100} 8, 'Must Update Anims', - {0x00000200} 9, 'Hidden From Local Map', - {0x00000800} 11, 'Used As Platform', - {0x00002000} 13, 'Pack-In Use Only', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00080000} 19, 'Has Currents', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbInteger(DATA, 'On Local Map', itU8, wbBoolEnum, cpNormal, True), - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]) - ]); -end; - -procedure DefineFO4f; -begin - wbRecord(IDLM, 'Idle Marker', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x20000000} 29, 'Child Can Use' - ])), [ - wbEDID, - wbOBNDReq, - wbKSIZ, - wbKWDAs, - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - 'Unknown 1', - 'Do Once', - 'Unknown 3', - 'Ignored by Sandbox' - ]), cpNormal, False), - wbInteger(IDLC, 'Animation Count', itU8, nil, cpBenign), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, False), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, False), - wbFormIDCk(QNAM, 'Unknown', [KYWD]), - wbMODL - ], False, nil, cpNormal, False, nil, wbAnimationsAfterSet); - - wbRecord(PROJ, 'Projectile', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbByteArray(DATA, 'Unused', 0, cpIgnore), - wbStruct(DNAM, 'Data', [ - wbInteger('Flags', itU16, wbFlags([ - {0x00001} 'Hitscan', - {0x00002} 'Explosion', - {0x00004} 'Alt. Trigger', - {0x00008} 'Muzzle Flash', - {0x00010} 'Unknown 4', - {0x00020} 'Can Be Disabled', - {0x00040} 'Can Be Picked Up', - {0x00080} 'Supersonic', - {0x00100} 'Pins Limbs', - {0x00200} 'Pass Through Small Transparent', - {0x00400} 'Disable Combat Aim Correction', - {0x00800} 'Penetrates Geometry', - {0x01000} 'Continuous Update', - {0x02000} 'Seeks Target' - ])), - wbInteger('Type', itU16, wbEnum([], [ - $01, 'Missile', - $02, 'Lobber', - $04, 'Beam', - $08, 'Flame', - $10, 'Cone', - $20, 'Barrier', - $40, 'Arrow' - ])), - wbFloat('Gravity'), - wbFloat('Speed'), - wbFloat('Range'), - wbFormIDCk('Light', [LIGH, NULL]), - wbFormIDCk('Muzzle Flash - Light', [LIGH, NULL]), - wbFloat('Explosion - Alt. Trigger - Proximity'), - wbFloat('Explosion - Alt. Trigger - Timer'), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Sound', [SNDR, NULL]), - wbFloat('Muzzle Flash - Duration'), - wbFloat('Fade Duration'), - wbFloat('Impact Force'), - wbFormIDCk('Sound - Countdown', [SNDR, NULL]), - wbFormIDCk('Sound - Disable', [SNDR, NULL]), - wbFormIDCk('Default Weapon Source', [WEAP, NULL]), - wbFloat('Cone Spread'), - wbFloat('Collision Radius'), - wbFloat('Lifetime'), - wbFloat('Relaunch Interval'), - wbFormIDCk('Decal Data', [TXST, NULL]), - wbFormIDCk('Collision Layer', [COLL, NULL]), - wbInteger('Tracer Frequency', itU8), - wbFormIDCk('VATS Projectile', [PROJ, NULL]) - ]), - wbRStructSK([0], 'Muzzle Flash Model', [ - wbString(NAM1, 'Model Filename'), - wbByteArray(NAM2, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow) - ], [], cpNormal, True), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ]); - - wbRecord(HAZD, 'Hazard', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD, NULL]), - wbStruct(DNAM, 'Data', [ - wbInteger('Limit', itU32), - wbFloat('Radius'), - wbFloat('Lifetime'), - wbFloat('Image Space Radius'), - wbFloat('Target Interval'), - wbInteger('Flags', itU32, wbFlags([ - {0x01} 'Affects Player Only', - {0x02} 'Inherit Duration from Spawn Spell', - {0x04} 'Align to Impact Normal', - {0x08} 'Inherit Radius from Spawn Spell', - {0x10} 'Drop to Ground', - {0x20} 'Taper Effectiveness by Proximity' - ])), - wbFormIDCk('Effect', [SPEL, ENCH, NULL]), - wbFormIDCk('Light', [LIGH, NULL]), - wbFormIDCk('Impact Data Set', [IPDS, NULL]), - wbFormIDCk('Sound', [SNDR, NULL]), - wbStruct('Taper Effectiveness', [ - wbFloat('Full Effect Radius'), - wbFloat('Taper Weight'), - wbFloat('Taper Curse') - ]) - ]) - ]); - - wbSoulGemEnum := wbEnum([ - {0} 'None', - {1} 'Petty', - {2} 'Lesser', - {3} 'Common', - {4} 'Greater', - {5} 'Grand' - ]); - - {wbRecord(SLGM, 'Soul Gem', [ - wbEDID - ]);} - - if wbSimpleRecords then begin - - wbRecord(NAVI, 'Navigation Mesh Info Map', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbRArray('Navigation Map Infos', - wbStruct(NVMI, 'Navigation Map Info', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbByteArray('Data', 20), - wbArray('Merged To', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Preferred Merges', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Linked Doors', wbStruct('Door', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Door Ref', [REFR]) - ]), -1), - wbInteger('Is Island', itU8, wbBoolEnum), - wbUnion('Island', wbNAVIIslandDataDecider, [ - wbNull, - wbStruct('Island Data', [ - wbByteArray('Unknown', 24), - wbArray('Triangles', wbByteArray('Triangle', 6), -1), - wbArray('Vertices', wbByteArray('Vertex', 12), -1) - ]) - ]), - wbByteArray('Unknown', 4), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNAVIParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]) - ]) - ), - wbStruct(NVPP, 'Preferred Pathing', [ - wbArray('NavMeshes', wbArray('Set', wbFormIDCk('', [NAVM]), -1), -1), - wbArray('NavMesh Tree?', wbStruct('', [ - wbFormIDCk('NavMesh', [NAVM]), - wbInteger('Index/Node', itU32) - ]), -1) - ]), - //wbArray(NVSI, 'Unknown', wbFormIDCk('Navigation Mesh', [NAVM])) - wbUnknown(NVSI) - ]); - - wbRecord(NAVM, 'Navigation Mesh', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed', - {0x04000000} 26, 'AutoGen', - {0x80000000} 31, 'Unknown 31' - ]), [18]), [ - wbEDID, - wbNVNM, -// wbStruct(NVNM, 'Geometry', [ -// wbByteArray('Unknown', 8), -// wbFormIDCk('Parent Worldspace', [WRLD, NULL]), -// wbUnion('Parent', wbNVNMParentDecider, [ -// wbStruct('Coordinates', [ -// wbInteger('Grid Y', itS16), -// wbInteger('Grid X', itS16) -// ]), -// wbFormIDCk('Parent Cell', [CELL]) -// ]), -// wbArray('Vertices', wbByteArray('Vertex', 12), -1), -// wbArray('Triangles', wbByteArray('Triangle', 21), -1), -// wbArray('Edge Links', -// wbStruct('Edge Link', [ -// wbByteArray('Unknown', 4), -// wbFormIDCk('Mesh', [NAVM]), -// wbInteger('Triangle', itS16), -// wbInteger('Unknown', itU8) -// ]) -// , -1), -// wbArray('Door Triangles', -// wbStruct('Door Triangle', [ -// wbInteger('Triangle before door', itS16), -// wbByteArray('Unknown', 4), -// wbFormIDCk('Door', [REFR]) -// ]) -// , -1), -// wbUnknown -// ]), - wbUnknown(ONAM), - wbUnknown(NNAM), - wbUnknown(MNAM) - ], False, wbNAVMAddInfo); - - end else begin - - wbRecord(NAVI, 'Navigation Mesh Info Map', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbRArray('Navigation Map Infos', - wbStruct(NVMI, 'Navigation Map Info', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbByteArray('Unknown', 4), - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z'), - wbInteger('Preferred Merges Flag', itU32), - wbArray('Merged To', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Preferred Merges', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Linked Doors', wbStruct('Door', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Door Ref', [REFR]) - ]), -1), - wbInteger('Is Island', itU8, wbBoolEnum), - wbUnion('Island', wbNAVIIslandDataDecider, [ - wbNull, - wbStruct('Island Data', [ - wbFloat('Min X'), - wbFloat('Min Y'), - wbFloat('Min Z'), - wbFloat('Max X'), - wbFloat('Max Y'), - wbFloat('Max Z'), - wbArray('Triangles', - wbStruct('Triangle', [ - wbArray('Vertices', wbInteger('Vertex', itS16), 3) - ]) - , -1), - wbArray('Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), -1) - ]) - ]), - wbByteArray('Unknown', 4), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNAVIParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]) - ]) - ), - wbStruct(NVPP, 'Preferred Pathing', [ - wbArray('NavMeshes', wbArray('Set', wbFormIDCk('', [NAVM]), -1), -1), - wbArray('NavMesh Tree?', wbStruct('', [ - wbFormIDCk('NavMesh', [NAVM]), - wbInteger('Index/Node', itU32) - ]), -1) - ]), - wbArray(NVSI, 'Unknown', wbFormIDCk('Navigation Mesh', [NAVM])) - ]); - - wbRecord(NAVM, 'Navigation Mesh', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed', - {0x04000000} 26, 'AutoGen' - ]), [18]), [ - wbEDID, - wbNVNM, -// wbStruct(NVNM, 'Geometry', [ -// wbInteger('Unknown', itU32), -// wbByteArray('Unknown', 4), -// wbFormIDCk('Parent Worldspace', [WRLD, NULL]), -// wbUnion('Parent', wbNVNMParentDecider, [ -// wbStruct('Coordinates', [ -// wbInteger('Grid Y', itS16), -// wbInteger('Grid X', itS16) -// ]), -// wbFormIDCk('Parent Cell', [CELL]) -// ]), -// wbArray('Vertices', wbStruct('Vertex', [ -// wbFloat('X'), -// wbFloat('Y'), -// wbFloat('Z') -// ]), -1), -// wbArray('Triangles', -// wbStruct('Triangle', [ -// wbInteger('Vertex 0', itS16), -// wbInteger('Vertex 1', itS16), -// wbInteger('Vertex 2', itS16), -// wbInteger('Edge 0-1', itS16), -// wbInteger('Edge 1-2', itS16), -// wbInteger('Edge 2-0', itS16), -// wbFloat('Height'), -// wbByteArray('Unknown', 5) -// ]) -// , -1), -// wbArray('Edge Links', -// wbStruct('Edge Link', [ -// wbByteArray('Unknown', 4), -// wbFormIDCk('Mesh', [NAVM]), -// wbInteger('Triangle', itS16), -// wbInteger('Unknown', itU8) -// ]) -// , -1), -// wbArray('Door Triangles', -// wbStruct('Door Triangle', [ -// wbInteger('Triangle before door', itS16), -// wbByteArray('Unknown', 4), -// wbFormIDCk('Door', [REFR]) -// ]) -// , -1), -// wbUnknown -// ]), - wbFormID(ONAM), - wbArray(NNAM, 'Unknown', wbInteger('Unknown', itU16)), - wbUnion(MNAM, 'Unknown', wbSubrecordSizeDecider, [wbNull, - wbStruct('Unknown', [ - wbFormID('Unknown'), - wbInteger('Unknown', itU16), - wbInteger('Unused', itU16), - wbUnknown - ]) - ]) - ], False, wbNAVMAddInfo); - - end; - -end; - -procedure DefineFO4g; -begin - - wbRecord(EXPL, 'Explosion', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbEITM, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]), - wbStruct(DATA, 'Data', [ - wbFormIDCk('Light', [LIGH, NULL]), - wbFormIDCk('Sound 1', [SNDR, NULL]), - wbFormIDCk('Sound 2', [SNDR, NULL]), - wbFormIDCk('Impact Data Set', [IPDS, NULL]), - wbFormID('Placed Object'), - wbFormIDCk('Spawn Projectile', [PROJ, NULL]), - wbFloat('Force'), - wbFloat('Damage'), - wbFloat('Inner Radius'), - wbFloat('Outer Radius'), - wbFloat('IS Radius'), - wbUnion('Vertical Offset Mult', wbDeciderFormVersion99, [ - wbByteArray('Unknown', 4), - wbFloat('Vertical Offset Mult') - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Unknown 0', - {0x00000002} 'Always Uses World Orientation', - {0x00000004} 'Knock Down - Always', - {0x00000008} 'Knock Down - By Formula', - {0x00000010} 'Ignore LOS Check', - {0x00000020} 'Push Explosion Source Ref Only', - {0x00000040} 'Ignore Image Space Swap', - {0x00000080} 'Chain', - {0x00000100} 'No Controller Vibration', - {0x00000200} 'Placed Object Persists', - {0x00000400} 'Skip Underwater Tests' - ])), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbFloat('Placed Object AutoFade Delay'), - wbInteger('Stagger', itU32, wbEnum([ - 'None', - 'Small', - 'Medium', - 'Large', - 'Extra Large' - ])), - wbStruct('Spawn', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z'), - wbFloat('Spread Degrees'), - wbInteger('Count', itU32) - ]) - ], cpNormal, True, nil, 13) - ]); - - wbRecord(DEBR, 'Debris', [ - wbEDID, - wbRStructs('Models', 'Model', [ - wbStruct(DATA, 'Data', [ - wbInteger('Percentage', itU8), - wbString('Model Filename'), - wbInteger('Flags', itU8, wbFlags([ - 'Has Collision Data' - ])) - ], cpNormal, True), - wbMODT - ], [], cpNormal, True) - ]); - - wbRecord(IMGS, 'Image Space', [ - wbEDID, - wbByteArray(ENAM, 'Unused', 0, cpIgnore), - wbStruct(HNAM, 'HDR', [ - wbFloat('Eye Adapt Speed'), - wbFloat('Tonemap E'), - wbFloat('Bloom Threshold'), - wbFloat('Bloom Scale'), - wbFloat('Auto Exposure Max'), - wbFloat('Auto Exposure Min'), - wbFloat('Sunlight Scale'), - wbFloat('Sky Scale'), - wbFloat('Middle Gray') - ], cpNormal, True), - wbStruct(CNAM, 'Cinematic', [ - wbFloat('Saturation'), - wbFloat('Brightness'), - wbFloat('Contrast') - ], cpNormal, True), - wbStruct(TNAM, 'Tint', [ - wbFloat('Amount'), - wbFloatColors('Color') - ], cpNormal, True), - wbStruct(DNAM, 'Depth of Field', [ - wbFloat('Strength'), - wbFloat('Distance'), - wbFloat('Range'), - wbByteArray('Unused', 2, cpIgnore), - wbInteger('Sky / Blur Radius', itU16, wbEnum([], [ - 16384, 'Radius 0', - 16672, 'Radius 1', - 16784, 'Radius 2', - 16848, 'Radius 3', - 16904, 'Radius 4', - 16936, 'Radius 5', - 16968, 'Radius 6', - 17000, 'Radius 7', - 16576, 'No Sky, Radius 0', - 16736, 'No Sky, Radius 1', - 16816, 'No Sky, Radius 2', - 16880, 'No Sky, Radius 3', - 16920, 'No Sky, Radius 4', - 16952, 'No Sky, Radius 5', - 16984, 'No Sky, Radius 6', - 17016, 'No Sky, Radius 7' - ])), - wbFloat('Vignette Radius'), - wbFloat('Vignette Strength') - ], cpNormal, True, nil, 5), - wbString(TX00, 'LUT') - ]); - - wbTimeInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Value') - ]); - - wbColorInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Red', cpNormal, False, 255, 0), - wbFloat('Green', cpNormal, False, 255, 0), - wbFloat('Blue', cpNormal, False, 255, 0), - wbFloat('Alpha', cpNormal, False, 255, 0) - ]); - - wbRecord(IMAD, 'Image Space Adapter', [ - wbEDID, - wbStruct(DNAM, 'Data Count', [ - wbInteger('Flags', itU32, wbFlags(['Animatable'])), - wbFloat('Duration'), - wbStruct('HDR', [ - wbInteger('Eye Adapt Speed Mult', itU32), - wbInteger('Eye Adapt Speed Add', itU32), - wbInteger('Bloom Blur Radius Mult', itU32), - wbInteger('Bloom Blur Radius Add', itU32), - wbInteger('Bloom Threshold Mult', itU32), - wbInteger('Bloom Threshold Add', itU32), - wbInteger('Bloom Scale Mult', itU32), - wbInteger('Bloom Scale Add', itU32), - wbInteger('Target Lum Min Mult', itU32), - wbInteger('Target Lum Min Add', itU32), - wbInteger('Target Lum Max Mult', itU32), - wbInteger('Target Lum Max Add', itU32), - wbInteger('Sunlight Scale Mult', itU32), - wbInteger('Sunlight Scale Add', itU32), - wbInteger('Sky Scale Mult', itU32), - wbInteger('Sky Scale Add', itU32) - ]), - wbInteger('Unknown08 Mult', itU32), - wbInteger('Unknown48 Add', itU32), - wbInteger('Unknown09 Mult', itU32), - wbInteger('Unknown49 Add', itU32), - wbInteger('Unknown0A Mult', itU32), - wbInteger('Unknown4A Add', itU32), - wbInteger('Unknown0B Mult', itU32), - wbInteger('Unknown4B Add', itU32), - wbInteger('Unknown0C Mult', itU32), - wbInteger('Unknown4C Add', itU32), - wbInteger('Unknown0D Mult', itU32), - wbInteger('Unknown4D Add', itU32), - wbInteger('Unknown0E Mult', itU32), - wbInteger('Unknown4E Add', itU32), - wbInteger('Unknown0F Mult', itU32), - wbInteger('Unknown4F Add', itU32), - wbInteger('Unknown10 Mult', itU32), - wbInteger('Unknown50 Add', itU32), - wbStruct('Cinematic', [ - wbInteger('Saturation Mult', itU32), - wbInteger('Saturation Add', itU32), - wbInteger('Brightness Mult', itU32), - wbInteger('Brightness Add', itU32), - wbInteger('Contrast Mult', itU32), - wbInteger('Contrast Add', itU32) - ]), - wbInteger('Unknown14 Mult', itU32), - wbInteger('Unknown54 Add', itU32), - wbInteger('Tint Color', itU32), - wbInteger('Blur Radius', itU32), - wbInteger('Double Vision Strength', itU32), - wbInteger('Radial Blur Strength', itU32), - wbInteger('Radial Blur Ramp Up', itU32), - wbInteger('Radial Blur Start', itU32), - wbInteger('Radial Blur Flags', itU32, wbFlags(['Use Target'])), - wbFloat('Radial Blur Center X'), - wbFloat('Radial Blur Center Y'), - wbInteger('DoF Strength', itU32), - wbInteger('DoF Distance', itU32), - wbInteger('DoF Range', itU32), - wbInteger('DoF Flags', itU32, wbFlags([ - {0x00000001} 'Use Target', - {0x00000002} 'Unknown 2', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Mode - Front', - {0x00000200} 'Mode - Back', - {0x00000400} 'No Sky', - {0x00000800} 'Blur Radius Bit 2', - {0x00001000} 'Blur Radius Bit 1', - {0x00002000} 'Blur Radius Bit 0' - ])), - wbInteger('Radial Blur Ramp Down', itU32), - wbInteger('Radial Blur Down Start', itU32), - wbInteger('Fade Color', itU32), - wbInteger('Motion Blur Strength', itU32), - wbUnknown - ]), - wbArray(BNAM, 'Blur Radius', wbTimeInterpolator), - wbArray(VNAM, 'Double Vision Strength', wbTimeInterpolator), - wbArray(TNAM, 'Tint Color', wbColorInterpolator), - wbArray(NAM3, 'Fade Color', wbColorInterpolator), - wbRStruct('Radial Blur', [ - wbArray(RNAM, 'Strength', wbTimeInterpolator), - wbArray(SNAM, 'RampUp', wbTimeInterpolator), - wbArray(UNAM, 'Start', wbTimeInterpolator), - wbArray(NAM1, 'RampDown', wbTimeInterpolator), - wbArray(NAM2, 'DownStart', wbTimeInterpolator) - ], []), - wbRStruct('Depth of Field', [ - wbArray(WNAM, 'Strength', wbTimeInterpolator), - wbArray(XNAM, 'Distance', wbTimeInterpolator), - wbArray(YNAM, 'Range', wbTimeInterpolator), - wbArray(NAM5, 'Vignette Radius', wbTimeInterpolator), - wbArray(NAM6, 'Vignette Strength', wbTimeInterpolator) - ], []), - wbArray(NAM4, 'Motion Blur Strength', wbTimeInterpolator), - wbRStruct('HDR', [ - wbArray(_00_IAD, 'Eye Adapt Speed Mult', wbTimeInterpolator), - wbArray(_40_IAD, 'Eye Adapt Speed Add', wbTimeInterpolator), - wbArray(_01_IAD, 'Bloom Blur Radius Mult', wbTimeInterpolator), - wbArray(_41_IAD, 'Bloom Blur Radius Add', wbTimeInterpolator), - wbArray(_02_IAD, 'Bloom Threshold Mult', wbTimeInterpolator), - wbArray(_42_IAD, 'Bloom Threshold Add', wbTimeInterpolator), - wbArray(_03_IAD, 'Bloom Scale Mult', wbTimeInterpolator), - wbArray(_43_IAD, 'Bloom Scale Add', wbTimeInterpolator), - wbArray(_04_IAD, 'Target Lum Min Mult', wbTimeInterpolator), - wbArray(_44_IAD, 'Target Lum Min Add', wbTimeInterpolator), - wbArray(_05_IAD, 'Target Lum Max Mult', wbTimeInterpolator), - wbArray(_45_IAD, 'Target Lum Max Add', wbTimeInterpolator), - wbArray(_06_IAD, 'Sunlight Scale Mult', wbTimeInterpolator), - wbArray(_46_IAD, 'Sunlight Scale Add', wbTimeInterpolator), - wbArray(_07_IAD, 'Sky Scale Mult', wbTimeInterpolator), - wbArray(_47_IAD, 'Sky Scale Add', wbTimeInterpolator) - ], []), - wbUnknown(_08_IAD), - wbUnknown(_48_IAD), - wbUnknown(_09_IAD), - wbUnknown(_49_IAD), - wbUnknown(_0A_IAD), - wbUnknown(_4A_IAD), - wbUnknown(_0B_IAD), - wbUnknown(_4B_IAD), - wbUnknown(_0C_IAD), - wbUnknown(_4C_IAD), - wbUnknown(_0D_IAD), - wbUnknown(_4D_IAD), - wbUnknown(_0E_IAD), - wbUnknown(_4E_IAD), - wbUnknown(_0F_IAD), - wbUnknown(_4F_IAD), - wbUnknown(_10_IAD), - wbUnknown(_50_IAD), - wbRStruct('Cinematic', [ - wbArray(_11_IAD, 'Saturation Mult', wbTimeInterpolator), - wbArray(_51_IAD, 'Saturation Add', wbTimeInterpolator), - wbArray(_12_IAD, 'Brightness Mult', wbTimeInterpolator), - wbArray(_52_IAD, 'Brightness Add', wbTimeInterpolator), - wbArray(_13_IAD, 'Contrast Mult', wbTimeInterpolator), - wbArray(_53_IAD, 'Contrast Add', wbTimeInterpolator) - ], []), - wbUnknown(_14_IAD), - wbUnknown(_54_IAD) - ]); - - wbRecord(FLST, 'FormID List', [ - wbString(EDID, 'Editor ID', 0, cpBenign, True, nil, wbFLSTEDIDAfterSet), - wbFULL, - wbRArrayS('FormIDs', wbFormID(LNAM, 'FormID'), cpNormal, False, nil, nil, nil, wbFLSTLNAMIsSorted) - ]); - - wbRecord(PERK, 'Perk', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbVMADFragmentedPERK, - wbFULL, - wbDESCReq, - wbString(ICON, 'Image'), - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Trait', itU8, wbBoolEnum), - wbInteger('Level', itU8), - wbInteger('Num Ranks', itU8), - wbInteger('Playable', itU8, wbBoolEnum), - wbInteger('Hidden', itU8, wbBoolEnum) - ], cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SNDR]), - wbFormIDCK(NNAM, 'Next Perk', [PERK, NULL]), - wbString(FNAM, 'SWF'), - - wbRStructsSK('Effects', 'Effect', [0, 1], [ - wbStructSK(PRKE, [1, 2, 0], 'Header', [ - wbInteger('Type', itU8, wbEnum([ - 'Quest + Stage', - 'Ability', - 'Entry Point' - ]), cpNormal, False, nil, wbPERKPRKETypeAfterSet), - wbInteger('Rank', itU8), - wbInteger('Priority', itU8) - ]), - wbUnion(DATA, 'Effect Data', wbPerkDATADecider, [ - wbStructSK([0, 1], 'Quest + Stage', [ - wbFormIDCk('Quest', [QUST]), - wbInteger('Quest Stage', itU16, wbPerkDATAQuestStageToStr, wbCTDAParam2QuestStageToInt), - wbByteArray('Unused', 2) - ]), - wbFormIDCk('Ability', [SPEL]), - wbStructSK([0, 1], 'Entry Point', [ - wbInteger('Entry Point', itU8, wbEntryPointsEnum, cpNormal, True, nil{, wbPERKEntryPointAfterSet}), - wbInteger('Function', itU8, wbEnum([ - {0} 'Unknown 0', - {1} 'Set Value', // EPFT=1 - {2} 'Add Value', // EPFT=1 - {3} 'Multiply Value', // EPFT=1 - {4} 'Add Range To Value', // EPFT=2 - {5} 'Add Actor Value Mult', // EPFT=2 - {6} 'Absolute Value', // no params - {7} 'Negative Absolute Value', // no params - {8} 'Add Leveled List', // EPFT=3 - {9} 'Add Activate Choice', // EPFT=4 - {10} 'Select Spell', // EPFT=5 - {11} 'Select Text', // EPFT=6 - {12} 'Set to Actor Value Mult', // EPFT=2 - {13} 'Multiply Actor Value Mult', // EPFT=2 - {14} 'Multiply 1 + Actor Value Mult', // EPFT=2 - {15} 'Set Text' // EPFT=7 - ])), - wbInteger('Perk Condition Tab Count', itU8, nil, cpIgnore) - ]) - ], cpNormal, True), - - wbRStructsSK('Perk Conditions', 'Perk Condition', [0], [ - wbInteger(PRKC, 'Run On (Tab Index)', itS8{, wbPRKCToStr, wbPRKCToInt}), - wbCTDAsReq - ], [], cpNormal, False{, nil, nil, wbPERKPRKCDontShow}), - - wbRStruct('Function Parameters', [ - wbInteger(EPFT, 'Type', itU8, wbEnum([ - {0} 'None', - {1} 'Float', - {2} 'Float/AV,Float', - {3} 'LVLI', - {4} 'SPEL,lstring,flags', - {5} 'SPEL', - {6} 'string', - {7} 'lstring', - {8} 'AVIF' - ])), - // case(EPFT) of - // 1: EPFD=float - // 2: EPFD=float,float - // 3: EPFD=LVLI - // 4: EPFD=SPEL, EPF2=lstring, EPF3=int32 flags - // 5: EPFD=SPEL - // 6: EPFD=string - // 7: EPFD=lstring - - wbInteger(EPFB, 'Perk Entry ID (unique)', itU16), - wbLString(EPF2, 'Button Label', 0, cpTranslate), - wbStruct(EPF3, 'Script Flags', [ - wbInteger('Script Flags', itU8, wbFlags([ - 'Run Immediately', - 'Replace Default' - ])), - wbByteArray('Unknown', 1) - ]), - wbUnion(EPFD, 'Data', wbEPFDDecider, [ - {0} wbByteArray('Unknown'), - {1} wbFloat('Float'), - {2} wbStruct('Float, Float', [ - wbFloat('Float 1'), - wbFloat('Float 2') - ]), - {3} wbFormIDCk('Leveled Item', [LVLI]), - {4} wbFormIDCk('Spell', [SPEL]), - {5} wbFormIDCk('Spell', [SPEL]), - {6} wbString('Text', 0, cpTranslate), - {7} wbLString('Text', 0, cpTranslate), - {8} wbStruct('Actor Value, Float', [ - wbActorValue, // wbInteger('Actor Value', itU32, wbEPFDActorValueToStr, wbEPFDActorValueToInt), - wbFloat('Float') - ]) - ], cpNormal, False{, wbEPFDDontShow}) - ], [], cpNormal, False{, wbPERKPRKCDontShow}), - wbEmpty(PRKF, 'End Marker', cpIgnore, True) - ], []) - ]); - - wbRecord(BPTD, 'Body Part Data', [ - wbEDID, - wbMODL, - wbRArrayS('Body Parts', - wbRStructSK([1], 'Body Part', [ - wbLString(BPTN, 'Part Name', 0, cpTranslate), // optional - wbString(BPNN, 'Part Node', 0, cpNormal, True), - wbString(BPNT, 'VATS Target', 0, cpNormal, True), - wbStruct(BPND, '', [ - wbFloat('Damage Mult'), - wbFormIDCk('Explodable - Debris', [DEBR, NULL]), - wbFormIDCk('Explodable - Explosion', [EXPL, NULL]), - wbFloat('Explodable - Debris Scale'), - wbFormIDCk('Severable - Debris', [DEBR, NULL]), - wbFormIDCk('Severable - Explosion', [EXPL, NULL]), - wbFloat('Severable - Debris Scale'), - wbFloat('Cut - Min'), - wbFloat('Cut - Max'), - wbFloat('Cut - Radius'), - wbFloat('Gore Effects - Local Rotate X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Gore Effects - Local Rotate Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Cut - Tesselation'), - wbFormIDCk('Severable - Impact DataSet', [IPDS, NULL]), - wbFormIDCk('Explodable - Impact DataSet', [IPDS, NULL]), - wbFloat('Explodable - Limb Replacement Scale'), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Severable', - {0x02} 'Hit Reaction', - {0x04} 'Hit Reaction - Default', - {0x08} 'Explodable', - {0x10} 'Cut - Meat Cap Sever', - {0x20} 'On Cripple', - {0x40} 'Explodable - Absolute Chance', - {0x80} 'Show Cripple Geometry' - ])), - wbInteger('Part Type', itU8, wbEnum([ - { 0} 'Torso', - { 1} 'Head1', - { 2} 'Eye', - { 3} 'LookAt', - { 4} 'Fly Grab', - { 5} 'Head2', - { 6} 'LeftArm1', - { 7} 'LeftArm2', - { 8} 'RightArm1', - { 9} 'RightArm2', - {10} 'LeftLeg1', - {11} 'LeftLeg2', - {12} 'LeftLeg3', - {13} 'RightLeg1', - {14} 'RightLeg2', - {15} 'RightLeg3', - {16} 'Brain', - {17} 'Weapon', - {18} 'Root', - {19} 'COM', - {20} 'Pelvis', - {21} 'Camera', - {22} 'Offset Root', - {23} 'Left Foot', - {24} 'Right Foot', - {25} 'Face Target Source' - ])), - wbInteger('Health Percent', itU8), - wbFormIDCk('Actor Value', [AVIF, NULL]), - wbInteger('To Hit Chance', itU8), - wbInteger('Explodable - Explosion Chance %', itU8), - wbInteger('Non-Lethal Dismemberment Chance', itU8), - wbInteger('Severable - Debris Count', itU8), - wbInteger('Explodable - Debris Count', itU8), - wbInteger('Severable - Decal Count', itU8), - wbInteger('Explodable - Decal Count', itU8), - wbInteger('Geometry Segment Index', itU8), - wbFormIDCk('On Cripple - Art Object', [ARTO, NULL]), - wbFormIDCk('On Cripple - Debris', [DEBR, NULL]), - wbFormIDCk('On Cripple - Explosion', [EXPL, NULL]), - wbFormIDCk('On Cripple - Impact DataSet', [IPDS, NULL]), - wbFloat('On Cripple - Debris Scale'), - wbInteger('On Cripple - Debris Count', itU8), - wbInteger('On Cripple - Decal Count', itU8) - ], cpNormal, True), - wbString(NAM1, 'Limb Replacement Model', 0, cpNormal, True), - wbString(NAM4, 'Gore Effects - Target Bone', 0, cpNormal, True), - wbByteArray(NAM5, 'Texture Files Hashes', 0, cpNormal), - wbString(ENAM, 'Hit Reaction - Start'), - wbString(FNAM, 'Hit Reaction - End'), - wbFormIDCk(BNAM, 'Gore Effects - Dismember Blood Art', [ARTO]), - wbFormIDCk(INAM, 'Gore Effects - Blood Impact Material Type', [MATT]), - wbFormIDCk(JNAM, 'On Cripple - Blood Impact Material Type', [MATT]), - wbFormIDCk(CNAM, 'Meat Cap TextureSet', [TXST]), - wbFormIDCk(NAM2, 'Collar TextureSet', [TXST]), - wbString(DNAM, 'Twist Variable Prefix') - ], [], cpNormal, False, nil, True) - ) - ]); - - wbRecord(ADDN, 'Addon Node', [ - wbEDID, - wbOBNDReq, - wbMODL, - wbInteger(DATA, 'Node Index', itS32, nil, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SNDR]), - wbFormIDCk(LNAM, 'Light', [LIGH]), - wbStruct(DNAM, 'Data', [ - wbInteger('Master Particle System Cap', itU16), - wbInteger('Flags', itU16, wbEnum([ - 'No Master Particle System', - 'Master Particle System', - 'Always Loaded', - 'Master Particle System and Always Loaded' - ])) - ], cpNormal, True) - ]); -end; - -procedure DefineFO4h; -begin - wbRecord(AVIF, 'Actor Value Information', [ - wbEDID, - wbFULL, - wbDESCReq, - wbLString(ANAM, 'Abbreviation', 0, cpTranslate), - wbFloat(NAM0, 'Default Value'), // Prior to form version 81, it was either 0.0, 1.0 or 100.0, so scale or multiplier ? - wbInteger(AVFL, 'Flags', itU32, wbFlags([ // 32 bits Flags, it used to impact NAM0 loading (bits 10, 11, 12) (even though it loads later :) ) - 'Unknown 1', - 'Unknown 2', - 'Unknown 3', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Unknown 7', - 'Unknown 8', - 'Unknown 9', - 'Unknown 10', - 'Unknown 11', - 'Unknown 12', - 'Unknown 13', - 'Unknown 14', - 'Unknown 15', - 'Unknown 16', - 'Unknown 17', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Minimum 1', - 'Maximum 10', - 'Maximum 100', - 'Multiply By 100', - 'Percentage', - 'Unknown 26', - 'Damage Is Positive', - 'God Mode Immune', - 'Unknown 29', - 'Unknown 30', - 'Unknown 31', - 'Hardcoded' - ])), - wbInteger(NAM1, 'Type', itU32, wbEnum([ - 'Derived Attribute', - 'Special (Attribute)', - 'Skill', - 'AI Attribute', - 'Resistance', - 'Condition', - 'Charge', - 'Int Value', - 'Variable', - 'Resource' - ])) - ]); // S.P.E.C.I.A.L start at index 5, so FormID 0x2bc+5 to 0x2bc+11, RadResistIngestion at index 0x29 - - wbRecord(CAMS, 'Camera Shot', [ - wbEDID, - wbMODL, - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Action', itU32, wbEnum([ - {0} 'Shoot', - {1} 'Fly', - {2} 'Hit', - {3} 'Zoom' - ])), - wbInteger('Location', itU32, wbEnum([ - {0} 'Attacker', - {1} 'Projectile', - {2} 'Target', - {3} 'Lead Actor' - ])), - wbInteger('Target', itU32, wbEnum([ - {0} 'Attacker', - {1} 'Projectile', - {2} 'Target', - {3} 'Lead Actor' - ])), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Position Follows Location', - {0x00000002} 'Rotation Follows Target', - {0x00000004} 'Don''t Follow Bone', - {0x00000008} 'First Person Camera', - {0x00000010} 'No Tracer', - {0x00000020} 'Start At Time Zero', - {0x00000040} 'Don''t Reset Location Spring', - {0x00000080} 'Don''t Reset Target Spring' - ])), - wbStruct('Time Multipliers', [ - wbFloat('Player'), - wbFloat('Target'), - wbFloat('Global') - ]), - wbFloat('Max Time'), - wbFloat('Min Time'), - wbFloat('Target % Between Actors'), - wbFloat('Near Target Distance'), - wbFloat('Location Spring'), - wbFloat('Target Spring'), - wbStruct('Rotation Offset', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]) - ], cpNormal, True, nil, 9), - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]) - ]); - - wbRecord(CPTH, 'Camera Path', [ - wbEDID, - wbCTDAs, - wbArray(ANAM, 'Related Camera Paths', wbFormIDCk('Related Camera Path', [CPTH, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbInteger(DATA, 'Camera Zoom / Flags', itU8, wbFlags([ - {0x01} 'Disable', - {0x02} 'Shot List', - {0x04} 'Dynamic Camera Times', - {0x08} 'Unknown 3', - {0x10} 'Unknown 4', - {0x20} 'Unknown 5', - {0x40} 'Randomize Paths', - {0x80} 'Not Must Have Camera Shots' - ]), cpNormal, True), - wbRArray('Camera Shots', wbFormIDCk(SNAM, 'Camera Shot', [CAMS])) - ]); - - wbRecord(VTYP, 'Voice Type', [ - wbEDID, - wbInteger(DNAM, 'Flags', itU8, wbFlags([ - 'Allow Default Dialog', - 'Female' - ]), cpNormal, True) - ]); - - wbRecord(MATT, 'Material Type', [ - wbEDID, - wbFormIDCk(PNAM, 'Material Parent', [MATT, NULL]), - wbString(MNAM, 'Material Name'), - wbStruct(CNAM, 'Havok Display Color', [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0) - ]), - wbFloat(BNAM, 'Buoyancy'), - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - 'Stair Material', - 'Arrows Stick', - 'Can Tunnel' - ], False)), - wbFormIDCk(HNAM, 'Havok Impact Data Set', [IPDS]), - wbString(ANAM, 'Breakable FX'), - wbMODT - ]); - - wbRecord(IPCT, 'Impact', [ - wbEDID, - wbMODL, - wbStruct(DATA, '', [ - wbFloat('Effect - Duration'), - wbInteger('Effect - Orientation', itU32, wbEnum([ - 'Surface Normal', - 'Projectile Vector', - 'Projectile Reflection' - ])), - wbFloat('Angle Threshold'), - wbFloat('Placement Radius'), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'No Decal Data' - ])), - wbInteger('Impact Result', itU8, wbEnum([ - {0} 'Default', - {1} 'Destroy', - {2} 'Bounce', - {3} 'Impale', - {4} 'Stick' - ])), - wbByteArray('Unknown', 2) - ], cpNormal, True), - wbDODT, - wbFormIDCk(DNAM, 'Texture Set', [TXST]), - wbFormIDCk(ENAM, 'Secondary Texture Set', [TXST]), - wbFormIDCk(SNAM, 'Sound 1', [SNDR]), - wbFormIDCk(NAM1, 'Sound 2', [SNDR]), - wbFormIDCk(NAM3, 'Footstep Explosion', [EXPL]), - wbFormIDCk(NAM2, 'Hazard', [HAZD]), - wbFloat(FNAM, 'Footstep Particle Max Dist') - ]); - - wbRecord(IPDS, 'Impact Data Set', [ - wbEDID, - wbRArrayS('Data', wbStructSK(PNAM, [0], '', [ - wbFormIDCk('Material', [MATT]), - wbFormIDCk('Impact', [IPCT]) - ])) - ]); - - wbRecord(ECZN, 'Encounter Zone', [ - wbEDID, - wbStruct(DATA, '', [ - wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - wbFormIDCk('Location', [LCTN, NULL]), - wbInteger('Rank', itS8), - wbInteger('Min Level', itS8), - wbInteger('Flags', itU8, wbFlags([ - 'Never Resets', - 'Match PC Below Minimum Level', - 'Disable Combat Boundary', - 'Workshop' - ])), - wbInteger('Max Level', itS8) - ], cpNormal, True) - ]); - - wbRecord(LCTN, 'Location', [ - wbEDID, - - wbArray(ACPR, 'Actor Cell Persistent Reference', wbStruct('', [ - wbFormIDCk('Actor', sigReferences, False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCPR, 'Location Cell Persistent Reference', wbStruct('', [ - wbFormIDCk('Actor', sigReferences, False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(RCPR, 'Reference Cell Persistent Reference', wbFormIDCk('Ref', [ACHR, REFR], False, cpBenign)), - - wbArray(ACUN, 'Actor Cell Unique', wbStruct('', [ - wbFormIDCk('Actor', [NPC_], False, cpBenign), - wbFormIDCk('Ref', [ACHR], False, cpBenign), - wbFormIDCk('Location', [LCTN, NULL], False, cpBenign) - ])), - wbArray(LCUN, 'Location Cell Unique', wbStruct('', [ - wbFormIDCk('Actor', [NPC_], False, cpBenign), - wbFormIDCk('Ref', [ACHR], False, cpBenign), - wbFormIDCk('Location', [LCTN, NULL], False, cpBenign) - ])), - wbArray(RCUN, 'Reference Cell Unique', wbFormIDCk('Actor', [NPC_], False, cpBenign)), - - wbArray(ACSR, 'Actor Cell Static Reference', wbStruct('', [ - wbFormIDCk('Loc Ref Type', [LCRT], False, cpBenign), - wbFormIDCk('Marker', sigReferences, False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCSR, 'Location Cell Static Reference', wbStruct('', [ - wbFormIDCk('Loc Ref Type', [LCRT], False, cpBenign), - wbFormIDCk('Marker', sigReferences, False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(RCSR, 'Reference Cell Static Reference', wbFormIDCk('Ref', [ACHR, REFR], False, cpBenign)), - - wbRArray('Actor Cell Encounter Cell', - wbStruct(ACEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - wbRArray('Location Cell Encounter Cell', - wbStruct(LCEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - wbRArray('Reference Cell Encounter Cell', - wbStruct(RCEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - - wbArray(ACID, 'Actor Cell Marker Reference', wbFormIDCk('Ref', sigReferences, False, cpBenign)), - wbArray(LCID, 'Location Cell Marker Reference', wbFormIDCk('Ref', sigReferences, False, cpBenign)), - - wbArray(ACEP, 'Actor Cell Enable Point', wbStruct('', [ - wbFormIDCk('Actor', sigReferences, False, cpBenign), - wbFormIDCk('Ref', sigReferences, False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCEP, 'Location Cell Enable Point', wbStruct('', [ - wbFormIDCk('Actor', sigReferences, False, cpBenign), - wbFormIDCk('Ref', sigReferences, False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - - wbFULL, - wbKSIZ, - wbKWDAs, - wbFormIDCk(PNAM, 'Parent Location', [LCTN, NULL]), - wbFormIDCk(NAM1, 'Music', [MUSC, NULL]), - wbFormIDCk(FNAM, 'Unreported Crime Faction', [FACT]), - wbFormIDCk(MNAM, 'World Location Marker Ref', [REFR, ACHR]), - wbFloat(RNAM, 'World Location Radius'), - //wbFormIDCk(NAM0, 'Horse Marker Ref', [REFR]), - wbFloat(ANAM, 'Unknown'), - wbCNAM - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - -end; - -{this is required to prevent XE6 compiler error} -type - TVarRecs = array of TVarRec; - -function CombineVarRecs(const a, b : array of const) - : TVarRecs; -begin - SetLength(Result, Length(a) + Length(b)); - if Length(a) > 0 then - Move(a[0], Result[0], SizeOf(TVarRec) * Length(a)); - if Length(b) > 0 then - Move(b[0], Result[Length(a)], SizeOf(TVarRec) * Length(b)); -end; - -function MakeVarRecs(const a : array of const) - : TVarRecs; -begin - SetLength(Result, Length(a)); - if Length(a) > 0 then - Move(a[0], Result[0], SizeOf(TVarRec) * Length(a)); -end; - - -procedure DefineFO4i; -var - a, b, c : TVarRecs; -begin - wbRecord(MESG, 'Message', [ - wbEDID, - wbDESCReq, - wbFULL, - wbFormIDCk(INAM, 'Icon (unused)', [NULL], False, cpIgnore, True), // leftover - wbFormIDCk(QNAM, 'Owner Quest', [QUST]), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - 'Message Box', - 'Delay Initial Display' - ]), cpNormal, True, False, nil, wbMESGDNAMAfterSet), - wbInteger(TNAM, 'Display Time', itU32, nil, cpNormal, False, False, wbMESGTNAMDontShow), - wbString(SNAM, 'SWF'), - wbLString(NNAM, 'Short Title', 0, cpTranslate), - wbRStructs('Menu Buttons', 'Menu Button', [ - wbLString(ITXT, 'Button Text', 0, cpTranslate), - wbCTDAs - ], []) - ], False, nil, cpNormal, False, wbMESGAfterLoad); - - a := MakeVarRecs([ - 0, 'None', - Sig2Int('AAAC'), 'Action Activate', - Sig2Int('AAB1'), 'Action Bleedout Start', - Sig2Int('AAB2'), 'Action Bleedout Stop', - Sig2Int('AABA'), 'Action Block Anticipate', - Sig2Int('AABH'), 'Action Block Hit', - Sig2Int('AABI'), 'Action Bumped Into', - Sig2Int('AADA'), 'Action Dual Attack', - Sig2Int('AADE'), 'Action Death', - Sig2Int('AADL'), 'Action Dual Release', - Sig2Int('AADR'), 'Action Draw', - Sig2Int('AADW'), 'Action Death Wait', - Sig2Int('AAF1'), 'Action Fly Start', - Sig2Int('AAF2'), 'Action Fly Stop', - Sig2Int('AAFA'), 'Action Fall', - Sig2Int('AAFQ'), 'Action Force Equip', - Sig2Int('AAGU'), 'Action Get Up', - Sig2Int('AAH1'), 'Action Hover Start', - Sig2Int('AAH2'), 'Action Hover Stop', - Sig2Int('AAID'), 'Action Idle', - Sig2Int('AAIS'), 'Action Idle Stop', - Sig2Int('AAJP'), 'Action Jump', - Sig2Int('AALA'), 'Action Left Attack', - Sig2Int('AALD'), 'Action Left Ready', - Sig2Int('AALI'), 'Action Left Interrupt', - Sig2Int('AALK'), 'Action Look', - Sig2Int('AALM'), 'Action Large Movement Delta', - Sig2Int('AALN'), 'Action Land', - Sig2Int('AALR'), 'Action Left Release', - Sig2Int('AALS'), 'Action Left Sync Attack', - Sig2Int('AAMT'), 'Action Mantle', - Sig2Int('AAOE'), 'Action AoE Attack', - Sig2Int('AAPA'), 'Action Right Power Attack', - Sig2Int('AAPE'), 'Action Path End', - Sig2Int('AAPS'), 'Action Path Start', - Sig2Int('AAR2'), 'Action Large Recoil', - Sig2Int('AARA'), 'Action Right Attack', - Sig2Int('AARC'), 'Action Recoil', - Sig2Int('AARD'), 'Action Right Ready', - Sig2Int('AARI'), 'Action Right Interrupt', - Sig2Int('AARR'), 'Action Right Release', - Sig2Int('AARS'), 'Action Right Sync Attack', - Sig2Int('AAS1'), 'Action Stagger Start', - Sig2Int('AASC'), 'Action Shield Change', - Sig2Int('AASH'), 'Action Sheath', - Sig2Int('AASN'), 'Action Sneak', - Sig2Int('AASP'), 'Action Sprint Stop', - Sig2Int('AASS'), 'Action Summoned Start', - Sig2Int('AAST'), 'Action Sprint Start', - Sig2Int('AASW'), 'Action Swim State Change', - Sig2Int('AAVC'), 'Action Voice', - Sig2Int('AAVD'), 'Action Voice Ready', - Sig2Int('AAVI'), 'Action Voice Interrupt', - Sig2Int('AAVR'), 'Action Voice Release', - Sig2Int('AAWH'), 'Action Ward Hit', - Sig2Int('ABLA'), 'Action Begin Looping Activate', - Sig2Int('ABOL'), 'Action Bolt Charge', - Sig2Int('ABSE'), 'Art Object Absorb Effect', - Sig2Int('ACHI'), 'Action Hide', - Sig2Int('ACSS'), 'Action Cover Sprint Start', - Sig2Int('ACTN'), 'Action Tunnel', - Sig2Int('ACWR'), 'Action Cower', - Sig2Int('ADGE'), 'Action Dodge', - Sig2Int('ADPA'), 'Action Dual Power Attack', - Sig2Int('AECL'), 'Action Enter Cover', - Sig2Int('AELA'), 'Action End Looping Activate', - Sig2Int('AENC'), 'Action Enter Combat', - Sig2Int('AENI'), 'Action Dialogue Enter', - Sig2Int('AEVD'), 'Action Evade', - Sig2Int('AEXC'), 'Action Exit Cover', - Sig2Int('AEXI'), 'Action Dialogue Exit', - Sig2Int('AEXT'), 'Action Exit Combat', - Sig2Int('AFCH'), 'Action Fire Charge', - Sig2Int('AFCO'), 'Action Fire Charge Hold', - Sig2Int('AFEM'), 'Action Fire Empty', - Sig2Int('AFIA'), 'Action Fire Auto', - Sig2Int('AFIS'), 'Action Fire Single', - Sig2Int('AFLT'), 'Action Flip-Throw', - Sig2Int('AFNP'), 'Keyword Activator Furniture No Player', - Sig2Int('AGAL'), 'Action Gun Alert', - Sig2Int('AGCS'), 'Action Gun Charge Start', - Sig2Int('AGDN'), 'Action Gun Down', - Sig2Int('AGRX'), 'Action Gun Relaxed', - Sig2Int('AGRY'), 'Action Gun Ready', - Sig2Int('AIDW'), 'Action Idle Warn', - Sig2Int('AIEN'), 'Action Interaction Enter', - Sig2Int('AIEQ'), 'Action Interaction Exit Quick', - Sig2Int('AIEX'), 'Action Interaction Exit', - Sig2Int('AILN'), 'Action Dialogue Listen Negative', - Sig2Int('AILp'), 'Action Dialogue Listen Positive', - Sig2Int('AILQ'), 'Action Dialogue Listen Question', - Sig2Int('AINT'), 'Action Intimidate', - Sig2Int('AIVC'), 'Verlet Cape', - Sig2Int('AIXA'), 'Action Interaction Exit Alternate', - Sig2Int('AKDN'), 'Action Knockdown', - Sig2Int('ALIC'), 'Action Limb Critical', - Sig2Int('ALIK'), 'Alcohol Item keyword', - Sig2Int('ALPA'), 'Action Left Power Attack', - Sig2Int('ALTI'), 'Action Dialogue Listen', - Sig2Int('AMBK'), 'Action Move Backward', - Sig2Int('AMEL'), 'Action Melee', - Sig2Int('AMFD'), 'Action Move Forward', - Sig2Int('AMLT'), 'Action Move Left', - Sig2Int('AMRT'), 'Action Move Right', - Sig2Int('AMSP'), 'Action Move Stop', - Sig2Int('AMST'), 'Action Move Start', - Sig2Int('ANML'), 'Keyword Animal', - Sig2Int('ANSC'), 'Action NonSupport Contact', - Sig2Int('AODA'), 'Keyword Armor Material Daedric', - Sig2Int('AODB'), 'Keyword Armor Material Dragonbone', - Sig2Int('AODP'), 'Keyword Armor Material Dragonplate', - Sig2Int('AODS'), 'Keyword Armor Material Dragonscale', - Sig2Int('AODW'), 'Keyword Armor Material Dwarven', - Sig2Int('AOEB'), 'Keyword Armor Material Ebony', - Sig2Int('AOEL'), 'Keyword Armor Material Elven', - Sig2Int('AOES'), 'Keyword Armor Material ElvenSplinted', - Sig2Int('AOFE'), 'Keyword Armor Material Iron', - Sig2Int('AOFL'), 'Keyword Armor Material FullLeather', - Sig2Int('AOGL'), 'Keyword Armor Material Glass', - Sig2Int('AOHI'), 'Keyword Armor Material Hide', - Sig2Int('AOIB'), 'Keyword Armor Material IronBanded', - Sig2Int('AOIH'), 'Keyword Armor Material ImperialHeavy', - Sig2Int('AOIM'), 'Keyword Armor Material Imperial', - Sig2Int('AOIR'), 'Keyword Armor Material ImperialReinforced', - Sig2Int('AOOR'), 'Keyword Armor Material Orcish', - Sig2Int('AOSC'), 'Keyword Armor Material Scaled', - Sig2Int('AOSD'), 'Keyword Armor Material Studded', - Sig2Int('AOSK'), 'Keyword Armor Material Stormcloak', - Sig2Int('AOSP'), 'Keyword Armor Material SteelPlate', - Sig2Int('AOST'), 'Keyword Armor Material Steel', - Sig2Int('APIC'), 'Action Pipboy Close', - Sig2Int('APID'), 'Action Pipboy Data', - Sig2Int('APII'), 'Action Pipboy Inventory', - Sig2Int('APIM'), 'Action Pipboy Map', - Sig2Int('APIN'), 'Action Pipboy Inspect', - Sig2Int('APIP'), 'Action Pipboy', - Sig2Int('APIS'), 'Action Pipboy Stats', - Sig2Int('APIT'), 'Action Pipboy Tab', - Sig2Int('APIZ'), 'Action Pipboy Zoom', - Sig2Int('APLH'), 'Action Pipboy Load Holotape', - Sig2Int('APLN'), 'Action Dialogue Listen Neutral', - Sig2Int('APNC'), 'Action Panic', - Sig2Int('APPS'), 'Action Pipboy Select', - Sig2Int('APR0'), 'Action Pipboy Radio Off', - Sig2Int('APR1'), 'Action Pipboy Radio On', - Sig2Int('APSH'), 'Allow Player Shout', - Sig2Int('APTP'), 'Action Pipboy Tab Previous', - Sig2Int('AREL'), 'Action Reload', - Sig2Int('ARGI'), 'Action Ragdoll Instant', - Sig2Int('ARTL'), 'Armor Material List', - Sig2Int('ASFL'), 'Action Shuffle', - Sig2Int('ASID'), 'Action Idle Stop Instant', - Sig2Int('ASIR'), 'Action Sighted Release', - Sig2Int('ASIT'), 'Action Sighted', - Sig2Int('ATHR'), 'Action Throw', - Sig2Int('ATKI'), 'Action Dialogue Talking', - Sig2Int('ATLE'), 'Action Turn Left', - Sig2Int('ATRI'), 'Action Turn Right', - Sig2Int('ATSP'), 'Action Turn Stop', - Sig2Int('AVVP'), 'Vampire Available Perks', - Sig2Int('AVWP'), 'Unused', - Sig2Int('AWWS'), 'Action Waterwalk Start', - Sig2Int('AWWW'), 'Bunny Faction', - Sig2Int('BAPO'), 'Base Potion', - Sig2Int('BAPS'), 'Base Poison', - Sig2Int('BEEP'), 'Keyword Robot', - Sig2Int('BENA'), 'Base Armor Enchantment', - Sig2Int('BENW'), 'Base Weapon Enchantment', - Sig2Int('BTMS'), 'Battle Music', - Sig2Int('CACA'), 'Commanded Actor Ability', - Sig2Int('CHIK'), 'Chem Item keyword', - Sig2Int('CLIK'), 'Clothes Item keyword', - Sig2Int('CMPX'), 'Complex Scene Object', - Sig2Int('CNMK'), 'Keyword nullptr Mod', - Sig2Int('COEX'), 'Keyword Conditional Explosion', - Sig2Int('COOK'), 'Keyword Cooking Pot', - Sig2Int('CSTY'), 'Combat Style', - Sig2Int('CWNE'), 'Keyword Civil War Neutral', - Sig2Int('CWOK'), 'Keyword Civil War Owner', - Sig2Int('DAED'), 'Keyword Daedra', - Sig2Int('DBHF'), 'Dark Brotherhood Faction', - Sig2Int('DCMS'), 'Dungeon Cleared Music', - Sig2Int('DCZM'), 'Dragon Crash Zone Marker', - Sig2Int('DDSC'), 'Dialogue Voice Category', - Sig2Int('DEIS'), 'Drug Wears Off Image Space', - Sig2Int('DFTS'), 'Footstep Set', - Sig2Int('DGFL'), 'DialogueFollower Quest', - Sig2Int('DIEN'), 'Keyword Disallow Enchanting', - Sig2Int('DLMT'), 'Landscape Material', - Sig2Int('DLZM'), 'Dragon Land Zone Marker', - Sig2Int('DMFL'), 'Default Movement Type: Fly', - Sig2Int('DMSN'), 'Default Movement Type: Sneak', - Sig2Int('DMSW'), 'Default Movement Type: Swim', - Sig2Int('DMWL'), 'Default Movement Type: Default', - Sig2Int('DOP2'), 'Dialogue Output Model 3D', - Sig2Int('DOP3'), 'Dialogue Output Model 2D', - Sig2Int('DRAK'), 'Keyword Dragon', - Sig2Int('DTMS'), 'Death Music', - Sig2Int('EACA'), 'Every Actor Ability', - Sig2Int('EPDF'), 'Eat Package Default Food', - Sig2Int('FFFP'), 'Keyword Furniture Forces 1st Person', - Sig2Int('FFTP'), 'Keyword Furniture Forces 3rd Person', - Sig2Int('FOIK'), 'Food Item Keyword', - Sig2Int('FORG'), 'Keyword Forge', - Sig2Int('FTEL'), 'Male Face Texture Set: Eyes', - Sig2Int('FTGF'), 'Fighters'' Guild Faction', - Sig2Int('FTHD'), 'Male Face Texture Set: Head', - Sig2Int('FTHF'), 'Female Face Texture Set: Head', - Sig2Int('FTMF'), 'Female Face Texture Set: Mouth', - Sig2Int('FTML'), 'Favor travel marker location', - Sig2Int('FTMO'), 'Male Face Texture Set: Mouth', - Sig2Int('FTNP'), 'Furniture Test NPC', - Sig2Int('FTRF'), 'Female Face Texture Set: Eyes' - ]); - - b := MakeVarRecs([ - Sig2Int('GCK1'), 'Keyword Generic Craftable Keyword 01', - Sig2Int('GCK2'), 'Keyword Generic Craftable Keyword 02', - Sig2Int('GCK3'), 'Keyword Generic Craftable Keyword 03', - Sig2Int('GCK4'), 'Keyword Generic Craftable Keyword 04', - Sig2Int('GCK5'), 'Keyword Generic Craftable Keyword 05', - Sig2Int('GCK6'), 'Keyword Generic Craftable Keyword 06', - Sig2Int('GCK7'), 'Keyword Generic Craftable Keyword 07', - Sig2Int('GCK8'), 'Keyword Generic Craftable Keyword 08', - Sig2Int('GCK9'), 'Keyword Generic Craftable Keyword 09', - Sig2Int('GCKX'), 'Keyword Generic Craftable Keyword 10', - Sig2Int('GFAC'), 'Guard Faction', - Sig2Int('GLIK'), 'Gloves Item Keyword', - Sig2Int('GOLD'), 'Gold', - Sig2Int('GRIK'), 'Grenade Item Keyword', - Sig2Int('HBAL'), 'Help Basic Alchemy', - Sig2Int('HBBR'), 'Help Barter', - Sig2Int('HBCO'), 'Help Basic Cooking', - Sig2Int('HBEC'), 'Help Basic Enchanting', - Sig2Int('HBFG'), 'Help Basic Forging', - Sig2Int('HBFS'), 'Help Favorites', - Sig2Int('HBFT'), 'Help Teamate Favor', - Sig2Int('HBHJ'), 'Help Jail', - Sig2Int('HBJL'), 'Help Journal', - Sig2Int('HBLH'), 'Help Low Health', - Sig2Int('HBLK'), 'Help Basic Lockpicking PC', - Sig2Int('HBLM'), 'Help Low Magicka', - Sig2Int('HBLS'), 'Help Low Stamina', - Sig2Int('HBLU'), 'Help Leveling up', - Sig2Int('HBLX'), 'Help Basic Lockpicking Console', - Sig2Int('HBML'), 'Help Basic Smelting', - Sig2Int('HBMM'), 'Help Map Menu', - Sig2Int('HBOC'), 'Help Basic Object Creation', - Sig2Int('HBSA'), 'Help Basic Smithing Armor', - Sig2Int('HBSK'), 'Help Skills Menu', - Sig2Int('HBSM'), 'Help Basic Smithing Weapon', - Sig2Int('HBTA'), 'Help Basic Tanning', - Sig2Int('HBWC'), 'Help Weapon Charge', - Sig2Int('HCLL'), 'FormList Hair Color List', - Sig2Int('HEIK'), 'Helmet Item Keyword', - Sig2Int('HFSD'), 'Heartbeat Sound Fast', - Sig2Int('HMPC'), 'Help Manual PC', - Sig2Int('HMXB'), 'Help Manual XBox', - Sig2Int('HRSK'), 'Keyword Horse', - Sig2Int('HSSD'), 'Heartbeat Sound Slow', - Sig2Int('HVFS'), 'Harvest Failed Sound', - Sig2Int('HVSS'), 'Harvest Sound', - Sig2Int('HWIK'), 'Heavy Weapon Item keyword', - Sig2Int('IMDI'), 'Dialogue Imagespace', - Sig2Int('IMID'), 'ImageSpaceModifier for inventory menu.', - Sig2Int('IMLH'), 'Imagespace: Low Health', - Sig2Int('IMPP'), 'ImageSpaceModifier for Pipboy menu in Power armor.', - Sig2Int('IOPM'), 'Interface Output Model', - Sig2Int('JRLF'), 'Jarl Faction', - Sig2Int('JWLR'), 'Keyword Jewelry', - Sig2Int('KHFL'), 'Kinect Help FormList', - Sig2Int('KTRW'), 'Teammate Ready Weapon', - Sig2Int('KWBR'), 'Color Form', - Sig2Int('KWCU'), 'Keyword Cuirass', - Sig2Int('KWDM'), 'Keyword DummyObject', - Sig2Int('KWDO'), 'Keyword ClearableLocation', - Sig2Int('KWGE'), 'Keyword UseGeometryEmitter', - Sig2Int('KWMS'), 'Keyword MustStop', - Sig2Int('LGH1'), 'Default Light 1', - Sig2Int('LGH2'), 'Default Light 2', - Sig2Int('LGH3'), 'Default Light 3', - Sig2Int('LGH4'), 'Default Light 4', - Sig2Int('LGHP'), 'Pipboy Light', - Sig2Int('LKHO'), 'Keyword Hold Location', - Sig2Int('LKPK'), 'Lockpick', - Sig2Int('LMHP'), 'Local Map Hide Plane', - Sig2Int('LRRD'), 'LocRefType Resource Destructible', - Sig2Int('LRSO'), 'LocRefType Civil War Soldier', - Sig2Int('LSIS'), 'Imagespace: Load screen', - Sig2Int('MBIK'), 'Med Bag Item Keyword', - Sig2Int('MDSC'), 'Music Sound Category', - Sig2Int('MFSN'), 'Magic Fail Sound', - Sig2Int('MGGF'), 'Mages'' Guild Faction', - Sig2Int('MIIK'), 'Mine Item Keyword', - Sig2Int('MMCL'), 'Main Menu Cell', - Sig2Int('MMSD'), 'Map Menu Looping Sound', - Sig2Int('MNTK'), 'Keyword Mount', - Sig2Int('MTSC'), 'Master Sound Category', - Sig2Int('MVBL'), 'Keyword Movable', - Sig2Int('NASD'), 'No-Activation Sound', - Sig2Int('NDSC'), 'Non-Dialogue Voice Category', - Sig2Int('NMRD'), 'Road Marker', - Sig2Int('NPCK'), 'Keyword NPC', - Sig2Int('NRNT'), 'Keyword Nirnroot', - Sig2Int('P3OM'), 'Player''s Output Model 3rd Person', - Sig2Int('PDLC'), 'Pause During Loading Menu Category', - Sig2Int('PDMC'), 'Pause During Menu Category Fade', - Sig2Int('PDSA'), 'Putdown Sound Armor', - Sig2Int('PDSB'), 'Putdown Sound Book', - Sig2Int('PDSG'), 'Putdown Sound Generic', - Sig2Int('PDSI'), 'Putdown Sound Ingredient', - Sig2Int('PDSW'), 'Putdown Sound Weapon', - Sig2Int('PFAC'), 'Player Faction', - Sig2Int('PIMC'), 'Pause During Menu Category Immediate', - Sig2Int('PIVV'), 'Player Is Vampire Variable', - Sig2Int('PIWV'), 'UNUSED01', - Sig2Int('PLOC'), 'PersistAll Location', - Sig2Int('PLST'), 'Default Pack List', - Sig2Int('POEQ'), 'Potion Equip', - Sig2Int('POPM'), 'Player''s Output Model 1st Person', - Sig2Int('PTEM'), 'Package Template', - Sig2Int('PTFR'), 'PotentialFollower Faction', - Sig2Int('PTNP'), 'Pathing Test NPC', - Sig2Int('PUSA'), 'Pickup Sound Armor', - Sig2Int('PUSB'), 'Pickup Sound Book', - Sig2Int('PUSG'), 'Pickup Sound Generic', - Sig2Int('PUSI'), 'Pickup Sound Ingredient', - Sig2Int('PUSW'), 'Pickup Sound Weapon', - Sig2Int('PVFA'), 'Player Voice Female', - Sig2Int('PVFC'), 'Player Voice Female Child', - Sig2Int('PVMA'), 'Player Voice Male', - Sig2Int('PVMC'), 'Player Voice Male Child', - Sig2Int('PWFD'), 'Wait-For-Dialogue Package', - Sig2Int('QMEA'), 'Quest Marker Enemy Above', - Sig2Int('QMEB'), 'Quest Marker Enemy Below', - Sig2Int('QMEN'), 'Quest Marker Enemy', - Sig2Int('QMFO'), 'Quest Marker Follower', - Sig2Int('QMLO'), 'Quest Marker Location', - Sig2Int('RIVR'), 'Vampire Race', - Sig2Int('RIVS'), 'Vampire Spells', - Sig2Int('RIWR'), 'UNUSED02', - Sig2Int('RKIK'), 'Repair Kit Item Keyword', - Sig2Int('RUSG'), 'Keyword Reusable SoulGem', - Sig2Int('RVBT'), 'Reverb Type', - Sig2Int('SALT'), 'Sitting Angle Limit', - Sig2Int('SAT1'), 'Keyword Scale Actor To 1.0', - Sig2Int('SCSD'), 'Soul Captured Sound', - Sig2Int('SFDC'), 'SFX To Fade In Dialogue Category', - Sig2Int('SFSN'), 'Shout Fail Sound', - Sig2Int('SKLK'), 'Skeleton Key', - Sig2Int('SLDM'), 'Snow LOD Material', - Sig2Int('SLHD'), 'Snow LOD Material HD', - Sig2Int('SMLT'), 'Keyword Smelter', - Sig2Int('SMSC'), 'Stats Mute Category', - Sig2Int('SPFK'), 'Keyword Special Furniture', - Sig2Int('SSSC'), 'Stats Music', - Sig2Int('TANN'), 'Keyword Tanning Rack', - Sig2Int('TKAM'), 'Keyword Type Ammo', - Sig2Int('TKAR'), 'Keyword Type Armor', - Sig2Int('TKBK'), 'Keyword Type Book', - Sig2Int('TKGS'), 'Telekinesis Grab Sound', - Sig2Int('TKIG'), 'Keyword Type Ingredient', - Sig2Int('TKKY'), 'Keyword Type Key', - Sig2Int('TKMS'), 'Keyword Type Misc', - Sig2Int('TKPT'), 'Keyword Type Potion', - Sig2Int('TKSG'), 'Keyword Type SoulGem', - Sig2Int('TKTS'), 'Telekinesis Throw Sound', - Sig2Int('TKWP'), 'Keyword Type Weapon', - Sig2Int('TVGF'), 'Thieves'' Guild Faction', - Sig2Int('UNDK'), 'Keyword Undead', - Sig2Int('URVT'), 'Underwater Reverb Type', - Sig2Int('UWLS'), 'Underwater Loop Sound', - Sig2Int('VAMP'), 'Keyword Vampire', - Sig2Int('VLOC'), 'Virtual Location', - Sig2Int('VOEQ'), 'Voice Equip', - Sig2Int('WASN'), 'Ward Absorb Sound', - Sig2Int('WBSN'), 'Ward Break Sound', - Sig2Int('WDSN'), 'Ward Deflect Sound', - Sig2Int('WEML'), 'Weapon Material List', - Sig2Int('WMDA'), 'Keyword Weapon Material Daedric', - Sig2Int('WMDH'), 'Keyword Weapon Material DraugrHoned', - Sig2Int('WMDR'), 'Keyword Weapon Material Draugr', - Sig2Int('WMDW'), 'Keyword Weapon Material Dwarven', - Sig2Int('WMEB'), 'Keyword Weapon Material Ebony', - Sig2Int('WMEL'), 'Keyword Weapon Material Elven', - Sig2Int('WMFA'), 'Keyword Weapon Material Falmer', - Sig2Int('WMFH'), 'Keyword Weapon Material FalmerHoned', - Sig2Int('WMGL'), 'Keyword Weapon Material Glass', - Sig2Int('WMIK'), 'Workshop Misc Item Keyword', - Sig2Int('WMIM'), 'Keyword Weapon Material Imperial', - Sig2Int('WMIR'), 'Keyword Weapon Material Iron', - Sig2Int('WMOR'), 'Keyword Weapon Material Orcish', - Sig2Int('WMST'), 'Keyword Weapon Material Steel', - Sig2Int('WMWE'), 'World Map Weather', - Sig2Int('WMWO'), 'Keyword Weapon Material Wood', - Sig2Int('WPOK'), 'Workshop Player Ownership', - Sig2Int('WTBA'), 'Keyword WeaponTypeBoundArrow', - Sig2Int('WWSP'), 'UNUSED03' - ]); - - c := CombineVarRecs(a, b); - - wbRecord(DOBJ, 'Default Object Manager', [ - wbEDID, - wbArrayS(DNAM, 'Objects', - wbStructSK([0], 'Object', [ - wbInteger('Use', itU32, wbEnum([], c), cpNormalIgnoreEmpty), - wbFormID('Object ID', cpNormalIgnoreEmpty) - ]), 0, cpNormalIgnoreEmpty, True, wbDOBJObjectsAfterLoad - ) - ]); - - wbRecord(LGTM, 'Lighting Template', [ - wbEDID, - wbStruct(DATA, 'Lighting', [ - wbByteColors('Ambient Color'), - wbByteColors('Directional Color'), - wbByteColors('Fog Color Near'), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Distance'), - wbFloat('Fog Power'), - wbByteArray('Unused', 32, cpIgnore), - wbByteColors('Fog Color Far'), - wbFloat('Fog Max'), - wbFloat('Light Fade Begin'), - wbFloat('Light Fade End'), - wbByteArray('Unused', 4, cpIgnore), - wbFloat('Near Height Mid'), - wbFloat('Near Height Range'), - wbByteColors('Fog Color High Near'), - wbByteColors('Fog Color High Far'), - wbFloat('High Density Scale'), - wbFloat('Fog Near Scale'), - wbFloat('Fog Far Scale'), - wbFloat('Fog High Near Scale'), - wbFloat('Fog High Far Scale'), - wbFloat('Far Height Mid'), - wbFloat('Far Height Range') - ], cpNormal, True, nil, 15), - wbAmbientColors(DALC), - wbFormIDCk(WGDR, 'God Rays', [GDRY]) - ]); - - wbRecord(MUSC, 'Music Type', [ - wbEDID, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x01} 'Plays One Selection', - {0x02} 'Abrupt Transition', - {0x04} 'Cycle Tracks', - {0x08} 'Maintain Track Order', - {0x10} 'Unknown 5', - {0x20} 'Ducks Current Track', - {0x40} 'Doesn''t Queue' - ]), cpNormal, True), - wbStruct(PNAM, 'Data', [ - wbInteger('Priority', itU16), - wbInteger('Ducking (dB)', itU16, wbDiv(100)) - ]), - wbFloat(WNAM, 'Fade Duration'), - wbArray(TNAM, 'Music Tracks', wbFormIDCk('Track', [MUST, NULL])) - ]); - - wbRecord(FSTP, 'Footstep', [ - wbEDID, - wbFormIDCk(DATA, 'Impact Data Set', [IPDS, NULL], False, cpNormal, True), - wbString(ANAM, 'Tag', 0, cpNormal, True) - ]); - - wbRecord(FSTS, 'Footstep Set', [ - wbEDID, - wbStruct(XCNT, 'Count', [ - wbInteger('Walking', itU32), - wbInteger('Running', itU32), - wbInteger('Sprinting', itU32), - wbInteger('Sneaking', itU32), - wbInteger('Swimming', itU32) - ], cpNormal, True), - wbArray(DATA, 'Footstep Sets', wbFormIDCk('Footstep', [FSTP]), 0, nil, nil, cpNormal, True) - ]); - - wbSMNodeFlags := wbFlags([ - 'Random', - 'Warn if no child quest started' - ]); - - wbRecord(SMBN, 'Story Manager Branch Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL], False, cpBenign), - wbCITC, - wbCTDAsCount, - wbInteger(DNAM, 'Flags', itU32, wbSMNodeFlags), - wbUnknown(XNAM) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(SMQN, 'Story Manager Quest Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL], False, cpBenign), - wbCITC, - wbCTDAsCount, - wbStruct(DNAM, 'Flags', [ - wbInteger('Node Flags', itU16, wbSMNodeFlags), - wbInteger('Quest Flags', itU16, wbFlags([ - 'Do all before repeating', - 'Shares event', - 'Num quests to run' - ])) - ]), - wbInteger(XNAM, 'Max concurrent quests', itU32), - wbInteger(MNAM, 'Num quests to run', itU32), - wbFloat(HNAM, 'Hours until reset'), - wbInteger(QNAM, 'Quest Count', itU32, nil, cpBenign), - wbRArray('Quests', wbRStructSK([0], 'Quest', [ - wbFormIDCk(NNAM, 'Quest', [QUST]), - wbUnknown(FNAM), - wbFloat(RNAM, 'Hours until reset', cpNormal, False, 1/24) - ], []), cpNormal, False, nil, wbSMQNQuestsAfterSet) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(SMEN, 'Story Manager Event Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL]), - wbCITC, - wbCTDAsCount, - wbInteger(DNAM, 'Flags', itU32, wbSMNodeFlags), - wbUnknown(XNAM), - wbString(ENAM, 'Type', 4) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); -end; - -procedure DefineFO4j; -begin - wbRecord(DLBR, 'Dialog Branch', [ - wbEDID, - wbFormIDCk(QNAM, 'Quest', [QUST], False, cpNormal, True), - wbInteger(TNAM, 'Unknown', itU32), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - {0x01} 'Top-Level', - {0x02} 'Blocking', - {0x04} 'Exclusive' - ])), - wbFormIDCk(SNAM, 'Starting Topic', [DIAL], False, cpNormal, True) - ]); - - wbRecord(MUST, 'Music Track', [ - wbEDID, - wbInteger(CNAM, 'Track Type', itU32, wbEnum([], [ - Int64($23F678C3), 'Palette', - Int64($6ED7E048), 'Single Track', - Int64($A1A9C4D5), 'Silent Track' - ]), cpNormal, True), - wbFloat(FLTV, 'Duration'), - wbFloat(DNAM, 'Fade-Out'), - wbString(ANAM, 'Track Filename'), - wbString(BNAM, 'Finale Filename'), - wbStruct(LNAM, 'Loop Data', [ - wbFloat('Loop Begins'), - wbFloat('Loop Ends'), - wbInteger('Loop Count', itU32) - ]), - wbArray(FNAM, 'Cue Points', wbFloat('Point')), - wbCITC, - wbCTDAsCount, - wbArray(SNAM, 'Tracks', wbFormIDCk('Track', [MUST, NULL])) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(DLVW, 'Dialog View', [ - wbEDID, - wbFormIDCk(QNAM, 'Quest', [QUST], False, cpNormal, True), - wbRArray('Branches', wbFormIDCk(BNAM, 'Branch', [DLBR])), - wbRArray('Unknown TNAM', wbRStruct('Unknown', [ - wbUnknown(TNAM) - ], [])), - wbUnknown(ENAM), - wbUnknown(DNAM) - ]); - - {wbRecord(WOOP, 'Word of Power', [ - wbEDID - ]);} - - {wbRecord(SHOU, 'Shout', [ - wbEDID - ]);} - - wbRecord(EQUP, 'Equip Type', [ - wbEDID, - wbArray(PNAM, 'Slot Parents', wbFormIDCk('Parent', [EQUP])), - wbInteger(DATA, 'Flags', itU32, wbFlags([ - 'Use All Parents', - 'Parents Optional', - 'Item Slot' - ])), - wbFormIDCk(ANAM, 'Condition Actor Value', [AVIF, NULL, FFFF]) - ]); - - wbRecord(RELA, 'Relationship', [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbFormIDCk('Parent', [NPC_, NULL]), - wbFormIDCk('Child', [NPC_, NULL]), - wbInteger('Rank', itU8, wbEnum([ - 'Lover', - 'Ally', - 'Confidant', - 'Friend', - 'Acquaitance', - 'Rival', - 'Foe', - 'Enemy', - 'Archnemesis' - ])), - wbByteArray('Unknown', 2), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Unknown 1', - {0x02} 'Unknown 2', - {0x04} 'Unknown 3', - {0x08} 'Unknown 4', - {0x10} 'Unknown 5', - {0x20} 'Unknown 6', - {0x40} 'Unknown 7', - {0x80} 'Secret' - ])), - wbFormIDCk('Association Type', [ASTP, NULL]) - ]) - ]); - - wbRecord(SCEN, 'Scene', [ - wbEDID, - wbVMADFragmentedSCEN, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Begin on Quest Start', - {0x00000002} 'Stop on Quest End', - {0x00000004} 'Unknown 2', - {0x00000008} 'Repeat Conditions While True', - {0x00000010} 'Interruptible', - {0x00000020} 'Unknown 5', - {0x00000040} 'Prevent Player Exit Dialogue', - {0x00000080} 'Unknown 7', - {0x00000100} 'Unknown 8', - {0x00000200} 'Unknown 9', - {0x00000400} 'Unknown 10', - {0x00000800} 'Disable Dialogue Camera', - {0x00001000} 'No Follower Idle Chatter' - ])), - wbRArray('Phases', - wbRStruct('Phase', [ - wbEmpty(HNAM, 'Marker Phase Start'), - wbString(NAM0, 'Name'), - wbRStruct('Start Conditions', [wbCTDAs], []), - wbEmpty(NEXT, 'Marker Start Conditions'), - wbRStruct('Completion Conditions', [wbCTDAs], []), - wbEmpty(NEXT, 'Marker Completion Conditions'), - wbInteger(WNAM, 'Editor Width', itU32), - wbInteger(FNAM, 'Flags', itU16, wbFlags([ - {0x0001} 'Start - WalkAway Phase', - {0x0002} 'Don''t Run End Scripts on Scene Jump', - {0x0004} 'Start - Inherit In Templated Scenes' - ])), - wbStruct(SCQS, 'Set Parent Quest Stage', [ - wbInteger('On Start', itS16), - wbInteger('On Completion', itS16) - ]), - wbEmpty(HNAM, 'Marker Phase End') - ], []) - ), - wbRArray('Actors', wbRStruct('Actor', [ - wbInteger(ALID, 'Alias ID', itS32), - wbInteger(LNAM, 'Flags', itU32, wbFlags([ - 'No Player Activation', - 'Optional', - 'Run Only Scene Packages', - 'No Command State' - ])), - wbInteger(DNAM, 'Behaviour Flags', itU32, wbFlags([ - 'Death Pause', - 'Death End', - 'Combat Pause', - 'Combat End', - 'Dialogue Pause', - 'Dialogue End', - 'OBS_COM Pause', - 'OBS_COM End' - ])) - ], [])), - wbRArray('Actions', wbRStruct('Action', [ - wbInteger(ANAM, 'Type', itU16, wbEnum([ - {0} 'Dialogue', - {1} 'Package', - {2} 'Timer', - {3} 'Player Dialogue', - {4} 'Start Scene', - {5} 'NPC Response Dialogue', - {6} 'Radio' - ])), - wbString(NAM0, 'Name'), - wbInteger(ALID, 'Alias ID', itS32), - wbInteger(INAM, 'Index', itU32), - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Unknown 0', - {0x00000002} 'Unknown 1', - {0x00000004} 'Unknown 2', - {0x00000008} 'Unknown 3', - {0x00000010} 'Unknown 4', - {0x00000020} 'Unknown 5', - {0x00000040} 'Unknown 6', - {0x00000080} 'Player Positive Use Dialogue Subtype / Hold Into Next Scene', - {0x00000100} 'Player Negative Use Dialogue Subtype', - {0x00000200} 'Player Neutral Use Dialogue Subtype', - {0x00000400} 'Use Dialogue Subtype', - {0x00000800} 'Player Question Use Dialogue Subtype', - {0x00001000} 'Keep/Clear Target on Action End', - {0x00002000} 'Unknown 13', - {0x00004000} 'Unknown 14', - {0x00008000} 'Face Target', - {0x00010000} 'Looping', - {0x00020000} 'Headtrack Player', - {0x00040000} 'Unknown 18', - {0x00080000} 'Ignore For Completion', - {0x00100000} 'Unknown 20', - {0x00200000} 'Camera Speaker Target', - {0x00400000} 'Complete Face Target', - {0x00800000} 'Unknown 23', - {0x01000000} 'Unknown 24', - {0x02000000} 'Unknown 25', - {0x04000000} 'Unknown 26', - {0x08000000} 'NPC Positive Use Dialogue Subtype', - {0x10000000} 'NPC Negative Use Dialogue Subtype', - {0x20000000} 'NPC Neutral Use Dialogue Subtype', - {0x40000000} 'NPC Question Use Dialogue Subtype' - ])), - wbInteger(SNAM, 'Start Phase', itU32), - wbInteger(ENAM, 'End Phase', itU32), - wbFloat(SNAM, 'Timer - Max Seconds'), - wbInteger(SCQS, 'Set Parent Quest Stage', itS16), - wbFloat(TNAM, 'Timer - Min Seconds'), - wbUnknown(STSC), - wbRStructs('Start Scenes', 'Start Scene', [ - wbFormIDCk(LCEP, 'Scene', [SCEN]), - wbInteger(INTT, 'Phase Index', itU16), - wbString(SSPN, 'Start Phase for Scene'), - wbCITC, - wbCTDAs - ], []), - wbFormIDCk(PTOP, 'Player Positive Response', [DIAL]), - wbFormIDCk(NTOP, 'Player Negative Response', [DIAL]), - wbFormIDCk(NETO, 'Player Neutral Response', [DIAL]), - wbFormIDCk(QTOP, 'Player Question Response', [DIAL]), - wbFormIDCk(VENC, 'Player Positive Dialogue Subtype', [KYWD]), - wbFormIDCk(PLVD, 'Player Negative Dialogue Subtype', [KYWD]), - wbFormIDCk(JOUT, 'Player Neutral Dialogue Subtype', [KYWD]), - wbFormIDCk(DALC, 'Player Question Dialogue Subtype', [KYWD]), - wbArray(DTID, 'NPC Headtracking', wbInteger('Actor ID', itS32)), - wbFormIDCk(NPOT, 'NPC Positive Response', [DIAL]), - wbFormIDCk(NNGT, 'NPC Negative Response', [DIAL]), - wbFormIDCk(NNUT, 'NPC Neutral Response', [DIAL]), - wbFormIDCk(NQUT, 'NPC Question Response', [DIAL]), - wbFormIDCk(NPOS, 'NPC Positive Dialogue Subtype', [KYWD]), - wbFormIDCk(NNGS, 'NPC Negative Dialogue Subtype', [KYWD]), - wbFormIDCk(NNUS, 'NPC Neutral Dialogue Subtype', [KYWD]), - wbFormIDCk(NQUS, 'NPC Question Dialogue Subtype', [KYWD]), - wbInteger(DTGT, 'Dialogue Target Actor', itS32), - wbRArray('Packages', wbFormIDCk(PNAM, 'Package', [PACK])), - wbFormIDCk(DATA, 'Topic', [DIAL, NULL]), - wbUnion(HTID, '', wbSceneActionSoundDecider, [ - wbEmpty('End Scene Say Greeting'), - wbFormIDCk('Play Sound', [SNDR, NULL]) - ]), - wbFloat(DMAX, 'Looping - Max'), - wbFloat(DMIN, 'Looping - Min'), - wbStruct(CRIS, 'Camera', [ - wbFloat('FOV On Player Camera'), - wbFloat('Rate Of Camera Change') - ]), - wbInteger(DEMO, 'Emotion Type', itU32, wbEmotionTypeEnum), - wbInteger(DEVA, 'Emotion Value', itU32), - wbArray(HTID, 'Player Headtracking', wbInteger('Actor ID', itS32)), - wbFormIDCk(VENC, 'Dialogue Subtype', [KYWD]), - wbFormIDCk(PNAM, 'AnimArchType', [KYWD]), - wbFormIDCk(ONAM, 'Audio Output Override', [SOPM]), - wbEmpty(ANAM, 'End Marker') - ], [])), - wbFormIDCk(PNAM, 'Quest', [QUST]), - wbInteger(INAM, 'Last Action Index', itU32), - wbUnknown(VNAM), - wbFloat(CNAM, 'Camera Distance Override'), - wbFloat(ACTV, 'Dialogue Distance Override'), - wbFloat(CRIS, 'FOV Override'), - wbKSIZ, - wbKWDAs, - wbCTDAs, - wbStruct(SCQS, 'Set Parent Quest Stage', [ - wbInteger('On Begin', itS16), - wbInteger('On End', itS16) - ]), - wbString(NNAM, 'Notes'), - wbFormIDCk(TNAM, 'Template Scene', [SCEN]), - wbInteger(XNAM, 'Index', itU32) - ]); - - wbRecord(ASTP, 'Association Type', [ - wbEDID, - wbString(MPRT, 'Male Parent Title'), - wbString(FPRT, 'Female Parent Title'), - wbString(MCHT, 'Male Child Title'), - wbString(FCHT, 'Female Child Title'), - wbInteger(DATA, 'Flags', itU32, wbFlags([ - 'Family Association' - ])) - ]); -end; - -procedure DefineFO4k; -begin - - wbSPED := wbStruct(SPED, 'Movement Data', [ - wbFloat('Unknown'), - wbFloat('Walk - Left'), - wbFloat('Run - Left'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Walk - Right'), - wbFloat('Run - Right'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Walk - Forward'), - wbFloat('Run - Forward'), - wbFloat('Sprint - Forward'), - wbFloat('Unknown'), - wbFloat('Walk - Back'), - wbFloat('Run - Back'), - wbFloat('Unknown'), - wbFloat('Standing - Pitch', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Walk - Pitch', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Run - Pitch', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Sprint - Pitch', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Unknown'{, cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize}), - wbFloat('Unknown'{, cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize}), - wbFloat('Unknown'{, cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize}), - wbFloat('Unknown'{, cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize}), - wbFloat('Standing - Yaw', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Walk - Yaw', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Run - Yaw', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Sprint - Yaw', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ], cpNormal, True, nil, 10); - - wbRecord(OTFT, 'Outfit', [ - wbEDID, - wbArrayS(INAM, 'Items', wbFormIDCk('Item', [ARMO, LVLI])) - ]); - - wbRecord(ARTO, 'Art Object', [ - wbEDID, - wbOBNDReq, - wbPTRN, - wbKSIZ, - wbKWDAs, - wbMODL, - wbInteger(DNAM, 'Art Type', itU32, wbEnum([ - 'Magic Casting', - 'Magic Hit Effect', - 'Enchantment Effect' - ])) - ]); - - wbRecord(MATO, 'Material Object', [ - wbEDID, - wbMODL, - wbRArray('Property Data', - wbByteArray(DNAM, 'Data', 0, cpIgnore, False, False, wbNeverShow) - ), - wbStruct(DATA, 'Directional Material Data', [ - wbFloat('Falloff Scale'), - wbFloat('Falloff Bias'), - wbFloat('Noise UV Scale'), - wbFloat('Material UV Scale'), - wbStruct('Projection Vector', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbFloat('Normal Dampener'), - wbFloatColors('Single Pass Color'), - wbInteger('Flags', itU32, wbFlags(['Single Pass'])) - ], cpNormal, True, nil, 5) - ]); - - wbRecord(MOVT, 'Movement Type', [ - wbEDID, - wbString(MNAM, 'Name'), - wbSPED, - wbStruct(INAM, 'Anim Change Thresholds (unused)', [ - wbFloat('Directional', cpNormal, True, 180/Pi), - wbFloat('Movement Speed'), - wbFloat('Rotation Speed', cpNormal, True, 180/Pi) - ]), - wbFloat(JNAM, 'Float Height'), - wbFloat(LNAM, 'Flight - Angle Gain') - ]); - - wbRecord(SNDR, 'Sound Descriptor', [ - wbEDID, - wbString(NNAM, 'Notes'), - wbInteger(CNAM, 'Descriptor Type', itU32, wbEnum([], [ - Int64($1EEF540A), 'Standard', - Int64($54651A43), 'Compound', - Int64($ED157AE3), 'AutoWeapon' - ])), - wbFormIDCk(GNAM, 'Category', [SNCT]), - wbFormIDCk(SNAM, 'Alternate Sound For', [SNDR]), - wbRArray('Sounds', - wbRStruct('Sound Files', [ - wbString(ANAM, 'File Name') - ], []) - ), - wbFormIDCk(ONAM, 'Output Model', [SOPM]), - wbCTDAs, - wbStruct(LNAM, 'Values', [ - wbByteArray('Unknown', 1), - wbInteger('Looping', itU8, wbEnum([], [ - $00, 'None', - $08, 'Loop', - $10, 'Envelope Fast', - $20, 'Envelope Slow' - ])), - wbInteger('Sidechain', itU8), - wbInteger('Rumble Send Value = (Small / 7) + ((Big / 7) * 16)', itU8) - ]), - wbUnion(BNAM, 'Data', wbSNDRDataDecider, [ - wbStruct('Values', [ - wbInteger('% Frequency Shift', itS8), - wbInteger('% Frequency Variance', itS8), - wbInteger('Priority', itU8), - wbInteger('db Variance', itU8), - wbInteger('Static Attenuation (db)', itU16, wbDiv(100)) - ]), - wbFormIDCk('Base Descriptor', [SNDR]) - ]), - wbRArray('Descriptors', wbFormIDCk(DNAM, 'Descriptor', [SNDR])), - wbInteger(ITMC, 'Count', itU32, nil, cpBenign), - wbRArrayS('Rates of Fire', - wbRStructSK([1], 'Sound', [ - wbEmpty(ITMS, 'Marker Start'), - wbInteger(INTV, 'RoF (RPM)', itU32), - wbString(FNAM, 'File'), - wbEmpty(ITME, 'Marker End') - ], []), - cpNormal, False, nil, wbSNDRRatesOfFireAfterSet - ) - ]); - - wbRecord(DUAL, 'Dual Cast Data', [ - wbEDID - ]); - - wbRecord(SNCT, 'Sound Category', [ - wbEDID, - wbFULL, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x0000001} 'Mute When Submerged', - {0x0000002} 'Should Appear on Menu', - {0x0000004} 'Immune to Time Speedup', - {0x0000008} 'Pause During Menus (Immed)', - {0x0000010} 'Pause During Menus (Fade)', - {0x0000020} 'Exclude from Player OPM Override', - {0x0000040} 'Pause During Start Menu' - ]), cpNormal, True), - wbFormIDCk(PNAM, 'Parent Category', [SNCT]), - wbFormIDCk(ONAM, 'Menu Slider Category', [SNCT]), - wbInteger(VNAM, 'Static Volume Multiplier', itU16, wbDiv(65535)), - wbInteger(UNAM, 'Default Menu Value', itU16, wbDiv(65535)), - wbFloat(MNAM, 'Min Frequency Multiplier'), - wbFloat(CNAM, 'Sidechain Target Multiplier') - ]); - - wbRecord(SOPM, 'Sound Output Model', [ - wbEDID, - wbStruct(NAM1, 'Data', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Attenuates With Distance', - {0x02} 'Allows Rumble', - {0x04} 'Applies Doppler', - {0x08} 'Applies Distance Delay', - {0x10} 'Player Output Model', - {0x20} 'Try Play on Controller', - {0x40} 'Causes Ducking', - {0x80} 'Avoids Ducking' - ])), - wbByteArray('Unknown', 2), - wbInteger('Reverb Send %', itU8) - ]), - wbInteger(MNAM, 'Type', itU32, wbEnum([ - 'Uses HRTF', - 'Defined Speaker Output' - ])), - wbInteger(VNAM, 'Static Attenuation', itS16, wbDiv(100)), - wbStruct(ONAM, 'Output Values', [ - wbArray('Channels', wbStruct('', [ - wbInteger('FL', itU8), - wbInteger('FR', itU8), - wbInteger('C', itU8), - wbInteger('LFE', itU8), - wbInteger('RL', itU8), - wbInteger('RR', itU8), - wbInteger('SL', itU8), - wbInteger('SR', itU8) - ]), [ - 'Channel 0', - 'Channel 1', - 'Channel 2? (unused)' - ]) - ]), - wbStruct(ATTN, 'Attenuation Values', [ - wbFloat('Fade In Distance - Start'), - wbFloat('Fade In Distance - End'), - wbFloat('Fade Out Distance - Start'), - wbFloat('Fade Out Distance - End'), - wbStruct('Fade In Curve', [ - wbInteger('Value 1', itU8), - wbInteger('Value 2', itU8), - wbInteger('Value 3', itU8), - wbInteger('Value 4', itU8) - ]), - wbStruct('Fade Out Curve', [ - wbInteger('Value 1', itU8), - wbInteger('Value 2', itU8), - wbInteger('Value 3', itU8), - wbInteger('Value 4', itU8) - ]) - ]), - wbFormIDCk(ENAM, 'Effect Chain', [AECH]) - ]); - - wbRecord(COLL, 'Collision Layer', [ - wbEDID, - wbDESCReq, - wbInteger(BNAM, 'Index', itU32, nil, cpNormal, True), - wbStruct(FNAM, 'Debug Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ], cpNormal, True), - wbInteger(GNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Trigger Volume', - {0x00000002} 'Sensor', - {0x00000004} 'Navmesh Obstacle' - ]), cpNormal, True), - wbString(MNAM, 'Name', 0, cpNormal, True), - wbInteger(INTV, 'Interactables Count', itU32, nil, cpNormal, True), - wbArrayS(CNAM, 'Collides With', wbFormIDCk('Forms', [COLL]), 0, cpNormal, False) - ]); - - wbRecord(CLFM, 'Color', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbFULL, - // union decider doesn't work during copying since decision data FNAM is located after it - // workaround using integer formatters - wbInteger(CNAM, 'Color/Index', itU32, wbCLFMColorToStr, wbCLFMColorToInt), - {wbUnion(CNAM, 'Value', wbCLFMColorDecider, [ - wbByteColors('Color'), - wbFloat('Remapping Index') - ]),} - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - 'Playable', - 'Remapping Index', - 'Extended LUT' - ]), cpNormal, True), - wbCTDAs - ]); -end; - -procedure DefineFO4l; -begin - wbRecord(REVB, 'Reverb Parameters', [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbInteger('Decay Time (ms)', itU16), - wbInteger('HF Reference (Hz)', itU16), - wbInteger('Room Filter', itS8), - wbInteger('Room HF Filter', itS8), - wbInteger('Reflections', itS8), - wbInteger('Reverb Amp', itS8), - wbInteger('Decay HF Ratio', itU8, wbDiv(100)), - wbInteger('Reflect Delay (ms), scaled', itU8), - wbInteger('Reverb Delay (ms)', itU8), - wbInteger('Diffusion %', itU8), - wbInteger('Density %', itU8), - wbInteger('Unknown', itU8) - ], cpNormal, True), - wbInteger(ANAM, 'Reverb Class', itU32, wbReverbClassEnum, cpNormal, True) - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDID, - wbOBNDReq, - wbMODL, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unknown', 1), - wbInteger('Units From Water', itU16), - wbByteArray('Unknown', 2), - wbInteger('Units From Water Type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unknown', 3) - ], cpNormal, True) - ]); - - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbCTDAs, - wbString(DNAM, 'Behavior Graph'), - wbString(ENAM, 'Animation Event'), - wbArray(ANAM, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [AACT, IDLE, NULL]), - ['Parent', 'Previous Sibling'], cpNormal, True), - wbStruct(DATA, '', [ - wbStruct('Looping seconds (both 255 forever)', [ - wbInteger('Min', itU8), - wbInteger('Max', itU8) - ]), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Parent', - {0x02} 'Sequence', - {0x04} 'No Attacking', - {0x04} 'Blocking' - ], True)), - wbInteger('Animation Group Section', itU8{, wbIdleAnam}), - wbInteger('Replay Delay', itU16) - ], cpNormal, True), - wbString(GNAM, 'Animation File') - ]); - - wbRecord(INFO, 'Dialog response', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Unknown 6', - {0x00000080} 7, 'Exclude From Export', - {0x00002000} 13, 'Actor Changed' - ])), [ - wbEDID, - wbVMADFragmentedINFO, - wbStruct(ENAM, 'Response flags', [ - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Start Scene on End', - {0x0002} 'Random', - {0x0004} 'Say Once', - {0x0008} 'Requires Player Activation', - {0x0010} 'Unknown 4', - {0x0020} 'Random End', - {0x0040} 'End Running Scene', - {0x0080} 'ForceGreet Hello', - {0x0100} 'Player Address', - {0x0200} 'Unknown 9', - {0x0400} 'Can Move While Greeting', - {0x0800} 'No LIP File', - {0x1000} 'Requires post-processing', - {0x2000} 'Audio Output Override', - {0x4000} 'Has Capture', - {0x8000} 'Unknown 16' - ])), - wbInteger('Reset Hours', itU16, wbDiv(2730)) - ]), - wbFormIDCk(TPIC, 'Topic', [DIAL]), - wbFormIDCkNoReach(PNAM, 'Previous INFO', [INFO, NULL], False, cpBenign), - wbFormIDCk(DNAM, 'Shared INFO', [INFO]), - wbFormIDCk(GNAM, 'Unknown', [INFO]), - wbString(IOVR, 'Override Filename'), - - wbRArray('Responses', wbRStruct('Response', [ - wbStruct(TRDA, 'Response Data', [ - wbFormIDCk('Emotion', [KYWD, FFFF]), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3), - wbByteArray('Unknown', 2), - wbInteger('Interrupt Percentage', itU16), - wbInteger('Camera Target Alias', itS32), - wbInteger('Camera Location Alias', itS32) - ]), - wbLStringKC(NAM1, 'Response Text', 0, cpTranslate, True), - wbString(NAM2, 'Script Notes', 0, cpNormal, True), - wbString(NAM3, 'Edits', 0, cpNormal, True), - wbString(NAM4, 'Alternate LIP Text', 0, cpNormal, True), - wbFormIDCk(SNAM, 'Idle Animations: Speaker', [IDLE]), - wbFormIDCk(LNAM, 'Idle Animations: Listener', [IDLE]), - wbInteger(TNAM, 'Interrupt Percentage', itU16), - wbByteArray(NAM9, 'Text Hash'), - wbFormIDCk(SRAF, 'Camera Path', [CPTH]), - wbEmpty(WZMD, 'Stop on Scene End') - ], [])), - - wbCTDAs, - wbLString(RNAM, 'Prompt', 0, cpTranslate), - wbFormIDCk(ANAM, 'Speaker', [NPC_]), - wbFormIDCk(TSCE, 'Start Scene', [SCEN]), - wbInteger(ALFA, 'Forced Alias', itS32), - wbUnknown(INTV), - wbFormIDCk(ONAM, 'Audio Output Override', [SOPM]), - wbInteger(GREE, 'Greet Distance', itU32), - wbStruct(TIQS, 'Set Parent Quest Stage', [ - wbInteger('On Begin', itS16), - wbInteger('On End', itS16) - ]), - wbString(NAM0, 'Start Scene Phase'), - wbInteger(INCC, 'Challenge', itU32, wbEnum([ - {0} 'None', - {1} 'Easy', - {2} 'Medium', - {3} 'Hard', - {4} 'Always Succeeds', - {5} 'Easy Repeatable', - {6} 'Medium Repeatable', - {7} 'Hard Repeatable' - ])), - wbFormIDCk(MODQ, 'Reset Global', [GLOB]), - wbInteger(INAM, 'Subtitle Priority', itU32, wbEnum([ - 'Low', - 'Normal', - 'Unknown 2', - 'Force' - ])) - ], False, wbINFOAddInfo, cpNormal, False, nil{wbINFOAfterLoad}); - - wbRecord(INGR, 'Ingredient', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbMODL, - wbICON, - wbMICO, - wbDEST, - wbETYP, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Ingredient Value', itS32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'No auto-calculation', - {0x00000002} 'Food item', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'References Persist' - ])) - ], cpNormal, True), - wbEffectsReq - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(KEYM, 'Key', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000800} 11, 'Calc Value From Components', - {0x00002000} 13, 'Pack-In Use Only' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULLReq, - wbMODL, - wbICON, - wbMICO, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed' - ]), [18]), [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])), - wbRArray('Unknown', wbUnknown(MPCD)) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed' - ]), [18]), [ - wbByteArray(DATA, 'Unknown'), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unknown', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unknown', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])), - wbRArray('Unknown', wbUnknown(MPCD)) - ]); - - end; - - wbRecord(LIGH, 'Light', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Unknown 17', - {0x00020000} 25, 'Obstacle', - {0x00020000} 28, 'Portal-strict' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbMODL, - wbKSIZ, - wbKWDAs, - wbDEST, - wbPRPS, - wbFULL, - wbICON, - wbMICO, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbByteColors('Color'), - // Omnidirectional is the default type - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Unknown 0', - {0x00000002} 'Can be Carried', - {0x00000004} 'Unknown 2', - {0x00000008} 'Flicker', - {0x00000010} 'Unknown 4', - {0x00000020} 'Off By Default', - {0x00000040} 'Unknown 6', - {0x00000080} 'Pulse', - {0x00000100} 'Unknown 8', - {0x00000200} 'Unknown 9', - {0x00000400} 'Shadow Spotlight', - {0x00000800} 'Shadow Hemisphere', - {0x00001000} 'Shadow OmniDirectional', - {0x00002000} 'Unknown 13', - {0x00004000} 'NonShadow Spotlight', - {0x00008000} 'Non Specular', - {0x00010000} 'Attenuation Only', - {0x00020000} 'NonShadow Box', - {0x00040000} 'Ignore Roughness', - {0x00080000} 'No Rim Lighting', - {0x00100000} 'Ambient Only', - {0x00200000} 'Unknown 21' // only in [001C7F0C] - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbFloat('Near Clip'), - wbStruct('Flicker Effect', [ - wbFloat('Period'), - wbFloat('Intensity Amplitude'), - wbFloat('Movement Amplitude') - ]), - wbFloat('Constant'), - wbFloat('Scalar'), - wbFloat('Exponent'), - wbFloat('God Rays - Near Clip'), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True, nil, 10), - wbFloat(FNAM, 'Fade value', cpNormal, True), - wbString(NAM0, 'Gobo'), - wbFormIDCk(LNAM, 'Lens', [LENS]), - wbFormIDCk(WGDR, 'God Rays', [GDRY]), - wbFormIDCk(SNAM, 'Sound', [SNDR]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); -end; - -procedure DefineFO4m; -begin - - wbRecord(LSCR, 'Load Screen', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Displays In Main Menu', - {0x00008000} 15, 'No Rotation' - ])), [ - wbEDID, - wbDESCReq, - wbCTDAs, - wbFormIDCk(NNAM, 'Loading Screen NIF', [STAT, SCOL, NULL], False, cpNormal, True), - wbFormIDCk(TNAM, 'Transform', [TRNS]), - wbStruct(ONAM, 'Rotation', [ - wbInteger('Min', itS16), - wbInteger('Max', itS16) - ]), - wbStruct(ZNAM, 'Zoom', [ - wbFloat('Min'), - wbFloat('Max') - ]), - wbString(MOD2, 'Camera Path', 0, cpNormal, False) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDID, - wbFormIDCk(TNAM, 'Texture Set', [TXST], False, cpNormal, False), - wbFormIDCk(MNAM, 'Material Type', [MATT, NULL], False, cpNormal, True), - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Friction', itU8), - wbInteger('Restitution', itU8) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True), - wbRArray('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])) - ]); - - wbRecord(LVLN, 'Leveled NPC', [ - wbEDID, - wbOBNDReq, - wbLVLD, - wbInteger(LVLM, 'Max Count', itU8), { Always 00 } {Unavailable} - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Calculate All' {Still picks just one} - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Use Global', [GLOB]), - wbLLCT, - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itU16), - wbByteArray('Unused', 2, cpIgnore, false, wbNeverShow), - wbFormIDCk('Reference', [NPC_, LVLN]), - wbInteger('Count', itS16), - wbInteger('Chance None', itU8), - wbByteArray('Unused', 1, cpIgnore, false, wbNeverShow) - ]), - wbCOED - ], []), cpNormal, False, nil, wbLVLOsAfterSet), - wbArrayS(LLKC, 'Filter Keyword Chances', - wbStructSK([0], 'Filter', [ - wbFormIDCk('Keyword', [KYWD]), - wbInteger('Chance', itU32) - ]) - ), - wbMODL - ], False, nil, cpNormal, False, wbLLEAfterLoad, wbLLEAfterSet); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDID, - wbOBNDReq, - wbLVLD, - wbInteger(LVLM, 'Max Count', itU8), { Always 00 } - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use All' - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Use Global', [GLOB]), - wbLLCT, - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itU16), - wbByteArray('Unused', 2, cpIgnore, false, wbNeverShow), - wbFormIDCk('Reference', sigBaseObjects), - wbInteger('Count', itU16), - wbInteger('Chance None', itU8), - wbByteArray('Unused', 1, cpIgnore, false, wbNeverShow) - ]), - wbCOED - ], []), cpNormal, False, nil, wbLVLOsAfterSet - ), - wbArrayS(LLKC, 'Filter Keyword Chances', - wbStructSK([0], 'Filter', [ - wbFormIDCk('Keyword', [KYWD]), - wbInteger('Chance', itU32) - ]) - ), - wbFormIDCk(LVSG, 'Epic Loot Chance', [GLOB]), - wbLStringKC(ONAM, 'Override Name', 0, cpTranslate) - ], False, nil, cpNormal, False, wbLLEAfterLoad, wbLLEAfterSet); - - wbRecord(LVSP, 'Leveled Spell', [ - wbEDID - ]); - - wbMGEFType := wbInteger('Archetype', itU32, wbEnum([ - {00} 'Value Modifier', - {01} 'Script', - {02} 'Dispel', - {03} 'Cure Disease', - {04} 'Absorb', - {05} 'Dual Value Modifier', - {06} 'Calm', - {07} 'Demoralize', - {08} 'Frenzy', - {09} 'Disarm', - {10} 'Command Summoned', - {11} 'Invisibility', - {12} 'Light', - {13} 'Darkness', - {14} 'Nighteye', - {15} 'Lock', - {16} 'Open', - {17} 'Bound Weapon', - {18} 'Summon Creature', - {19} 'Detect Life', - {20} 'Telekinesis', - {21} 'Paralysis', - {22} 'Reanimate', - {23} 'Soul Trap', - {24} 'Turn Undead', - {25} 'Guide', - {26} 'Unknown 26', - {27} 'Cure Paralysis', - {28} 'Cure Addiction', - {29} 'Cure Poison', - {30} 'Concussion', - {31} 'Stimpack', - {32} 'Accumulate Magnitude', - {33} 'Stagger', - {34} 'Peak Value Modifier', - {35} 'Cloak', - {36} 'Unknown 36', - {37} 'Slow Time', - {38} 'Rally', - {39} 'Enhance Weapon', - {40} 'Spawn Hazard', - {41} 'Etherealize', - {42} 'Banish', - {43} 'Spawn Scripted Ref', - {44} 'Disguise', - {45} 'Damage', - {46} 'Immunity', - {47} 'Permanent Reanimate', - {48} 'Jetpack', - {49} 'Chameleon' - ]), cpNormal, False, nil, wbMGEFArchtypeAfterSet); - - wbMGEFData := wbRStruct('Magic Effect Data', [ - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} 'Snap to Navmesh', - {0x00000010} 'No Hit Event', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Dispel with Keywords', - {0x00000200} 'No Duration', - {0x00000400} 'No Magnitude', - {0x00000800} 'No Area', - {0x00001000} 'FX Persist', - {0x00002000} 'Unknown 14', - {0x00004000} 'Gory Visuals', - {0x00008000} 'Hide in UI', - {0x00010000} 'Unknown 17', - {0x00020000} 'No Recast', - {0x00040000} 'Unknown 19', - {0x00080000} 'Unknown 20', - {0x00100000} 'Unknown 21', - {0x00200000} 'Power Affects Magnitude', - {0x00400000} 'Power Affects Duration', - {0x00800000} 'Unknown 24', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Painless', - {0x08000000} 'No Hit Effect', - {0x10000000} 'No Death Dispel', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbFloat('Base Cost'), - wbUnion('Assoc. Item', wbMGEFAssocItemDecider, [ - wbFormID('Unused', cpIgnore), - wbFormIDCk('Assoc. Item', [LIGH, NULL]), - wbFormIDCk('Assoc. Item', [WEAP, ARMO, NULL]), - wbFormIDCk('Assoc. Item', [NPC_, NULL]), - wbFormIDCk('Assoc. Item', [HAZD, NULL]), - wbFormIDCk('Assoc. Item', [SPEL, NULL]), - wbFormIDCk('Assoc. Item', [RACE, NULL]), - wbFormIDCk('Assoc. Item', [ENCH, NULL]), - wbFormIDCk('Assoc. Item', [KYWD, NULL]) - ], cpNormal, False, nil, wbMGEFAssocItemAfterSet), - wbByteArray('Magic Skill (unused)', 4), - wbFormIDCk('Resist Value', [AVIF, NULL]), - wbInteger('Counter Effect count', itU16), - wbByteArray('Unused', 2), - wbFormIDCk('Casting Light', [LIGH, NULL]), - wbFloat('Taper Weight'), - wbFormIDCk('Hit Shader', [EFSH, NULL]), - wbFormIDCk('Enchant Shader', [EFSH, NULL]), - wbInteger('Minimum Skill Level', itU32), - wbStruct('Spellmaking', [ - wbInteger('Area', itU32), - wbFloat('Casting Time') - ]), - wbFloat('Taper Curve'), - wbFloat('Taper Duration'), - wbFloat('Second AV Weight', cpNormal, False, nil, wbMGEFAV2WeightAfterSet), - wbMGEFType, - wbActorValue, - wbFormIDCk('Projectile', [PROJ, NULL]), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbInteger('Casting Type', itU32, wbCastEnum), - wbInteger('Delivery', itU32, wbTargetEnum), - wbActorValue, //wbInteger('Second Actor Value', itS32, wbActorValueEnum), - wbFormIDCk('Casting Art', [ARTO, NULL]), - wbFormIDCk('Hit Effect Art', [ARTO, NULL]), - wbFormIDCk('Impact Data', [IPDS, NULL]), - wbFloat('Skill Usage Multiplier'), - wbStruct('Dual Casting', [ - wbFormIDCk('Art', [DUAL, NULL]), - wbFloat('Scale') - ]), - wbFormIDCk('Enchant Art', [ARTO, NULL]), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbFormIDCk('Equip Ability', [SPEL, NULL]), - wbFormIDCk('Image Space Modifier', [IMAD, NULL]), - wbFormIDCk('Perk to Apply', [PERK, NULL]), - wbInteger('Casting Sound Level', itU32, wbSoundLevelEnum), - wbStruct('Script Effect AI', [ - wbFloat('Score'), - wbFloat('Delay Time') - ]) - ], cpNormal, True) - ], []); - - wbRecord(MGEF, 'Magic Effect', [ - wbEDID, - wbVMAD, - wbFULL, - wbMDOB, - wbKSIZ, - wbKWDAs, - wbMGEFData, - wbRArrayS('Counter Effects', wbFormIDCk(ESCE, 'Effect', [MGEF]), cpNormal, False, nil, wbCounterEffectsAfterSet), - wbArray(SNDD, 'Sounds', wbStruct('', [ - wbInteger('Type', itU32, wbEnum([ - 'Sheathe/Draw', - 'Charge', - 'Ready', - 'Release', - 'Concentration Cast Loop', - 'On Hit' - ])), - wbFormIDCk('Sound', [SNDR]) - ])), - wbLStringKC(DNAM, 'Magic Item Description', 0, cpTranslate), - wbCTDAs - ], False, nil, cpNormal, False, nil {wbMGEFAfterLoad}, wbMGEFAfterSet); - - wbRecord(MISC, 'Misc. Item', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 11, 'Calc From Components', - {0x00000004} 13, 'Pack-In Use Only' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbICON, - wbMICO, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbFormID(FIMD, 'Featured Item Message'), - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - // the amount of components is the same as size of CDIX, so should not be sorted probably - wbStructs(CVPA, 'Components', 'Component', [ - wbFormIDCk('Component', sigBaseObjects), // CK allows only CMPO - wbInteger('Count', itU32) - ]), - wbArray(CDIX, 'Component Display Indices', wbInteger('Display Index', itU8)) - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(COBJ, 'Constructible Object', [ - wbEDID, - wbYNAM, - wbZNAM, - wbArrayS(FVPA, 'Components', - wbStructSK([0], 'Component', [ - wbFormIDCk('Component', sigBaseObjects), - wbInteger('Count', itU32) - ]) - ), - wbDESC, - wbCTDAs, - wbFormIDCk(CNAM, 'Created Object', sigBaseObjects), - wbFormIDCk(BNAM, 'Workbench Keyword', [KYWD]), - wbByteArray(NAM1, 'Unused', 0, cpIgnore, False, False, wbNeverShow), // co_PA_FusionCore01 - wbByteArray(NAM2, 'Unused', 0, cpIgnore, False, False, wbNeverShow), // co_PA_FusionCore01 - wbByteArray(NAM3, 'Unused', 0, cpIgnore, False, False, wbNeverShow), // co_PA_FusionCore01 - wbFormIDCk(ANAM, 'Menu Art Object', [ARTO]), - wbArrayS(FNAM, 'Category', wbFormIDCk('Keyword', [KYWD])), - wbStruct(INTV, 'Data', [ - wbInteger('Created Object Count', itU16), - wbInteger('Priority', itU16) - ], cpNormal, False, nil, 1) - ]); - - wbRecord(NPC_, 'Non-Player Character (Actor)', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Unknown 10', - {0x00040000} 18, 'Compressed', - {0x00080000} 19, 'Unknown 19', - {0x20000000} 29, 'Bleedout Override' - ]), [18]), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFormIDCk(STCP, 'Unknown', [STAG]), - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Female', - {0x00000002} 'Essential', - {0x00000004} 'Is CharGen Face Preset', - {0x00000008} 'Respawn', - {0x00000010} 'Auto-calc stats', - {0x00000020} 'Unique', - {0x00000040} 'Doesn''t affect stealth meter', - {0x00000080} 'PC Level Mult', - {0x00000100} 'Unknown 8', - {0x00000200} 'Calc For Each Template', - {0x00000400} 'Unknown 10', - {0x00000800} 'Protected', - {0x00001000} 'Unknown 12', - {0x00002000} 'Unknown 13', - {0x00004000} 'Summonable', - {0x00008000} 'Unknown 15', - {0x00010000} 'Doesn''t bleed', - {0x00020000} 'Unknown 17', - {0x00040000} 'Bleedout Override', - {0x00080000} 'Opposite Gender Anims', - {0x00100000} 'Simple Actor', - {0x00200000} 'Unknown 21', - {0x00400000} 'Unknown 22', - {0x00800000} 'No Activation/Hellos', - {0x01000000} 'Diffuse Alpha Test', - {0x02000000} 'Unknown 25', - {0x04000000} 'Unknown 26', - {0x08000000} 'Unknown 27', - {0x10000000} 'Unknown 28', - {0x20000000} 'Is Ghost', - {0x40000000} 'Unknown 30', - {0x80000000} 'Invulnerable' - ])), - wbInteger('XP Value Offset', itS16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbUnion('Level', wbNPCLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, True, nil{wbActorTemplateUseStats}) - ], cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Calc min level', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Calc max level', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Disposition Base', itS16), - wbInteger('Use Template Actors', itU16, wbFlags([ - {0x0001} 'Traits', - {0x0002} 'Stats', - {0x0004} 'Factions', - {0x0008} 'Spell List', - {0x0010} 'AI Data', - {0x0020} 'AI Packages', - {0x0040} 'Model/Animation', - {0x0080} 'Base Data', - {0x0100} 'Inventory', - {0x0200} 'Script', - {0x0400} 'Def Pack List', - {0x0800} 'Attack Data', - {0x1000} 'Keywords' - ])), - wbInteger('Bleedout Override', itU16), - wbByteArray('Unknown', 2) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itS8) - ]), cpNormal, False, nil, nil, nil{wbActorTemplateUseFactions} - ), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(TPLT, 'Default Template', [LVLN, NPC_]), - wbFormIDCk(LTPT, 'Legendary Template', [LVLN, NPC_]), - wbFormIDCk(LTPC, 'Legendary Chance', [GLOB]), - wbStruct(TPTA, 'Template Actors', [ - wbFormIDCk('Traits', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate0), - wbFormIDCk('Stats', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate1), - wbFormIDCk('Factions', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate2), - wbFormIDCk('Spell List', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate3), - wbFormIDCk('AI Data', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate4), - wbFormIDCk('AI Packages', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate5), - wbFormIDCk('Model/Animation', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate6), - wbFormIDCk('Base Data', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate7), - wbFormIDCk('Inventory', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate8), - wbFormIDCk('Script', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate9), - wbFormIDCk('Def Pack List', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate10), - wbFormIDCk('Attack Data', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate11), - wbFormIDCk('Keywords', [LVLN, NPC_, NULL], False, cpNormal, False, wbActorTemplatesUseTemplate12) - ]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True, nil{wbActorTemplateUseTraits}), - wbSPCT, - wbSPLOs, - wbDEST, - wbFormIDCk(WNAM, 'Skin', [ARMO], False, cpNormal, False), - wbFormIDCk(ANAM, 'Far away model', [ARMO], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(ATKR, 'Attack Race', [RACE], False, cpNormal, False), - wbRArrayS('Attacks', wbAttackData), - wbFormIDCk(SPOR, 'Spectator Override Package List', [FLST]), - wbFormIDCk(OCOR, 'Observe Dead Body Override Package List', [FLST]), - wbFormIDCk(GWOR, 'Guard Warn Override Package List', [FLST]), - wbFormIDCk(ECOR, 'Combat Override Package List', [FLST]), - wbFormIDCk(FCPL, 'Follower Command Package List', [FLST]), - wbFormIDCk(RCLR, 'Follower Elevator Package List', [FLST]), - wbInteger(PRKZ, 'Perk Count', itU32, nil, cpBenign), - wbRArrayS('Perks', - wbStructSK(PRKR, [0], 'Perk', [ - wbFormIDCk('Perk', [PERK]), - wbInteger('Rank', itU8) - ]), cpNormal, False, nil, wbPRKRsAfterSet - ), - wbPRPS, - wbFTYP, - wbNTRM, - wbCOCT, - wbCNTOs, - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil{wbActorTemplateUseAIPackages}), - wbKSIZ, - wbKWDAs, - wbAPPR, - wbObjectTemplate, - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True), - wbFULL, - wbLString(SHRT, 'Short Name', 0, cpTranslate), - wbByteArray(DATA, 'Marker'), - wbStruct(DNAM, '', [ - wbInteger('Unknown', itU16), - wbInteger('Unknown', itU16), - wbInteger('Far Away Model Distance', itU16), - wbInteger('Geared Up Weapons', itU16) - ]), - wbRArrayS('Head Parts', wbFormIDCk(PNAM, 'Head Part', [HDPT]), cpNormal, False, nil, nil, nil{wbActorTemplateUseModelAnimation}), - wbFormIDCk(HCLF, 'Hair Color', [CLFM], False, cpNormal, False), - wbFormIDCk(BCLF, 'Facial Hair Color', [CLFM], False, cpNormal, False), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False), - wbFormIDCk(GNAM, 'Gift Filter', [FLST], False, cpNormal, False), - wbUnknown(NAM5, cpNormal, True), - wbFloat(NAM6, 'Height Min', cpNormal, True), - wbFloat(NAM7, 'Unused', cpNormal, True), - wbFloat(NAM4, 'Height Max'), - wbStruct(MWGT, 'Weight', [ - wbFloat('Thin'), - wbFloat('Muscular'), - wbFloat('Fat') - ]), - wbInteger(NAM8, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True), - wbRStruct('Actor Sounds', [ - wbInteger(CS2H, 'Count', itU32, nil, cpBenign, True), - wbRArrayS('Sounds', - wbRStructSK([0], 'Sound', [ - wbFormIDCk(CS2K, 'Keyword', [KYWD]), - wbFormIDCk(CS2D, 'Sound', [SNDR], False, cpNormal, True) - ], [], cpNormal, False, nil, True), - cpNormal, False, nil, wbNPCActorSoundsAfterSet - ), - wbEmpty(CS2E, 'End Marker', cpNormal, True), - wbByteArray(CS2F, 'Finalize', 1, cpNormal, True) - ], []), - wbFormIDCk(CSCR, 'Inherits Sounds From', [NPC_], False, cpNormal, False), - wbFormIDCk(PFRN, 'Power Armor Stand', [FURN]), - wbFormIDCk(DOFT, 'Default Outfit', [OTFT], False, cpNormal, False), - wbFormIDCk(SOFT, 'Sleeping Outfit', [OTFT], False, cpNormal, False), - wbFormIDCk(DPLT, 'Default Package List', [FLST], False, cpNormal, False), - wbFormIDCk(CRIF, 'Crime Faction', [FACT], False, cpNormal, False), - wbFormIDCk(FTST, 'Head Texture', [TXST], False, cpNormal, False), - wbStruct(QNAM, 'Texture lighting', [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0), - wbFloat('Alpha') - ]), - wbArray(MSDK, 'Morph Keys', wbInteger('Key', itU32, wbMorphValueToStr, wbHexStrToInt)), - wbArray(MSDV, 'Morph Values', wbFloat('Value')), - wbRArrayS('Face Tinting Layers', - wbRStructSK([0], 'Layer', [ - wbStructSK(TETI, [1], 'Index', [ - wbInteger('Data Type', itU16, wbEnum(['', 'Value/Color', 'Value'])), - wbInteger('Index', itU16, wbTintLayerToStr, wbStrToInt) - ]), - //wbByteArray(TEND, 'Data') - wbStruct(TEND, 'Data', [ - wbInteger('Value', itU8, wbDiv(100)), - wbByteColors('Color'), - wbInteger('Template Color Index', itS16) - ], cpNormal, True, nil, 1) - ], []) - ), - wbStruct(MRSV, 'Body Morph Region Values', [ - wbFloat('Head'), - wbFloat('Upper Torso'), - wbFloat('Arms'), - wbFloat('Lower Torso'), - wbFloat('Legs') - ]), - // reported to cause issues when sorted - wbRArrayS('Face Morphs', - wbRStructSK([0], 'Face Morph', [ - wbInteger(FMRI, 'Index', itU32, wbFaceMorphToStr, wbHexStrToInt), - //wbArray(FMRS, 'Unknown', wbFloat('Unknown')) - wbStruct(FMRS, 'Values', [ - wbFloat('Position - X'), - wbFloat('Position - Y'), - wbFloat('Position - Z'), - wbFloat('Rotation - X'), - wbFloat('Rotation - Y'), - wbFloat('Rotation - Z'), - wbFloat('Scale'), - wbByteArray('Unknown') - ]) - ], []) - ), - wbFloat(FMIN, 'Facial Morph Intensity'), - wbATTX - ], False, nil, cpNormal, False, wbNPCAfterLoad, wbNPCAfterSet); - - wbPKDTSpecificFlagsUnused := False; - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers Services', - {0x00000002} 'Unknown 2', - {0x00000004} 'Must complete', - {0x00000008} 'Maintain Speed at Goal', - {0x00000010} 'Treat As Player Follower', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Request Block Idles', - {0x00000200} 'Continue if PC Near', - {0x00000400} 'Once per day', - {0x00000800} 'Unknown 12', - {0x00001000} 'Skip Load Into Furniture', - {0x00002000} 'Preferred Speed', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Unknown 17', - {0x00020000} 'Always Sneak', - {0x00040000} 'Allow Swimming', - {0x00080000} 'Unknown 20', - {0x00100000} 'Ignore Combat', - {0x00200000} 'Weapons Unequipped', - {0x00400000} 'Unknown 23', - {0x00800000} 'Weapon Drawn', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Unknown 27', - {0x08000000} 'No Combat Alert', - {0x10000000} 'Unknown 29', - {0x20000000} 'Wear Sleep Outfit', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ], [29]); - - wbPKDTInterruptFlags := wbFlags([ - {0x0001} 'Hellos to player', - {0x0002} 'Random conversations', - {0x0004} 'Observe combat behavior', - {0x0008} 'Greet corpse behavior', - {0x0010} 'Reaction to player actions', - {0x0020} 'Friendly fire comments', - {0x0040} 'Aggro Radius Behavior', - {0x0080} 'Allow Idle Chatter', - {0x0100} 'Unknown 9', - {0x0200} 'World Interactions', - {0x0400} 'Off For Important Scene', - {0x0800} 'Unknown 12', - {0x1000} 'Unknown 13', - {0x2000} 'Unknown 14', - {0x4000} 'Unknown 15', - {0x8000} 'Unknown 16' - ]); -end; - - -procedure DefineFO4n; - - function wbTintTemplateGroups(const aName: string): IwbSubRecordArrayDef; - begin - Result := - wbRStructs(aName, 'Group', [ - wbLString(TTGP, 'Group Name', 0, cpTranslate), - wbRStructs('Options', 'Option', [ - wbStruct(TETI, 'Index', [ - wbByteArray('Unknown', 2), - wbInteger('Index', itU16) - ]), - wbLString(TTGP, 'Name', 0, cpTranslate), - wbUnknown(TTEF), - wbCTDAs, - wbRArray('Textures', wbString(TTET, 'Texture')), - wbUnknown(TTEB), - wbArray(TTEC, 'Template Colors', wbStruct('Template Color', [ - wbFormIDCk('Color', [CLFM]), - wbFloat('Alpha'), - wbInteger('Template Index', itU16), - wbByteArray('Unknown', 4) - ])), - wbFloat(TTED, 'Unknown') - ], []), - wbByteArray(TTGE, 'Group End', 4) - ], []); - end; - - function wbMorphGroups(const aName: string): IwbSubRecordArrayDef; - begin - Result := - wbRArray(aName, - wbRStruct('Morph Group', [ - wbString(MPGN, 'Name'), - wbInteger(MPPC, 'Count', itU32, nil, cpBenign), - wbRArray('Morph Presets', - wbRStruct('Morph Preset', [ - wbInteger(MPPI, 'Index', itU32, wbIntToHexStr, wbHexStrToInt), - wbLString(MPPN, 'Name', 0, cpTranslate), - wbString(MPPM, 'Unknown'), - wbFormIDCk(MPPT, 'Texture', [TXST]), - wbUnknown(MPPF) - ], []), - cpNormal, False, nil, wbMorphPresetsAfterSet - ), - wbUnknown(MPPK), - wbUnknown(MPGS) - ], []) - ); - end; - - function wbFaceMorphs(const aName: string): IwbSubRecordArrayDef; - begin - Result := - wbRArray(aName, - wbRStruct('Face Morph', [ - wbInteger(FMRI, 'Index', itU32, wbIntToHexStr, wbHexStrToInt), - wbLString(FMRN, 'Name') - ], []) - ); - end; - -begin - wbUNAMs := wbRArray('Data Inputs', wbRStruct('Data Input', [ - wbInteger(UNAM, 'Index', itS8), - wbString(BNAM, 'Name'), - wbInteger(PNAM, 'Flags', itU32, wbFlags([ - 'Public' - ])) - ], [])); - - wbRecord(PACK, 'Package', [ - wbEDID, - wbVMADFragmentedPACK, - - wbStruct(PKDT, 'Pack Data', [ - wbInteger('General Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbEnum ([], [ - 18, 'Package', - 19, 'Package Template' - ])), - wbInteger('Interrupt Override', itU8, wbEnum([ - {0} 'None', - {1} 'Spectator', - {2} 'ObserveDead', - {3} 'GuardWarn', - {4} 'Combat', - {5} 'Command Travel', - {6} 'Command Activate', - {7} 'Leave Workstation' - ])), - wbInteger('Preferred Speed', itU8, wbEnum([ - 'Walk', - 'Jog', - 'Run', - 'Fast Walk' - ])), - wbByteArray('Unknown', 1), - wbInteger('Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbByteArray('Unknown', 2) - ], cpNormal, True), - - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Weekdays', - 'Weekends', - 'Monday, Wednesday, Friday', - 'Tuesday, Thursday' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Hour', itS8), - wbInteger('Minute', itS8), - wbByteArray('Unused', 3, cpIgnore), - wbInteger('Duration (minutes)', itS32) - ], cpNormal, True), - - wbCTDAs, - - wbRStruct('Idle Animations', [ - wbInteger(IDLF, 'Flags', itU8, wbEnum([], [ - 0, 'Unknown', - 8, 'Random', - 9, 'Run in Sequence', - 12, 'Random, Do Once', - 13, 'Run in Sequence, Do Once' - ]), cpNormal, True), - wbInteger(IDLC, 'Animation Count', itU8, nil, cpBenign), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, True), - wbByteArray(IDLB, 'Unknown', 4, cpIgnore) - ], [], cpNormal, False, nil, False, nil {cannot be totally removed , wbAnimationsAfterSet}), - - wbFormIDCk(CNAM, 'Combat Style', [CSTY]), - wbFormIDCk(QNAM, 'Owner Quest', [QUST]), - wbStruct(PKCU, 'Counter', [ - wbInteger('Data Input Count', itU32), - wbFormIDCk('Package Template', [PACK, NULL]), - wbInteger('Version Counter (autoincremented)', itU32) - ], cpNormal, True), - - wbRStruct('Package Data', [ - wbRArray('Data Input Values', wbRStruct('Value', [ - wbString(ANAM, 'Type'), - wbUnion(CNAM, 'Value', wbPubPackCNAMDecider, [ - {0} wbByteArray('Unknown'), - {1} wbInteger('Bool', itU8, wbBoolEnum), - {2} wbInteger('Integer', itU32), - {3} wbFloat('Float') - ]), - wbUnknown(BNAM), - wbPDTOs, - wbPLDT, - wbStruct(PTDA, 'Target', [wbTargetData]), - wbUnknown(TPIC) - ], [], cpNormal, False)), - wbUNAMs - ], []), - wbByteArray(XNAM, 'Marker'), - - wbRStruct('Procedure Tree', [ - wbRArray('Branches', wbRStruct('Branch', [ - wbString(ANAM, 'Branch Type'), - wbCITC, - wbCTDAsCount, - wbStruct(PRCB, 'Root', [ - wbInteger('Branch Count', itU32), - wbInteger('Flags', itU32, wbFlags([ - 'Repeat when Complete', - 'Unknown 1' - ])) - ]), - wbString(PNAM, 'Procedure Type'), - wbInteger(FNAM, 'Flags', itU32, wbFlags(['Success Completes Package'])), - wbRArray('Data Input Indexes', wbInteger(PKC2, 'Index', itU8)), - {>>> PFO2 should be single, there is only 1 PACK [00095F46] in Skyrim.esm with 2xPFO2 <<<} - wbRArray('Flags Override', - wbStruct(PFO2, 'Data', [ - wbInteger('Set General Flags', itU32, wbPKDTFlags), - wbInteger('Clear General Flags', itU32, wbPKDTFlags), - wbInteger('Set Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbInteger('Clear Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbInteger('Preferred Speed Override', itU8, wbEnum([ - 'Walk', - 'Jog', - 'Run', - 'Fast Walk' - ])), - wbByteArray('Unknown', 3) - ]) - ), - wbRArray('Unknown', wbUnknown(PFOR), cpIgnore) - ], [], cpNormal, False, nil, False, nil, wbConditionsAfterSet)) - ], []), - wbUNAMs, - wbRStruct('OnBegin', [ - wbEmpty(POBA, 'OnBegin Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbPDTOs - ], []), - wbRStruct('OnEnd', [ - wbEmpty(POEA, 'OnEnd Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbPDTOs - ], []), - wbRStruct('OnChange', [ - wbEmpty(POCA, 'OnChange Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbPDTOs - ], []) - ], False, nil, cpNormal, False, nil {wbPACKAfterLoad}); - - wbQUSTAliasFlags := - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Reserves Location/Reference', - {0x00000002} 'Optional', - {0x00000004} 'Quest Object', - {0x00000008} 'Allow Reuse in Quest', - {0x00000010} 'Allow Dead', - {0x00000020} 'Matching Ref - In Loaded Area', - {0x00000040} 'Essential', - {0x00000080} 'Allow Disabled', - {0x00000100} 'Stores Text', - {0x00000200} 'Allow Reserved', - {0x00000400} 'Protected', - {0x00000800} 'Forced by Aliases', - {0x00001000} 'Allow Destroyed', - {0x00002000} 'Matching Ref - Closest', - {0x00004000} 'Uses Stored Text', - {0x00008000} 'Initially Disabled', - {0x00010000} 'Allow Cleared', - {0x00020000} 'Clear Names When Removed', - {0x00040000} 'Matching Ref - Actors Only', - {0x00080000} 'Create Ref - Temp', - {0x00100000} 'External Alias - Linked', - {0x00200000} 'No Pickpocket', - {0x00400000} 'Can Apply Data To Non-Aliased Refs', - {0x00800000} 'Is Companion', - {0x01000000} 'Optional All Scenes' - ])); - - wbRecord(QUST, 'Quest', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00004000} 14, 'Partial Form' // Allows the Record to inherit some subrecords from its master - ])), [ - wbEDID, - wbVMADFragmentedQUST, - wbFULL, - wbStruct(DNAM, 'General', [ - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Start Game Enabled', - {0x0002} 'Unknown 2', - {0x0004} 'Add Idle Topic To Hello', - {0x0008} 'Allow repeated stages', - {0x0010} 'Unknown 5', - {0x0020} 'Unknown 6', - {0x0040} 'Unknown 7', - {0x0080} 'Unknown 8', - {0x0100} 'Run Once', - {0x0200} 'Exclude from dialogue export', - {0x0400} 'Warn on alias fill failure', - {0x0800} 'Unknown 12', - {0x1000} 'Unknown 13' - ])), - wbInteger('Priority', itU8), - wbInteger('Form Version', itU8, nil, cpIgnore), - wbByteArray('Unknown', 4), - wbInteger('Type', itU32, wbEnum([ - {0} 'None', - {1} 'Main Quest', - {2} 'Brotherhood of Steel', - {3} 'Institute', - {4} 'Minutemen', - {5} 'Railroad', - {6} 'Miscellaneous', - {7} 'Side Quests', - {8} 'DLC01', - {9} 'DLC02', - {10} 'DLC03', - {11} 'DLC04', - {12} 'DLC05', - {13} 'DLC06', - {14} 'DLC07' - ])) - ]), - wbString(ENAM, 'Event', 4), - wbFormIDCk(LNAM, 'Location', [LCTN]), - wbFormIDCk(XNAM, 'Quest Completion XP', [GLOB]), - wbRArray('Text Display Globals', wbFormIDCk(QTGL, 'Global', [GLOB])), - wbFLTR, - wbRStruct('Quest Dialogue Conditions', [wbCTDAs], [], cpNormal, False), - wbEmpty(NEXT, 'Marker'), - wbCTDAs, {>>> Unknown, doesn't show up in CK <<<} - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbStructSK(INDX, [0], 'Stage Index', [ - wbInteger('Stage Index', itU16), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Unknown 1', - {0x02} 'Run On Start', - {0x04} 'Run On Stop', - {0x08} 'Keep Instance Data From Here On' - ])), - wbInteger('Unknown', itU8) - ]), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete Quest', - {0x02} 'Fail Quest' - ])), - wbCTDAs, - wbString(NAM2, 'Note'), - wbLString(CNAM, 'Log Entry', 0, cpTranslate), - wbFormIDCk(NAM0, 'Next Quest', [QUST]) - ], [])) - ], [])), - wbRArray('Objectives', wbRStruct('Objective', [ - wbInteger(QOBJ, 'Objective Index', itU16), - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x01} 'ORed With Previous', - {0x02} 'No Stats Tracking' - ])), - wbLString(NNAM, 'Display Text', 0, cpTranslate, True), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbInteger('Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbInteger('Flags', itU32, wbFlags([ - {0x01} 'Compass Marker Ignores Locks', - {0x02} 'Hostile', - {0x04} 'Use Straight Line Pathing' - ])), - wbFormIDCk('Keyword', [KYWD, NULL]) - ]), - wbCTDAs - ], [])) - ], [])), - - wbByteArray(ANAM, 'Aliases Marker', 4), - - wbRArray('Aliases', - wbRUnion('Alias', [ - - // Reference Alias - wbRStruct('Alias', [ - wbInteger(ALST, 'Reference Alias ID', itU32), - wbString(ALID, 'Alias Name'), - wbQUSTAliasFlags, - wbInteger(ALFI, 'Force Into Alias When Filled', itS32, wbQuestAliasToStr, wbStrToAlias), - //wbFormIDCk(ALFL, 'Specific Location', [LCTN]), - wbFormID(ALFR, 'Forced Reference'), - wbFormIDCk(ALUA, 'Unique Actor', [NPC_]), - wbRStruct('Location Alias Reference', [ - wbInteger(ALFA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(KNAM, 'Keyword', [KYWD]), - wbFormIDCk(ALRT, 'Ref Type', [LCRT]) - ], []), - wbRStruct('External Alias Reference', [ - wbFormIDCk(ALEQ, 'Quest', [QUST]), - wbInteger(ALEA, 'Alias', itS32, wbQuestExternalAliasToStr, wbStrToAlias) - ], []), - wbRStruct('Create Reference to Object', [ - wbFormID(ALCO, 'Object'), - wbStruct(ALCA, 'Alias', [ - wbInteger('Alias', itS16, wbQuestAliasToStr, wbStrToAlias), - wbInteger('Create', itU16, wbEnum([] ,[ - $0000, 'At', - $8000, 'In' - ])) - ]), - wbInteger(ALCL, 'Level', itU32, wbEnum([ - 'Easy', - 'Medium', - 'Hard', - 'Very Hard', - 'None' - ])) - ], []), - wbRStruct('Find Matching Reference Near Alias', [ - wbInteger(ALNA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbInteger(ALNT, 'Type', itU32, wbEnum([ - 'Linked From', - 'Linked Ref' - ])) - ], []), - wbRStruct('Find Matching Reference From Event', [ - wbString(ALFE, 'From Event', 4), - wbByteArray(ALFD, 'Event Data') - ], []), - wbInteger(ALCC, 'Closest To Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbCTDAs, - wbKSIZ, - wbKWDAs, - wbCOCT, - wbCNTOs, - wbFormIDCk(SPOR, 'Spectator override package list', [FLST], False, cpNormal, False), - wbFormIDCk(OCOR, 'Observe dead body override package list', [FLST], False, cpNormal, False), - wbFormIDCk(GWOR, 'Guard warn override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ECOR, 'Combat override package list', [FLST], False, cpNormal, False), - wbArray(ALLA, 'Linked Aliases', wbStruct('Linked Alias', [ - wbFormIDCk('Keyword', [KYWD, NULL]), - wbInteger('Alias', itS32, wbQuestAliasToStr, wbStrToAlias) - ])), - wbFormIDCk(ALDN, 'Display Name', [MESG]), - wbFormIDCk(ALFV, 'Forced Voice', [VTYP]), - wbFormIDCk(ALDI, 'Death Item', [LVLI]), - wbRArrayS('Alias Spells', wbFormIDCk(ALSP, 'Spell', [SPEL])), - wbRArrayS('Alias Factions', wbFormIDCk(ALFC, 'Faction', [FACT])), - wbRArray('Alias Package Data', wbFormIDCk(ALPC, 'Package', [PACK])), - wbFormIDCk(VTCK, 'Voice Types', [NPC_, FACT, FLST, VTYP, NULL]), - wbEmpty(ALED, 'Alias End', cpNormal, True) - ], [], cpNormal, False, nil, False, nil, wbContainerAfterSet), - - // Location Alias - wbRStruct('Alias', [ - wbInteger(ALLS, 'Location Alias ID', itU32), - wbString(ALID, 'Alias Name'), - wbQUSTAliasFlags, - wbInteger(ALFI, 'Force Into Alias When Filled', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(ALFL, 'Specific Location', [LCTN]), - wbRStruct('Reference Alias Location', [ - wbInteger(ALFA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(KNAM, 'Keyword', [KYWD]) - ], []), - wbRStruct('External Alias Location', [ - wbFormIDCk(ALEQ, 'Quest', [QUST]), - wbInteger(ALEA, 'Alias', itS32, wbQuestExternalAliasToStr, wbStrToAlias) - ], []), - wbRStruct('Find Matching Location From Event', [ - wbString(ALFE, 'From Event', 4), - wbByteArray(ALFD, 'Event Data') - ], []), - wbCTDAs, - wbInteger(ALCC, 'Closest To Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbEmpty(ALED, 'Alias End', cpNormal, True) - ], []), - - // Ref Collection Alias - wbRStruct('Alias', [ - wbInteger(ALCS, 'Collection Alias ID', itU32), - wbInteger(ALMI, 'Max Initial Fill Count', itU8) - ], []) - - ], []) - ), - - wbString(NNAM, 'Description', 0, cpTranslate, False), - wbFormIDCk(GNAM, 'Quest Group', [KYWD]), - wbString(SNAM, 'SWF File') - ]); - - wbBodyPartIndexEnum := wbEnum([ - 'Body Texture' - ]); - - wbPhonemeTargets := wbStruct(PHWT, 'Phoneme Target Weight', [ - wbFloat('Aah / LipBigAah'), - wbFloat('BigAah / LipDST'), - wbFloat('BMP / LipEee'), - wbFloat('ChJsh / LipFV'), - wbFloat('DST / LipK'), - wbFloat('Eee / LipL'), - wbFloat('Eh / LipR'), - wbFloat('FV / LipTh'), - wbFloat('I'), - wbFloat('K'), - wbFloat('N'), - wbFloat('Oh'), - wbFloat('OohQ'), - wbFloat('R'), - wbFloat('TH'), - wbFloat('W'), - wbUnknown - ], cpNormal, False, nil, 1); // only a single value in HandyRace - - wbPHWT := wbRStruct('FaceFX Phonemes', [ - wbRStruct('IY', [wbPhonemeTargets], []), - wbRStruct('IH', [wbPhonemeTargets], []), - wbRStruct('EH', [wbPhonemeTargets], []), - wbRStruct('EY', [wbPhonemeTargets], []), - wbRStruct('AE', [wbPhonemeTargets], []), - wbRStruct('AA', [wbPhonemeTargets], []), - wbRStruct('AW', [wbPhonemeTargets], []), - wbRStruct('AY', [wbPhonemeTargets], []), - wbRStruct('AH', [wbPhonemeTargets], []), - wbRStruct('AO', [wbPhonemeTargets], []), - wbRStruct('OY', [wbPhonemeTargets], []), - wbRStruct('OW', [wbPhonemeTargets], []), - wbRStruct('UH', [wbPhonemeTargets], []), - wbRStruct('UW', [wbPhonemeTargets], []), - wbRStruct('ER', [wbPhonemeTargets], []), - wbRStruct('AX', [wbPhonemeTargets], []), - wbRStruct('S', [wbPhonemeTargets], []), - wbRStruct('SH', [wbPhonemeTargets], []), - wbRStruct('Z', [wbPhonemeTargets], []), - wbRStruct('ZH', [wbPhonemeTargets], []), - wbRStruct('F', [wbPhonemeTargets], []), - wbRStruct('TH', [wbPhonemeTargets], []), - wbRStruct('V', [wbPhonemeTargets], []), - wbRStruct('DH', [wbPhonemeTargets], []), - wbRStruct('M', [wbPhonemeTargets], []), - wbRStruct('N', [wbPhonemeTargets], []), - wbRStruct('NG', [wbPhonemeTargets], []), - wbRStruct('L', [wbPhonemeTargets], []), - wbRStruct('R', [wbPhonemeTargets], []), - wbRStruct('W', [wbPhonemeTargets], []), - wbRStruct('Y', [wbPhonemeTargets], []), - wbRStruct('HH', [wbPhonemeTargets], []), - wbRStruct('B', [wbPhonemeTargets], []), - wbRStruct('D', [wbPhonemeTargets], []), - wbRStruct('JH', [wbPhonemeTargets], []), - wbRStruct('G', [wbPhonemeTargets], []), - wbRStruct('P', [wbPhonemeTargets], []), - wbRStruct('T', [wbPhonemeTargets], []), - wbRStruct('K', [wbPhonemeTargets], []), - wbRStruct('CH', [wbPhonemeTargets], []), - wbRStruct('SIL', [wbPhonemeTargets], []), - wbRStruct('SHOTSIL', [wbPhonemeTargets], []), - wbRStruct('FLAP', [wbPhonemeTargets], []) - ], []); - - wbHeadPart := wbRStructSK([0], 'Head Part', [ - wbInteger(INDX, 'Head Part Number', itU32), - wbFormIDCk(HEAD, 'Head', [HDPT, NULL]) - ], []); - - wbRaceRBPC := - wbArray(RBPC, 'Biped Object Conditions', - wbUnion('Slot 30+', wbFormVer78Decider, [ - wbInteger('Slot 30+', itU32), - wbFormIDCk('Slot 30+', [AVIF, NULL]) - ]) - ); - // since version 78: array of pair of AVIF FormID, before array of AVIF index. Similar to DamageType (and MGEF also somehow). - {wbUnion(RBPC, 'Biped Object Conditions', wbFormVer78Decider, [ - wbArray('Biped Object Conditions', wbInteger('Condition AV', itU32)), - wbArray('Biped Object Conditions', wbStruct('Condition AV', [ - wbFormIDck('AVIF 1', [AVIF, NULL]), - wbFormIDck('AVIF 2', [AVIF, NULL]) - ])) - ]);} - - wbRecord(RACE, 'Race', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Unknown 19' - ])), [ - wbEDID, - wbFormIDCk(STCP, 'Sound', [STAG]), - wbFULL, - wbDESCReq, - wbSPCT, - wbSPLOs, - wbFormIDCk(WNAM, 'Skin', [ARMO, NULL]), - wbBOD2, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbAPPR, - wbStruct(DATA, 'Data', [ - wbFloat('Male Height'), - wbFloat('Female Height'), - wbStruct('Male Default Weight', [ - wbFloat('Thin'), - wbFloat('Muscular'), - wbFloat('Fat') - ]), - wbStruct('Female Default Weight', [ - wbFloat('Thin'), - wbFloat('Muscular'), - wbFloat('Fat') - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Playable', - {0x00000002} 'FaceGen Head', - {0x00000004} 'Child', - {0x00000008} 'Tilt Front/Back', - {0x00000010} 'Tilt Left/Right', - {0x00000020} 'No Shadow', - {0x00000040} 'Swims', - {0x00000080} 'Flies', - {0x00000100} 'Walks', - {0x00000200} 'Immobile', - {0x00000400} 'Not Pushable', - {0x00000800} 'No Combat In Water', - {0x00001000} 'No Rotating to Head-Track', - {0x00002000} 'Don''t Show Blood Spray', - {0x00004000} 'Don''t Show Blood Decal', - {0x00008000} 'Uses Head Track Anims', - {0x00010000} 'Spells Align w/Magic Node', - {0x00020000} 'Use World Raycasts For FootIK', - {0x00040000} 'Allow Ragdoll Collision', - {0x00080000} 'Regen HP In Combat', - {0x00100000} 'Can''t Open Doors', - {0x00200000} 'Allow PC Dialogue', - {0x00400000} 'No Knockdowns', - {0x00800000} 'Allow Pickpocket', - {0x01000000} 'Always Use Proxy Controller', - {0x02000000} 'Don''t Show Weapon Blood', - {0x04000000} 'Overlay Head Part List', {>>>Only one can be active<<<} - {0x08000000} 'Override Head Part List', {>>>Only one can be active<<<} - {0x10000000} 'Can Pickup Items', - {0x20000000} 'Allow Multiple Membrane Shaders', - {0x40000000} 'Can Dual Wield', - {0x80000000} 'Avoids Roads' - ])), - wbFloat('Acceleration Rate'), - wbFloat('Deceleration Rate'), - wbInteger('Size', itU32, wbEnum([ - 'Small', - 'Medium', - 'Large', - 'Extra Large' - ])), - wbByteArray('Unknown', 8), - wbFloat('Injured Health Pct'), - wbInteger('Shield Biped Object', itS32, wbBipedObjectEnum), - wbInteger('Beard Biped Object', itS32, wbBipedObjectEnum), - wbInteger('Body Biped Object', itS32, wbBipedObjectEnum), - wbFloat('Aim Angle Tolerance'), - wbFloat('Flight Radius'), - wbFloat('Angular Acceleration Rate'), - wbFloat('Angular Tolerance'), - wbInteger('Flags 2', itU32, wbFlags([ - {0x00000001} 'Use Advanced Avoidance', - {0x00000002} 'Non-Hostile', - {0x00000004} 'Floats', - {0x00000008} 'Unknown 3', - {0x00000010} 'Unknown 4', - {0x00000020} 'Head Axis Bit 0', - {0x00000040} 'Head Axis Bit 1', - {0x00000080} 'Can Melee When Knocked Down', - {0x00000100} 'Use Idle Chatter During Combat', - {0x00000200} 'Ungendered', - {0x00000400} 'Can Move When Knocked Down', - {0x00000800} 'Use Large Actor Pathing', - {0x00001000} 'Use Subsegmented Damage', - {0x00002000} 'Flight - Defer Kill', - {0x00004000} 'Unknown 14', - {0x00008000} 'Flight - Allow Procedural Crash Land', - {0x00010000} 'Disable Weapon Culling', - {0x00020000} 'Use Optimal Speeds', - {0x00040000} 'Has Facial Rig', - {0x00080000} 'Can Use Crippled Limbs', - {0x00100000} 'Use Quadruped Controller', - {0x00200000} 'Low Priority Pushable', - {0x00400000} 'Cannot Use Playable Items' - ])), - wbByteArray('Unknown', 36), - wbInteger('Pipboy Biped Object', itS32, wbBipedObjectEnum), - wbInteger('XP Value', itS16), - wbFloat('Severable - Debris Scale'), - wbInteger('Severable - Debris Count', itU8), - wbInteger('Severable - Decal Count', itU8), - wbFloat('Explodable - Debris Scale'), - wbInteger('Explodable - Debris Count', itU8), - wbInteger('Explodable - Decal Count', itU8), - wbFormIDCk('Severable - Explosion', [EXPL, NULL]), - wbFormIDCk('Severable - Debris', [DEBR, NULL]), - wbFormIDCk('Severable - Impact DataSet', [IPDS, NULL]), - wbFormIDCk('Explodable - Explosion', [EXPL, NULL]), - wbFormIDCk('Explodable - Debris', [DEBR, NULL]), - wbFormIDCk('Explodable - Impact DataSet', [IPDS, NULL]), - wbFloat('OnCripple - Debris Scale'), - wbInteger('OnCripple - Debris Count', itU8), - wbInteger('OnCripple - Decal Count', itU8), - wbFormIDCk('OnCripple - Explosion', [EXPL, NULL]), - wbFormIDCk('OnCripple - Debris', [DEBR, NULL]), - wbFormIDCk('OnCripple - Impact DataSet', [IPDS, NULL]), - wbFormIDCk('Explodable - Subsegment Explosion', [EXPL, NULL]), - wbFloat('Orientation Limits - Pitch'), - wbFloat('Orientation Limits - Roll') - ], cpNormal, True), - - wbEmpty(MNAM, 'Male Marker'), - wbString(ANAM, 'Male Skeletal Model'), - wbMODT, - wbEmpty(FNAM, 'Female Marker'), - wbString(ANAM, 'Female Skeletal Model'), - wbMODT, - wbEmpty(NAM2, 'Marker NAM2 #1'), - wbRArrayS('Movement Type Names', wbString(MTNM, 'Name')), - wbArray(VTCK, 'Voices', wbFormIDCk('Voice', [VTYP]), ['Male', 'Female'], cpNormal, True), - //wbArray(DNAM, 'Decapitate Armors', wbFormIDCk('Decapitate Armor', [NULL, ARMO]), ['Male', 'Female'], cpNormal, False), - wbArray(HCLF, 'Default Hair Colors', wbFormIDCk('Default Hair Color', [NULL, CLFM]), ['Male', 'Female'], cpNormal, False), - wbInteger(TINL, 'Total Number of Tints in List', itU16, nil, nil, cpNormal, False), {>>> Needs Count Updated <<<} - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - - wbFormIDCk(ATKR, 'Attack Race', [RACE], False, cpNormal, False), - wbRArrayS('Attacks', wbAttackData), - - wbRStruct('Body Data', [ - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbMODL - ], []), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbMODL - ], []), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbFormIDCk(GNAM, 'Body Part Data', [BPTD]), - - wbEmpty(NAM2, 'Marker NAM2 #2', cpNormal), - wbEmpty(NAM3, 'Marker NAM3 #3', cpNormal, True), - wbRStruct('Male Behavior Graph', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbMODL - ], [], cpNormal, True), - wbRStruct('Female Behavior Graph', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbMODL - ], [], cpNormal, True), - - wbFormIDCk(NAM4, 'Impact Material Type', [MATT]), - wbFormIDCk(NAM5, 'Impact Data Set', [IPDS]), - wbFormIDCk(NAM7, 'Dismember Blood Art', [ARTO]), - wbFormIDCk(CNAM, 'Meat Cap TextureSet', [TXST]), - wbFormIDCk(NAM2, 'Collar TextureSet', [TXST]), - wbFormIDCk(ONAM, 'Sound - Open Corpse', [SNDR]), - wbFormIDCk(LNAM, 'Sound - Close Corpse', [SNDR]), - wbRArray('Biped Object Names', wbString(NAME, 'Name')), - wbRaceRBPC, - wbRArrayS('Movement Data Overrides', wbRStructSK([0], 'Override', [ - wbFormIDCk(MTYP, 'Movement Type', [MOVT]), - wbSPED - ], [])), - wbInteger(VNAM, 'Equipment Flags', itU32, wbEquipType), - wbRArray('Equip Slots', - wbRStruct('Equip Slot', [ - wbFormIDCk(QNAM, 'Equip Slot', [EQUP]), - wbString(ZNAM, 'Node') - ], []) - ), - wbFormIDCk(UNWP, 'Unarmed Weapon', [WEAP]), - - wbRArray('Phoneme Target Names', wbString(PHTN, 'Name')), - wbPHWT, - - wbFormIDCk(WKMV, 'Base Movement Defaults - Default', [MOVT]), - wbFormIDCk(SWMV, 'Base Movement Defaults - Swim', [MOVT]), - wbFormIDCk(FLMV, 'Base Movement Defaults - Fly', [MOVT]), - wbFormIDCk(SNMV, 'Base Movement Defaults - Sneak', [MOVT]), - - // Male head - wbEmpty(NAM0, 'Head Data Marker'), - wbEmpty(MNAM, 'Male Data Marker'), - wbStruct(NNAM, 'Male Neck Fat Adjustments Scale', [ - wbByteArray('Unknown', 4), - wbFloat('X'), - wbFloat('Y') - ]), - wbRArrayS('Male Head Parts', wbHeadPart), - wbRArray('Male Race Presets', wbFormIDCk(RPRM, 'Preset NPC', [NPC_, NULL])), - wbRArray('Male Hair Colors', wbFormIDCk(AHCM, 'Hair Color', [CLFM, NULL])), - wbRArrayS('Male Face Details', wbFormIDCk(FTSM, 'Texture Set', [TXST, NULL])), - wbFormIDCk(DFTM, 'Male Default Face Texture', [TXST]), - wbTintTemplateGroups('Male Tint Layers'), - wbMorphGroups('Male Morph Groups'), - wbFaceMorphs('Male Face Morphs'), - wbString(WMAP, 'Male Wrinkle Map Path'), - - // Female head - wbEmpty(NAM0, 'Head Data Marker'), - wbEmpty(FNAM, 'Female Data Marker'), - wbStruct(NNAM, 'Female Neck Fat Adjustments Scale', [ - wbByteArray('Unknown', 4), - wbFloat('X'), - wbFloat('Y') - ]), - wbRArrayS('Female Head Parts', wbHeadPart), - wbRArray('Female Race Presets', wbFormIDCk(RPRF, 'Preset NPC', [NPC_, NULL])), - wbRArray('Female Hair Colors', wbFormIDCk(AHCF, 'Hair Color', [CLFM, NULL])), - wbRArrayS('Female Face Details', wbFormIDCk(FTSF, 'Texture Set', [TXST, NULL])), - wbFormIDCk(DFTF, 'Female Default Face Texture', [TXST]), - wbTintTemplateGroups('Female Tint Layers'), - wbMorphGroups('Female Morph Groups'), - wbFaceMorphs('Female Face Morphs'), - wbString(WMAP, 'Female Wrinkle Map Path'), - - wbFormIDCk(NAM8, 'Morph Race', [RACE]), - wbFormIDCk(RNAM, 'Armor Race', [RACE]), - wbFormIDCk(SRAC, 'Subgraph Template Race', [RACE]), - wbFormIDCk(SADD, 'Subgraph Additive Race', [RACE]), - wbRArray('Subgraph Data', - wbRStruct('Data', [ - wbString(SGNM, 'Behaviour Graph'), - wbRArray('Actor Keywords', wbFormIDCk(SAKD, 'Keyword', [KYWD])), - wbRArray('Target Keywords', wbFormIDCk(STKD, 'Keyword', [KYWD])), - wbRArray('Animation Paths', wbString(SAPT, 'Path'), cpNormal, True), - // Values greater than $10000 sets a bool. Reading this "closes" the current record. - wbStruct(SRAF, 'Flags', [ - wbInteger('Role', itU16, wbEnum([ - {0} 'MT', - {1} 'Weapon', - {2} 'Furniture', - {3} 'Idle', - {4} 'Pipboy' - ])), - wbInteger('Perspective', itU16, wbEnum([ - '3rd', - '1st' - ])) - ], cpNormal, True) - ], [], cpNormal, False, nil, True) - ), - wbFloat(PTOP, 'Idle Chatter Time Min'), - wbFloat(NTOP, 'Idle Chatter Time Max'), - wbRArray('Morph Values', - wbRStruct('Value', [ - wbInteger(MSID, 'Index', itU32, wbIntToHexStr, wbHexStrToInt), - wbString(MSM0, 'Min Name'), - wbString(MSM1, 'Max Name') - ], []) - ), - wbUnknown(MLSI), - wbString(HNAM, 'Hair Color Lookup Texture'), - wbString(HLTX, 'Hair Color Extended Lookup Texture'), - wbFormIDCk(QSTI, 'Dialogue Quest', [QUST]), - wbBSMPSequence - ], False, nil, cpNormal, False, nil, wbRACEAfterSet); - - - wbRecord(REFR, 'Placed Object', wbFormaterUnion(wbREFRRecordFlagsDecider, [ - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Ground Piece', - {0x00000100} 8, 'LOD Respects Enable State', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x40000000} 30, 'Ground', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ACTI STAT SCOL TREE} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Ground Piece', - {0x00000100} 8, 'LOD Respects Enable State', - {0x00000200} 9, 'Hidden From Local Map', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00008000} 15, 'Visible when distant', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {CONT TERM} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Ground Piece', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x02000000} 25, 'No AI Acquire', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'Ground', - {0x80000000} 31, 'Multibound' - ], True, True)), - {DOOR} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Minimal Use Door', - {0x00000040} 6, 'Hidden From Local Map', - {0x00000100} 8, 'Inaccessible', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {LIGH} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000100} 8, 'Doesn''t Light Water', - {0x00000200} 9, 'Casts Shadows', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Never Fades', - {0x00020000} 17, 'Doesn''t Light Landscape', - {0x02000000} 25, 'No AI Acquire', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {MSTT} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Ground Piece', - {0x00000200} 9, 'Motion Blur', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ADDN} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ALCH BOOK SCRL AMMO ARMO INGR KEYM MISC FURN WEAP} - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000010} 4, 'Ground Piece', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x02000000} 25, 'No AI Acquire', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)) - ]), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Base', sigBaseObjects, False, cpNormal, True), - - {--- Bound Contents ---} - {--- Bound Data ---} - wbStruct(XMBO, 'Bound Half Extents', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - - {--- Primitive ---} - wbStruct(XPRM, 'Primitive', [ - wbStruct('Bounds', [ - wbFloat('X', cpNormal, True, 2, 4), - wbFloat('Y', cpNormal, True, 2, 4), - wbFloat('Z', cpNormal, True, 2, 4) - ]), - wbFloatColors('Color'), - wbFloat('Unknown'), - wbInteger('Type', itU32, wbEnum([ - 'None', - 'Box', - 'Sphere', - 'Plane', - 'Line', - 'Ellipsoid' - ])) - ]), - - wbArray(XPOD, 'Portal Data', wbStruct('References', [ - wbFormIDCk('Origin', [REFR, NULL]), - wbFormIDCk('Destination', [REFR, NULL]) - ])), - - wbUnknown(XORD), - - wbStruct(XOCP, 'Occlusion Plane Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - - wbRStruct('Bound Data', [ - wbStruct(XRMR, 'Header', [ - wbInteger('Linked Rooms Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Unknown 1', - 'Unknown 2', - 'Unknown 3', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Has Image Space', - 'Has Lighting Template' - ])), - wbByteArray('Unknown', 2) - ]), - wbFormIDCk(LNAM, 'Lighting Template', [LGTM]), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbRArrayS('Linked Rooms', - wbFormIDCk(XLRM, 'Linked Room', [REFR]) - ) - ], []), - wbEmpty(XMBP, 'MultiBound Primitive Marker', cpIgnore), - - {--- Ragdoll ---} - wbXRGD, - wbXRGB, - - wbFloat(XRDS, 'Radius'), - wbXSCL, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - wbStruct(XLIG, 'Light Data', [ - wbFloat('FOV 90+/-'), - wbFloat('Fade 1.0+/-'), - wbFloat('End Distance Cap'), - wbFloat('Shadow Depth Bias'), - wbFloat('Near Clip'), - wbFloat('Volumetric Intensity') - ], cpNormal, False, nil, 4), - wbStruct(XALP, 'Alpha', [ - wbInteger('Cutoff', itU8), - wbInteger('Base', itU8) - ]), - - {--- Teleport ---} - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot, - wbInteger('Flags', itU32, wbFlags([ - 'No Alarm', - 'No Load Screen', - 'Relative Position' - ])), - wbFormIDCk('Transition Interior', [CELL, NULL]) - ]), - wbFormIDCk(XTNM, 'Teleport Loc Name', [MESG]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - {--- Placed Water ---} - wbUnknown(XWCN), - wbStruct(XWCU, 'Water Velocity', [ - wbFloat('X Offset'), - wbFloat('Y Offset'), - wbFloat('Z Offset'), - wbByteArray('Unknown', 4), - wbFloat('X Angle'), - wbFloat('Y Angle'), - wbFloat('Z Angle'), - wbByteArray('Unknown', 0) - ]), - - wbFormIDCk(XASP, 'Acoustic Restriction', [REFR]), - wbEmpty(XATP, 'Activation Point'), - wbInteger(XAMC, 'Ammo Count', itU32), - wbEmpty(XLKT, 'Linked Ref Transient'), - wbFormIDCk(XLYR, 'Layer', [LAYR]), - wbFormIDCk(XMSP, 'Material Swap', [MSWP]), - wbFormIDCk(XRFG, 'Reference Group', [RFGP]), - wbStruct(XRDO, 'Radio', [ - wbFloat('Frequency'), - wbFloat('Min Weak Distance'), - wbFloat('Max Weak Distance'), - wbInteger('Flags', itU32, wbFlags(['Ignores Distance Checks'])) - ]), - wbStruct(XBSD, 'Spline', [ - wbFloat('Slack'), - wbFloat('Thickness'), - wbFloat('Unknown'), // not shown in editor - wbFloat('Unknown'), // not shown in editor - wbFloat('Unknown'), // not shown in editor - wbInteger('Wind - Detached End', itU8, wbBoolEnum), - wbByteArray('Unused', 0) // junk data? - ], cpNormal, False, nil, 5), - wbStruct(XPDD, 'Projected Decal', [ - wbFloat('Width Scale'), - wbFloat('Height Scale') - // "Uses Box Primitive" checkbox does the following: - // 1. "Rounds" above floats (probably due to floating point precision) [DIRTY EDITS?] - // 2. "Rounds" DATA\Position floats (probably due to floating point precision) [DIRTY EDITS?] - // 3. Creates an XPRM subrecord (this is the "Primitive" tab in the editor) - // 4. Fills out Primitive data: - // 4a. Primitive type: Box - // 4b. Collision layer: XTRI subrecord = 15 - // 4c. Bounds (XYZ): 256.0, 215.0, 256.0 - // 4d. Color (RGB): 0, 128, 128 - // 4e. Unknown: 0.4 - ]), - wbFormIDCk(XSPC, 'Spawn Container', [REFR]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', sigReferences), - wbFloat('Delay') - ]) - ) - ], []), - - wbFormIDCk(XLIB, 'Leveled Item Base Object', [LVLI]), - wbXLCM, - wbFormIDCk(XLCN, 'Persistent Location', [LCTN]), - - {>>> COLL form Index value <<<} - wbInteger(XTRI, 'Collision Layer', itU32), - - {--- Lock ---} - wbStruct(XLOC, 'Lock Data', [ - wbInteger('Level', itU8, wbEnum([], [ - 0, 'None', - 1, 'Novice 1', - 25, 'Novice 25', - 50, 'Advanced', - 75, 'Expert', - 100, 'Master', - 253, 'Requires Terminal', - 251, 'Barred', - 252, 'Chained', - 254, 'Inaccessible', - 255, 'Requires Key' - ])), - wbByteArray('Unused', 3, cpIgnore), - wbFormIDCkNoReach('Key', [KEYM, NULL]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3, cpIgnore), - wbUnknown - ], cpNormal, False, nil, 4), - - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Generated Data ---} - wbStruct(XNDP, 'Navigation Door Link', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbInteger('Teleport Marker Triangle', itS16, wbREFRNavmeshTriangleToStr, wbStringToInt), - wbByteArray('Unused', 2, cpIgnore) - ]), - - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - wbEmpty(XIS2, 'Ignored by Sandbox'), - - {--- Ownership ---} - wbXOWN, - wbXRNK, - - wbInteger(XCNT, 'Item Count', itS32), - wbInteger(XHLT, 'Health %', itU32), - - wbXESP, - wbRArray('Linked References', wbStruct(XLKR, 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', sigReferences) - ], cpNormal, False, nil, 1)), - - wbRArray('Patrol', wbRStruct('Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbPDTOs - ], [])), - - {--- Flags ---} - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - - wbEmpty(ONAM, 'Open by Default'), - - {--- Map Data ---} - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Data'), - wbInteger(FNAM, 'Map Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To', - {0x04} '"Show All" Hidden', - {0x08} 'Use Location Name' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([], [ - {Vv = Verified Vanilla} - {No new map markers for Automatron or Workshop} - 0, 'Cave', {Vv} - 1, 'City', {Vv} - 2, 'Diamond City', {Vv} - 3, 'Encampment', {Vv} - 4, 'Factory / Industrial Site', {Vv} - 5, 'Gov''t Building / Monument', {Vv} - 6, 'Metro Station', {Vv} - 7, 'Military Base', {Vv} - 8, 'Natural Landmark', {Vv} - 9, 'Office / Civic Building', {Vv} - 10, 'Ruins - Town', {Vv} - 11, 'Ruins - Urban', {Vv} - 12, 'Sanctuary', {Vv} - 13, 'Settlement', {Vv} - 14, 'Sewer / Utility Tunnels', {Vv} - 15, 'Vault', {Vv} - 16, 'Airfield', {Vv} - 17, 'Bunker Hill', {Vv} - 18, 'Camper', {Vv} - 19, 'Car', {Vv} - 20, 'Church', {Vv} - 21, 'Country Club', {Vv} - 22, 'Custom House', {Vv} - 23, 'Drive-In', {Vv} - 24, 'Elevated Highway', {Vv} - 25, 'Faneuil Hall', {Vv} - 26, 'Farm', {Vv} - 27, 'Filling Station', {Vv} - 28, 'Forested', {Vv} - 29, 'Goodneighbor', {Vv} - 30, 'Graveyard', {Vv} - 31, 'Hospital', {Vv} - 32, 'Industrial Dome', {Vv} - 33, 'Industrial Stacks', {Vv} - 34, 'Institute', {Vv} - 35, 'Irish Pride', {Vv} - 36, 'Junkyard', {Vv} - 37, 'Observatory', {Vv} - 38, 'Pier', {Vv} - 39, 'Pond / Lake', {Vv} - 40, 'Quarry', {Vv} - 41, 'Radioactive Area', {Vv} - 42, 'Radio Tower', {Vv} - 43, 'Salem', {Vv} - 44, 'School', {Vv} - 45, 'Shipwreck', {Vv} - 46, 'Submarine', {Vv} - 47, 'Swan Pond', {Vv} - 48, 'Synth Head', {Vv} - 49, 'Town', {Vv} - 50, 'Brotherhood of Steel', {Vv} - 51, 'Brownstone Townhouse', {Vv} - 52, 'Bunker', {Vv} - 53, 'Castle', {Vv} - 54, 'Skyscraper', {Vv} - 55, 'Libertalia', {Vv} - 56, 'Low-Rise Building', {Vv} - 57, 'Minutemen', {Vv} - 58, 'Police Station', {Vv} - 59, 'Prydwen', {Vv} - 60, 'Railroad - Faction', {Vv} - 61, 'Railroad', {Vv} - 62, 'Satellite', {Vv} - 63, 'Sentinel', {Vv} - 64, 'USS Constitution', {Vv} - 65, 'Mechanist LairRaider settlementVassal settlementPotential Vassal settlement', {Vv} - 66, 'Custom 66', - 67, 'Custom 67', - 68, 'Custom 68', - 69, 'Custom 69', - 70, 'Custom 70', - 71, 'Custom 71', - 72, 'Custom 72', - 73, 'Custom 73', - 74, 'Custom 74', - 75, 'Custom 75', - 76, 'Custom 76', - 77, 'Custom 77', - 78, 'Custom 78', - 79, 'Custom 79', - 80, 'Custom 80', - 81, 'Custom 81', - 82, 'Custom 82', - 83, 'Custom 83', - 84, 'Custom 84', - 85, 'Custom 85', - 86, 'Custom 86', - 87, 'Custom 87', - 88, 'Custom 88', - 89, 'Custom 89', - 90, 'Custom 90', - 91, 'Custom 91', - 92, 'Custom 92', - 93, 'Custom 93', - 94, 'Custom 94', - 95, 'Custom 95', - 96, 'Custom 96', - 97, 'Custom 97', - 98, 'Custom 98', - 99, 'Custom 99' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ], []), - - {--- Attach reference ---} - wbFormIDCk(XATR, 'Attach Ref', [REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - - wbRArray('Spline Connection', wbStruct(XPLK, 'Link', [ - wbFormIDCk('Ref', [REFR, ACHR]), - wbUnknown // always 00 00 00 00 so far in DLCWorkshop03.esm - ])), - - wbRStruct('Power Grid', [ - wbInteger(XWPG, 'Count', itU32), - wbRArray('Connections', wbStruct(XWPN, 'Connection', [ - wbFormIDCk('Node 1', [REFR, ACHR, NULL]), - wbFormIDCk('Node 2', [REFR, ACHR, NULL]), - wbFormIDCk('Line', [REFR, NULL]) // BNDS ref - ])) - ], []), - - wbUnknown(XCVR), - wbUnknown(XCVL), - wbFormIDCk(XCZR, 'Unknown', sigReferences), - wbUnknown(XCZA), - wbFormIDCk(XCZC, 'Unknown', [CELL, NULL]), - - wbXLOD, // not seen in FO4 vanilla files - - wbDataPosRot, - wbString(MNAM, 'Comments') - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbRecord(REGN, 'Region', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Border Region' - ])), [ - wbEDID, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unknown', 1) - ], cpNormal, True), - wbFormIDCkNoReach(WNAM, 'Worldspace', [WRLD]), - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad), - wbUnknown(ANAM) - ], [])), - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Unknown 0', - {1} 'Unknown 1', - {2} 'Objects', - {3} 'Weather', - {4} 'Map', - {5} 'Land', - {6} 'Grass', - {7} 'Sound', - {8} 'Imposter', - {9} 'Unknown 10', - {10}'Unknown 11', - {11}'Unknown 12', - {12}'Unknown 13', - {13}'Unknown 14', - {14}'Unknown 15', - {15}'Unknown 16' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unknown') - ], cpNormal, True), - - {--- Icon ---} - wbICON, - - {--- Sound ---} - wbFormIDCk(RDMO, 'Music', [MUSC], False, cpNormal, False, wbREGNSoundDontShow), - wbArrayS(RDSA, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SNDR, NULL]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Pleasant', - {0x00000002} 'Cloudy', - {0x00000004} 'Rainy', - {0x00000008} 'Snowy' - ])), - wbFloat('Chance') - ]), 0, cpNormal, False, nil, nil, wbREGNSoundDontShow), - - {--- Map ---} - wbLString(RDMP, 'Map Name', 0, cpTranslate, False, wbREGNMapDontShow), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, FLOR, STAT, LTEX, MSTT]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unknown', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unknown', 2), - wbByteArray('Unknown', 4) - ]), 0, nil, nil, cpNormal, False, wbREGNObjectsDontShow), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unknown',4) - ]), 0, cpNormal, False, nil, nil, wbREGNGrassDontShow), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32), - wbFormIDCk('Global', [GLOB, NULL]) - ]), 0, cpNormal, False, nil, nil, wbREGNWeatherDontShow), - - wbFloat(RLDM, 'LOD Display Distance Multiplier'), - wbFloat(ANAM, 'Occlusion Accuracy Dist') - - ], [])) - ], True); - - wbRecord(SOUN, 'Sound Marker', [ - wbEDID, - wbOBNDReq, - wbFormIDCk(SDSC, 'Sound Descriptor', [SNDR, NULL]), - wbStruct(REPT, 'Repeat', [ - wbFloat('Min Time'), - wbFloat('Max Time'), - wbInteger('Stackable', itU8, wbBoolEnum) - ], cpNormal, False, nil, 2) - ]); - - wbSPIT := wbStruct(SPIT, 'Data', [ - wbInteger('Base Cost', itU32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Manual Cost Calc', - {0x00000002} 'Unknown 2', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Unknown 9', - {0x00000200} 'Unknown 10', - {0x00000400} 'Unknown 11', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Unknown 14', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Unknown 17', - {0x00020000} 'PC Start Spell', - {0x00040000} 'Instant Cast', - {0x00080000} 'Area Effect Ignores LOS', - {0x00100000} 'Ignore Resistance', - {0x00200000} 'No Absorb/Reflect', - {0x00400000} 'Unknown 23', - {0x00800000} 'No Dual Cast Modification', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Unknown 27', - {0x08000000} 'Unknown 28', - {0x10000000} 'Unknown 29', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbInteger('Type', itU32, wbEnum([ - {0} 'Spell', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison', - {6} 'Unknown 6', - {7} 'Unknown 7', - {8} 'Unknown 8', - {9} 'Unknown 9', - {10} 'Addiction', - {11} 'Voice' - ])), - wbFloat('Charge Time'), - wbInteger('Cast Type', itU32, wbCastEnum), - wbInteger('Target Type', itU32, wbTargetEnum), - wbFloat('Cast Duration'), - wbFloat('Range'), - wbFormIDCk('Casting Perk', [NULL, PERK]) - ], cpNormal, True); - - wbRecord(SPEL, 'Spell', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbETYP, - wbDESCReq, - wbSPIT, - wbEffectsReq - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - {wbRecord(SCRL, 'Scroll', [ - wbEDID - ]);} - - wbRecord(STAT, 'Static', - wbFlags(wbRecordFlagsFlags, [ - {0x00000001} { 0} '', - {0x00000002} { 1} '', - {0x00000004} { 2} 'Heading Marker', - {0x00000008} { 3} '', - {0x00000010} { 4} 'Non Occluder', - {0x00000020} { 5} 'Deleted', - {0x00000040} { 6} 'Has Tree LOD', // Used in Fallout 4 ? - {0x00000080} { 7} 'Add-On LOD Object', - {0x00000100} { 8} '', - {0x00000200} { 9} 'Hidden From Local Map', - {0x00000400} {10} 'Headtrack Marker', - {0x00000800} {11} 'Used as Platform', - {0x00001000} {12} '', - {0x00002000} {13} 'Pack-In Use Only', - {0x00004000} {14} '', - {0x00008000} {15} 'Has Distant LOD', - {0x00010000} {16} '', - {0x00020000} {17} 'Uses HD LOD Texture', - {0x00040000} {18} '', - {0x00080000} {19} 'Has Currents', - {0x00100000} {20} '', - {0x00200000} {21} '', - {0x00400000} {22} '', - {0x00800000} {23} 'Is Marker', - {0x01000000} {24} '', - {0x02000000} {25} 'Obstacle', - {0x04000000} {26} 'NavMesh Generation - Filter', - {0x08000000} {27} 'NavMesh Generation - Bounding Box', - {0x10000000} {28} 'Show In World Map (Sky Cell Only)', - {0x20000000} {29} '', - {0x40000000} {30} 'NavMesh Generation - Ground', - {0x80000000} {31} '' - ]), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFTYP, - wbMODL, - wbPRPS, - wbFULL, - wbStruct(DNAM, 'Direction Material', [ - wbFloat('Max Angle (30-120)'), - wbFormIDCk('Material', [MATO, NULL]), - wbFloat('Leaf Amplitude'), - wbFloat('Leaf Frequency') - ], cpNormal, True, nil, 2), - wbNVNM, - wbArray(MNAM, 'Distant LOD', - wbStruct('LOD', [ - {>>> Contains null-terminated mesh filename followed by random data up to 260 bytes <<<} - wbString(True, 'Mesh', 260) - //wbByteArray('Mesh', 260, cpIgnore) - ]), [ - 'Level 0', - 'Level 1', - 'Level 2', - 'Level 3' - ], - cpNormal, False - ) - ], True); // unordered, NVNM can be before or after MNAM - - wbRecord(TES4, 'Main File Header', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000001} 0, 'ESM', - {0x00000080} 7, 'Localized' - ], False), True), [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), // If possible then ignored by the runtime. Neither from the CK - wbByteArray(DELE, 'Unknown', 0, cpIgnore), // If possible then ignored by the runtime. Neither from the CK - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - // wbInteger(DATA, 'Filesize', itU64, nil, nil, cpIgnore, True) // Should be set by CK but usually null - wbByteArray(DATA, 'Unknown', 8, cpIgnore, True) - ], [ONAM])), - wbArray(ONAM, 'Overridden Forms', // Valid in CK - wbFormIDCk('Form', [ACHR, LAND, NAVM, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, DLBR, DIAL, INFO, SCEN]), - 0, nil, nil, cpNormal, False{, wbTES4ONAMDontShow}), - wbByteArray(SCRN, 'Screenshot'), // If possible then ignored by the runtime. Neither from the CK - wbRArray('Transient Types (CK only)', wbStruct(TNAM, 'Transient Type', [ - wbInteger('FormType', itU32), // seen TESTopic 78 (array of DIAL) and BGSScene 126 (array of SCEN) - wbArray('Unknown', wbFormID('Unknown')) - ])), // Ignored by the runtime - wbInteger(INTV, 'Unknown', itU32), // Ignored by the runtime, 4 bytes loaded in CK - wbInteger(INCC, 'Unknown', itU32) // Size of some array of 12 bytes elements - ], True, nil, cpNormal, True, wbRemoveOFST); -end; - -procedure DefineFO4o; -begin - - wbRecord(TREE, 'Tree', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 15, 'Has Distant LOD' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbMODL, - wbFormIDCK(PFIG, 'Ingredient', sigBaseObjects), - wbFormIDCK(SNAM, 'Harvest Sound', [SNDR, NULL]), - wbStruct(PFPC, 'Ingredient Production', [ - wbInteger('Spring', itU8), - wbInteger('Summer', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ]), - wbFULL, - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Trunk Flexibility'), - wbFloat('Branch Flexibility'), - //wbByteArray('Unknown', 32), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Leaf Amplitude'), - wbFloat('Leaf Frequency') - ], cpNormal, True) - ]); - - wbRecord(FLOR, 'Flora', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULLReq, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbUnknown(PNAM), - wbATTX, - wbLString(RNAM, 'Activate Text Override', 0, cpTranslate), - wbUnknown(FNAM), - wbFormIDCk(PFIG, 'Ingredient', sigBaseObjects), - wbFormIDCK(SNAM, 'Harvest Sound', [SNDR]), - wbStruct(PFPC, 'Ingredient Production', [ - wbInteger('Spring', itU8), - wbInteger('Summer ', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ], cpNormal, True) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(WATR, 'Water', [ - wbEDID, - wbFULL, - wbInteger(ANAM, 'Opacity (unused)', itU8), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Dangerous', - {0x02} 'Unknown 1', - {0x04} 'Directional Sound' - ]), cpNormal, True), - wbFormIDCk(TNAM, 'Material (unused)', [MATT]), - wbFormIDCk(SNAM, 'Open Sound', [SNDR, NULL]), - wbFormIDCk(XNAM, 'Consume Spell', [SPEL]), - wbFormIDCk(YNAM, 'Contact Spell', [SPEL]), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbByteArray(DATA, 'Unused', 0), - wbStruct(DNAM, 'Visual Data', [ - wbStruct('Fog Properties', [ - wbFloat('Depth Amount'), - wbByteColors('Shallow Color'), - wbByteColors('Deep Color'), - wbFloat('Color Shallow Range'), - wbFloat('Color Deep Range'), - wbFloat('Shallow Alpha'), - wbFloat('Deep Alpha'), - wbFloat('Alpha Shallow Range'), - wbFloat('Alpha Deep Range'), - wbByteColors('Underwater Color'), - wbFloat('Underwater Fog Amount'), - wbFloat('Underwater Near Fog'), - wbFloat('Underwater Far Fog') - ]), - wbStruct('Physical Properties', [ - wbFloat('Normal Magnitude'), - wbFloat('Shallow Normal Falloff'), - wbFloat('Deep Normal Falloff'), - wbFloat('Reflectivity Amount'), - wbFloat('Fresnel Amount'), - wbFloat('Surface Effect Falloff'), - wbStruct('Displacement Simulator', [ - wbFloat('Force'), - wbFloat('Velocity'), - wbFloat('Falloff'), - wbFloat('Dampener'), - wbFloat('Starting Size') - ]), - wbByteColors('Reflection Color') - ]), - wbStruct('Specular Properties', [ - wbFloat('Sun Specular Power'), - wbFloat('Sun Specular Magnitude'), - wbFloat('Sun Sparkle Power'), - wbFloat('Sun Sparkle Magnitude'), - wbFloat('Interior Specular Radius'), - wbFloat('Interior Specular Brightness'), - wbFloat('Interior Specular Power') - ]), - wbStruct('Noise Properties', [ - wbFloat('Layer 1 - Wind Direction'), - wbFloat('Layer 2 - Wind Direction'), - wbFloat('Layer 3 - Wind Direction'), - wbFloat('Layer 1 - Wind Speed'), - wbFloat('Layer 2 - Wind Speed'), - wbFloat('Layer 3 - Wind Speed'), - wbFloat('Layer 1 - Amplitude Scale'), - wbFloat('Layer 2 - Amplitude Scale'), - wbFloat('Layer 3 - Amplitude Scale'), - wbFloat('Layer 1 - UV Scale'), - wbFloat('Layer 2 - UV Scale'), - wbFloat('Layer 3 - UV Scale'), - wbFloat('Layer 1 - Noise Falloff'), - wbFloat('Layer 2 - Noise Falloff'), - wbFloat('Layer 3 - Noise Falloff') - ]), - wbStruct('Silt Properties', [ - wbFloat('Silt Amount'), - wbByteColors('Light Color'), - wbByteColors('Dark Color') - ]), - wbInteger('Screen Space Reflections', itU8, wbBoolEnum) - ], cpNormal, True, nil, 4), - wbByteArray(GNAM, 'Unused', 0), - wbStruct(NAM0, 'Linear Velocity', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, False), - wbStruct(NAM1, 'Angular Velocity', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, False), - wbString(NAM2, 'Layer 1 Noise Texture'), - wbString(NAM3, 'Layer 2 Noise Texture'), - wbString(NAM4, 'Layer 3 Noise Texture') - ]); - - wbRecord(WEAP, 'Weapon', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable', - {0x20000000} 30, 'High-Res 1st Person Only' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbPTRN, - wbFULL, - wbMODL, - wbICON, - wbMICO, - wbEITM, - wbInteger(EAMT, 'Enchantment Amount', itU16), - wbDEST, - wbETYP, - wbFormIDCk(BIDS, 'Block Bash Impact Data Set', [IPDS, NULL]), - wbFormIDCk(BAMT, 'Alternate Block Material', [MATT, NULL]), - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbDESC, - wbFormIDCk(INRD, 'Instance Naming', [INNR]), - wbAPPR, - wbObjectTemplate, - wbFormIDCk(NNAM, 'Embedded Weapon Mod', [OMOD]), - wbRStruct('1st Person Model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO4S, - wbMO4C, - wbMO4F - ], []), - wbStruct(DNAM, 'Data', [ - wbFormIDCk('Ammo', [AMMO, NULL]), - wbFloat('Speed'), - wbFloat('Reload Speed'), - wbFloat('Reach'), - wbFloat('Min Range'), - wbFloat('Max Range'), - wbFloat('Attack Delay'), - wbByteArray('Unknown', 4), - wbFloat('Damage - OutOfRange Mult'), - wbInteger('On Hit', itU32, wbHitBehaviourEnum), - wbFormIDCk('Skill', [AVIF, NULL]), - wbFormIDCk('Resist', [AVIF, NULL]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Player Only', - {0x00000002} 'NPCs Use Ammo', - {0x00000004} 'No Jam After Reload', - {0x00000008} 'Charging Reload', - {0x00000010} 'Minor Crime', - {0x00000020} 'Fixed Range', - {0x00000040} 'Not Used In Normal Combat', - {0x00000080} 'Unknown 8', - {0x00000100} 'Crit Effect - on Death', - {0x00000200} 'Charging Attack', - {0x00000400} 'Unknown 11', - {0x00000800} 'Hold Input To Power', - {0x00001000} 'Non Hostile', - {0x00002000} 'Bound Weapon', - {0x00004000} 'Ignores Normal Weapon Resistance', - {0x00008000} 'Automatic', - {0x00010000} 'Repeatable Single Fire', - {0x00020000} 'Can''t Drop', - {0x00040000} 'Hide Backpack', - {0x00080000} 'Embedded Weapon', - {0x00100000} 'Not Playable', - {0x00200000} 'Has Scope', - {0x00400000} 'Bolt Action', - {0x00800000} 'Secondary Weapon', - {0x01000000} 'Disable Shells', - {0x02000000} 'Unknown 26', - {0x04000000} 'Unknown 27', - {0x08000000} 'Unknown 28', - {0x10000000} 'Unknown 29', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbInteger('Capacity', itU16), - wbInteger('Animation Type', itU8, wbEnum([ - 'HandToHandMelee', - 'OneHandSword', - 'OneHandDagger', - 'OneHandAxe', - 'OneHandMace', - 'TwoHandSword', - 'TwoHandAxe', - 'Bow', - 'Staff', - 'Gun', - 'Grenade', - 'Mine' - ])), - wbFloat('Damage - Secondary'), - wbFloat('Weight'), - wbInteger('Value', itU32), - wbInteger('Damage - Base', itU16), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbFormIDCk('Sound - Attack', [SNDR, NULL]), - wbFormIDCk('Sound - Attack 2D', [SNDR, NULL]), - wbFormIDCk('Sound - Attack Loop', [SNDR, NULL]), - wbFormIDCk('Sound - Attack Fail', [SNDR, NULL]), - wbFormIDCk('Sound - Idle', [SNDR, NULL]), - wbFormIDCk('Sound - Equip Sound', [SNDR, NULL]), - wbFormIDCk('Sound - UnEquip Sound', [SNDR, NULL]), - wbFormIDCk('Sound - Fast Equip Sound', [SNDR, NULL]), - wbInteger('Accuracy Bonus', itU8), - wbFloat('Animation Attack Seconds'), - wbByteArray('Unknown', 2), - wbFloat('Action Point Cost'), - wbFloat('Full Power Seconds'), - wbFloat('Min Power Per Shot'), - wbInteger('Stagger', itU32, wbStaggerEnum), - wbByteArray('Unknown', 4) - ]), - wbStruct(FNAM, '', [ - wbFloat('Animation Fire Seconds'), - wbFloat('Rumble - Left Motor Strength'), - wbFloat('Rumble - Right Motor Strength'), - wbFloat('Rumble - Duration'), - wbFloat('Animation Reload Seconds'), - wbByteArray('Unknown', 4), - wbFloat('Sighted Transition Seconds'), - wbInteger('# Projectiles', itU8), - wbFormIDCk('Override Projectile', [PROJ, NULL]), - wbInteger('Pattern', itU32, wbEnum([ - 'Constant', - 'Square', - 'Triangle', - 'Sawtooth' - ])), - wbInteger('Rumble - Peroid (ms)', itU32) - ]), - wbStruct(CRDT, 'Critical Data', [ - wbFloat('Crit Damage Mult'), - wbFloat('Crit Charge Bonus'), - wbFormIDCk('Crit Effect', [SPEL, NULL]) - ]), - wbFormIDCk(INAM, 'Impact Data Set', [IPDS]), - wbFormIDCk(LNAM, 'NPC Add Ammo List', [LVLI]), - wbFormIDCk(WAMD, 'Aim Model', [AMDL]), - wbFormIDCk(WZMD, 'Zoom', [ZOOM]), - wbFormIDCk(CNAM, 'Template', [WEAP]), - wbStructs(DAMA, 'Damage Types', 'Damage Type', [ - wbFormIDCk('Type', [DMGT]), - wbInteger('Amount', itU32) - ]), - wbFLTR, - wbInteger(MASE, 'Melee Speed', itU32, wbEnum([ - 'Very Slow', - 'Slow', - 'Medium', - 'Fast', - 'Very Fast' - ])) - ], False, nil, cpNormal, False, nil{wbWEAPAfterLoad}, wbKeywordsAfterSet); - - wbRecord(WRLD, 'Worldspace', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Can''t Wait' - ])), [ - wbEDID, - wbRArray('Unused RNAM', wbUnknown(RNAM), cpIgnore, False{, wbNeverShow}), - wbMaxHeightDataWRLD, - wbFULL, - wbStruct(WCTR, 'Fixed Dimensions Center Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbFormIDCk(LTMP, 'Interior Lighting', [LGTM]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN, NULL]), - wbFormIDCk(XLCN, 'Location', [LCTN, NULL]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbStruct(PNAM, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x0001} 'Use Land Data', - {0x0002} 'Use LOD Data', - {0x0004} 'Don''t Use Map Data', - {0x0008} 'Use Water Data', - {0x0010} 'Use Climate Data', - {0x0020} 'Use Image Space Data (unused)', - {0x0040} 'Use Sky Cell' - ], [5])), - wbByteArray('Unknown', 1) - ], cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbString(ICON, 'Map Image'), - wbRStruct('Cloud Model', [wbMODL], []), - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset'), - wbFloat('Cell Z Offset') - ], cpNormal, True), - wbFloat(NAMA, 'Distant LOD Multiplier'), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} 'Unknown 3', - {0x08} 'No LOD Water', - {0x10} 'No Landscape', - {0x20} 'No Sky', - {0x40} 'Fixed Dimensions', - {0x80} 'No Grass' - ]), cpNormal, True), - {>>> Object Bounds doesn't show up in CK <<<} - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow (unused)', 0, cpIgnore), - wbString(XWEM, 'Water Environment Map'), - wbString(TNAM, 'HD LOD Diffuse Texture'), - wbString(UNAM, 'HD LOD Normal Texture'), - wbRStruct('World Default Level Data', [ - wbStruct(WLEV, 'Dimension', [ - wbStruct('NW Cell', [ - wbInteger('X', itS8), - wbInteger('Y', itS8) - ]), - wbStruct('Size', [ - wbInteger('Width', itU8), - wbInteger('Height', itU8) - ]) - ]), - wbByteArray(WLEV, 'Data') - ], []), - wbOFST, - wbUnknown(CLSZ) - ], False, nil, cpNormal, False, wbWRLDAfterLoad); - - - wbRecord(WTHR, 'Weather', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Unknown 9' - ])), [ - wbEDID, - wbString(_00_0TX, 'Cloud Texture Layer #0'), - wbString(_10_0TX, 'Cloud Texture Layer #1'), - wbString(_20_0TX, 'Cloud Texture Layer #2'), - wbString(_30_0TX, 'Cloud Texture Layer #3'), - wbString(_40_0TX, 'Cloud Texture Layer #4'), - wbString(_50_0TX, 'Cloud Texture Layer #5'), - wbString(_60_0TX, 'Cloud Texture Layer #6'), - wbString(_70_0TX, 'Cloud Texture Layer #7'), - wbString(_80_0TX, 'Cloud Texture Layer #8'), - wbString(_90_0TX, 'Cloud Texture Layer #9'), - wbString(_3A_0TX, 'Cloud Texture Layer #10'), - wbString(_3B_0TX, 'Cloud Texture Layer #11'), - wbString(_3C_0TX, 'Cloud Texture Layer #12'), - wbString(_3D_0TX, 'Cloud Texture Layer #13'), - wbString(_3E_0TX, 'Cloud Texture Layer #14'), - wbString(_3F_0TX, 'Cloud Texture Layer #15'), - wbString(_40h_0TX, 'Cloud Texture Layer #16'), - wbString(A0TX, 'Cloud Texture Layer #17'), - wbString(B0TX, 'Cloud Texture Layer #18'), - wbString(C0TX, 'Cloud Texture Layer #19'), - wbString(D0TX, 'Cloud Texture Layer #20'), - wbString(E0TX, 'Cloud Texture Layer #21'), - wbString(F0TX, 'Cloud Texture Layer #22'), - wbString(G0TX, 'Cloud Texture Layer #23'), - wbString(H0TX, 'Cloud Texture Layer #24'), - wbString(I0TX, 'Cloud Texture Layer #25'), - wbString(J0TX, 'Cloud Texture Layer #26'), - wbString(K0TX, 'Cloud Texture Layer #27'), - wbString(L0TX, 'Cloud Texture Layer #28'), - wbUnknown(LNAM), - wbFormIDCK(MNAM, 'Precipitation Type', [SPGD, NULL]), - wbFormIDCK(NNAM, 'Visual Effect', [RFCT, NULL], False, cpNormal, True), - wbByteArray(ONAM, 'Unused', 0, cpIgnore), - wbRStruct('Cloud Speed', [ - wbArray(RNAM, 'Y Speed', wbInteger('Layer', itU8, wbCloudSpeedToStr, wbCloudSpeedToInt)), - wbArray(QNAM, 'X Speed', wbInteger('Layer', itU8, wbCloudSpeedToStr, wbCloudSpeedToInt)) - ], []), - wbArray(PNAM, 'Cloud Colors', wbWeatherColors('Layer')), - wbArray(JNAM, 'Cloud Alphas', wbStruct('Layer', [ - wbFloat('Sunrise'), - wbFloat('Day'), - wbFloat('Sunset'), - wbFloat('Night'), - wbFloat('EarlySunrise'), - wbFloat('LateSunrise'), - wbFloat('EarlySunset'), - wbFloat('LateSunset') - ])), - wbStruct(NAM0, 'Weather Colors', [ - wbWeatherColors('Sky-Upper'), - wbWeatherColors('Fog Near'), - wbWeatherColors('Unknown'), - wbWeatherColors('Ambient'), - wbWeatherColors('Sunlight'), - wbWeatherColors('Sun'), - wbWeatherColors('Stars'), - wbWeatherColors('Sky-Lower'), - wbWeatherColors('Horizon'), - wbWeatherColors('Effect Lighting'), - wbWeatherColors('Cloud LOD Diffuse'), - wbWeatherColors('Cloud LOD Ambient'), - wbWeatherColors('Fog Far'), - wbWeatherColors('Sky Statics'), - wbWeatherColors('Water Multiplier'), - wbWeatherColors('Sun Glare'), - wbWeatherColors('Moon Glare'), - wbWeatherColors('Fog Near High'), - wbWeatherColors('Fog Far High') - ], cpNormal, True, nil, 8), - wbArray(NAM4, 'Unknown', wbFloat('Unknown')), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day - Near'), - wbFloat('Day - Far'), - wbFloat('Night - Near'), - wbFloat('Night - Far'), - wbFloat('Day - Power'), - wbFloat('Night - Power'), - wbFloat('Day - Max'), - wbFloat('Night - Max'), - wbFloat('Day - Near Height Mid'), - wbFloat('Day - Near Height Range'), - wbFloat('Night - Near Height Mid'), - wbFloat('Night - Near Height Range'), - wbFloat('Day - High Density Scale'), - wbFloat('Night - High Density Scale'), - wbFloat('Day - Far Height Mid'), - wbFloat('Day - Far Height Range'), - wbFloat('Night - Far Height Mid'), - wbFloat('Night - Far Height Range') - ], cpNormal, True, nil, 8), - wbStruct(DATA, 'Data', [ - wbInteger('Wind Speed', itU8), // scaled 0..1 - wbByteArray('Unknown', 2), - wbInteger('Trans Delta', itU8), // scaled 0..0,25 - wbInteger('Sun Glare', itU8), // scaled 0..1 - wbInteger('Sun Damage', itU8), // scaled 0..1 - wbInteger('Precipitation - Begin Fade In', itU8), // scaled 0..1 - wbInteger('Precipitation - End Fade Out', itU8), // scaled 0..1 - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Weather - Pleasant', - {0x02} 'Weather - Cloudy', - {0x04} 'Weather - Rainy', - {0x08} 'Weather - Snow', - {0x10} 'Sky Statics - Always Visible', - {0x20} 'Sky Statics - Follows Sun Position', - {0x40} 'Rain Occlusion', - {0x80} 'HUD Rain Effects' - ])), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]), - wbInteger('Visual Effect - Begin', itU8), // scaled 0..1 - wbInteger('Visual Effect - End', itU8), // scaled 0..1 - wbInteger('Wind Direction', itU8), // scaled 0..360 - wbInteger('Wind Direction Range', itU8), // scaled 0..180 - wbInteger('Unknown', itU8) - ], cpNormal, True, nil, 16), - wbInteger(NAM1, 'Disabled Cloud Layers', itU32, wbFlags(['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31'])), - wbRArray('Sounds', - wbStruct(SNAM, 'Sound', [ - wbFormIDCK('Sound', [SNDR, NULL]), - wbInteger('Type', itU32, wbEnum([ - {0x01} 'Default', - {0x02} 'Precipitation', - {0x04} 'Wind', - {0x08} 'Thunder' - ])) - ]) - ), - wbRArrayS('Sky Statics', wbFormIDCk(TNAM, 'Static', [STAT, NULL])), - wbStruct(IMSP, 'Image Spaces', [ - wbFormIDCK('Sunrise', [IMGS, NULL]), - wbFormIDCK('Day', [IMGS, NULL]), - wbFormIDCK('Sunset', [IMGS, NULL]), - wbFormIDCK('Night', [IMGS, NULL]), - wbFormIDCK('EarlySunrise', [IMGS, NULL]), - wbFormIDCK('LateSunrise', [IMGS, NULL]), - wbFormIDCK('EarlySunset', [IMGS, NULL]), - wbFormIDCK('LateSunset', [IMGS, NULL]) - ], cpNormal, True, nil, 4), - wbStruct(WGDR, 'God Rays', [ - wbFormIDCK('Sunrise', [GDRY, NULL]), - wbFormIDCK('Day', [GDRY, NULL]), - wbFormIDCK('Sunset', [GDRY, NULL]), - wbFormIDCK('Night', [GDRY, NULL]), - wbFormIDCK('EarlySunrise', [GDRY, NULL]), - wbFormIDCK('LateSunrise', [GDRY, NULL]), - wbFormIDCK('EarlySunset', [GDRY, NULL]), - wbFormIDCK('LateSunset', [GDRY, NULL]) - ]), - wbRStruct('Directional Ambient Lighting Colors', [ - wbAmbientColors(DALC, 'Sunrise'), - wbAmbientColors(DALC, 'Day'), - wbAmbientColors(DALC, 'Sunset'), - wbAmbientColors(DALC, 'Night'), - wbAmbientColors(DALC, 'EarlySunrise'), - wbAmbientColors(DALC, 'LateSunrise'), - wbAmbientColors(DALC, 'EarlySunset'), - wbAmbientColors(DALC, 'LateSunset') - ], [], cpNormal, True), - wbRStruct('Aurora', [wbMODL], []), - wbFormIDCk(GNAM, 'Sun Glare Lens Flare', [LENS]), - wbStruct(UNAM, 'Magic', [ - wbFormIDCk('On Lightning Strike - Spell', [SPEL, NULL]), - wbFloat('On Lightning Strike - Threshold'), - wbFormIDCk('On Weather Activate - Spell', [SPEL, NULL]), - wbFloat('On Weather Activate - Threshold'), - wbByteArray('Unknown', 4), // SPEL FormID for another context but unresolved in Fallout4.esm, legacy data - wbFloat('Unknown') - ], cpNormal, False, nil, 3), - wbFloat(VNAM, 'Volatility Mult'), - wbFloat(WNAM, 'Visibility Mult') - ]); -end; - -procedure DefineFO4p; -begin - {wbRecord(SCPT, 'SCPT', [ - wbEDID - ]);} -end; - -{>>> Start of new Fallout 4 Records <<<} - -procedure DefineFO4q; -begin - wbRecord(AECH, 'Audio Effect Chain', [ - wbEDID, - wbRArray('Effects', - wbRStruct('Effect', [ - wbInteger(KNAM, 'Type', itU32, wbEnum([], [ - Int64($864804BE), 'BSOverdrive', - Int64($EF575F7F), 'BSStateVariableFilter', - Int64($18837B4F), 'BSDelayEffect' - ]), cpNormal, False, False, nil, nil, Int64($864804BE)), - wbStruct(DNAM, 'Data', [ - wbInteger('Enabled', itU32, wbBoolEnum), - wbUnion('Value 1', wbAECHDataDecider, [ - wbFloat('Input Gain'), // exponentially(?) normalized from 0..10 to -80..20 - wbFloat('Center Freq'), - wbFloat('Feedback %') - ]), - wbUnion('Value 2', wbAECHDataDecider, [ - wbFloat('Output Gain'), // exponentially(?) normalized from 0..10 to -80..20 - wbFloat('Q Value'), - wbFloat('Wet Mix %') - ]), - wbUnion('Value 3', wbAECHDataDecider, [ - wbFloat('Upper Threshold'), // exponentially(?) normalized from 0..1 to -74..0 - wbInteger('Filter Mode', itU32, wbEnum([ - 'High Pass', - 'Low Pass', - 'Band Pass', - 'Notch' - ])), - wbInteger('Delay MS', itU32) - ]), - wbUnion('Value 4', wbAECHDataDecider, [ - wbFloat('Lower Threshold'), // exponentially(?) normalized from 0..1 to -80..0 - wbByteArray('Unused', 0), - wbByteArray('Unused', 0) - ]) - ]) - ], []) - ) - ]); - - wbRecord(AMDL, 'Aim Model', [ - wbEDID, - wbStruct(DNAM, 'Data', [ - wbFloat('Cone of Fire - Min Angle'), - wbFloat('Cone of Fire - Max Angle'), - wbFloat('Cone of Fire - Increase Per Shot'), - wbFloat('Cone of Fire - Decrease Per Sec'), - wbInteger('Cone of Fire - Decrease Delay MS', itU32), - wbFloat('Cone of Fire - Sneak Mult'), - wbFloat('Recoil - Diminish Spring Force'), - wbFloat('Recoil - Diminish Sights Mult'), - wbFloat('Recoil - Max Per Shot'), - wbFloat('Recoil - Min Per Shot'), - wbFloat('Recoil - Hip Mult'), - wbInteger('Runaway - Recoil Shots', itU32), - wbFloat('Recoil - Arc'), - wbFloat('Recoil - Arc Rotate'), - wbFloat('Cone of Fire - Iron Sights Mult'), - wbFloat('Stability - Base Stability') - ]) - ]); - - wbRecord(AORU, 'Attraction Rule', [ - wbEDID, - wbStruct(AOR2, 'Data', [ - wbFloat('Radius'), - wbFloat('Min Delay'), - wbFloat('Max Delay'), - wbInteger('Requires Line of Sight', itU8, wbBoolEnum), - wbInteger('Combat Target', itU8, wbBoolEnum), - wbByteArray('Unused', 2) - ], cpNormal, True) - ]); - - wbRecord(BNDS, 'Bendable Spline', [ - wbEDID, - wbOBND, - wbStruct(DNAM, 'Data', [ - wbFloat('Default Number of Tiles'), - wbInteger('Default Number of Slices', itU16), - wbInteger('Default Number of Tiles - Relative to Length', itU16, wbBoolEnum), - wbFloatColors('Default Color'), - wbFloat('Wind Settings - Sensibility'), - wbFloat('Wind Settings - Flexibility') - ]), - wbFormIDCk(TNAM, 'Texture', [TXST]) - ]); - - wbRecord(CMPO, 'Component', [ - wbEDID, - wbOBND, - wbFULL, - wbCUSD, - wbInteger(DATA, 'Auto Calc Value', itU32), - wbFormIDCk(MNAM, 'Scrap Item', [MISC]), - wbFormIDCk(GNAM, 'Mod Scrap Scalar', [GLOB]) - ]); - - wbRecord(DFOB, 'Default Object', [ - wbEDID, - wbFormID(DATA, 'Object') - ]); - - wbRecord(DMGT, 'Damage Type', [ - wbEDID, - // Before form version 78, it was an array of AVIF index, since then array of AVIF formID, coupled with a SPEL formID - wbUnion(DNAM, 'Data', wbFormVer78Decider, [ - wbArray('Damage Types', wbInteger('Actor Value Index', itU32)), - wbArray('Damage Types', wbStruct('Damage Type', [ - wbFormIDck('Actor Value', [AVIF, NULL]), - wbFormIDck('Spell', [SPEL, NULL]) - ])) - ]) - ]); - - wbRecord(GDRY, 'God Rays', [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbFloatColors('Back Color'), - wbFloatColors('Fwd Color'), - wbFloat('Intensity'), - wbFloat('Air Color - Scale'), - wbFloat('Back Color - Scale'), - wbFloat('Fwd Color - Scale'), - wbFloat('Back Phase'), - wbFloatColors('Air Color'), - wbFloat('Fwd Phase') - ]) - ]); - -end; - -procedure DefineFO4r; -begin - wbRecord(INNR, 'Instance Naming Rules', [ - wbEDID, - wbInteger(UNAM, 'Target', itU32, wbEnum([], [ - 0, 'None', - $1D, 'Armor', - $2D, 'Actor', - $2A, 'Furniture', - $2B, 'Weapon' - ])), - wbRArray('Naming Rules', - wbRStruct('Ruleset', [ - wbInteger(VNAM, 'Count', itU32), - // should not be sorted - wbRArray('Names', - wbRStruct('Name', [ - wbLString(WNAM, 'Text', 0, cpTranslate), - wbKSIZ, - wbKWDAs, - wbStruct(XNAM, 'Property', [ - wbFloat('Value'), - wbInteger('Target', itU8, wbEnum([ - { 0} 'Enchantments', - { 1} 'BashImpactDataSet', - { 2} 'BlockMaterial', - { 3} 'Keywords', - { 4} 'Weight', - { 5} 'Value', - { 6} 'Rating', - { 7} 'AddonIndex', - { 8} 'BodyPart', - { 9} 'DamageTypeValues', - {10} 'ActorValues', - {11} 'Health', - {12} 'ColorRemappingIndex', - {13} 'MaterialSwaps' - ])), - wbInteger('Op', itU8, wbEnum([ - {0} '>=', - {1} '>', - {2} '<=', - {3} '<', - {4} '=' - ])) - ]), - wbInteger(YNAM, 'Index', itU16) - ], []), - cpNormal, False, nil, wbINNRAfterSet - ) - ], []) - ) - ]); - - wbRecord(KSSM, 'Sound Keyword Mapping', [ - wbEDID, - wbFormIDCk(DNAM, 'Primary Descriptor', [SNDR]), - wbFormIDCk(ENAM, 'Exterior Tail', [SNDR]), - wbFormIDCk(VNAM, 'VATS Descriptor', [SNDR]), - wbFloat(TNAM, 'VATS Threshold'), - wbRArray('Keywords', wbFormIDCk(KNAM, 'Keyword', [KYWD])), - wbRArrayS('Sounds', wbStructSK(RNAM, [0], 'Sound', [ - wbInteger('Reverb Class', itU32, wbReverbClassEnum), - wbFormIDCk('Descriptor', [SNDR]) - ])) - ]); - - wbRecord(LAYR, 'Layer', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent', [LAYR]) - ]); - - wbRecord(LENS, 'Lens Flare', [ - wbEDID, - wbFloat(CNAM, 'Color Influence'), - wbFloat(DNAM, 'Fade Distance Radius Scale'), - wbInteger(LFSP, 'Count', itU32, nil, cpBenign), - wbRArrayS('Lens Flare Sprites', - wbRStructSK([0], 'Flare', [ - wbString(DNAM, 'Lens Flare Sprite ID'), - wbString(FNAM, 'Texture'), - wbStruct(LFSD, 'Lens Flare Data', [ - wbFloatColors('Tint'), - wbFloat('Width'), - wbFloat('Height'), - wbFloat('Position'), - wbFloat('Angular Fade'), - wbFloat('Opacity'), - wbInteger('Flags', itU32, wbFlags([ - {0x01} 'Rotates', - {0x02} 'Shrinks When Occluded' - ])) - ]) - ], []), - cpNormal, False, nil, wbLENSAfterSet - ) - ]); - - {wbRecord(LSPR, 'LSPR', [ - wbEDID - ]); - - wbRecord(MICN, 'MICN', [ - wbEDID - ]);} - - wbRecord(MSWP, 'Material Swap', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00010000} 16, 'Custom Swap' - ])), [ - wbEDID, - wbString(FNAM, 'Tree Folder'), {First FNAM} - wbRArrayS('Material Substitutions', - wbRStructSK([0], 'Substitution', [ - wbString(BNAM, 'Original Material'), - wbString(SNAM, 'Replacement Material'), - wbString(FNAM, 'Tree Folder (obsolete)'), {Unused, will be moved up to First FNAM} - wbFloat(CNAM, 'Color Remapping Index') - ], []) - ) - ]); - - wbRecord(NOCM, 'Navigation Mesh Obstacle Manager', [ - wbRArray('Unknown', - wbRStruct('Unknown', [ - wbInteger(INDX, 'Index', itU32), - wbRArray('Unknown', wbUnknown(DATA)), - wbUnknown(INTV), - wbString(NAM1, 'Model') - ], []) - ) - ]); - -end; - -procedure DefineFO4s; -begin - wbRecord(NOTE, 'Note', [ - wbEDID, - wbVMAD, - wbOBND, - wbPTRN, - wbFULL, - wbMODL, - wbICON, - wbYNAM, - wbZNAM, - wbInteger(DNAM, 'Type', itU8, wbEnum([ - 'Sound', - 'Voice', - 'Program', - 'Terminal' - ]), cpNormal, True), - wbStruct(DATA, '', [ // was DNAM before form version 65. Now holds value and weight - wbInteger('Value', itU32), - wbFloat('Weight') - ]), - wbUnion(SNAM, 'Data', wbNOTEDataDecider, [ - wbByteArray('Unused', 4), - wbFormIDCk('Sound', [SNDR]), - wbFormIDCk('Scene', [SCEN]), - wbFormIDCk('Terminal', [TERM]) - ]), - wbString(PNAM, 'Program File') - ]); - - wbRecord(OMOD, 'Object Modification', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000008} 4, 'Legendary Mod', - {0x00000040} 7, 'Mod Collection' - ])), [ - wbEDID, - wbFULL, - wbDESC, - wbMODL, - wbStruct(DATA, 'Data', [ - wbInteger('Include Count', itU32), - wbInteger('Property Count', itU32), - wbByteArray('Unused', 2, cpIgnore), - wbInteger('Form Type', itU32, wbEnum([], [ - Sig2Int(ARMO), 'Armor', - Sig2Int(NPC_), 'Non-player character', - Sig2Int(WEAP), 'Weapon', - Sig2Int(NONE), 'None' - ])), - wbByteArray('Unused', 2, cpIgnore), - wbFormIDCk('Attach Point', [KYWD, NULL]), - wbArray('Attach Parent Slots', wbFormIDCk('Keyword', [KYWD, NULL]), -1), - // no way to change these in CK, legacy data leftover? - wbArray('Items', wbStruct('Item', [ - wbByteArray('Value 1', 4), - wbByteArray('Value 2', 4) - ]), -1), - // should not be sorted - wbArray('Includes', wbStruct('Include', [ - wbFormIDCk('Mod', [OMOD]), - wbInteger('Minimum Level', itU8), - wbInteger('Optional', itU8, wbBoolEnum), - wbInteger('Don''t Use All', itU8, wbBoolEnum) - ]), wbOMODDataIncludeCounter, cpNormal, False, nil, wbOMODincludeAfterSet), - wbObjectModProperties - ], cpNormal, False, nil, -1, nil, wbOMODdataAfterSet), - wbArray(MNAM, 'Target OMOD Keywords', wbFormIDCk('Keyword', [KYWD])), - wbArray(FNAM, 'Filter Keywords', wbFormIDCk('Keyword', [KYWD])), - wbFormIDCk(LNAM, 'Loose Mod', sigBaseObjects), - wbInteger(NAM1, 'Priority', itU8), - wbFLTR - ]); - - wbRecord(OVIS, 'Object Visibility Manager', [ - wbRArray('Unknown', - wbRStruct('Unknown', [ - wbFormIDCk(INDX, 'Object', [STAT]), - wbStruct(DATA, 'Object Bounds', [ - wbFloat('X1'), - wbFloat('Y1'), - wbFloat('Z1'), - wbFloat('X2'), - wbFloat('Y2'), - wbFloat('Z2') - ]) - ], []) - ) - ]); - - wbRecord(PKIN, 'Pack-In', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Prefab' - ])), [ - wbEDID, - wbOBND, - wbFLTR, - wbFormIDCk(CNAM, 'Cell', [CELL]), - wbInteger(VNAM, 'Version', itU32) - ]); - - wbRecord(RFGP, 'Reference Group', [ - wbEDID, - wbString(NNAM, 'Name'), - wbFormIDCk(RNAM, 'Reference', sigReferences), - wbUnknown(PNAM) - ]); - - {wbRecord(RGDL, 'RGDL', [ - wbEDID - ]);} - - wbRecord(SCCO, 'Scene Collection', [ - wbEDID, - wbFormIDCk(QNAM, 'Quest', [QUST]), - wbRArray('Scenes', - wbRStruct('Scene', [ - wbFormIDCk(SNAM, 'Scene', [SCEN]), - wbStruct(XNAM, 'Unknown', [ - wbInteger('Unknown', itS32), - wbInteger('Unknown', itS32) - ]) - ], []) - ), - wbUnknown(VNAM, cpNormal, True), - wbRArray('Unknown', wbStruct(XNAM, 'Unknown', [ - wbInteger('Unknown', itS32), - wbInteger('Unknown', itS32) - ])), - wbUnknown(VNAM, cpNormal, True) - ]); - - wbRecord(SCOL, 'Static Collection', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 4, 'Non Occluder', - {0x00000200} 9, 'Hidden From Local Map', - {0x00000400} 10, 'Unknown 10', - {0x00000800} 11, 'Used as Platform', - {0x00008000} 15, 'Has Distant LOD', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbOBNDReq, - wbPTRN, - wbMODL, - wbFULL, - wbFLTR, - wbRStructsSK('Parts', 'Part', [0], [ - wbFormIDCk(ONAM, 'Static', [ACTI, ALCH, AMMO, BOOK, CONT, DOOR, FURN, MISC, MSTT, STAT, TERM, WEAP]), - wbArrayS(DATA, 'Placements', wbStruct('Placement', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]), - wbFloat('Scale') - ]), 0, cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(SCSN, 'Audio Category Snapshot', [ - wbEDID, - wbInteger(PNAM, 'Priority', itU16), - wbRArray('Category Multipliers', wbStruct(CNAM, 'Category Multiplier', [ - wbFormIDCk('Categoty', [SNCT]), - wbFloat('Multiplier') - ])) - ]); - -end; - -procedure DefineFO4t; -begin - {wbRecord(SKIL, 'SKIL', [ - wbEDID - ]);} - - wbRecord(STAG, 'Animation Sound Tag Set', [ - wbEDID, - wbRArray('Sounds', wbStruct(TNAM, 'Sound', [ - wbFormIDCk('Sound', [SNDR, NULL]), - wbString('Action') - ])) - ]); - - wbRecord(TERM, 'Terminal', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 4, 'Unknown 4', - {0x00002000} 13, 'Unknown 13', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start' - ])), [ - wbEDID, - wbVMADFragmentedPERK, // same fragments format as in PERK - wbOBNDReq, - wbPTRN, - wbLString(NAM0, 'Header Text'), - wbLString(WNAM, 'Welcome Text'), - wbFULL, - wbMODL, - wbKSIZ, - wbKWDAs, - wbPRPS, - wbUnknown(PNAM), - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]), - wbUnknown(FNAM), - wbCOCT, - wbCNTOs, - wbMNAMFurnitureMarker, - wbByteArray(WBDT, 'Workbench Data (unused)', 0), - wbString(XMRK, 'Marker Model'), - wbSNAMMarkerParams, - wbInteger(BSIZ, 'Count', itU32, nil, cpBenign), - wbRArray('Body Text', - wbRStruct('Item', [ - wbLString(BTXT, 'Text', 0, cpTranslate), - wbCTDAs - ], []), - cpNormal, False, nil, wbTERMDisplayItemsAfterSet - ), - wbInteger(ISIZ, 'Count', itU32, nil, cpBenign), - wbRArray('Menu Items', - wbRStruct('Menu Item', [ - wbLString(ITXT, 'Item Text', 0, cpTranslate), - wbLString(RNAM, 'Response Text', 0, cpTranslate), - wbInteger(ANAM, 'Type', itU8, wbEnum([ - {0} 'Unknown 0', - {1} 'Unknown 1', - {2} 'Unknown 2', - {3} 'Unknown 3', - {4} 'Submenu - Terminal', - {5} 'Submenu - Return to Top Level', - {6} 'Submenu - Force Redraw', - {7} 'Unknown 7', - {8} 'Display Text' - ]), cpNormal, True), - wbInteger(ITID, 'Item ID', itU16), - wbLString(UNAM, 'Display Text', 0, cpTranslate), - wbString(VNAM, 'Show Image'), - wbFormIDCk(TNAM, 'Submenu', [TERM]), - wbCTDAs - ], []), - cpNormal, False, nil, wbTERMMenuItemsAfterSet - ) - ]); - - {wbRecord(TLOD, 'TLOD', [ - wbEDID - ]); - - wbRecord(TOFT, 'TOFT', [ - wbEDID - ]);} - - wbRecord(TRNS, 'Transform', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 16, 'Around Origin' - ])), [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbPosRot, - wbFloat('Scale'), - wbFloat('Zoom Min'), - wbFloat('Zoom Max') - ], cpNormal, True, nil, 2) - ]); - - wbRecord(ZOOM, 'Zoom', [ - wbEDID, - wbStruct(GNAM, 'Data', [ - wbFloat('FOV Mult'), - wbInteger('Overlay', itU32, wbEnum([ - { 0} 'Default', - { 1} 'Fine', - { 2} 'Duplex', - { 3} 'German', - { 4} 'Dot', - { 5} 'Mil-Dot', - { 6} 'Circle', - { 7} 'Old Rangefind', - { 8} 'Modern Rangefind', - { 9} 'SVD', - {10} 'Hand Painted', - {11} 'Binoculars', - {12} 'Cross', - {13} 'Double Zero', - {14} 'Rangefinder 1', - {15} 'Rangefinder 2', - {16} 'Rectangle' - ])), - wbFormIDCk('Imagespace Modifier', [IMAD, NULL]), - wbStruct('Camera Offset', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]) - ]) - ]); - -end; - -procedure DefineFO4u; -begin - wbAddGroupOrder(GMST); - wbAddGroupOrder(KYWD); - wbAddGroupOrder(LCRT); - wbAddGroupOrder(AACT); - wbAddGroupOrder(TRNS); - wbAddGroupOrder(CMPO); - wbAddGroupOrder(TXST); - //wbAddGroupOrder(MICN); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(DMGT); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HDPT); - //wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(ASPC); - //wbAddGroupOrder(SKIL); - wbAddGroupOrder(MGEF); - //wbAddGroupOrder(SCPT);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - //wbAddGroupOrder(SCRL); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(TACT); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(STAT); - wbAddGroupOrder(SCOL); - wbAddGroupOrder(MSTT); - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(FLOR); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(LVLN); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(IDLM); - wbAddGroupOrder(NOTE); - wbAddGroupOrder(PROJ); - wbAddGroupOrder(HAZD); - wbAddGroupOrder(BNDS); - //wbAddGroupOrder(SLGM); - wbAddGroupOrder(TERM); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(SPGD); - wbAddGroupOrder(RFCT); - wbAddGroupOrder(REGN); - wbAddGroupOrder(NAVI); - wbAddGroupOrder(CELL); - //wbAddGroupOrder(REFR); - //wbAddGroupOrder(ACHR); - //wbAddGroupOrder(PMIS); - //wbAddGroupOrder(PARW); - //wbAddGroupOrder(PGRE); - //wbAddGroupOrder(PBEA); - //wbAddGroupOrder(PFLA); - //wbAddGroupOrder(PCON); - //wbAddGroupOrder(PBAR); - //wbAddGroupOrder(PHZD); - wbAddGroupOrder(WRLD); - //wbAddGroupOrder(LAND); - //wbAddGroupOrder(NAVM); - //wbAddGroupOrder(TLOD); - //wbAddGroupOrder(DIAL); - //wbAddGroupOrder(INFO); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(LVSP); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); - //wbAddGroupOrder(TOFT); - wbAddGroupOrder(EXPL); - wbAddGroupOrder(DEBR); - wbAddGroupOrder(IMGS); - wbAddGroupOrder(IMAD); - wbAddGroupOrder(FLST); - wbAddGroupOrder(PERK); - wbAddGroupOrder(BPTD); - wbAddGroupOrder(ADDN); - wbAddGroupOrder(AVIF); - wbAddGroupOrder(CAMS); - wbAddGroupOrder(CPTH); - wbAddGroupOrder(VTYP); - wbAddGroupOrder(MATT); - wbAddGroupOrder(IPCT); - wbAddGroupOrder(IPDS); - wbAddGroupOrder(ARMA); - wbAddGroupOrder(ECZN); - wbAddGroupOrder(LCTN); - wbAddGroupOrder(MESG); - //wbAddGroupOrder(RGDL);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(DOBJ); - wbAddGroupOrder(DFOB); - wbAddGroupOrder(LGTM); - wbAddGroupOrder(MUSC); - wbAddGroupOrder(FSTP); - wbAddGroupOrder(FSTS); - wbAddGroupOrder(SMBN); - wbAddGroupOrder(SMQN); - wbAddGroupOrder(SMEN); - wbAddGroupOrder(DLBR); - wbAddGroupOrder(MUST); - wbAddGroupOrder(DLVW); - //wbAddGroupOrder(WOOP); - //wbAddGroupOrder(SHOU); - wbAddGroupOrder(EQUP); - wbAddGroupOrder(RELA); - wbAddGroupOrder(SCEN); - wbAddGroupOrder(ASTP); - wbAddGroupOrder(OTFT); - wbAddGroupOrder(ARTO); - wbAddGroupOrder(MATO); - wbAddGroupOrder(MOVT); - wbAddGroupOrder(SNDR); - wbAddGroupOrder(DUAL); // doesn't exist but can be created in CK - wbAddGroupOrder(SNCT); - wbAddGroupOrder(SOPM); - wbAddGroupOrder(COLL); - wbAddGroupOrder(CLFM); - wbAddGroupOrder(REVB); - wbAddGroupOrder(PKIN); - wbAddGroupOrder(RFGP); - wbAddGroupOrder(AMDL); - wbAddGroupOrder(LAYR); - wbAddGroupOrder(COBJ); - wbAddGroupOrder(OMOD); - wbAddGroupOrder(MSWP); - wbAddGroupOrder(ZOOM); - wbAddGroupOrder(INNR); - wbAddGroupOrder(KSSM); - wbAddGroupOrder(AECH); - wbAddGroupOrder(SCCO); - wbAddGroupOrder(AORU); - wbAddGroupOrder(SCSN); - wbAddGroupOrder(STAG); - wbAddGroupOrder(NOCM); - wbAddGroupOrder(LENS); - //wbAddGroupOrder(LSPR); - wbAddGroupOrder(GDRY); - wbAddGroupOrder(OVIS); -end; - -procedure DefineFO4; -begin - DefineFO4a; - DefineFO4b; - DefineFO4c; - DefineFO4d; - DefineFO4e; - DefineFO4f; - DefineFO4g; - DefineFO4h; - DefineFO4i; - DefineFO4j; - DefineFO4k; - DefineFO4l; - DefineFO4m; - DefineFO4n; - DefineFO4o; - DefineFO4p; - DefineFO4q; - DefineFO4r; - DefineFO4s; - DefineFO4t; - DefineFO4u; - - SetLength(wbOfficialDLC, 6); - wbOfficialDLC[0] := 'DLCRobot.esm'; - wbOfficialDLC[1] := 'DLCWorkshop01.esm'; - wbOfficialDLC[2] := 'DLCCoast.esm'; - wbOfficialDLC[3] := 'DLCWorkshop02.esm'; - wbOfficialDLC[4] := 'DLCWorkshop03.esm'; - wbOfficialDLC[5] := 'DLCNukaWorld.esm'; -end; - -initialization -end. diff --git a/lib/xedit/wbDefinitionsTES3.pas b/lib/xedit/wbDefinitionsTES3.pas deleted file mode 100644 index ec867de..0000000 --- a/lib/xedit/wbDefinitionsTES3.pas +++ /dev/null @@ -1,4962 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} -//------------------------------------------------------------------------------ -// Placeholder for future expansion -//------------------------------------------------------------------------------ -unit wbDefinitionsTES3; - -interface - -uses - wbInterface; - -var - wbPKDTFlags: IwbFlagsDef; - wbServiceFlags: IwbFlagsDef; - - wbAxisEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFunctionsEnum: IwbEnumDef; - wbMagicSchoolEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbOBMEResolutionInfo: IwbEnumDef; - wbPKDTType: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoulGemEnum: IwbEnumDef; - wbSpecializationEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - -procedure DefineTES3; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants; - -const - ACBS : TwbSignature = 'ACBS'; - ACHR : TwbSignature = 'ACHR'; - ACRE : TwbSignature = 'ACRE'; - TRGT : TwbSignature = 'TRGT'; - ACTI : TwbSignature = 'ACTI'; - AIDT : TwbSignature = 'AIDT'; - ALCH : TwbSignature = 'ALCH'; - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - APPA : TwbSignature = 'APPA'; - ARMO : TwbSignature = 'ARMO'; - ATTR : TwbSignature = 'ATTR'; - ATXT : TwbSignature = 'ATXT'; - BMDT : TwbSignature = 'BMDT'; - BNAM : TwbSignature = 'BNAM'; - BOOK : TwbSignature = 'BOOK'; - BSGN : TwbSignature = 'BSGN'; - BTXT : TwbSignature = 'BTXT'; - CELL : TwbSignature = 'CELL'; - CLAS : TwbSignature = 'CLAS'; - CLMT : TwbSignature = 'CLMT'; - CLOT : TwbSignature = 'CLOT'; - CNAM : TwbSignature = 'CNAM'; - CNTO : TwbSignature = 'CNTO'; - CONT : TwbSignature = 'CONT'; - CREA : TwbSignature = 'CREA'; - CSAD : TwbSignature = 'CSAD'; - CSCR : TwbSignature = 'CSCR'; - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSTD : TwbSignature = 'CSTD'; - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - CTDT : TwbSignature = 'CTDT'; - DATA : TwbSignature = 'DATA'; - DATX : TwbSignature = 'DATX'; - DELE : TwbSignature = 'DELE'; - DESC : TwbSignature = 'DESC'; - DIAL : TwbSignature = 'DIAL'; - DNAM : TwbSignature = 'DNAM'; - DOOR : TwbSignature = 'DOOR'; - EDID : TwbSignature = 'EDID'; - EDDX : TwbSignature = 'EDDX'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - ACVA : TwbSignature = 'ACVA'; - EFII : TwbSignature = 'EFII'; - EFXX : TwbSignature = 'EFXX'; - EFIX : TwbSignature = 'EFIX'; - EFME : TwbSignature = 'EFME'; - EFSH : TwbSignature = 'EFSH'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - ESCE : TwbSignature = 'ESCE'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FGGA : TwbSignature = 'FGGA'; - FGGS : TwbSignature = 'FGGS'; - FGTS : TwbSignature = 'FGTS'; - FLOR : TwbSignature = 'FLOR'; - FLTV : TwbSignature = 'FLTV'; - FNAM : TwbSignature = 'FNAM'; - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - GLOB : TwbSignature = 'GLOB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - HAIR : TwbSignature = 'HAIR'; - HCLR : TwbSignature = 'HCLR'; - HEDR : TwbSignature = 'HEDR'; - HNAM : TwbSignature = 'HNAM'; - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLE : TwbSignature = 'IDLE'; - NULL : TwbSignature = 'NULL'; - INAM : TwbSignature = 'INAM'; - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - JNAM : TwbSignature = 'JNAM'; - KEYM : TwbSignature = 'KEYM'; - KFFZ : TwbSignature = 'KFFZ'; - LAND : TwbSignature = 'LAND'; - LIGH : TwbSignature = 'LIGH'; - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LTEX : TwbSignature = 'LTEX'; - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLI : TwbSignature = 'LVLI'; - LVLO : TwbSignature = 'LVLO'; - LVSP : TwbSignature = 'LVSP'; - MAST : TwbSignature = 'MAST'; - MGEF : TwbSignature = 'MGEF'; - MISC : TwbSignature = 'MISC'; - MNAM : TwbSignature = 'MNAM'; - MO2B : TwbSignature = 'MO2B'; - MO2T : TwbSignature = 'MO2T'; - MO3B : TwbSignature = 'MO3B'; - MO3T : TwbSignature = 'MO3T'; - MO4B : TwbSignature = 'MO4B'; - MO4T : TwbSignature = 'MO4T'; - MOD2 : TwbSignature = 'MOD2'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MODB : TwbSignature = 'MODB'; - MODL : TwbSignature = 'MODL'; - MODT : TwbSignature = 'MODT'; - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM9 : TwbSignature = 'NAM9'; - NAME : TwbSignature = 'NAME'; - NIFT : TwbSignature = 'NIFT'; - NIFZ : TwbSignature = 'NIFZ'; - NPC_ : TwbSignature = 'NPC_'; - OFST : TwbSignature = 'OFST'; - OBME : TwbSignature = 'OBME'; - ONAM : TwbSignature = 'ONAM'; - PACK : TwbSignature = 'PACK'; - PFIG : TwbSignature = 'PFIG'; - PFPC : TwbSignature = 'PFPC'; - PGAG : TwbSignature = 'PGAG'; - PGRD : TwbSignature = 'PGRD'; - PGRI : TwbSignature = 'PGRI'; - PGRL : TwbSignature = 'PGRL'; - PGRP : TwbSignature = 'PGRP'; - PGRR : TwbSignature = 'PGRR'; - PKDT : TwbSignature = 'PKDT'; - PKID : TwbSignature = 'PKID'; - PLDT : TwbSignature = 'PLDT'; - PNAM : TwbSignature = 'PNAM'; - PSDT : TwbSignature = 'PSDT'; - PTDT : TwbSignature = 'PTDT'; - QNAM : TwbSignature = 'QNAM'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QSTI : TwbSignature = 'QSTI'; - QSTR : TwbSignature = 'QSTR'; - TPIC : TwbSignature = 'TPIC'; - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RCLR : TwbSignature = 'RCLR'; - RDAT : TwbSignature = 'RDAT'; - RDGS : TwbSignature = 'RDGS'; - RDMD : TwbSignature = 'RDMD'; - RDMP : TwbSignature = 'RDMP'; - RDOT : TwbSignature = 'RDOT'; - RDSD : TwbSignature = 'RDSD'; - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - PLYR : TwbSignature = 'PLYR'; - REGN : TwbSignature = 'REGN'; - RNAM : TwbSignature = 'RNAM'; - ROAD : TwbSignature = 'ROAD'; - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - SBSP : TwbSignature = 'SBSP'; - SCDA : TwbSignature = 'SCDA'; - SCHD : TwbSignature = 'SCHD'; - SCHR : TwbSignature = 'SCHR'; - SCIT : TwbSignature = 'SCIT'; - SCPT : TwbSignature = 'SCPT'; - SCRI : TwbSignature = 'SCRI'; - SCRO : TwbSignature = 'SCRO'; - SCRV : TwbSignature = 'SCRV'; - SCTX : TwbSignature = 'SCTX'; - SCVR : TwbSignature = 'SCVR'; - SGST : TwbSignature = 'SGST'; - SKIL : TwbSignature = 'SKIL'; - SLCP : TwbSignature = 'SLCP'; - SLGM : TwbSignature = 'SLGM'; - SLSD : TwbSignature = 'SLSD'; - SNAM : TwbSignature = 'SNAM'; - SNDD : TwbSignature = 'SNDD'; - SNDX : TwbSignature = 'SNDX'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPEL : TwbSignature = 'SPEL'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - STAT : TwbSignature = 'STAT'; - TCLF : TwbSignature = 'TCLF'; - TCLT : TwbSignature = 'TCLT'; - TES3 : TwbSignature = 'TES3'; - TNAM : TwbSignature = 'TNAM'; - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - UNAM : TwbSignature = 'UNAM'; - VCLR : TwbSignature = 'VCLR'; - VHGT : TwbSignature = 'VHGT'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - WATR : TwbSignature = 'WATR'; - WEAP : TwbSignature = 'WEAP'; - WLST : TwbSignature = 'WLST'; - WNAM : TwbSignature = 'WNAM'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - XACT : TwbSignature = 'XACT'; - XCCM : TwbSignature = 'XCCM'; - XCHG : TwbSignature = 'XCHG'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMT : TwbSignature = 'XCMT'; - XCNT : TwbSignature = 'XCNT'; - XCWT : TwbSignature = 'XCWT'; - XESP : TwbSignature = 'XESP'; - XGLB : TwbSignature = 'XGLB'; - XHLT : TwbSignature = 'XHLT'; - XHRS : TwbSignature = 'XHRS'; - XLCM : TwbSignature = 'XLCM'; - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XNAM : TwbSignature = 'XNAM'; - XOWN : TwbSignature = 'XOWN'; - XPCI : TwbSignature = 'XPCI'; - XRGD : TwbSignature = 'XRGD'; - XRNK : TwbSignature = 'XRNK'; - XRTM : TwbSignature = 'XRTM'; - XSCL : TwbSignature = 'XSCL'; - XSED : TwbSignature = 'XSED'; - XSOL : TwbSignature = 'XSOL'; - XTEL : TwbSignature = 'XTEL'; - XTRG : TwbSignature = 'XTRG'; - XXXX : TwbSignature = 'XXXX'; - ZNAM : TwbSignature = 'ZNAM'; - -var - wbEDID: IwbSubRecordDef; - wbXOWN: IwbSubRecordDef; - wbXGLB: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbSLSD: IwbSubRecordDef; - wbBodyDataIndex: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordDef; - wbCNTOs: IwbSubRecordArrayDef; - wbCSDT: IwbSubRecordStructDef; - wbCSDTs: IwbSubRecordArrayDef; - wbFULL: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbXNAM: IwbSubRecordDef; - wbXNAMs: IwbSubRecordArrayDef; - wbDESC: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot : IwbSubRecordDef; - wbPosRot : IwbStructDef; - wbMODL: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordUnionDef; - wbSCHR: IwbSubRecordUnionDef; - wbCTDAs: IwbSubRecordArrayDef; - wbSCROs: IwbSubRecordArrayDef; - wbPGRP: IwbSubRecordDef; - wbResultScript: IwbSubRecordStructDef; -// wbResultScriptOld: IwbSubRecordStructDef; - wbSCRI: IwbSubRecordDef; - wbFaceGen: IwbSubRecordStructDef; - wbENAM: IwbSubRecordDef; - wbFGGS: IwbSubRecordDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIDOBME: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEFITOBME: IwbSubRecordDef; - wbEFIX: IwbSubRecordDef; - wbSCIT: IwbSubRecordStructDef; - wbSCITOBME: IwbSubRecordStructDef; - wbEffects: IwbSubRecordUnionDef; - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ); -end; - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaType(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and $F0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.ToString(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $F0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.Check(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not $80 of - 0: Result := 'Lower Body'; - 1: Result := 'Left Arm'; - 2: Result := 'Left Hand'; - 3: Result := 'Right Arm'; - 4: Result := 'Special Idle'; - 5: Result := 'Whole Body'; - 6: Result := 'Upper Body'; - else - Result := ''; - end; - - if (aInt and $80) = 0 then - Result := Result + ', Must return a file'; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - end; - ctCheck: begin - case aInt and not $80 of - 0..6: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbWthrDataClassification(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not 192 of - 0: Result := 'None'; - 1: Result := 'Pleasant'; - 2: Result := 'Cloudy'; - 3: Result := 'Rainy'; - 4: Result := 'Snow'; - else - Result := ''; - end; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2) - end; - ctCheck: begin - case aInt and not 192 of - 0..4: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbGLOBFNAM(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt of - Ord('s'): Result := 'Short'; - Ord('l'): Result := 'Long'; - Ord('f'): Result := 'Float'; - else - Result := ''; - end; - end; - ctToSortKey: Result := Chr(aInt); - ctCheck: begin - case aInt of - Ord('s'), Ord('l'), Ord('f'): Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; -end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; - 'f': Result := 2; - end; - end; -end; - -function wbMISCActorValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - MainRecord : IwbMainRecord; -begin - Result := 0; - - if not Assigned(aElement) then - Exit; - - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - - if (MainRecord.Flags._Flags and $000000C0) = $000000C0 then - Result := 1; -end; - -function wbXLOCFillerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Container.DataSize = 16 then - Result := 1; -end; - -function wbPACKPKDTDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 1; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Container.DataSize = 4 then - Result := 0; -end; - -function wbREFRXSEDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Container.DataSize = 4 then - Result := 1; -end; - - -type - TCTDAFunctionParamType = ( - ptNone, - ptInteger, - ptVariableName, //Integer - ptSex, //Enum: Male, Female - ptActorValue, //Enum: wbActorValue - ptCrimeType, //?? Enum - ptAxis, //?? Char - ptFormType, //?? Enum - ptQuestStage, - - ptObjectReference, //REFR, ACHR, ACRE, PGRE - ptInventoryObject, //ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, ARMA - ptActor, //ACHR, ACRE - ptQuest, //QUST - ptFaction, //FACT - ptCell, //CELL - ptClass, //CLAS - ptRace, //RACE - ptActorBase, //NPC_, CREA - ptGlobal, //GLOB - ptWeather, //WTHR - ptPackage, //PACK - ptOwnerOpt, //FACT, NPC_ - ptBirthsign, //BSGN - ptFurniture, //FURN - ptMagicItem, //SPEL - ptMagicEffect, //MGEF - ptWorldspace, //WRLD - ptReferencableObject - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - end; - -const - wbCTDAFunctions : array[0..168] of TCTDAFunction = ( - (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), - (Index: 5; Name: 'GetLocked'), - (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), - (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), - (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), - (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), - (Index: 12; Name: 'GetSecondsPassed'), - (Index: 14; Name: 'GetActorValue'; ParamType1: ptActorValue), - (Index: 18; Name: 'GetCurrentTime'), - (Index: 24; Name: 'GetScale'), - (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), - (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), - (Index: 35; Name: 'GetDisabled'), - (Index: 36; Name: 'MenuMode'; ParamType1: ptInteger), - (Index: 39; Name: 'GetDisease'), - (Index: 40; Name: 'GetVampire'), - (Index: 41; Name: 'GetClothingValue'), - (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), - (Index: 43; Name: 'SameRace'; ParamType1: ptActor), - (Index: 44; Name: 'SameSex'; ParamType1: ptActor), - (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), - (Index: 46; Name: 'GetDead'), - (Index: 47; Name: 'GetItemCount'; ParamType1: ptInventoryObject), - (Index: 48; Name: 'GetGold'), - (Index: 49; Name: 'GetSleeping'), - (Index: 50; Name: 'GetTalkedToPC'), - (Index: 53; Name: 'GetScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), - (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), - (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), - (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), - (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), - (Index: 61; Name: 'GetAlarmed'), - (Index: 62; Name: 'IsRaining'), - (Index: 63; Name: 'GetAttacked'), - (Index: 64; Name: 'GetIsCreature'), - (Index: 65; Name: 'GetLockLevel'), - (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), - (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), - (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), - (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), - (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), - (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), - (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), - (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), - (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), - (Index: 75; Name: 'IsSnowing'), - (Index: 76; Name: 'GetDisposition'; ParamType1: ptActor), - (Index: 77; Name: 'GetRandomPercent'), - (Index: 79; Name: 'GetQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), - (Index: 80; Name: 'GetLevel'), - (Index: 81; Name: 'GetArmorRating'), - (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), - (Index: 91; Name: 'GetIsAlerted'), - (Index: 98; Name: 'GetPlayerControlsDisabled'), - (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), - (Index: 101; Name: 'IsWeaponOut'), - (Index: 102; Name: 'IsTorchOut'), - (Index: 103; Name: 'IsShieldOut'), - (Index: 104; Name: 'IsYielding'), - (Index: 106; Name: 'IsFacingUp'), - (Index: 107; Name: 'GetKnockedState'), - (Index: 108; Name: 'GetWeaponAnimType'), - (Index: 109; Name: 'GetWeaponSkillType'), - (Index: 110; Name: 'GetCurrentAIPackage'), - (Index: 111; Name: 'IsWaiting'), - (Index: 112; Name: 'IsIdlePlaying'), - (Index: 116; Name: 'GetCrimeGold'), - (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), - (Index: 125; Name: 'IsGuard'), - (Index: 127; Name: 'CanPayCrimeGold'), - (Index: 128; Name: 'GetFatiguePercentage'), - (Index: 129; Name: 'GetPCIsClass'; ParamType1: ptClass), - (Index: 130; Name: 'GetPCIsRace'; ParamType1: ptRace), - (Index: 131; Name: 'GetPCIsSex'; ParamType1: ptSex), - (Index: 132; Name: 'GetPCInFaction'; ParamType1: ptFaction), - (Index: 133; Name: 'SameFactionAsPC'), - (Index: 134; Name: 'SameRaceAsPC'), - (Index: 135; Name: 'SameSexAsPC'), - (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), - (Index: 141; Name: 'IsTalking'), - (Index: 142; Name: 'GetWalkSpeed'), - (Index: 143; Name: 'GetCurrentAIProcedure'), - (Index: 144; Name: 'GetTrespassWarningLevel'), - (Index: 145; Name: 'IsTrespassing'), - (Index: 146; Name: 'IsInMyOwnedCell'), - (Index: 147; Name: 'GetWindSpeed'), - (Index: 148; Name: 'GetCurrentWeatherPercent'), - (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), - (Index: 150; Name: 'IsContinuingPackagePCNear'), - (Index: 153; Name: 'CanHaveFlames'), - (Index: 154; Name: 'HasFlames'), - (Index: 157; Name: 'GetOpenState'), - (Index: 159; Name: 'GetSitting'), - (Index: 160; Name: 'GetFurnitureMarkerID'), - (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), - (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), - (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), - (Index: 170; Name: 'GetDayOfWeek'), - (Index: 171; Name: 'IsPlayerInJail'), - (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), - (Index: 175; Name: 'IsPCSleeping'), - (Index: 176; Name: 'IsPCAMurderer'), - (Index: 180; Name: 'GetDetectionLevel'; ParamType1: ptActor), - (Index: 182; Name: 'GetEquipped'; ParamType1: ptInventoryObject), - (Index: 185; Name: 'IsSwimming'), - (Index: 190; Name: 'GetAmountSoldStolen'), - (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), - (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), - (Index: 197; Name: 'GetPCFactionSteal'; ParamType1: ptFaction), - (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), - (Index: 201; Name: 'GetPCFactionSubmitAuthority'; ParamType1: ptFaction), - (Index: 203; Name: 'GetDestroyed'), - (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), - (Index: 215; Name: 'GetDoorDefaultOpen'), - (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), - (Index: 224; Name: 'GetIsPlayerBirthsign'; ParamType1: ptBirthsign), - (Index: 225; Name: 'GetPersuasionNumber'), - (Index: 227; Name: 'HasVampireFed'), - (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), - (Index: 229; Name: 'GetClassDefaultMatch'), - (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), - (Index: 237; Name: 'GetIsGhost'), - (Index: 242; Name: 'GetUnconscious'), - (Index: 244; Name: 'GetRestrained'), - (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), - (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), - (Index: 249; Name: 'GetPCFame'), - (Index: 251; Name: 'GetPCInfamy'), - (Index: 254; Name: 'GetIsPlayableRace'), - (Index: 255; Name: 'GetOffersServicesNow'), - (Index: 258; Name: 'GetUsedItemLevel'), - (Index: 259; Name: 'GetUsedItemActivate'), - (Index: 264; Name: 'GetBarterGold'), - (Index: 265; Name: 'IsTimePassing'), - (Index: 266; Name: 'IsPleasant'), - (Index: 267; Name: 'IsCloudy'), - (Index: 274; Name: 'GetArmorRatingUpperBody'), - (Index: 277; Name: 'GetBaseActorValue'; ParamType1: ptActorValue), - (Index: 278; Name: 'IsOwner'; ParamType1: ptOwnerOpt), - (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwnerOpt), - (Index: 282; Name: 'IsHorseStolen'), - (Index: 285; Name: 'IsLeftUp'), - (Index: 286; Name: 'IsSneaking'), - (Index: 287; Name: 'IsRunning'), - (Index: 288; Name: 'GetFriendHit'; ParamType1: ptActor), - (Index: 289; Name: 'IsInCombat'), - (Index: 300; Name: 'IsInInterior'), - (Index: 305; Name: 'GetInvestmentGold'), - (Index: 306; Name: 'IsActorUsingATorch'), - (Index: 309; Name: 'IsXBox'), - (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldSpace), - (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptInteger), - (Index: 313; Name: 'IsActorEvil'), - (Index: 314; Name: 'IsActorAVictim'), - (Index: 315; Name: 'GetTotalPersuasionNumber'), - (Index: 318; Name: 'GetIdleDoneOnce'), - (Index: 320; Name: 'GetNoRumors'), - (Index: 323; Name: 'WhichServiceMenu'), - (Index: 327; Name: 'IsRidingHorse'), - (Index: 329; Name: 'IsTurnArrest'), - (Index: 332; Name: 'IsInDangerousWater'), - (Index: 338; Name: 'GetIgnoreFriendlyHits'), - (Index: 339; Name: 'IsPlayersLastRiddenHorse'), - (Index: 353; Name: 'IsActor'), - (Index: 354; Name: 'IsEssential'), - (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), - (Index: 361; Name: 'GetTimeDead'), - (Index: 362; Name: 'GetPlayerHasLastRiddenHorse'), - (Index: 365; Name: 'GetPlayerInSEWorld') - ); - -var - wbCTDAFunctionEditInfo : string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbEFITOBMEParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ParamInfo: Variant; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ParamInfo := Container.ElementNativeValues['..\EFME\EFIT Param Info']; - if VarIsNull(ParamInfo) or VarIsEmpty(ParamInfo) then - else - Result := ParamInfo; -end; - -function wbEFIXParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ParamInfo: Variant; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ParamInfo := Container.ElementNativeValues['..\EFME\EFIX Param Info']; - if VarIsNull(ParamInfo) or VarIsEmpty(ParamInfo) then - else - Result := ParamInfo; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType1)); -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType2)); -end; -{ -function wbCTDAFunction(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc: PCTDAFunction; -begin - Result := ''; - case aType of - ctToStr: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - end; -end; -} -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -function wbCTDAParam2VariableNameToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - Variables : TStringList; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - MainRecord := nil; - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; -{ if Param1.NativeValue = 0 then - if Supports(Container.Container, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[i], IwbContainerElementRef, Container2) then - if SameText(Container2.ElementValues['Function'], 'GetIsID') then begin - Param1 := Container2.ElementByName['Parameter #1']; - if Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Break; - end;} - - if not Assigned(MainRecord) then - Exit; - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - Variables := TStringList.Create; - else - Variables := nil; - end; - try - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if Assigned(Variables) then - Variables.AddObject(s, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := s; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - Variables.Sort; - Result := Variables.CommaText; - end; - end; - finally - FreeAndNil(Variables); - end; -end; - -function wbCTDAParam2VariableNameToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - Result := StrToInt64Def(aString, Low(Cardinal)); - if Result <> Low(Cardinal) then - Exit; - - if not Assigned(aElement) then - raise Exception.Create('aElement not specified'); - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - raise Exception.Create('Container not assigned'); - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - raise Exception.Create('Could not find "Parameter #1"'); - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - raise Exception.Create('"Parameter #1" does not reference a valid main record'); - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not contain a SCRI subrecord'); - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not have a valid script'); - - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if SameText(s, Trim(aString)) then begin - Result := j; - Exit; - end; - end; - end; - - raise Exception.Create('Variable "'+aString+'" was not found in "'+MainRecord.ShortName+'"'); -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if Supports(aElement, IwbContainer, Container) then begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; - i : Integer; - IsInterior : Boolean; - GroupRecord : IwbGroupRecord; - Removed : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DATA'] then - Exit; - - IsInterior := (Container.ElementNativeValues['DATA'] and 1) <> 0; - - if IsInterior then - Container.Add('XCLL') - else begin - Container.Add('XCLC'); - if (Container.ElementNativeValues['DATA'] and 2) = 0 then - if Supports(MainRecord.Container, IwbGroupRecord, GroupRecord) then - if GroupRecord.GroupType = 1 then - Container.ElementNativeValues['DATA'] := - Container.ElementNativeValues['DATA'] or 2; - end; - - Removed := False; - if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin - for i:= Pred(Container2.ElementCount) downto 0 do - if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then begin - if not Removed then begin - Removed := True; - Container2.MarkModifiedRecursive; - end; - Container2.RemoveElement(i); - end; - if Container2.ElementCount < 1 then - Container2.Remove; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMGEFAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - _File : IwbFile; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - _File := MainRecord._File; - - if not Assigned(_File) then - Exit; - - if not SameText(_File.FileName, 'Oblivion.esm') then - Exit; - - if SameText(MainRecord.EditorID, 'RSFI') or - SameText(MainRecord.EditorID, 'RSFR') or - SameText(MainRecord.EditorID, 'RSPA') or - SameText(MainRecord.EditorID, 'RSSH') then begin - - Container.ElementNativeValues['DATA - Data\Flags'] := - Cardinal(Container.ElementNativeValues['DATA - Data\Flags']) or $8; - - end; - - if SameText(MainRecord.EditorID, 'REAN') then begin - - Container.ElementNativeValues['DATA - Data\Flags'] := - Cardinal(Container.ElementNativeValues['DATA - Data\Flags']) and not $20000; - - end; - - finally - wbEndInternalEdit; - end; -end; - - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Container.ElementCount < 1 then - Exit; - - Element := Container.ElementByName['Magic effect name']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - - if (MainRecord.ElementNativeValues['DATA - Data\Flags'] and $01000000) = 0 then - Exit; - - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Assoc. Item']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Container.ElementCount < 1 then - Exit; - - Container.RemoveElement('XPCI'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbLVLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Chance : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('DATA'); - - Chance := Container.ElementNativeValues['LVLD']; - if (Chance and $80) <> 0 then begin - Chance := Chance and not $80; - Container.ElementNativeValues['LVLD'] := Chance; - Container.ElementNativeValues['LVLF'] := Container.ElementNativeValues['LVLF'] or $01; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container : IwbContainer; - a, b : Single; - NeedsFlip : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainer, Container) then - Exit; - - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := (Container.Elements[0] as IwbContainer).Elements[0].NativeValue; - b := (Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].NativeValue; - case CompareValue(a, b) of - EqualsValue: begin - a := (Container.Elements[0] as IwbContainer).Elements[1].NativeValue; - b := (Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].NativeValue; - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRDAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Points : IwbContainerElementRef; - Connections : IwbContainerElementRef; - i, j : Integer; - Point : IwbContainerElementRef; - Connection : IwbContainerElementRef; - Removed : Boolean; - FirstRemoved: Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Supports(Container.ElementBySignature['PGRP'], IwbContainerElementRef, Points) then - Exit; - - if not Container.ElementExists['PGAG'] then - Container.Add('PGAG').DataSize := (Points.ElementCount + 7) div 8; - - MainRecord.IsCompressed := True; - - if not Supports(Container.ElementBySignature['PGRR'], IwbContainerElementRef, Connections) then - Exit; - - if Points.ElementCount < Connections.ElementCount then - Exit; - - FirstRemoved := False; - for i := Pred(Connections.ElementCount) downto 0 do begin - Connection := Connections.Elements[i] as IwbContainerElementRef; - - Removed := False; - j := Connection.ElementCount; - while j > 0 do begin - Dec(j); - if Connection.Elements[j].NativeValue = 65535 then begin - if not FirstRemoved then begin - FirstRemoved := True; - Connections.MarkModifiedRecursive; - end; - Connection.Elements[j].Remove; - Removed := True; - end else - Break; - end; - - if Removed then begin - Point := Points.Elements[i] as IwbContainerElementRef; - Point.ElementNativeValues['Connections'] := Connection.ElementCount; - end; - - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRRPointAfterLoad(const aElement: IwbElement); -var - Connections : IwbContainerElementRef; - i : Integer; -// Index : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Connections) then - Exit; - for i := Pred(Connections.ElementCount) downto 0 do - if Connections.Elements[i].NativeValue = 65535 then begin - Connections.RemoveElement(i); - end; -{ if Removed then begin - Index := aElement.Container.ElementCount; - (aElement.ContainingMainRecord.RecordBySignature['PGRP'].Elements[Index] as IwbContainer).Elements[3].NativeValue := Connections.ElementCount; - end;} - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRIPointerAfterLoad(const aElement: IwbElement); -var - Connections : IwbContainerElementRef; - i, j : Integer; - s : string; - Keys : TStringList; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Connections) then - Exit; - - Keys := TStringList.Create; - try - Keys.Sorted := True; - Keys.Duplicates := dupError; - for i := Pred(Connections.ElementCount) downto 0 do begin - s := Connections.Elements[i].SortKey[True]; - if Keys.Find(s, j) then - Connections.RemoveElement(i, True) - else - Keys.Add(s); - end; - finally - Keys.Free; - end; - finally - wbEndInternalEdit; - end; -end; - -{ -function wbPGRPConnectionsCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Point : IwbContainerElementRef; - s : string; - i : Integer; - PGRP : IwbContainerElementRef; - PGRD : IwbMainRecord; - PGRR : IwbContainerElementRef; - Cons : IwbContainerElementRef; -begin - Result := ''; - if aType = ctCheck then - Exit; - - if wbFixupPGRD and (aInt > 0) and Assigned(aElement) and (aElement.ElementStates * [esModified] = []) then begin - Point := aElement.Container as IwbContainerElementRef; - if Assigned(Point) then begin - s := Trim(Point.Name); - i := Pos('#', s); - if i > 0 then begin - i := StrToIntDef(Copy(s, i+1, High(Integer)), -1); - if i >= 0 then begin - PGRP := Point.Container as IwbContainerElementRef; - if Assigned(PGRP) then begin - if Supports(PGRP.Container, IwbMainRecord, PGRD) then begin - if (csInitDone in PGRD.ContainerStates) and (PGRD.Signature = 'PGRD') then begin - PGRR := PGRD.RecordBySignature['PGRR'] as IwbContainerElementRef; - if Assigned(PGRR) and (PGRR.ElementCount > 0) and (csInitDone in PGRR.ContainerStates) then begin - if (i < PGRR.ElementCount) then begin - if Supports(PGRR.Elements[i], IwbContainer, Cons) then begin - aInt := Cons.ElementCount; - end; - end; - end; - PGRR := nil; - end; - end; - end; - end; - end; - end; - end; - - if aType = ctToSortKey then - Result := IntToHex64(aInt, 2) - else if aType = ctToStr then - Result := IntToStr(aInt); -end; -} - -function wbPxDTLocationDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Type'].NativeValue; -end; - -function wbCalcPGRRSize(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Index: Integer; -begin - Index := aElement.Container.ElementCount; - Result := ((aElement.Container.Container as IwbMainRecord).RecordBySignature['PGRP'].Elements[Pred(Index)] as IwbContainer).Elements[3].NativeValue; -end; - -function wbMGEFFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - s: string; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - s := Container.ElementByName['Flags'].SortKey[False]; - if s[17] = '1' then - Result := 1 - else if s[18] = '1' then - Result := 2 - else if s[19] = '1' then - Result := 3 - else if s[25] = '1' then - Result := 4; -end; - -function wbEDDXDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := True; - - if Supports(aElement.Container, IwbMainRecord, MainRecord) then - Result := not Assigned(MainRecord.ElementBySignature[OBME]); -end; - -function wbOBMEDontShow(const aElement: IwbElement): Boolean; -var - _File: IwbFile; -begin - if not Assigned(aElement) then begin - Result := True; - Exit; - end; - - Result := False; - - _File := aElement._File; - if Assigned(_File) and SameText(_File.FileName, 'Oblivion.esm') then - Result := True; -end; - -procedure DefineTES3; -begin - wbHeaderSignature := 'TES3'; - - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags([ - {0x00000001}'ESM', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'Deleted', - {0x00000040}'Border Region / Actor Value', - {0x00000080}'Turn Off Fire / Actor Value', - {0x00000100}'', - {0x00000200}'Casts shadows', - {0x00000400}'Quest item / Persistent reference / Show in Menu', - {0x00000800}'Initially disabled', - {0x00001000}'Ignored', - {0x00002000}'', - {0x00004000}'', - {0x00008000}'Visible when distant', - {0x00010000}'', - {0x00020000}'Dangerous / Off limits (Interior cell)', - {0x00040000}'Compressed ', - {0x00080000}'Can''t wait' - ])); - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbByteArray('Unknown', 4, cpIgnore) - ]); - - wbSizeOfMainRecordStruct := 20; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - - wbEDID := wbString(EDID, 'Editor ID', 0, cpBenign); - wbFULL := wbString(FULL, 'Name', 0, cpTranslate); - wbFULLReq := wbString(FULL, 'Name', 0, cpNormal, True); - wbDESC := wbString(DESC, 'Description', 0, cpTranslate); - wbXSCL := wbFloat(XSCL, 'Scale'); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(MODT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, cpBenign) - ], []); - - wbSCRI := wbFormIDCk(SCRI, 'Script', [SCPT]); - wbENAM := wbFormIDCk(ENAM, 'Enchantment', [ENCH]); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', [PLYR, REFR, ACRE, ACHR]), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent' - ])), - wbByteArray('Unused', 3) - ]); - - wbRecord(ACHR, 'Placed NPC', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbRStruct('Unused', [ - wbFormIDCk(XPCI, 'Unused', [CELL]), - wbString(FULL, 'Unused') - ], []), - wbXLOD, - wbXESP, - wbFormIDCk(XMRC, 'Merchant container', [REFR], True), - wbFormIDCk(XHRS, 'Horse', [ACRE], True), - wbXRGD, - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbXOWN := wbFormIDCk(XOWN, 'Owner', [FACT, NPC_]); - wbXGLB := wbFormIDCk(XGLB, 'Global variable', [GLOB]); - - wbRecord(ACRE, 'Placed Creature', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [CREA], False, cpNormal, True), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], []), - wbXESP, - wbXRGD, - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(ACTI, 'Activator', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ]); - - wbICON := wbString(ICON, 'Icon filename'); - - wbActorValueEnum := - wbEnum([ - 'Strength', - 'Intelligence', - 'Willpower', - 'Agility', - 'Speed', - 'Endurance', - 'Personality', - 'Luck', - 'Health', - 'Magicka', - 'Fatigue', - 'Encumbrance', - 'Armorer', - 'Athletics', - 'Blade', - 'Block', - 'Blunt', - 'Hand To Hand', - 'Heavy Armor', - 'Alchemy', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration', - 'Acrobatics', - 'Light Armor', - 'Marksman', - 'Mercantile', - 'Security', - 'Sneak', - 'Speechcraft', - {33} 'Aggression', - {34} 'Confidence', - {35} 'Energy', - {36} 'Responsibility', - {37} 'Bounty', - {38} 'Fame', - {39} 'Infamy', - {40} 'Magicka Multiplier', - {41} 'Night Eye Bonus', - {42} 'Attack Bonus', - {43} 'Defend Bonus', - {44} 'Casting Penalty', - {45} 'Blindness', - {46} 'Chameleon', - {47} 'Invisibility', - {48} 'Paralysis', - {49} 'Silence', - {50} 'Confusion', - {51} 'Detect Item Range', - {52} 'Spell Absorb Chance', - {53} 'Spell Reflect Chance', - {54} 'Swim Speed Multiplier', - {55} 'Water Breathing', - {56} 'Water Walking', - {57} 'Stunted Magicka', - {58} 'Detect Life Range', - {59} 'Reflect Damage', - {60} 'Telekinesis', - {61} 'Resist Fire', - {62} 'Resist Frost', - {63} 'Resist Disease', - {64} 'Resist Magic', - {65} 'Resist Normal Weapons', - {66} 'Resist Paralysis', - {67} 'Resist Poison', - {68} 'Resist Shock', - {69} 'Vampirism', - {70} 'Darkness', - {71} 'Resist Water Damage' - ], [ - -1, 'None' - ]); - - wbSkillEnum := - wbEnum([ - 'Armorer', - 'Athletics', - 'Blade', - 'Block', - 'Blunt', - 'Hand To Hand', - 'Heavy Armor', - 'Alchemy', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration', - 'Acrobatics', - 'Light Armor', - 'Marksman', - 'Mercantile', - 'Security', - 'Sneak', - 'Speechcraft' - ], [ - -1, 'None' - ]); - - - wbEFID := wbInteger(EFID, 'Magic effect name', itU32, wbChar4, cpNormal, True); - - wbEFIDOBME := wbStringMgefCode(EFID, 'Magic Effect Code', 4, cpNormal, True); - - wbEFIT := - wbStructSK(EFIT, [4, 5], '', [ - wbInteger('Magic effect name', itU32, wbChar4), - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbInteger('Actor Value', itS32, wbActorValueEnum) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbEFITOBME := - wbStructSK(EFIT, [4, 5], '', [ - wbStringMgefCode('Magic Effect Code', 4), - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbUnion('Param #1', wbEFITOBMEParamDecider, [ - wbByteArray('Param #1 - Unknown Type', 4), - wbFormID('Param #1 - FormID'), - wbStringMgefCode('Param #1 - Magic Effect Code', 4), - wbFormIDCk('Param #1 - Actor Value', [ACVA]) - ]) - ], cpNormal, True, nil, -1{, wbEFITAfterLoad}); - - wbEFIX := - wbStructSK(EFIX, [3], '', [ - wbInteger('Override Mask', itU32, wbFlags([])), - wbInteger('Flags', itU32, wbFlags([])), - wbFloat('Base Cost'), - wbUnion('Param #2', wbEFIXParamDecider, [ - wbByteArray('Param #2 - Unknown Type', 4), - wbFormID('Param #2 - FormID'), - wbStringMgefCode('Param #2 - Magic Effect Code', 4), - wbFormIDCk('Param #2 - Actor Value', [ACVA]) - ]) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbMagicSchoolEnum := - wbEnum([ - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration' - ]); - - wbSCIT := - wbRStructSK([0], 'Script effect', [ - wbStructSK(SCIT, [0], 'Script effect data', [ - wbFormIDCk('Script effect', [NULL, SCPT]), - wbInteger('Magic school', itU32, wbMagicSchoolEnum), - wbInteger('Visual effect name', itU32, wbChar4), - wbInteger('Flags', itU8, wbFlags(['Hostile'])), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFULLReq - ], []); - - wbSCITOBME := - wbRStructSK([0], 'Script effect', [ - wbStructSK(SCIT, [0], 'Script effect data', [ - wbFormIDCk('Script effect', [NULL, SCPT]), - wbInteger('Magic school', itU32, wbMagicSchoolEnum), - wbStringMgefCode('Visual Effect Code', 4), - wbInteger('Flags', itU8, wbFlags(['Hostile'])), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFULLReq - ], []); - - - wbOBMEResolutionInfo := wbEnum(['None', 'FormID', 'Magic Effect Code', 'Actor Value']); - - wbEffects := - wbRUnion('Effects', [ - wbRStruct('Effects', [ - wbRStructs('Effects','Effect', [ - wbEFID, - wbEFIT, - wbSCIT - ], []) - ], []), - wbRStruct('Effects', [ - wbRStructs('Effects','Effect', [ - wbStruct(EFME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbInteger('EFIT Param Info', itU8, wbOBMEResolutionInfo), - wbInteger('EFIX Param Info', itU8, wbOBMEResolutionInfo), - wbByteArray('Unused', $0A) - ]), - wbEFIDOBME, - wbEFITOBME, - wbSCITOBME, - wbString(EFII, 'Icon'), - wbEFIX - ], []), - wbEmpty(EFXX, 'Effects End Marker', cpNormal, True), - wbFULLReq - ], []) - ], []); - - wbRecord(ALCH, 'Potion', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, '', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(AMMO, 'Ammunition', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbFormIDCk(ENAM, 'Enchantment', [ENCH]), - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(DATA, '', [ - wbFloat('Speed'), - wbInteger('Flags', itU8, wbFlags(['Ignores Normal Weapon Resistance'])), - wbByteArray('Unused', 3), - wbInteger('Value', itU32), - wbFloat('Weight'), - wbInteger('Damage', itU16) - ], cpNormal, True) - ]); - - wbRecord(ANIO, 'Animated Object', [ - wbEDID, - wbMODL, - wbFormIDCk(DATA, 'IDLE animation', [IDLE], False, cpNormal, True) - ]); - - wbRecord(APPA, 'Alchemical Apparatus', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum(['Mortar and Pestle', 'Alembic', 'Calcinator', 'Retort'])), - wbInteger('Value', itU32), - wbFloat('Weight'), - wbFloat('Quality') - ], cpNormal, True) - ]); - - wbRecord(ARMO, 'Armor', [ - wbEDID, - wbFULL, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(BMDT, '', [ - wbInteger('Biped Flags', itU16, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Lower Body', - {0x00000010} 'Hand', - {0x00000020} 'Foot', - {0x00000040} 'Right Ring', - {0x00000080} 'Left Ring', - {0x00000100} 'Amulet', - {0x00000200} 'Weapon', - {0x00000400} 'Back Weapon', - {0x00000800} 'Side Weapon', - {0x00001000} 'Quiver', - {0x00002000} 'Shield', - {0x00004000} 'Torch', - {0x00008000} 'Tail' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} 'Hide Rings', - {0x0002} 'Hide Amulets', - {0x0004} '', - {0x0008} '', - {0x0010} '', - {0x0020} '', - {0x0040} 'Non-Playable', - {0x0080} 'Heavy armor' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbFloat(MO2B, 'Bound Radius', cpBenign), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICON, 'Male icon filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename'), - wbFloat(MO3B, 'Bound Radius', cpBenign), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbFloat(MO4B, 'Bound Radius', cpBenign), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICO2, 'Female icon filename'), - wbStruct(DATA, '', [ - wbInteger('Armor', itU16, wbDiv(100)), - wbInteger('Value', itU32), - wbInteger('Health', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbRecord(BOOK, 'Book', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbDESC, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['Scroll', 'Can''t be taken'])), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ], True); - - wbSPLO := wbFormIDCk(SPLO, 'Spell', [SPEL, LVSP]); - wbSPLOs := wbRArrayS('Spells', wbSPLO); - - wbRecord(BSGN, 'Birthsign', [ - wbEDID, - wbFULL, - wbICON, - wbDESC, - wbSPLOs - ]); - - wbRecord(CELL, 'Cell', [ - wbEDID, - wbFULL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Is Interior Cell', - {0x02} 'Has water', - {0x04} 'Invert Fast Travel behavior', - {0x08} 'Force hide land (exterior cell) / Oblivion interior (interior cell)', - {0x10} '', - {0x20} 'Public place', - {0x40} 'Hand changed', - {0x80} 'Behave like exterior' - ]), cpNormal, True), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct(XCLL, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade', cpNormal, False, 1, -1, nil, nil, 1.0), - wbFloat('Fog Clip Dist') - ]), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbInteger(XCMT, 'Music', itU8, wbMusicEnum), - wbFloat(XCLW, 'Water Height', cpBenign), - wbFormIDCk(XCCM, 'Climate', [CLMT]), - wbFormIDCk(XCWT, 'Water', [WATR]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], [XCLW, XCMT]) - ], True, wbCellAddInfo, cpNormal, False, wbCELLAfterLoad); - - wbServiceFlags := - wbFlags([ - {0x00000001} 'Weapons', - {0x00000002} 'Armor', - {0x00000004} 'Clothing', - {0x00000008} 'Books', - {0x00000010} 'Ingredients', - {0x00000020} '', - {0x00000040} '', - {0x00000080} 'Lights', - {0x00000100} 'Apparatus', - {0x00000200} '', - {0x00000400} 'Miscellaneous', - {0x00000800} 'Spells', - {0x00001000} 'Magic Items', - {0x00002000} 'Potions', - {0x00004000} 'Training', - {0x00008000} '', - {0x00010000} 'Recharge', - {0x00020000} 'Repair' - ]); - - wbSpecializationEnum := wbEnum(['Combat', 'Magic', 'Stealth']); - - wbRecord(CLAS, 'Class', [ - wbEDID, - wbFULL, - wbDESC, - wbICON, - wbStruct(DATA, '', [ - wbArrayS('Primary Attributes', wbInteger('Primary Attribute', itS32, wbActorValueEnum), 2), - wbInteger('Specialization', itU32, wbSpecializationEnum), - wbArrayS('Major Skills', wbInteger('Major Skill', itS32, wbActorValueEnum), 7), - wbInteger('Flags', itU32, wbFlags(['Playable', 'Guard'])), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbInteger('Unused', itU16) - ], cpNormal, True, nil, 5) - ]); - - wbRecord(CLMT, 'Climate', [ - wbEDID, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itS32) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbRecord(CLOT, 'Clothing', [ - wbEDID, - wbFULL, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(BMDT, '', [ - wbInteger('Biped Flags', itU16, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Lower Body', - {0x00000010} 'Hand', - {0x00000020} 'Foot', - {0x00000040} 'Right Ring', - {0x00000080} 'Left Ring', - {0x00000100} 'Amulet', - {0x00000200} 'Weapon', - {0x00000400} 'Back Weapon', - {0x00000800} 'Side Weapon', - {0x00001000} 'Quiver', - {0x00002000} 'Shield', - {0x00004000} 'Torch', - {0x00008000} 'Tail' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} 'Hide Rings', - {0x0002} 'Hide Amulets', - {0x0004} '', - {0x0008} '', - {0x0010} '', - {0x0020} '', - {0x0040} 'Non-Playable', - {0x0080} '' {Heavy armor} - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbFloat(MO2B, 'Bound Radius', cpBenign), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICON, 'Male icon filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename'), - wbFloat(MO3B, 'Bound Radius', cpBenign), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbFloat(MO4B, 'Bound Radius', cpBenign), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICO2, 'Female icon filename'), - wbStruct(DATA, '', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbCNTO := - wbStructSK(CNTO, [0], 'Item', [ - wbFormIDCk('Item', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, LVLI, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Count', itS32) - ]); - - wbCNTOs := wbRArrayS('Items', wbCNTO); - - wbRecord(CONT, 'Container', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbCNTOs, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['', 'Respawns'])), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(SNAM, 'Open sound', [SOUN]), - wbFormIDCk(QNAM, 'Close sound', [SOUN]) - ]); - - wbCSDT := wbRStructSK([0], 'Sound Type', [ - wbInteger(CSDT, 'Type', itU32,wbEnum([ - {0x00} 'Left Foot', - {0x01} 'Right Foot', - {0x02} 'Left Back Foot', - {0x03} 'Right Back Foot', - {0x04} 'Idle', - {0x05} 'Aware', - {0x06} 'Attack', - {0x07} 'Hit', - {0x08} 'Death', - {0x09} 'Weapon' - ])), - wbRArrayS('Sounds', wbRStructSK([0], 'Sound', [ - wbFormIDCk(CSDI, 'Sound', [SOUN], False, cpNormal, True), - wbInteger(CSDC, 'Sound Chance', itU8, nil, cpNormal, True) - ], []), cpNormal, True) - ], []); - - wbCSDTs := wbRArrayS('Sound Types', wbCSDT); - - wbSoulGemEnum := wbEnum([ - {0} 'None', - {1} 'Petty', - {2} 'Lesser', - {3} 'Common', - {4} 'Greater', - {5} 'Grand' - ]); - - wbRecord(CREA, 'Creature', [ - wbEDID, - wbFULL, - wbMODL, - wbCNTOs, - wbSPLOs, - wbArrayS(NIFZ, 'Models', wbStringLC('Model')), - wbByteArray(NIFT, 'Texture Files Hashes', 0, cpIgnore), - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Biped', - {0x000002} 'Essential', - {0x000004} 'Weapon & Shield', - {0x000008} 'Respawn', - {0x000010} 'Swims', - {0x000020} 'Flies', - {0x000040} 'Walks', - {0x000080} 'PC Level Offset', - {0x000100} 'Unused', //?? - {0x000200} 'No Low Level Processing', - {0x000400} 'Unused', //?? - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} 'No Head', - {0x010000} 'No Right Arm', - {0x020000} 'No Left Arm', - {0x040000} 'No Combat in Water', - {0x080000} 'No Shadow', - {0x100000} 'No Corpse Check' - ])), - wbInteger('Base spell points', itU16), - wbInteger('Fatigue', itU16), - wbInteger('Barter gold', itU16), - wbInteger('Level (offset)', itS16), - wbInteger('Calc min', itU16), - wbInteger('Calc max', itU16) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]) - ), - wbFormIDCk(INAM, 'Death item', [LVLI]), - wbSCRI, - wbStruct(AIDT, 'AI Data', [ - wbInteger('Aggression', itU8), - wbInteger('Confidence', itU8), - wbInteger('Energy Level', itU8), - wbInteger('Responsibility', itU8), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbRArray('AI Packages', wbFormIDCk(PKID, 'AI Package', [PACK])), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation')), - wbStruct(DATA, 'Creature Data', [ - wbInteger('Type', itU8, wbEnum([ - 'Creature', - 'Daedra', - 'Undead', - 'Humanoid', - 'Horse', - 'Giant' - ])), - wbInteger('Combat Skill', itU8), - wbInteger('Magic Skill', itU8), - wbInteger('Stealth Skill', itU8), - wbInteger('Soul', itU8, wbSoulGemEnum), - wbByteArray('Unused', 1), - wbInteger('Health', itU16), - wbByteArray('Unused', 2), - wbInteger('Attack Damage', itU16), - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ], cpNormal, True), - wbInteger(RNAM, 'Attack reach', itU8, nil, cpNormal, True), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY]), - wbFloat(TNAM, 'Turning Speed', cpNormal, True), - wbFloat(BNAM, 'Base Scale', cpNormal, True), - wbFloat(WNAM, 'Foot Weight', cpNormal, True), - wbString(NAM0, 'Blood Spray'), - wbString(NAM1, 'Blood Decal'), - wbFormIDCk(CSCR, 'Inherits Sounds from', [CREA]), - wbCSDTs - ], True); - - wbRecord(CSTY, 'Combat Style', [ - wbEDID, - wbStruct(CSTD, 'Standard', [ - {000}wbInteger('Dodge % Chance', itU8), - {001}wbInteger('Left/Right % Chance', itU8), - {002}wbByteArray('Unused', 2), - {004}wbFloat('Dodge L/R Timer (min)'), - {008}wbFloat('Dodge L/R Timer (max)'), - {012}wbFloat('Dodge Forward Timer (min)'), - {016}wbFloat('Dodge Forward Timer (max)'), - {020}wbFloat('Dodge Back Timer Min'), - {024}wbFloat('Dodge Back Timer Max'), - {028}wbFloat('Idle Timer min'), - {032}wbFloat('Idle Timer max'), - {036}wbInteger('Block % Chance', itU8), - {037}wbInteger('Attack % Chance', itU8), - {038}wbByteArray('Unused', 2), - {040}wbFloat('Recoil/Stagger Bonus to Attack'), - {044}wbFloat('Unconscious Bonus to Attack'), - {048}wbFloat('Hand-To-Hand Bonus to Attack'), - {052}wbInteger('Power Attack % Chance', itU8), - {053}wbByteArray('Unused', 3), - {056}wbFloat('Recoil/Stagger Bonus to Power'), - {060}wbFloat('Unconscious Bonus to Power Attack'), - {064}wbInteger('Power Attack - Normal', itU8), - {065}wbInteger('Power Attack - Forward', itU8), - {066}wbInteger('Power Attack - Back', itU8), - {067}wbInteger('Power Attack - Left', itU8), - {068}wbInteger('Power Attack - Right', itU8), - {069}wbByteArray('Unused', 3), - {072}wbFloat('Hold Timer (min)'), - {076}wbFloat('Hold Timer (max)'), - {080}wbInteger('Flags 1', itU8, wbFlags([ - 'Advanced', - 'Choose Attack using % Chance', - 'Ignore Allies in Area', - 'Will Yield', - 'Rejects Yields', - 'Fleeing Disabled', - 'Prefers Ranged', - 'Melee Alert OK' - ])), - {081}wbInteger('Acrobatic Dodge % Chance', itU8), - {082}wbByteArray('Unused', 2), - {084}wbFloat('Range Mult (Optimal)'), - {088}wbFloat('Range Mult (Max)'), - {092}wbFloat('Switch Distance (Melee)'), - {096}wbFloat('Switch Distance (Ranged)'), - {100}wbFloat('Buff standoff Distance'), - {104}wbFloat('Ranged standoff Distance'), - {108}wbFloat('Group standoff Distance'), - {112}wbInteger('Rushing Attack % Chance', itU8), - {113}wbByteArray('Unused', 3), - {116}wbFloat('Rushing Attack Distance Mult'), - {120}wbInteger('Flags 2', itU32, wbFlags([ - 'Do Not Acquire' - ])) - ], cpNormal, True, nil, 31), - wbStruct(CSAD, 'Advanced', [ - wbFloat('Dodge Fatigue Mod Mult'), - wbFloat('Dodge Fatigue Mod Base'), - wbFloat('Encumb. Speed Mod Base'), - wbFloat('Encumb. Speed Mod Mult'), - wbFloat('Dodge While Under Attack Mult'), - wbFloat('Dodge Not Under Attack Mult'), - wbFloat('Dodge Back While Under Attack Mult'), - wbFloat('Dodge Back Not Under Attack Mult'), - wbFloat('Dodge Forward While Attacking Mult'), - wbFloat('Dodge Forward Not Attacking Mult'), - wbFloat('Block Skill Modifier Mult'), - wbFloat('Block Skill Modifier Base'), - wbFloat('Block While Under Attack Mult'), - wbFloat('Block Not Under Attack Mult'), - wbFloat('Attack Skill Modifier Mult'), - wbFloat('Attack Skill Modifier Base'), - wbFloat('Attack While Under Attack Mult'), - wbFloat('Attack Not Under Attack Mult'), - wbFloat('Attack During Block Mult'), - wbFloat('Power Att. Fatigue Mod Base'), - wbFloat('Power Att. Fatigue Mod Mult') - ]) - ]); - - wbRecord(DIAL, 'Dialog Topic', [ - wbEDID, - wbRArrayS('Quests', wbFormIDCk(QSTI, 'Quest', [QUST], False, cpBenign)), - wbRArrayS('Quests?', wbFormIDCk(QSTR, 'Quest?', [QUST], False, cpBenign)), - wbFULL, - wbInteger(DATA, 'Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous' - ]), cpNormal, True) - ], True); - - wbRecord(DOOR, 'Door', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(SNAM, 'Open sound', [SOUN]), - wbFormIDCk(ANAM, 'Close sound', [SOUN]), - wbFormIDCk(BNAM, 'Loop sound', [SOUN]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Oblivion gate', - {0x02} 'Automatic door', - {0x04} 'Hidden', - {0x08} 'Minimal use' - ]), cpNormal, True), - wbRArrayS('Random teleport destinations', wbFormIDCk(TNAM, 'Destination', [CELL, WRLD])) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - 'Normal', - 'Greater Than', - '', - 'Greater Than or Equal Than', - 'Always Show' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0} 'No Membrane Shader', - {1} '', - {2} '', - {3} 'No Particle Shader', - {4} 'Edge Effect - Inverse', - {5} 'Membrane Shader - Affect Skin Only' - ])), - wbByteArray('Unused', 3), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbStruct('Fill/Texture Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbStruct('Edge Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pusle Frequence'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Birth Ratio'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbStruct('Color Key 1 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 2 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 3 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time') - ], cpNormal, True, nil, 25) - ]); - - wbRecord(ENCH, 'Enchantment', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbStruct(ENIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Scroll', - {1} 'Staff', - {2} 'Weapon', - {3} 'Apparel' - ])), - wbInteger('Charge Amount', itU32), - wbInteger('Enchant Cost', itU32), - wbInteger('Flags', itU8, wbFlags(['Manual Enchant Cost (Autocalc Off)'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(EYES, 'Eyes', [ - wbEDID, - wbFULL, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags(['Playable']), cpNormal, True) - ]); - - wbXNAM := - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCk('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32) - ]); - - wbXNAMs := wbRArrayS('Relations', wbXNAM); - - wbRecord(FACT, 'Faction', [ - wbEDID, - wbFULL, - wbXNAMs, - wbInteger(DATA, 'Flags', itU8, wbFlags(['Hidden from Player', 'Evil', 'Special Combat']), cpNormal, True), - wbFloat(CNAM, 'Crime Gold Multiplier', cpNormal, True, 1, -1, nil, nil, 1.0), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itS32), - wbString(MNAM, 'Male', 0, cpTranslate), - wbString(FNAM, 'Female', 0, cpTranslate), - wbString(INAM, 'Insignia') - ], []) - ]); - - wbRecord(FLOR, 'Flora', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(PFIG, 'Ingredient', [INGR]), - wbStruct(PFPC, 'Seasonal ingredient production', [ - wbInteger('Spring', itU8), - wbInteger('Summer ', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ], cpNormal, True) - ]); - - wbRecord(FURN, 'Furniture', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbByteArray(MNAM, 'Marker Flags', 0, cpNormal, True) - ]); - - wbRecord(GLOB, 'Global', [ - wbEDID, - wbInteger(FNAM, 'Type', itU8, wbGLOBFNAM, nil, cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - wbRecord(GMST, 'Game Setting', [ - wbEDID, - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbString('', 0, cpTranslate), - wbInteger('', itS32), - wbFloat('') - ], cpNormal, True) - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDID, - wbMODL, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unused', 1), - wbInteger('Unit from water amount', itU16), - wbByteArray('Unused', 2), - wbInteger('Unit from water type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True) - ]); - - wbRecord(HAIR, 'Hair', [ - wbEDID, - wbFULL, - wbMODL, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female', - 'Fixed' - ]), cpNormal, True) - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder', - 'Steal Horse' - ], [ - -1, 'None' - ]); - - wbFormTypeEnum := - wbEnum([], [ - $03, 'Game Setting', - $04, 'Global', - $05, 'Class', - $06, 'Faction', - $07, 'Hair', - $08, 'Eyes', - $09, 'Race', - $0A, 'Sound', - $0B, 'Skill', - $0C, 'Magic Effect', - $0D, 'Script', - $0E, 'Land Texture', - $0F, 'Enchantment', - $10, 'Spell', - $11, 'BirthSign', - $12, 'Activator', - $13, 'Apparatus', - $14, 'Armor', - $15, 'Book', - $16, 'Clothing', - $17, 'Container', - $18, 'Door', - $19, 'Ingredient', - $1A, 'Light', - $1B, 'Misc', - $1C, 'Static', - $1D, 'Grass', - $1E, 'Tree', - $1F, 'Flora', - $20, 'Furniture', - $21, 'Weapon', - $22, 'Ammi', - $23, 'NPC', - $24, 'Creature', - $25, 'Leveled Creature', - $26, 'Soul Gem', - $27, 'Key', - $28, 'Alchemy', - $29, 'SubSpace', - $2A, 'Sigil Stone', - $2B, 'Leveled Item', - $2D, 'Weather', - $2E, 'Climate', - $2F, 'Region', - $30, 'Cell', - $31, 'Placed Object', - $32, 'Placed NPC', - $33, 'Placed Creature', - $34, 'Path Grid', - $35, 'Worldspace', - $36, 'Landscape', - $38, 'Road', - $39, 'Dialog Topic', - $3A, 'Dialog Response', - $3B, 'Quest', - $3C, 'Idle Animation', - $3D, 'Package', - $3E, 'Combat Style', - $3F, 'Load Screen', - $40, 'Leveled Spell', - $41, 'Animated Object', - $42, 'Water', - $43, 'Effect Shader' - ]); - - wbSexEnum := - wbEnum(['Male','Female']); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCTDA := - wbRUnion('Condition', [ - wbStruct(CTDA, 'Condition', [ - wbInteger('Type', itU8, wbCtdaType), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage (INVALID)', itS32), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbInteger('Unused', itU32, nil, cpIgnore) - ], cpNormal, False, nil, 6), - wbStruct(CTDT, 'Condition (old format)', [ - wbInteger('Type', itU8, wbCtdaType), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage (INVALID)', itS32), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbEmpty('Unused', cpIgnore) - ]) - ], []); - - wbCTDAs := wbRArray('Conditions', wbCTDA); - - wbSCHR := - wbRUnion('Basic Script Data', [ - wbStruct(SCHR, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU32, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Magic Effect' - ])) - ]), - wbStruct(SCHD, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU32, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Magic Effect' - ])) - ]) - ], []); - - wbSCROs := - wbRArray('References', - wbRUnion('', [ - wbFormIDCk(SCRO, 'Global Reference', - [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, - INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, QUST, PLYR, PACK, LVLI, - FACT, ACHR, REFR, ACRE, GLOB, DIAL, CELL, SOUN, MGEF, WTHR, CLAS, EFSH, RACE, - LVLC, CSTY, WRLD, SCPT, BSGN, TREE, NULL]), - wbInteger(SCRV, 'Local Variable', itU32) - ], []) - ); - - wbResultScript := wbRStruct('Result Script', [ - wbSCHR, - wbByteArray(SCDA, 'Compiled result script'), - wbStringScript(SCTX, 'Result script source'), - wbSCROs - ], []); -{ - wbResultScriptOld := wbRStruct('Result Script (Old Format?)', [ - wbByteArray(SCHD, 'Unknown (Script Header?)'), - wbByteArray(SCDA, 'Compiled result script'), - wbStringScript(SCTX, 'Result script source'), - wbSCROs - ], []); -} - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbMODL, - wbCTDAs, - wbInteger(ANAM, 'Animation Group Section', itU8, wbIdleAnam, nil, cpNormal, True), - wbArray(DATA, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [IDLE, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True) - ]); - - wbRecord(INFO, 'Dialog response', [ - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x0001} 'Goodbye', - {0x0002} 'Random', - {0x0004} 'Say Once', - {0x0008} '', - {0x0010} 'Info Refusal', - {0x0020} 'Random End', - {0x0040} 'Run for Rumors' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(QSTI, 'Quest', [QUST], False, cpNormal, True), - wbFormIDCk(TPIC, 'Topic', [DIAL]), - wbFormIDCk(PNAM, 'Previous INFO', [INFO, NULL]), - wbRArray('Add topics', wbFormIDCk(NAME, 'Topic', [DIAL])), - wbRArray('Responses', - wbRStruct('Response', [ - wbStruct(TRDT, 'Response Data', [ - wbInteger('Emotion Type', itU32, wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise' - ])), - wbInteger('Emotion Value', itS32), - wbByteArray('Unused', 4), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3) - ]), - wbString(NAM1, 'Response Text', 0, cpTranslate), - wbString(NAM2, 'Actor notes', 0, cpTranslate) - ], []) - ), - wbCTDAs, - wbRArray('Choices', wbFormIDCk(TCLT, 'Choice', [DIAL])), - wbRArray('Link From', wbFormIDCk(TCLF, 'Topic', [DIAL])), - wbResultScript - ]); - - wbRecord(INGR, 'Ingredient', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, '', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(KEYM, 'Key', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), -// wbStruct(DATA, '', [ -// wbInteger('Flags', itU8, wbFlags([])), -// wbByteArray('Unknown') -// ]), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unused', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unused', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end; - - wbRecord(LIGH, 'Light', [ - wbEDID, - wbMODL, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Dynamic', - {0x00000002} 'Can be Carried', - {0x00000004} 'Negative', - {0x00000008} 'Flicker', - {0x00000010} 'Unused', - {0x00000020} 'Off By Default', - {0x00000040} 'Flicker Slow', - {0x00000080} 'Pulse', - {0x00000100} 'Pulse Slow', - {0x00000200} 'Spot Light', - {0x00000400} 'Spot Shadow' - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True, nil, 6), - wbFloat(FNAM, 'Fade value', cpNormal, True, 1, -1, nil, nil, 1.0), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); - - wbRecord(LSCR, 'Load Screen', [ - wbEDID, - wbICON, - wbDESC, - wbRArrayS('Locations', wbStructSK(LNAM, [0, 1], 'Location', [ - wbFormIDCk('Direct', [CELL, WRLD, NULL]), - wbStructSK([0, 1], 'Indirect', [ - wbFormIDCk('World', [NULL, WRLD]), - wbStructSK([0,1], 'Grid', [ - wbInteger('Y', itS16), - wbInteger('X', itS16) - ]) - ]) - ])) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDID, - wbICON, - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Material Type', itU8, wbEnum([ - {00} 'STONE', - {01} 'CLOTH', - {02} 'DIRT', - {03} 'GLASS', - {04} 'GRASS', - {05} 'METAL', - {06} 'ORGANIC', - {07} 'SKIN', - {08} 'WATER', - {09} 'WOOD', - {10} 'HEAVY STONE', - {11} 'HEAVY METAL', - {12} 'HEAVY WOOD', - {13} 'CHAIN', - {14} 'SNOW' - ]), cpNormal, True, nil, nil, 2), - wbInteger('Friction', itU8, nil, cpNormal, True, nil, nil, 30), - wbInteger('Restitution', itU8, nil, cpNormal, True, nil, nil, 30) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True, False, nil, nil, 30), - wbRArrayS('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])) - ]); - - wbRecord(LVLC, 'Leveled Creature', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [NPC_, CREA, LVLC]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True), - wbSCRI, - wbFormIDCk(TNAM, 'Creature template', [NPC_, CREA]) - ], True, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, LVLI, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True), - wbByteArray(DATA, 'Unused', 1) - ], False, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(LVSP, 'Leveled Spell', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use all spells' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [SPEL, LVSP]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True) - ], False, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(MGEF, 'Magic Effect', [ - wbStringMgefCode(EDID, 'Magic Effect Code'), - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbInteger('Param A Info', itU8, wbOBMEResolutionInfo), - wbInteger('Param B Info', itU8, wbOBMEResolutionInfo), - wbByteArray('Unused', 2), - wbString('Handler', 4), - wbInteger('Flag Overrides', itU32, wbFlags([ - { 0} '', - { 1} '', - { 2} 'ParamFlagA', - { 3} 'Beneficial', - { 4} '', - { 5} '', - { 6} '', - { 7} '', - { 8} '', - { 9} '', - {10} '', - {11} '', - {12} '', - {13} '', - {14} '', - {15} '', - {16} 'ParamFlagB', - {17} 'Magnitude Is Range', - {18} 'Atomic Resistance', - {19} 'ParamFlagC', - {20} 'ParamFlagD', - {21} '', - {22} '', - {23} '', - {24} '', - {25} '', - {26} '', - {27} '', - {28} '', - {29} '', - {30} 'Hidden' - ])), - wbByteArray('ParamB', 4), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbString(EDDX, 'EditorID', 0, cpNormal, False, wbEDDXDontShow), - wbFULL, - wbDESC, - wbICON, - wbMODL, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} 'Magnitude %', - {0x00000010} 'Self', - {0x00000020} 'Touch', - {0x00000040} 'Target', - {0x00000080} 'No duration', - {0x00000100} 'No magnitude', - {0x00000200} 'No area', - {0x00000400} 'FX persist', - {0x00000800} 'Spellmaking', - {0x00001000} 'Enchanting', - {0x00002000} 'No Ingredient', - {0x00004000} '', - {0x00008000} '', - {0x00010000} 'Use weapon', - {0x00020000} 'Use armor', - {0x00040000} 'Use creature', - {0x00080000} 'Use skill', - {0x00100000} 'Use attribute', - {0x00200000} '', - {0x00400000} '', - {0x00800000} '', - {0x01000000} 'Use actor value', - {0x02000000} 'Spray projectile type (or Fog if Bolt is specified as well)', - {0x04000000} 'Bolt projectile type', - {0x08000000} 'No hit effect' - ])), - wbFloat('Base cost'), - wbUnion('Assoc. Item', wbMGEFFAssocItemDecider, [ - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Assoc. Weapon', [WEAP]), - wbFormIDCk('Assoc. Armor', [ARMO, NULL{?}]), - wbFormIDCk('Assoc. Creature', [CREA, LVLC, NPC_]), - wbInteger('Assoc. Actor Value', itS32, wbActorValueEnum) - ]), - wbInteger('Magic School', itS32, wbMagicSchoolEnum), - wbInteger('Resist value', itS32, wbActorValueEnum), - wbInteger('Counter Effect Count', itU16), //!!! must be updated automatically when ESCE length changes! - wbByteArray('Unused', 2), - wbFormIDCk('Light', [LIGH, NULL]), - wbFloat('Projectile speed'), - wbFormIDCk('Effect Shader', [EFSH, NULL]), - wbFormIDCk('Enchant effect', [EFSH, NULL]), - wbFormIDCk('Casting sound', [NULL, SOUN]), - wbFormIDCk('Bolt sound', [NULL, SOUN]), - wbFormIDCk('Hit sound', [NULL, SOUN]), - wbFormIDCk('Area sound', [NULL, SOUN]), - wbFloat('Constant Effect enchantment factor'), - wbFloat('Constant Effect barter factor') - ], cpNormal, True, nil, 10), - wbArrayS(ESCE, 'Counter Effects', wbStringMgefCode('Counter Effect Code', 4){wbInteger('Counter Effect', itU32, wbChar4)}) - ], False, nil, cpNormal, False, wbMGEFAfterLoad); - - wbRecord(MISC, 'Misc. Item', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbUnion('', wbMISCActorValueDecider, [ - wbInteger('Value', itS32), - wbFormIDCk('Actor Value', [ACVA]) - ]), - wbUnion('', wbMISCActorValueDecider, [ - wbFloat('Weight'), - wbInteger('Group', itU32, wbEnum([], [ - $40E00000, ' [NONE]', - $40400000, 'AI', - $00000000, 'Attribute', - $40C00000, 'Combat', - $40A00000, 'Misc', - $40000000, 'Skill', - $40800000, 'Social', - $3F800000, 'Stat' - ])) - ]) - ], cpNormal, True) - ]); - - wbFaceGen := wbRStruct('FaceGen Data', [ - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True); - - wbRecord(NPC_, 'Non-Player Character', [ - wbEDID, - wbFULL, - wbMODL, - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Female', - {0x000002} 'Essential', - {0x000004} '', - {0x000008} 'Respawn', - {0x000010} 'Auto-calc stats', - {0x000020} '', - {0x000040} '', - {0x000080} 'PC Level Offset', - {0x000100} '', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} '', - {0x001000} '', - {0x002000} 'No Rumors', - {0x004000} 'Summonable', - {0x008000} 'No Persuasion', - {0x010000} '', - {0x020000} '', - {0x040000} '', - {0x080000} '', - {0x100000} 'Can Corpse Check' - ])), - wbInteger('Base spell points', itU16), - wbInteger('Fatigue', itU16), - wbInteger('Barter gold', itU16), - wbInteger('Level (offset)', itS16), - wbInteger('Calc min', itU16), - wbInteger('Calc max', itU16) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]) - ), - wbFormIDCk(INAM, 'Death item', [LVLI]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True), - wbCNTOs, - wbSPLOs, - wbSCRI, - wbStruct(AIDT, 'AI Data', [ - wbInteger('Aggression', itU8), - wbInteger('Confidence', itU8), - wbInteger('Energy Level', itU8), - wbInteger('Responsibility', itU8), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbRArray('AI Packages', wbFormIDCk(PKID, 'AI Package', [PACK])), - wbArrayS(KFFZ, 'Animations', wbString('Animation')), - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True), - wbStruct(DATA, 'Stats', [ - wbInteger('Armorer', itU8), - wbInteger('Athletics', itU8), - wbInteger('Blade', itU8), - wbInteger('Block', itU8), - wbInteger('Blunt', itU8), - wbInteger('Hand to Hand', itU8), - wbInteger('Heavy Armor', itU8), - wbInteger('Alchemy', itU8), - wbInteger('Alteration', itU8), - wbInteger('Conjuration', itU8), - wbInteger('Destruction', itU8), - wbInteger('Illusion', itU8), - wbInteger('Mysticism', itU8), - wbInteger('Restoration', itU8), - wbInteger('Acrobatics', itU8), - wbInteger('Light Armor', itU8), - wbInteger('Marksman', itU8), - wbInteger('Mercantile', itU8), - wbInteger('Security', itU8), - wbInteger('Sneak', itU8), - wbInteger('Speechcraft', itU8), - wbInteger('Health', itU16), - wbByteArray('Unused', 2), - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ], cpNormal, True), - wbFormIDCk(HNAM, 'Hair', [HAIR]), - wbFloat(LNAM, 'Hair length'), - wbArray(ENAM, 'Eyes', wbFormIDCk('Eyes', [EYES])), - wbStruct(HCLR, 'Hair color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY]), - wbFaceGen, - wbByteArray(FNAM, 'Unknown', 0, cpBenign) - ], True); - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers services', - {0x00000002} 'Must reach location', - {0x00000004} 'Must complete', - {0x00000008} 'Lock doors at package start', - {0x00000010} 'Lock doors at package end', - {0x00000020} 'Lock doors at location', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Unlock doors at location', - {0x00000200} 'Continue if PC near', - {0x00000400} 'Once per day', - {0x00000800} 'Unused', - {0x00001000} 'Skip fallout behavior', - {0x00002000} 'Always run', - {0x00004000} '', - {0x00008000} '', - {0x00010000} '', - {0x00020000} 'Always sneak', - {0x00040000} 'Allow swimming', - {0x00080000} 'Allow falls', - {0x00100000} 'Armor unequipped', - {0x00200000} 'Weapons unequipped', - {0x00400000} 'Defensive combat', - {0x00800000} 'Use horse', - {0x01000000} 'No idle anims', - {0x02000000} '', - {0x04000000} '', - {0x08000000} '', - {0x10000000} '', - {0x20000000} '', - {0x40000000} '', - {0x80000000} '' - ]); - - wbPKDTType := wbEnum([ - {0} 'Find', - {1} 'Follow', - {2} 'Escort', - {3} 'Eat', - {4} 'Sleep', - {5} 'Wander', - {6} 'Travel', - {7} 'Accompany', - {8} 'Use item at', - {9} 'Ambush', - {10} 'Flee not combat', - {11} 'Cast magic' - ]); - - wbRecord(PACK, 'AI Package', [ - wbEDID, - wbUnion(PKDT, 'General', wbPACKPKDTDecider, [ - wbStruct('General', [ - wbInteger('Flags', itU16, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 1) - ]), - wbStruct('General', [ - wbInteger('Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 3) - ]) - ]), - wbStruct(PLDT, 'Location', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object type' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCk('Reference', [REFR, ACHR, ACRE, PLYR], True), - wbFormIDCk('Cell', [CELL]), - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Object ID', [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Object type', itU32) - ]), - wbInteger('Radius', itS32) - ]), - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sundas', - 'Morndas', - 'Tirdas', - 'Middas', - 'Turdas', - 'Fredas', - 'Loredas', - 'Morndas to Fredas', - 'Loredas, Sundas', - 'Morndas, Middas, Fredas', - 'Tirdas, Turdas' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Time', itS8), - wbInteger('Duration', itS32) - ]), - wbStruct(PTDT, 'Target', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific reference', - {1} 'Object ID', - {2} 'Object type' - ])), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCk('Reference', [ACHR, ACRE, REFR, PLYR], True), - wbFormIDCk('Object ID', [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Object type', itU32) - ]), - wbInteger('Count', itS32) - ]), - wbCTDAs - ]); - - wbPGRP := - wbArray(PGRP, 'Points', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z (Even = Red/Orange, Odd = Blue)'), - wbInteger('Connections', itU8{, wbPGRPConnectionsCallback}), - wbByteArray('Unused', 3) - ]), 0, nil, nil, cpNormal, True); - - {The Connection Count in the PGRP record specifies how many entries in this - array belong to each point. If the first 4 points in the PGRP array have - Connection Counts 2, 5, 2, 4 then the first 2 entries are the connections - of point 0, then next 5 are the connections of point 1, the next 2 of point 2, - the next 4 of point 3 and so on..., this can currently not be represented - declaratively } - - wbRecord(PGRD, 'Path Grid', [ - wbInteger(DATA, 'Point Count', itU16, nil, cpNormal, True), - wbPGRP, - wbByteArray(PGAG, 'Unknown'), - wbArray(PGRR, 'Point-to-Point Connections', - wbArrayS('Point', wbInteger('Point', itU16), wbCalcPGRRSize{, cpNormal, False, wbPGRRPointAfterLoad}) - ), - wbArrayS(PGRI, 'Inter-Cell Connections', wbStructSK([0,2,3,4], 'Inter-Cell Connection', [ - wbInteger('Point', itU16), - wbByteArray('Unused', 2), - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), 0, cpNormal, False, wbPGRIPointerAfterLoad), - wbRArrayS('Point-to-Reference Mappings', - wbStructSK(PGRL, [0], 'Point-to-Reference Mapping', [ - wbFormIDCk('Reference', [REFR]), - wbArrayS('Points', wbInteger('Point', itU32)) - ]) - ) - ], False, nil, cpNormal, False, wbPGRDAfterLoad); - - wbRecord(QUST, 'Quest', [ - wbEDID, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, 'General', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Start game enabled', - {0x02} '', - {0x04} 'Allow repeated conversation topics', - {0x08} 'Allow repeated stages' - ])), - wbInteger('Priority', itU8) - ], cpNormal, True), - wbCTDAs, - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbInteger(INDX, 'Stage index', itS16), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete quest' - ])), - wbCTDAs, - wbString(CNAM, 'Log Entry', 0, cpTranslate), - wbResultScript - ], [])) - ], [])), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbFormIDCk('Target', [REFR, ACRE, ACHR], True), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass marker ignores locks' - ])), - wbByteArray('Unused', 3) - ]), - wbCTDAs - ], [])) - ]); - - wbBodyDataIndex := - wbInteger(INDX, 'Index', itU32, wbEnum([ - 'Upper Body', - 'Lower Body', - 'Hand', - 'Foot', - 'Tail' - ])); - - wbRecord(RACE, 'Race', [ - wbEDID, - wbFULL, - wbDESC, - wbSPLOs, - wbXNAMs, - wbStruct(DATA, '', [ - wbArrayS('Skill Boosts', wbStructSK([0], 'Skill Boost', [ - wbInteger('Skill', itS8, wbActorValueEnum), - wbInteger('Boost', itS8) - ]), 7), - wbByteArray('Unused', 2), - wbFloat('Male Height'), - wbFloat('Female Height'), - wbFloat('Male Weight'), - wbFloat('Female Weight'), - wbInteger('Flags', itU32, wbFlags([ - 'Playable' - ])) - ], cpNormal, True), - wbStruct(VNAM, 'Voice', [ - wbFormIDCk('Male', [RACE, NULL]), - wbFormIDCk('Female', [RACE, NULL]) - ]), - wbStruct(DNAM, 'Default Hair', [ - wbFormIDCk('Male', [HAIR]), - wbFormIDCk('Female', [HAIR]) - ]), - wbInteger(CNAM, 'Default Hair Color', itU8, nil, cpNormal, True), - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - wbStruct(ATTR, 'Base Attributes', [ - wbStruct('Male', [ - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ]), - wbStruct('Female', [ - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ]) - ]), - wbRStruct('Face Data', [ - wbEmpty(NAM0, 'Face Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbEnum([ - 'Head', - 'Ear (Male)', - 'Ear (Female)', - 'Mouth', - 'Teeth (Lower)', - 'Teeth (Upper)', - 'Tongue', - 'Eye (Left)', - 'Eye (Right)' - ])), - wbMODL, - wbICON - ], [])) - ], [], cpNormal, True), - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Body Data Marker'), - wbMODL, - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbBodyDataIndex, - wbICON - ], [])) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Body Data Marker'), - wbMODL, - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbBodyDataIndex, - wbICON - ], [])) - ], [], cpNormal, True), - wbArrayS(HNAM, 'Hairs', wbFormIDCk('Hair', [HAIR]), 0, cpNormal, True), - wbArrayS(ENAM, 'Eyes', wbFormIDCk('Eye', [EYES]), 0, cpNormal, True), - wbFaceGen, - wbByteArray(SNAM, 'Unknown', 2, cpNormal, True) - ], True); - - wbRecord(REFR, 'Placed Object', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS], False, cpNormal, True), - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot - ]), - wbStruct(XLOC, 'Lock information', [ - wbInteger('Lock Level', itU8), - wbByteArray('Unused', 3), - wbFormIDCk('Key', [KEYM, NULL]), - wbUnion('Unused', wbXLOCFillerDecider, [ - wbEmpty('Unused'), - wbByteArray('Unused', 4) - ]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3) - ]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], [XLOC]), - wbXESP, - wbFormIDCk(XTRG, 'Target', [REFR, ACHR, ACRE], True), - wbUnion(XSED, '', wbREFRXSEDDecider, [ - wbInteger('SpeedTree Seed', itU8), - wbInteger('SpeedTree Seed (old format)', itU8{itU32 CS just cuts it off...}) - ]), - wbXLOD, - wbFloat(XCHG, 'Charge'), - wbInteger(XHLT, 'Health', itS32), - wbRStruct('Unused', [ - wbFormIDCk(XPCI, 'Unused', [CELL]), - wbString(FULL, 'Unused') - ], []), - wbInteger(XLCM, 'Level Modifier', itS32), - wbFormIDCk(XRTM, 'Unknown', [REFR]), - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - wbInteger(XCNT, 'Count', itS32), - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Start Marker'), - wbInteger(FNAM, 'Map Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([ - {0x00} 'None?', - {0x01} 'Camp', - {0x02} 'Cave', - {0x03} 'City', - {0x04} 'Elven Ruin', - {0x05} 'Fort Ruin', - {0x06} 'Mine', - {0x07} 'Landmark', - {0x08} 'Tavern', - {0x09} 'Settlement', - {0x0A} 'Daedric Shrine', - {0x0B} 'Oblivion Gate', - {0x0C} 'Unknown? (door icon)' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ], []), - wbEmpty(ONAM, 'Open by Default'), - wbXSCL, - wbInteger(XSOL, 'Contained Soul', itU8, wbSoulGemEnum), - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbRecord(REGN, 'Region', [ - wbEDID, - wbICON, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad) - ], []), cpNormal, True), - - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0}'', - {1}'', - {2}'Objects', - {3}'Weather', - {4}'Map', - {5}'', - {6}'Grass', - {7}'Sound', - {8}'', - {9}'' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 3), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, FLOR, STAT, LTEX]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unused', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbByteArray('Unknown', 4), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unused', 2), - wbByteArray('Unknown', 4) - ])), - - {--- Map ---} - wbString(RDMP, 'Map Name', 0, cpTranslate), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unused', 4) - ])), - - {--- Sound ---} - wbInteger(RDMD, 'Music Type', itU32, wbMusicEnum), - wbArrayS(RDSD, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Flags', itU32, wbFlags([ - 'Pleasant', - 'Cloudy', - 'Rainy', - 'Snowy' - ])), - wbInteger('Chance', itU32, wbScaledInt4ToStr, wbScaledInt4ToInt) - ])), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32) - ])) - ], [])) - ], True); - - wbRecord(ROAD, 'Road', [ - wbPGRP, - wbArray(PGRR, 'Point-to-Point Connections (complex structure can''t be represented, see source)', - {The Connection Count in the PGRP record specifies how many entries in this - array belong to each point. If the first 4 points in the PGRP array have - Connection Counts 2, 5, 2, 4 then the first 2 entries are the connections - of point 0, then next 5 are the connections of point 1, the next 2 of point 2, - the next 4 of point 3 and so on..., this can currently not be represented - declaratively } - wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), 0, nil, nil, cpNormal, True) - ]); - - wbRecord(SBSP, 'Subspace', [ - wbEDID, - wbStruct(DNAM, '', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, True) - ]); - - wbSLSD := wbStructSK(SLSD, [0], 'Local Variable Data', [ - wbInteger('Index', itU32), - wbByteArray('Unused', 12), - wbInteger('Flags', itU8, wbFlags(['IsLongOrShort']), cpCritical), - wbByteArray('Unused') - ]); - - wbRecord(SCPT, 'Script', [ - wbEDID, - wbByteArray(SCHD, 'Unknown (Script Header?)'), - wbSCHR, - wbByteArray(SCDA, 'Compiled Script'), - wbStringScript(SCTX, 'Script Source', 0, cpNormal, True), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical) - ], [])), - wbSCROs - ]); - - wbRecord(SGST, 'Sigil Stone', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbEffects, - wbStruct(DATA, '', [ - wbInteger('Uses ', itU8), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbRecord(SKIL, 'Skill', [ - wbEDID, - wbInteger(INDX, 'Skill', itS32, wbActorValueEnum, cpNormal, True), - wbDESC, - wbICON, - wbStruct(DATA, 'Skill Data', [ - wbInteger('Action', itS32, wbActorValueEnum), - wbInteger('Attribute', itS32, wbActorValueEnum), - wbInteger('Specialization', itU32, wbSpecializationEnum), - wbArray('Use Values', wbFloat('Use Value'), 2) - ], cpNormal, True), - wbString(ANAM, 'Apprentice Text', 0, cpTranslate, True), - wbString(JNAM, 'Journeyman Text', 0, cpTranslate, True), - wbString(ENAM, 'Expert Text', 0, cpTranslate, True), - wbString(MNAM, 'Master Text', 0, cpTranslate, True) - ]); - - wbRecord(SLGM, 'Soul Gem', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbInteger(SOUL, 'Contained Soul', itU8, wbSoulGemEnum, cpNormal, True), - wbInteger(SLCP, 'Maximum Capacity', itU8, wbSoulGemEnum, cpNormal, True) - ]); - - wbRecord(SOUN, 'Sound', [ - wbEDID, - wbString(FNAM, 'Sound Filename'), - wbRUnion('Sound Data', [ - wbStruct(SNDX, 'Sound Data', [ - wbInteger('Minimum attentuation distance', itU8, wbMul(5)), - wbInteger('Maximum attentuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE' - ])), - wbByteArray('Unused', 2), - wbInteger('Static attentuation cdB', itS16), - wbInteger('Stop time ', itU8), - wbInteger('Start time ', itU8) - ], cpNormal, True), - wbStruct(SNDD, 'Sound Data', [ - wbInteger('Minimum attentuation distance', itU8, wbMul(5)), - wbInteger('Maximum attentuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE' - ])), - wbByteArray('Unused', 2), - wbEmpty('Unused'), - wbEmpty('Unused'), - wbEmpty('Unused') - ], cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(SPEL, 'Spell', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbStruct(SPIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Spell', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison' - ])), - wbInteger('Cost', itU32), - wbInteger('Level', itU32, wbEnum([ - {0} 'Novice', - {1} 'Apprentice', - {2} 'Journeyman', - {3} 'Expert', - {4} 'Master' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x00000001} 'Manual Spell Cost', - {0x00000002} 'Immune to Silence 1', - {0x00000004} 'Player Start Spell', - {0x00000008} 'Immune to Silence 2', - {0x00000010} 'Area Effect Ignores LOS', - {0x00000020} 'Script Effect Always Applies', - {0x00000040} 'Disallow Spell Absorb/Reflect', - {0x00000080} 'Touch Spell Explodes w/ no Target' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(STAT, 'Static', [ - wbEDID, - wbMODL - ]); - - wbRecord(TES3, 'Main File Header', [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), - wbByteArray(DELE, 'Unknown', 0, cpIgnore), - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - wbByteArray(DATA, 'Unused', 8, cpIgnore, True) - ], [])) - ], False, nil, cpNormal, True, wbRemoveOFST); - - wbRecord(TREE, 'Tree', [ - wbEDID, - wbMODL, - wbICON, - wbArrayS(SNAM, 'SpeedTree Seeds', wbInteger('SpeedTree Seed', itU32)), - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Leaf Curvature'), - wbFloat('Minimum Leaf Angle'), - wbFloat('Maximum Leaf Angle'), - wbFloat('Branch Dimming Value'), - wbFloat('Leaf Dimming Value'), - wbInteger('Shadow Radius', itS32), - wbFloat('Rock Speed'), - wbFloat('Rustle Speed') - ], cpNormal, True), - wbStruct(BNAM, 'Billboard Dimensions', [ - wbFloat('Width'), - wbFloat('Height') - ], cpNormal, True) - ]); - - wbRecord(WATR, 'Water', [ - wbEDID, - wbString(TNAM, 'Texture', 0, cpNormal, True), - wbInteger(ANAM, 'Opacity', itU8, nil, cpNormal, True), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0}'Causes Damage', - {1}'Reflective' - ]), cpNormal, True), - wbString(MNAM, 'Material ID'), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbStruct(DATA, '', [ - wbFloat('Wind Velocity'), - wbFloat('Wind Direction'), - wbFloat('Wave Amplitude'), - wbFloat('Wave Frequency'), - wbFloat('Sun Power'), - wbFloat('Reflectivity Amount'), - wbFloat('Fresnel Amount'), - wbFloat('Scroll X Speed'), - wbFloat('Scroll Y Speed'), - wbFloat('Fog Distance - Near Plane'), - wbFloat('Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbInteger('Texture Blend', itU8), - wbByteArray('Unused', 3), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbInteger('Damage', itU16) - ], cpNormal, True, nil, 0), - wbStruct(GNAM, 'Related Waters', [ - wbFormIDCk('Daytime', [WATR, NULL]), - wbFormIDCk('Nighttime', [WATR, NULL]), - wbFormIDCk('Underwater', [WATR, NULL]) - ], cpNormal, True) - ]); - - wbRecord(WEAP, 'Weapon', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(DATA, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Blade One Hand', - {1} 'Blade Two Hand', - {2} 'Blunt One Hand', - {3} 'Blunt Two Hand', - {4} 'Staff', - {5} 'Bow' - ])), - wbFloat('Speed'), - wbFloat('Reach'), - wbInteger('Flags', itU32, wbFlags(['Ignores Normal Weapon Resistance'])), - wbInteger('Value', itU32), - wbInteger('Health', itU32), - wbFloat('Weight'), - wbInteger('Damage', itU16) - ], cpNormal, True) - ]); - - wbRecord(WRLD, 'Worldspace', [ - wbEDID, - wbFULL, - wbFormIDCk(WNAM, 'Parent Worldspace', [WRLD]), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Uable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small world', - {0x02} 'Can''t fast travel', - {0x04} 'Oblivion worldspace', - {0x08} '', - {0x10} 'No LOD water' - ]), cpNormal, True), - wbArray(NAM0, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - wbArray(NAM9, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - wbInteger(SNAM, 'Music', itU32, wbMusicEnum), - wbByteArray(OFST, 'Unknown') - ], False, nil, cpNormal, False, wbRemoveOFST); - - wbRecord(WTHR, 'Weather', [ - wbEDID, - wbString(CNAM, 'Texture Lower Layer'), - wbString(DNAM, 'Texture Upper Layer'), - wbMODL, - wbArray(NAM0, 'Colors by Types/Times', - wbArray('Type', - wbStruct('Time', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night'] - ), - ['Sky-Upper','Fog','Clouds-Lower','Ambient','Sunlight','Sun','Stars','Sky-Lower','Horizon','Clouds-Upper'] - , cpNormal, True), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day Near'), - wbFloat('Day Far'), - wbFloat('Night Near'), - wbFloat('Night Far') - ], cpNormal, True), - wbStruct(HNAM, 'HDR Data', [ - wbFloat('Eye Adapt Speed'), - wbFloat('Blur Radius'), - wbFloat('Blur Passes'), - wbFloat('Emissive Mult'), - wbFloat('Target LUM'), - wbFloat('Upper LUM Clamp'), - wbFloat('Bright Scale'), - wbFloat('Bright Clamp'), - wbFloat('LUM Ramp No Tex'), - wbFloat('LUM Ramp Min'), - wbFloat('LUM Ramp Max'), - wbFloat('Sunlight Dimmer'), - wbFloat('Grass Dimmer'), - wbFloat('Tree Dimmer') - ], cpNormal, True), - wbStruct(DATA, '', [ - wbInteger('Wind Speed', itU8), - wbInteger('Cloud Speed (Lower)', itU8), - wbInteger('Cloud Speed (Upper)', itU8), - wbInteger('Trans Delta', itU8), - wbInteger('Sun Glare', itU8), - wbInteger('Sun Damage', itU8), - wbInteger('Precipitation - Begin Fade In', itU8), - wbInteger('Precipitation - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Weather Classification', itU8, wbWthrDataClassification), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]) - ], cpNormal, True), - wbRArray('Sounds', wbStruct(SNAM, 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Type', itU32, wbEnum([ - {0}'Default', - {1}'Precip', - {2}'Wind', - {3}'Thunder' - ])) - ])) - ]); - - wbAddGroupOrder(GMST); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HAIR); - wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(SKIL); - wbAddGroupOrder(MGEF); - wbAddGroupOrder(SCPT); - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - wbAddGroupOrder(BSGN); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(APPA); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CLOT); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(STAT); - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(FLOR); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(CREA); - wbAddGroupOrder(LVLC); - wbAddGroupOrder(SLGM); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(SBSP); - wbAddGroupOrder(SGST); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(REGN); - wbAddGroupOrder(CELL); - wbAddGroupOrder(WRLD); - wbAddGroupOrder(DIAL); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(LVSP); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); -end; - -initialization -end. diff --git a/lib/xedit/wbDefinitionsTES4.pas b/lib/xedit/wbDefinitionsTES4.pas deleted file mode 100644 index 546f29e..0000000 --- a/lib/xedit/wbDefinitionsTES4.pas +++ /dev/null @@ -1,5174 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbDefinitionsTES4; - -{$I wbDefines.inc} - -interface - -uses - wbInterface; - -var - wbPKDTFlags: IwbFlagsDef; - wbServiceFlags: IwbFlagsDef; - - wbAxisEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFunctionsEnum: IwbEnumDef; - wbMagicSchoolEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbOBMEResolutionInfo: IwbEnumDef; - wbPKDTType: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoulGemEnum: IwbEnumDef; - wbSpecializationEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - -procedure DefineTES4; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants, - wbHelpers; - -const - ACBS : TwbSignature = 'ACBS'; - ACHR : TwbSignature = 'ACHR'; - ACRE : TwbSignature = 'ACRE'; - TRGT : TwbSignature = 'TRGT'; - ACTI : TwbSignature = 'ACTI'; - AIDT : TwbSignature = 'AIDT'; - ALCH : TwbSignature = 'ALCH'; - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - APPA : TwbSignature = 'APPA'; - ARMO : TwbSignature = 'ARMO'; - ATTR : TwbSignature = 'ATTR'; - ATXT : TwbSignature = 'ATXT'; - BMDT : TwbSignature = 'BMDT'; - BNAM : TwbSignature = 'BNAM'; - BOOK : TwbSignature = 'BOOK'; - BSGN : TwbSignature = 'BSGN'; - BTXT : TwbSignature = 'BTXT'; - CELL : TwbSignature = 'CELL'; - CLAS : TwbSignature = 'CLAS'; - CLMT : TwbSignature = 'CLMT'; - CLOT : TwbSignature = 'CLOT'; - CNAM : TwbSignature = 'CNAM'; - CNTO : TwbSignature = 'CNTO'; - CONT : TwbSignature = 'CONT'; - CREA : TwbSignature = 'CREA'; - CSAD : TwbSignature = 'CSAD'; - CSCR : TwbSignature = 'CSCR'; - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSTD : TwbSignature = 'CSTD'; - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - CTDT : TwbSignature = 'CTDT'; - DATA : TwbSignature = 'DATA'; - DATX : TwbSignature = 'DATX'; - DELE : TwbSignature = 'DELE'; - DESC : TwbSignature = 'DESC'; - DIAL : TwbSignature = 'DIAL'; - DNAM : TwbSignature = 'DNAM'; - DOOR : TwbSignature = 'DOOR'; - EDID : TwbSignature = 'EDID'; - EDDX : TwbSignature = 'EDDX'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - ACVA : TwbSignature = 'ACVA'; - EFII : TwbSignature = 'EFII'; - EFXX : TwbSignature = 'EFXX'; - EFIX : TwbSignature = 'EFIX'; - EFME : TwbSignature = 'EFME'; - EFSH : TwbSignature = 'EFSH'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - ESCE : TwbSignature = 'ESCE'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FGGA : TwbSignature = 'FGGA'; - FGGS : TwbSignature = 'FGGS'; - FGTS : TwbSignature = 'FGTS'; - FLOR : TwbSignature = 'FLOR'; - FLTV : TwbSignature = 'FLTV'; - FNAM : TwbSignature = 'FNAM'; - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - GLOB : TwbSignature = 'GLOB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - HAIR : TwbSignature = 'HAIR'; - HCLR : TwbSignature = 'HCLR'; - HEDR : TwbSignature = 'HEDR'; - HNAM : TwbSignature = 'HNAM'; - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLE : TwbSignature = 'IDLE'; - NULL : TwbSignature = 'NULL'; - INAM : TwbSignature = 'INAM'; - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - JNAM : TwbSignature = 'JNAM'; - KEYM : TwbSignature = 'KEYM'; - KFFZ : TwbSignature = 'KFFZ'; - LAND : TwbSignature = 'LAND'; - LIGH : TwbSignature = 'LIGH'; - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LTEX : TwbSignature = 'LTEX'; - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLI : TwbSignature = 'LVLI'; - LVLO : TwbSignature = 'LVLO'; - LVSP : TwbSignature = 'LVSP'; - MAST : TwbSignature = 'MAST'; - MGEF : TwbSignature = 'MGEF'; - MISC : TwbSignature = 'MISC'; - MNAM : TwbSignature = 'MNAM'; - MO2B : TwbSignature = 'MO2B'; - MO2T : TwbSignature = 'MO2T'; - MO3B : TwbSignature = 'MO3B'; - MO3T : TwbSignature = 'MO3T'; - MO4B : TwbSignature = 'MO4B'; - MO4T : TwbSignature = 'MO4T'; - MOD2 : TwbSignature = 'MOD2'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MODB : TwbSignature = 'MODB'; - MODL : TwbSignature = 'MODL'; - MODT : TwbSignature = 'MODT'; - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM9 : TwbSignature = 'NAM9'; - NAME : TwbSignature = 'NAME'; - NIFT : TwbSignature = 'NIFT'; - NIFZ : TwbSignature = 'NIFZ'; - NPC_ : TwbSignature = 'NPC_'; - OFST : TwbSignature = 'OFST'; - OBME : TwbSignature = 'OBME'; - ONAM : TwbSignature = 'ONAM'; - PACK : TwbSignature = 'PACK'; - PFIG : TwbSignature = 'PFIG'; - PFPC : TwbSignature = 'PFPC'; - PGAG : TwbSignature = 'PGAG'; - PGRD : TwbSignature = 'PGRD'; - PGRI : TwbSignature = 'PGRI'; - PGRL : TwbSignature = 'PGRL'; - PGRP : TwbSignature = 'PGRP'; - PGRR : TwbSignature = 'PGRR'; - PKDT : TwbSignature = 'PKDT'; - PKID : TwbSignature = 'PKID'; - PLDT : TwbSignature = 'PLDT'; - PNAM : TwbSignature = 'PNAM'; - PSDT : TwbSignature = 'PSDT'; - PTDT : TwbSignature = 'PTDT'; - QNAM : TwbSignature = 'QNAM'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QSTI : TwbSignature = 'QSTI'; - QSTR : TwbSignature = 'QSTR'; - TPIC : TwbSignature = 'TPIC'; - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RCLR : TwbSignature = 'RCLR'; - RDAT : TwbSignature = 'RDAT'; - RDGS : TwbSignature = 'RDGS'; - RDMD : TwbSignature = 'RDMD'; - RDMP : TwbSignature = 'RDMP'; - RDOT : TwbSignature = 'RDOT'; - RDSD : TwbSignature = 'RDSD'; - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - PLYR : TwbSignature = 'PLYR'; - REGN : TwbSignature = 'REGN'; - RNAM : TwbSignature = 'RNAM'; - ROAD : TwbSignature = 'ROAD'; - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - SBSP : TwbSignature = 'SBSP'; - SCDA : TwbSignature = 'SCDA'; - SCHD : TwbSignature = 'SCHD'; - SCHR : TwbSignature = 'SCHR'; - SCIT : TwbSignature = 'SCIT'; - SCPT : TwbSignature = 'SCPT'; - SCRI : TwbSignature = 'SCRI'; - SCRO : TwbSignature = 'SCRO'; - SCRV : TwbSignature = 'SCRV'; - SCTX : TwbSignature = 'SCTX'; - SCVR : TwbSignature = 'SCVR'; - SGST : TwbSignature = 'SGST'; - SKIL : TwbSignature = 'SKIL'; - SLCP : TwbSignature = 'SLCP'; - SLGM : TwbSignature = 'SLGM'; - SLSD : TwbSignature = 'SLSD'; - SNAM : TwbSignature = 'SNAM'; - SNDD : TwbSignature = 'SNDD'; - SNDX : TwbSignature = 'SNDX'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPEL : TwbSignature = 'SPEL'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - STAT : TwbSignature = 'STAT'; - TCLF : TwbSignature = 'TCLF'; - TCLT : TwbSignature = 'TCLT'; - TES4 : TwbSignature = 'TES4'; - TNAM : TwbSignature = 'TNAM'; - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - UNAM : TwbSignature = 'UNAM'; - VCLR : TwbSignature = 'VCLR'; - VHGT : TwbSignature = 'VHGT'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - WATR : TwbSignature = 'WATR'; - WEAP : TwbSignature = 'WEAP'; - WLST : TwbSignature = 'WLST'; - WNAM : TwbSignature = 'WNAM'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - XACT : TwbSignature = 'XACT'; - XCCM : TwbSignature = 'XCCM'; - XCHG : TwbSignature = 'XCHG'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMT : TwbSignature = 'XCMT'; - XCNT : TwbSignature = 'XCNT'; - XCWT : TwbSignature = 'XCWT'; - XESP : TwbSignature = 'XESP'; - XGLB : TwbSignature = 'XGLB'; - XHLT : TwbSignature = 'XHLT'; - XHRS : TwbSignature = 'XHRS'; - XLCM : TwbSignature = 'XLCM'; - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XNAM : TwbSignature = 'XNAM'; - XOWN : TwbSignature = 'XOWN'; - XPCI : TwbSignature = 'XPCI'; - XRGD : TwbSignature = 'XRGD'; - XRNK : TwbSignature = 'XRNK'; - XRTM : TwbSignature = 'XRTM'; - XSCL : TwbSignature = 'XSCL'; - XSED : TwbSignature = 'XSED'; - XSOL : TwbSignature = 'XSOL'; - XTEL : TwbSignature = 'XTEL'; - XTRG : TwbSignature = 'XTRG'; - XXXX : TwbSignature = 'XXXX'; - ZNAM : TwbSignature = 'ZNAM'; - -var - wbEDID: IwbSubRecordDef; - wbXOWN: IwbSubRecordDef; - wbXGLB: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbSLSD: IwbSubRecordDef; - wbBodyDataIndex: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordDef; - wbCNTOs: IwbSubRecordArrayDef; - wbCSDT: IwbSubRecordStructDef; - wbCSDTs: IwbSubRecordArrayDef; - wbFULL: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbXNAM: IwbSubRecordDef; - wbXNAMs: IwbSubRecordArrayDef; - wbDESC: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot : IwbSubRecordDef; - wbPosRot : IwbStructDef; - wbMODL: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordUnionDef; - wbSCHR: IwbSubRecordUnionDef; - wbCTDAs: IwbSubRecordArrayDef; - wbSCROs: IwbSubRecordArrayDef; - wbPGRP: IwbSubRecordDef; - wbResultScript: IwbSubRecordStructDef; -// wbResultScriptOld: IwbSubRecordStructDef; - wbSCRI: IwbSubRecordDef; - wbFaceGen: IwbSubRecordStructDef; - wbENAM: IwbSubRecordDef; - wbFGGS: IwbSubRecordDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIDOBME: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEFITOBME: IwbSubRecordDef; - wbEFIX: IwbSubRecordDef; - wbSCIT: IwbSubRecordStructDef; - wbSCITOBME: IwbSubRecordStructDef; -// wbEffects: IwbSubRecordUnionDef; - wbEffects: IwbSubRecordArrayDef; - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ); -end; - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaType(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and $F0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.ToString(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $F0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Run on target', - {0x04} 'Use global' - ]); - - s := wbCtdaTypeFlags.Check(aInt and $0F, aElement); - - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not $80 of - 0: Result := 'Lower Body'; - 1: Result := 'Left Arm'; - 2: Result := 'Left Hand'; - 3: Result := 'Right Arm'; - 4: Result := 'Special Idle'; - 5: Result := 'Whole Body'; - 6: Result := 'Upper Body'; - else - Result := ''; - end; - - if (aInt and $80) = 0 then - Result := Result + ', Must return a file'; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - end; - ctCheck: begin - case aInt and not $80 of - 0..6: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbWthrDataClassification(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt and not 192 of - 0: Result := 'None'; - 1: Result := 'Pleasant'; - 2: Result := 'Cloudy'; - 3: Result := 'Unknown 3'; - 4: Result := 'Rainy'; - 8: Result := 'Snow'; - else - Result := ''; - end; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2) - end; - ctCheck: begin - case aInt and not 192 of - 0..4, 8: Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbGLOBFNAM(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt of - Ord('s'): Result := 'Short'; - Ord('l'): Result := 'Long'; - Ord('f'): Result := 'Float'; - else - Result := ''; - end; - end; - ctToSortKey: Result := Chr(aInt); - ctCheck: begin - case aInt of - Ord('s'), Ord('l'), Ord('f'): Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; - Cell: IwbMainRecord; - Position: TwbVector; - Grid: TwbGridCell; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - - // grid position of persistent reference in exterior persistent cell (interior cells are not persistent) - if Supports(aMainRecord.Container, IwbGroupRecord, Container) then - Cell := IwbGroupRecord(Container).ChildrenOf; - if Assigned(Cell) and Cell.IsPersistent and (Cell.Signature = 'CELL') then - if aMainRecord.GetPosition(Position) then begin - Grid := wbPositionToGridCell(Position); - Result := Result + ' at ' + IntToStr(Grid.x) + ',' + IntToStr(Grid.y); - end; - end; - end; -end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - if not aMainRecord.IsPersistent then begin - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; - 'f': Result := 2; - end; - end; -end; - -function wbMISCActorValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - MainRecord : IwbMainRecord; -begin - Result := 0; - - if not Assigned(aElement) then - Exit; - - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - - if (MainRecord.Flags._Flags and $000000C0) = $000000C0 then - Result := 1; -end; - -function wbXLOCFillerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 16 then - Result := 1; -end; - -function wbPACKPKDTDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 1; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 4 then - Result := 0; -end; - -function wbREFRXSEDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbSubRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Supports(Container, IwbSubRecord, SubRecord) then - if SubRecord.SubRecordHeaderSize = 4 then - Result := 1; -end; - - -type - TCTDAFunctionParamType = ( - ptNone, - ptInteger, - ptVariableName, //Integer - ptSex, //Enum: Male, Female - ptActorValue, //Enum: wbActorValue - ptCrimeType, //?? Enum - ptAxis, //?? Char - ptFormType, //?? Enum - ptQuestStage, - - ptObjectReference, //REFR, ACHR, ACRE, PGRE - ptInventoryObject, //ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, NOTE, ARMA - ptActor, //ACHR, ACRE - ptQuest, //QUST - ptFaction, //FACT - ptCell, //CELL - ptClass, //CLAS - ptRace, //RACE - ptActorBase, //NPC_, CREA - ptGlobal, //GLOB - ptWeather, //WTHR - ptPackage, //PACK - ptOwnerOpt, //FACT, NPC_ - ptBirthsign, //BSGN - ptFurniture, //FURN - ptMagicItem, //SPEL - ptMagicEffect, //MGEF - ptWorldspace, //WRLD - ptReferencableObject - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - end; - -const - wbCTDAFunctions : array[0..191] of TCTDAFunction = ( - (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), - (Index: 5; Name: 'GetLocked'), - (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), - (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), - (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), - (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), - (Index: 12; Name: 'GetSecondsPassed'), - (Index: 14; Name: 'GetActorValue'; ParamType1: ptActorValue), - (Index: 18; Name: 'GetCurrentTime'), - (Index: 24; Name: 'GetScale'), - (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), - (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), - (Index: 35; Name: 'GetDisabled'), - (Index: 36; Name: 'MenuMode'; ParamType1: ptInteger), - (Index: 39; Name: 'GetDisease'), - (Index: 40; Name: 'GetVampire'), - (Index: 41; Name: 'GetClothingValue'), - (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), - (Index: 43; Name: 'SameRace'; ParamType1: ptActor), - (Index: 44; Name: 'SameSex'; ParamType1: ptActor), - (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), - (Index: 46; Name: 'GetDead'), - (Index: 47; Name: 'GetItemCount'; ParamType1: ptInventoryObject), - (Index: 48; Name: 'GetGold'), - (Index: 49; Name: 'GetSleeping'), - (Index: 50; Name: 'GetTalkedToPC'), - (Index: 53; Name: 'GetScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), - (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), - (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), - (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), - (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), - (Index: 61; Name: 'GetAlarmed'), - (Index: 62; Name: 'IsRaining'), - (Index: 63; Name: 'GetAttacked'), - (Index: 64; Name: 'GetIsCreature'), - (Index: 65; Name: 'GetLockLevel'), - (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), - (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), - (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), - (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), - (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), - (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), - (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), - (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), - (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), - (Index: 75; Name: 'IsSnowing'), - (Index: 76; Name: 'GetDisposition'; ParamType1: ptActor), - (Index: 77; Name: 'GetRandomPercent'), - (Index: 79; Name: 'GetQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), - (Index: 80; Name: 'GetLevel'), - (Index: 81; Name: 'GetArmorRating'), - (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), - (Index: 91; Name: 'GetIsAlerted'), - (Index: 98; Name: 'GetPlayerControlsDisabled'), - (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), - (Index: 101; Name: 'IsWeaponOut'), - (Index: 102; Name: 'IsTorchOut'), - (Index: 103; Name: 'IsShieldOut'), - (Index: 104; Name: 'IsYielding'), - (Index: 106; Name: 'IsFacingUp'), - (Index: 107; Name: 'GetKnockedState'), - (Index: 108; Name: 'GetWeaponAnimType'), - (Index: 109; Name: 'GetWeaponSkillType'), - (Index: 110; Name: 'GetCurrentAIPackage'), - (Index: 111; Name: 'IsWaiting'), - (Index: 112; Name: 'IsIdlePlaying'), - (Index: 116; Name: 'GetCrimeGold'), - (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), - (Index: 125; Name: 'IsGuard'), - (Index: 127; Name: 'CanPayCrimeGold'), - (Index: 128; Name: 'GetFatiguePercentage'), - (Index: 129; Name: 'GetPCIsClass'; ParamType1: ptClass), - (Index: 130; Name: 'GetPCIsRace'; ParamType1: ptRace), - (Index: 131; Name: 'GetPCIsSex'; ParamType1: ptSex), - (Index: 132; Name: 'GetPCInFaction'; ParamType1: ptFaction), - (Index: 133; Name: 'SameFactionAsPC'), - (Index: 134; Name: 'SameRaceAsPC'), - (Index: 135; Name: 'SameSexAsPC'), - (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), - (Index: 141; Name: 'IsTalking'), - (Index: 142; Name: 'GetWalkSpeed'), - (Index: 143; Name: 'GetCurrentAIProcedure'), - (Index: 144; Name: 'GetTrespassWarningLevel'), - (Index: 145; Name: 'IsTrespassing'), - (Index: 146; Name: 'IsInMyOwnedCell'), - (Index: 147; Name: 'GetWindSpeed'), - (Index: 148; Name: 'GetCurrentWeatherPercent'), - (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), - (Index: 150; Name: 'IsContinuingPackagePCNear'), - (Index: 153; Name: 'CanHaveFlames'), - (Index: 154; Name: 'HasFlames'), - (Index: 157; Name: 'GetOpenState'), - (Index: 159; Name: 'GetSitting'), - (Index: 160; Name: 'GetFurnitureMarkerID'), - (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), - (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), - (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), - (Index: 170; Name: 'GetDayOfWeek'), - (Index: 171; Name: 'IsPlayerInJail'), - (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), - (Index: 175; Name: 'IsPCSleeping'), - (Index: 176; Name: 'IsPCAMurderer'), - (Index: 180; Name: 'GetDetectionLevel'; ParamType1: ptActor), - (Index: 182; Name: 'GetEquipped'; ParamType1: ptInventoryObject), - (Index: 185; Name: 'IsSwimming'), - (Index: 190; Name: 'GetAmountSoldStolen'), - (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), - (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), - (Index: 197; Name: 'GetPCFactionSteal'; ParamType1: ptFaction), - (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), - (Index: 201; Name: 'GetPCFactionSubmitAuthority'; ParamType1: ptFaction), - (Index: 203; Name: 'GetDestroyed'), - (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), - (Index: 215; Name: 'GetDoorDefaultOpen'), - (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), - (Index: 224; Name: 'GetIsPlayerBirthsign'; ParamType1: ptBirthsign), - (Index: 225; Name: 'GetPersuasionNumber'), - (Index: 227; Name: 'HasVampireFed'), - (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), - (Index: 229; Name: 'GetClassDefaultMatch'), - (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), - (Index: 237; Name: 'GetIsGhost'), - (Index: 242; Name: 'GetUnconscious'), - (Index: 244; Name: 'GetRestrained'), - (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), - (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), - (Index: 249; Name: 'GetPCFame'), - (Index: 251; Name: 'GetPCInfamy'), - (Index: 254; Name: 'GetIsPlayableRace'), - (Index: 255; Name: 'GetOffersServicesNow'), - (Index: 258; Name: 'GetUsedItemLevel'), - (Index: 259; Name: 'GetUsedItemActivate'), - (Index: 264; Name: 'GetBarterGold'), - (Index: 265; Name: 'IsTimePassing'), - (Index: 266; Name: 'IsPleasant'), - (Index: 267; Name: 'IsCloudy'), - (Index: 274; Name: 'GetArmorRatingUpperBody'), - (Index: 277; Name: 'GetBaseActorValue'; ParamType1: ptActorValue), - (Index: 278; Name: 'IsOwner'; ParamType1: ptOwnerOpt), - (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwnerOpt), - (Index: 282; Name: 'IsHorseStolen'), - (Index: 285; Name: 'IsLeftUp'), - (Index: 286; Name: 'IsSneaking'), - (Index: 287; Name: 'IsRunning'), - (Index: 288; Name: 'GetFriendHit'; ParamType1: ptActor), - (Index: 289; Name: 'IsInCombat'), - (Index: 300; Name: 'IsInInterior'), - (Index: 305; Name: 'GetInvestmentGold'), - (Index: 306; Name: 'IsActorUsingATorch'), - (Index: 309; Name: 'IsXBox'), - (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldSpace), - (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptInteger), - (Index: 313; Name: 'IsActorEvil'), - (Index: 314; Name: 'IsActorAVictim'), - (Index: 315; Name: 'GetTotalPersuasionNumber'), - (Index: 318; Name: 'GetIdleDoneOnce'), - (Index: 320; Name: 'GetNoRumors'), - (Index: 323; Name: 'WhichServiceMenu'), - (Index: 327; Name: 'IsRidingHorse'), - (Index: 329; Name: 'IsTurnArrest'), - (Index: 332; Name: 'IsInDangerousWater'), - (Index: 338; Name: 'GetIgnoreFriendlyHits'), - (Index: 339; Name: 'IsPlayersLastRiddenHorse'), - (Index: 353; Name: 'IsActor'), - (Index: 354; Name: 'IsEssential'), - (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), - (Index: 361; Name: 'GetTimeDead'), - (Index: 362; Name: 'GetPlayerHasLastRiddenHorse'), - (Index: 365; Name: 'GetPlayerInSEWorld'), - - // Added by OBSE: - (Index: 1107; Name: 'IsAmmo,'; ParamType1: ptInteger), - (Index: 1884; Name: 'GetPCTrainingSessionsUsed'; ParamType1: ptPackage), - (Index: 2213; Name: 'GetPackageOffersServices'; ParamType1: ptPackage), - (Index: 2214; Name: 'GetPackageMustReachLocation'; ParamType1: ptPackage), - (Index: 2215; Name: 'GetPackageMustComplete'; ParamType1: ptPackage), - (Index: 2216; Name: 'GetPackageLockDoorsAtStart'; ParamType1: ptPackage), - (Index: 2217; Name: 'GetPackageLockDoorsAtEnd'; ParamType1: ptPackage), - (Index: 2218; Name: 'GetPackageLockDoorsAtLocation'; ParamType1: ptPackage), - (Index: 2219; Name: 'GetPackageUnlockDoorsAtStart'; ParamType1: ptPackage), - (Index: 2220; Name: 'GetPackageUnlockDoorsAtEnd'; ParamType1: ptPackage), - (Index: 2221; Name: 'GetPackageUnlockDoorsAtLocation'; ParamType1: ptPackage), - (Index: 2222; Name: 'GetPackageContinueIfPCNear'; ParamType1: ptPackage), - (Index: 2223; Name: 'GetPackageOncePerDay'; ParamType1: ptPackage), - (Index: 2224; Name: 'GetPackageSkipFalloutBehavior'; ParamType1: ptPackage), - (Index: 2225; Name: 'GetPackageAlwaysRun'; ParamType1: ptPackage), - (Index: 2226; Name: 'GetPackageAlwaysSneak'; ParamType1: ptPackage), - (Index: 2227; Name: 'GetPackageAllowSwimming'; ParamType1: ptPackage), - (Index: 2228; Name: 'GetPackageAllowFalls'; ParamType1: ptPackage), - (Index: 2229; Name: 'GetPackageArmorUnequipped'; ParamType1: ptPackage), - (Index: 2230; Name: 'GetPackageWeaponsUnequipped'; ParamType1: ptPackage), - (Index: 2231; Name: 'GetPackageDefensiveCombat'; ParamType1: ptPackage), - (Index: 2232; Name: 'GetPackageUseHorse'; ParamType1: ptPackage), - (Index: 2233; Name: 'GetPackageNoIdleAnims'; ParamType1: ptPackage) - ); - -var - wbCTDAFunctionEditInfo : string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbEFITOBMEParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ParamInfo: Variant; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ParamInfo := Container.ElementNativeValues['..\EFME\EFIT Param Info']; - if VarIsNull(ParamInfo) or VarIsEmpty(ParamInfo) then - else - Result := ParamInfo; -end; - -function wbEFIXParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ParamInfo: Variant; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - ParamInfo := Container.ElementNativeValues['..\EFME\EFIX Param Info']; - if VarIsNull(ParamInfo) or VarIsEmpty(ParamInfo) then - else - Result := ParamInfo; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType1)); -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - if Assigned(Desc) then - Result := Succ(Integer(Desc.ParamType2)); -end; -{ -function wbCTDAFunction(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc: PCTDAFunction; -begin - Result := ''; - case aType of - ctToStr: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - end; -end; -} -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -function wbCTDAParam2VariableNameToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - Variables : TStringList; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - MainRecord := nil; - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; -{ if Param1.NativeValue = 0 then - if Supports(Container.Container, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[i], IwbContainerElementRef, Container2) then - if SameText(Container2.ElementValues['Function'], 'GetIsID') then begin - Param1 := Container2.ElementByName['Parameter #1']; - if Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Break; - end;} - - if not Assigned(MainRecord) then - Exit; - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - Variables := TStringList.Create; - else - Variables := nil; - end; - try - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if Assigned(Variables) then - Variables.AddObject(s, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := s; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - Variables.Sort; - Result := Variables.CommaText; - end; - end; - finally - FreeAndNil(Variables); - end; -end; - -function wbCTDAParam2VariableNameToInt(const aString: string; const aElement: IwbElement): Int64; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - BaseRecord : IwbMainRecord; - ScriptRef : IwbElement; - Script : IwbMainRecord; - LocalVars : IwbContainerElementRef; - LocalVar : IwbContainerElementRef; - i, j : Integer; - s : string; -begin - Result := StrToInt64Def(aString, Low(Cardinal)); - if Result <> Low(Cardinal) then - Exit; - - if not Assigned(aElement) then - raise Exception.Create('aElement not specified'); - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - raise Exception.Create('Container not assigned'); - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - raise Exception.Create('Could not find "Parameter #1"'); - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - raise Exception.Create('"Parameter #1" does not reference a valid main record'); - - BaseRecord := MainRecord.BaseRecord; - if Assigned(BaseRecord) then - MainRecord := BaseRecord; - - ScriptRef := MainRecord.RecordBySignature['SCRI']; - - if not Assigned(ScriptRef) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not contain a SCRI subrecord'); - - if not Supports(ScriptRef.LinksTo, IwbMainRecord, Script) then - raise Exception.Create('"'+MainRecord.ShortName+'" does not have a valid script'); - - if Supports(Script.ElementByName['Local Variables'], IwbContainerElementRef, LocalVars) then begin - for i := 0 to Pred(LocalVars.ElementCount) do - if Supports(LocalVars.Elements[i], IwbContainerElementRef, LocalVar) then begin - j := LocalVar.ElementNativeValues['SLSD\Index']; - s := LocalVar.ElementNativeValues['SCVR']; - if SameText(s, Trim(aString)) then begin - Result := j; - Exit; - end; - end; - end; - - raise Exception.Create('Variable "'+aString+'" was not found in "'+MainRecord.ShortName+'"'); -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if not wbRemoveOffsetData then - Exit; - - if Supports(aElement, IwbContainer, Container) then begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; -// Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; -// i : Integer; - IsInterior : Boolean; - GroupRecord : IwbGroupRecord; -// Removed : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['DATA'] then - Exit; - - IsInterior := (Container.ElementNativeValues['DATA'] and 1) <> 0; - - if IsInterior then - Container.Add('XCLL') - else begin - Container.Add('XCLC'); - if (Container.ElementNativeValues['DATA'] and 2) = 0 then - if Supports(MainRecord.Container, IwbGroupRecord, GroupRecord) then - if GroupRecord.GroupType = 1 then - Container.ElementNativeValues['DATA'] := - Container.ElementNativeValues['DATA'] or 2; - end; - -// Removed := False; -// if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin -// for i:= Pred(Container2.ElementCount) downto 0 do -// if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then begin -// if not Removed then begin -// Removed := True; -// Container2.MarkModifiedRecursive; -// end; -// Container2.RemoveElement(i); -// end; -// if Container2.ElementCount < 1 then -// Container2.Remove; -// end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMGEFAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - _File : IwbFile; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - _File := MainRecord._File; - - if not Assigned(_File) then - Exit; - - if not SameText(_File.FileName, 'Oblivion.esm') then - Exit; - - if SameText(MainRecord.EditorID, 'RSFI') or - SameText(MainRecord.EditorID, 'RSFR') or - SameText(MainRecord.EditorID, 'RSPA') or - SameText(MainRecord.EditorID, 'RSSH') then begin - - Container.ElementNativeValues['DATA - Data\Flags'] := - Cardinal(Container.ElementNativeValues['DATA - Data\Flags']) or $8; - - end; - - if SameText(MainRecord.EditorID, 'REAN') then begin - - Container.ElementNativeValues['DATA - Data\Flags'] := - Cardinal(Container.ElementNativeValues['DATA - Data\Flags']) and not $20000; - - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbCounterEffectsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterByPathAfterSet('DATA - Data\Counter effect count', aElement); -end; - -procedure wbMGEFAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerByPathAfterSet('DATA - Data\Counter effect count', 'ESCE - Counter Effects', aElement); -end; - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Container.ElementCount < 1 then - Exit; - - Element := Container.ElementByName['Magic effect name']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - - if (MainRecord.ElementNativeValues['DATA - Data\Flags'] and $01000000) = 0 then - Exit; - - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Assoc. Item']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Container.ElementCount < 1 then - Exit; - - Container.RemoveElement('XPCI'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbLVLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Chance : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - Container.RemoveElement('DATA'); - - Chance := Container.ElementNativeValues['LVLD']; - if (Chance and $80) <> 0 then begin - Chance := Chance and not $80; - Container.ElementNativeValues['LVLD'] := Chance; - Container.ElementNativeValues['LVLF'] := Container.ElementNativeValues['LVLF'] or $01; - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container : IwbContainer; - a, b : Single; - NeedsFlip : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainer, Container) then - Exit; - - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := (Container.Elements[0] as IwbContainer).Elements[0].NativeValue; - b := (Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].NativeValue; - case CompareValue(a, b) of - EqualsValue: begin - a := (Container.Elements[0] as IwbContainer).Elements[1].NativeValue; - b := (Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].NativeValue; - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRDAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Points : IwbContainerElementRef; - Connections : IwbContainerElementRef; - i, j : Integer; - Point : IwbContainerElementRef; - Connection : IwbContainerElementRef; - Removed : Boolean; - FirstRemoved: Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Supports(Container.ElementBySignature['PGRP'], IwbContainerElementRef, Points) then - Exit; - - if not Container.ElementExists['PGAG'] then - Container.Add('PGAG').DataSize := (Points.ElementCount + 7) div 8; - - MainRecord.IsCompressed := True; - - if not Supports(Container.ElementBySignature['PGRR'], IwbContainerElementRef, Connections) then - Exit; - - if Points.ElementCount < Connections.ElementCount then - Exit; - - FirstRemoved := False; - for i := Pred(Connections.ElementCount) downto 0 do begin - Connection := Connections.Elements[i] as IwbContainerElementRef; - - Removed := False; - j := Connection.ElementCount; - while j > 0 do begin - Dec(j); - if Connection.Elements[j].NativeValue = 65535 then begin - if not FirstRemoved then begin - FirstRemoved := True; - Connections.MarkModifiedRecursive; - end; - Connection.Elements[j].Remove; - Removed := True; - end else - Break; - end; - - if Removed then begin - Point := Points.Elements[i] as IwbContainerElementRef; - Point.ElementNativeValues['Connections'] := Connection.ElementCount; - end; - - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRRPointAfterLoad(const aElement: IwbElement); -var - Connections : IwbContainerElementRef; - i : Integer; -// Index : Integer; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Connections) then - Exit; - for i := Pred(Connections.ElementCount) downto 0 do - if Connections.Elements[i].NativeValue = 65535 then begin - Connections.RemoveElement(i); - end; -{ if Removed then begin - Index := aElement.Container.ElementCount; - (aElement.ContainingMainRecord.RecordBySignature['PGRP'].Elements[Index] as IwbContainer).Elements[3].NativeValue := Connections.ElementCount; - end;} - finally - wbEndInternalEdit; - end; -end; - -procedure wbPGRIPointerAfterLoad(const aElement: IwbElement); -var - Connections : IwbContainerElementRef; - i, j : Integer; - s : string; - Keys : TStringList; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Connections) then - Exit; - - Keys := TStringList.Create; - try - Keys.Sorted := True; - Keys.Duplicates := dupError; - for i := Pred(Connections.ElementCount) downto 0 do begin - s := Connections.Elements[i].SortKey[True]; - if Keys.Find(s, j) then - Connections.RemoveElement(i, True) - else - Keys.Add(s); - end; - finally - Keys.Free; - end; - finally - wbEndInternalEdit; - end; -end; - -{ -function wbPGRPConnectionsCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Point : IwbContainerElementRef; - s : string; - i : Integer; - PGRP : IwbContainerElementRef; - PGRD : IwbMainRecord; - PGRR : IwbContainerElementRef; - Cons : IwbContainerElementRef; -begin - Result := ''; - if aType = ctCheck then - Exit; - - if wbFixupPGRD and (aInt > 0) and Assigned(aElement) and (aElement.ElementStates * [esModified] = []) then begin - Point := aElement.Container as IwbContainerElementRef; - if Assigned(Point) then begin - s := Trim(Point.Name); - i := Pos('#', s); - if i > 0 then begin - i := StrToIntDef(Copy(s, i+1, High(Integer)), -1); - if i >= 0 then begin - PGRP := Point.Container as IwbContainerElementRef; - if Assigned(PGRP) then begin - if Supports(PGRP.Container, IwbMainRecord, PGRD) then begin - if (csInitDone in PGRD.ContainerStates) and (PGRD.Signature = 'PGRD') then begin - PGRR := PGRD.RecordBySignature['PGRR'] as IwbContainerElementRef; - if Assigned(PGRR) and (PGRR.ElementCount > 0) and (csInitDone in PGRR.ContainerStates) then begin - if (i < PGRR.ElementCount) then begin - if Supports(PGRR.Elements[i], IwbContainer, Cons) then begin - aInt := Cons.ElementCount; - end; - end; - end; - PGRR := nil; - end; - end; - end; - end; - end; - end; - end; - - if aType = ctToSortKey then - Result := IntToHex64(aInt, 2) - else if aType = ctToStr then - Result := IntToStr(aInt); -end; -} - -function wbPxDTLocationDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Type'].NativeValue; -end; - -function wbCalcPGRRSize(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Index: Integer; - - function ExtractCountFromLabel(const aElement: IwbElement; aCount: Integer): Integer; - var - i: Integer; - begin - i := Pos('#', aElement.Name); - if i = 0 then - Result := aCount - else try - Result := StrToInt(Trim(Copy(aElement.Name, i+1, Length(aElement.Name))))+1; - except - Result := aCount; - end; - - end; - -begin - Index := ExtractCountFromLabel(aElement, aElement.Container.ElementCount); - Result := ((aElement.Container.Container as IwbMainRecord).RecordBySignature['PGRP'].Elements[Pred(Index)] as IwbContainer).Elements[3].NativeValue; -end; - -function wbMGEFFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - s: string; - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - s := Container.ElementByName['Flags'].SortKey[False]; - if s[17] = '1' then - Result := 1 - else if s[18] = '1' then - Result := 2 - else if s[19] = '1' then - Result := 3 - else if s[25] = '1' then - Result := 4; -end; - -function wbEDDXDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := True; - - if Supports(aElement.Container, IwbMainRecord, MainRecord) then - Result := not Assigned(MainRecord.ElementBySignature[OBME]); -end; - -function wbOBMEDontShow(const aElement: IwbElement): Boolean; -var - _File: IwbFile; -begin - if not Assigned(aElement) then begin - Result := True; - Exit; - end; - - Result := False; - - _File := aElement._File; - if Assigned(_File) and SameText(_File.FileName, 'Oblivion.esm') then - Result := True; -end; - -function wbOffsetDataColsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbDataContainer; - Element : IwbElement; - fResult : Extended; -begin - Result := 0; - - if Supports(aElement.Container, IwbDataContainer, Container) and (Container.Name = 'OFST - Offset Data') and - Supports(Container.Container, IwbDataContainer, Container) then begin - Element := Container.ElementByPath['Object Bounds\NAM0 - Min\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 0 - else - Result := Trunc(fResult); - Element := Container.ElementByPath['Object Bounds\NAM9 - Max\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 1 - else - Result := Trunc(fResult) - Result + 1; - end; - end; - end; -end; - -procedure DefineTES4; -begin - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags([ - {0x00000001}'ESM', - {0x00000002}'', - {0x00000004}'', - {0x00000008}'', - {0x00000010}'', - {0x00000020}'Deleted', - {0x00000040}'Border Region / Actor Value', - {0x00000080}'Turn Off Fire / Actor Value', - {0x00000100}'', - {0x00000200}'Casts shadows', - {0x00000400}'Quest item / Persistent reference / Show in Menu', - {0x00000800}'Initially disabled', - {0x00001000}'Ignored', - {0x00002000}'', - {0x00004000}'', - {0x00008000}'Visible when distant', - {0x00010000}'', - {0x00020000}'Dangerous / Off limits (Interior cell)', - {0x00040000}'Compressed ', - {0x00080000}'Can''t wait' - ])); - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbByteArray('Unknown', 4, cpIgnore) - ]); - - wbSizeOfMainRecordStruct := 20; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - - wbEDID := wbString(EDID, 'Editor ID', 0, cpNormal); // not cpBenign according to Arthmoor - wbFULL := wbStringKC(FULL, 'Name', 0, cpTranslate); - wbFULLReq := wbStringKC(FULL, 'Name', 0, cpNormal, True); - wbDESC := wbStringKC(DESC, 'Description', 0, cpTranslate); - wbXSCL := wbFloat(XSCL, 'Scale'); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) -// wbArray(MODT, 'Unknown', -// wbByteArray('Unknown', 24, cpBenign), -// 0, nil, cpBenign) - ], []); - - wbSCRI := wbFormIDCk(SCRI, 'Script', [SCPT]); - wbENAM := wbFormIDCk(ENAM, 'Enchantment', [ENCH]); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', [PLYR, REFR, ACRE, ACHR]), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent' - ])), - wbByteArray('Unused', 3) - ]); - - wbRecord(ACHR, 'Placed NPC', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbRStruct('Unused', [ - wbFormIDCk(XPCI, 'Unused', [CELL]), - wbString(FULL, 'Unused') - ], []), - wbXLOD, - wbXESP, - wbFormIDCk(XMRC, 'Merchant container', [REFR], True), - wbFormIDCk(XHRS, 'Horse', [ACRE], True), - wbXRGD, - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbXOWN := wbFormIDCk(XOWN, 'Owner', [FACT, NPC_]); - wbXGLB := wbFormIDCk(XGLB, 'Global variable', [GLOB]); - - wbRecord(ACRE, 'Placed Creature', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [CREA], False, cpNormal, True), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], []), - wbXESP, - wbXRGD, - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(ACTI, 'Activator', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ]); - - wbICON := wbString(ICON, 'Icon filename'); - - wbActorValueEnum := - wbEnum([ - 'Strength', - 'Intelligence', - 'Willpower', - 'Agility', - 'Speed', - 'Endurance', - 'Personality', - 'Luck', - 'Health', - 'Magicka', - 'Fatigue', - 'Encumbrance', - 'Armorer', - 'Athletics', - 'Blade', - 'Block', - 'Blunt', - 'Hand To Hand', - 'Heavy Armor', - 'Alchemy', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration', - 'Acrobatics', - 'Light Armor', - 'Marksman', - 'Mercantile', - 'Security', - 'Sneak', - 'Speechcraft', - {33} 'Aggression', - {34} 'Confidence', - {35} 'Energy', - {36} 'Responsibility', - {37} 'Bounty', - {38} 'Fame', - {39} 'Infamy', - {40} 'Magicka Multiplier', - {41} 'Night Eye Bonus', - {42} 'Attack Bonus', - {43} 'Defend Bonus', - {44} 'Casting Penalty', - {45} 'Blindness', - {46} 'Chameleon', - {47} 'Invisibility', - {48} 'Paralysis', - {49} 'Silence', - {50} 'Confusion', - {51} 'Detect Item Range', - {52} 'Spell Absorb Chance', - {53} 'Spell Reflect Chance', - {54} 'Swim Speed Multiplier', - {55} 'Water Breathing', - {56} 'Water Walking', - {57} 'Stunted Magicka', - {58} 'Detect Life Range', - {59} 'Reflect Damage', - {60} 'Telekinesis', - {61} 'Resist Fire', - {62} 'Resist Frost', - {63} 'Resist Disease', - {64} 'Resist Magic', - {65} 'Resist Normal Weapons', - {66} 'Resist Paralysis', - {67} 'Resist Poison', - {68} 'Resist Shock', - {69} 'Vampirism', - {70} 'Darkness', - {71} 'Resist Water Damage' - ], [ - -1, 'None' - ]); - - wbSkillEnum := - wbEnum([ - 'Armorer', - 'Athletics', - 'Blade', - 'Block', - 'Blunt', - 'Hand To Hand', - 'Heavy Armor', - 'Alchemy', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration', - 'Acrobatics', - 'Light Armor', - 'Marksman', - 'Mercantile', - 'Security', - 'Sneak', - 'Speechcraft' - ], [ - -1, 'None' - ]); - - - wbEFID := wbInteger(EFID, 'Magic effect name', itU32, wbChar4, cpNormal, True); - - wbEFIDOBME := wbStringMgefCode(EFID, 'Magic Effect Code', 4, cpNormal, True); - - wbEFIT := - wbStructSK(EFIT, [4, 5], '', [ - wbInteger('Magic effect name', itU32, wbChar4), - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbInteger('Actor Value', itS32, wbActorValueEnum) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbEFITOBME := - wbStructSK(EFIT, [4, 5], '', [ - wbStringMgefCode('Magic Effect Code', 4), - wbInteger('Magnitude', itU32), - wbInteger('Area', itU32), - wbInteger('Duration', itU32), - wbInteger('Type', itU32, wbEnum(['Self', 'Touch', 'Target'])), - wbUnion('Param #1', wbEFITOBMEParamDecider, [ - wbByteArray('Param #1 - Unknown Type', 4), - wbFormID('Param #1 - FormID'), - wbStringMgefCode('Param #1 - Magic Effect Code', 4), - wbFormIDCk('Param #1 - Actor Value', [ACVA]) - ]) - ], cpNormal, True, nil, -1{, wbEFITAfterLoad}); - - wbEFIX := - wbStructSK(EFIX, [3], '', [ - wbInteger('Override Mask', itU32, wbFlags([])), - wbInteger('Flags', itU32, wbFlags([])), - wbFloat('Base Cost'), - wbUnion('Param #2', wbEFIXParamDecider, [ - wbByteArray('Param #2 - Unknown Type', 4), - wbFormID('Param #2 - FormID'), - wbStringMgefCode('Param #2 - Magic Effect Code', 4), - wbFormIDCk('Param #2 - Actor Value', [ACVA]) - ]) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbMagicSchoolEnum := - wbEnum([ - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Mysticism', - 'Restoration' - ]); - - wbSCIT := - wbRStructSK([0], 'Script effect', [ - wbStructSK(SCIT, [0], 'Script effect data', [ - wbFormIDCk('Script effect', [NULL, SCPT]), - wbInteger('Magic school', itU32, wbMagicSchoolEnum), - wbInteger('Visual effect name', itU32, wbChar4), - wbInteger('Flags', itU8, wbFlags(['Hostile'])), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFULLReq - ], []); - - wbSCITOBME := - wbRStructSK([0], 'Script effect', [ - wbStructSK(SCIT, [0], 'Script effect data', [ - wbFormIDCk('Script effect', [NULL, SCPT]), - wbInteger('Magic school', itU32, wbMagicSchoolEnum), - wbStringMgefCode('Visual Effect Code', 4), - wbInteger('Flags', itU8, wbFlags(['Hostile'])), - wbByteArray('Unused', 3) - ], cpNormal, True, nil, 1), - wbFULLReq - ], []); - - - wbOBMEResolutionInfo := wbEnum(['None', 'FormID', 'Magic Effect Code', 'Actor Value']); - - wbEffects := wbRArray('Effects', - wbRUnion('Effects', [ - wbRStruct('Effect', [ - wbEFID, - wbEFIT, - wbSCIT - ], []), - wbRStruct('Effects', [ - wbRStructs('Effects','Effect', [ - wbStruct(EFME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbInteger('EFIT Param Info', itU8, wbOBMEResolutionInfo), - wbInteger('EFIX Param Info', itU8, wbOBMEResolutionInfo), - wbByteArray('Unused', $0A) - ]), - wbEFIDOBME, - wbEFITOBME, - wbSCITOBME, - wbString(EFII, 'Icon'), - wbEFIX - ], []), - wbEmpty(EFXX, 'Effects End Marker', cpNormal, True), - wbFULLReq - ], []) - ], []) - ); - -// wbEffects := -// wbRUnion('Effects', [ -// wbRStruct('Effects', [ -// wbRStructs('Effects','Effect', [ -// wbEFID, -// wbEFIT, -// wbSCIT -// ], []) -// ], []), -// wbRStruct('Effects', [ -// wbRStructs('Effects','Effect', [ -// wbStruct(EFME, 'Oblivion Magic Extender', [ -// wbInteger('Record Version', itU8), -// wbStruct('OBME Version', [ -// wbInteger('Beta', itU8), -// wbInteger('Minor', itU8), -// wbInteger('Major', itU8) -// ]), -// wbInteger('EFIT Param Info', itU8, wbOBMEResolutionInfo), -// wbInteger('EFIX Param Info', itU8, wbOBMEResolutionInfo), -// wbByteArray('Unused', $0A) -// ]), -// wbEFIDOBME, -// wbEFITOBME, -// wbSCITOBME, -// wbString(EFII, 'Icon'), -// wbEFIX -// ], []), -// wbEmpty(EFXX, 'Effects End Marker', cpNormal, True), -// wbFULLReq -// ], []) -// ], []); - - wbRecord(ALCH, 'Potion', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, '', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(AMMO, 'Ammunition', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbFormIDCk(ENAM, 'Enchantment', [ENCH]), - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(DATA, '', [ - wbFloat('Speed'), - wbInteger('Flags', itU8, wbFlags(['Ignores Normal Weapon Resistance'])), - wbByteArray('Unused', 3), - wbInteger('Value', itU32), - wbFloat('Weight'), - wbInteger('Damage', itU16) - ], cpNormal, True) - ]); - - wbRecord(ANIO, 'Animated Object', [ - wbEDID, - wbMODL, - wbFormIDCk(DATA, 'IDLE animation', [IDLE], False, cpNormal, True) - ]); - - wbRecord(APPA, 'Alchemical Apparatus', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum(['Mortar and Pestle', 'Alembic', 'Calcinator', 'Retort'])), - wbInteger('Value', itU32), - wbFloat('Weight'), - wbFloat('Quality') - ], cpNormal, True) - ]); - - wbRecord(ARMO, 'Armor', [ - wbEDID, - wbFULL, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(BMDT, '', [ - wbInteger('Biped Flags', itU16, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Lower Body', - {0x00000010} 'Hand', - {0x00000020} 'Foot', - {0x00000040} 'Right Ring', - {0x00000080} 'Left Ring', - {0x00000100} 'Amulet', - {0x00000200} 'Weapon', - {0x00000400} 'Back Weapon', - {0x00000800} 'Side Weapon', - {0x00001000} 'Quiver', - {0x00002000} 'Shield', - {0x00004000} 'Torch', - {0x00008000} 'Tail' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} 'Hide Rings', - {0x0002} 'Hide Amulets', - {0x0004} '', - {0x0008} '', - {0x0010} '', - {0x0020} '', - {0x0040} 'Non-Playable', - {0x0080} 'Heavy armor' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbFloat(MO2B, 'Bound Radius', cpBenign), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICON, 'Male icon filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename'), - wbFloat(MO3B, 'Bound Radius', cpBenign), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbFloat(MO4B, 'Bound Radius', cpBenign), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICO2, 'Female icon filename'), - wbStruct(DATA, '', [ - wbInteger('Armor', itU16, wbDiv(100)), - wbInteger('Value', itU32), - wbInteger('Health', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbRecord(BOOK, 'Book', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbDESC, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['Scroll', 'Can''t be taken'])), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ], True); - - wbSPLO := wbFormIDCk(SPLO, 'Spell', [SPEL, LVSP]); - wbSPLOs := wbRArrayS('Spells', wbSPLO); - - wbRecord(BSGN, 'Birthsign', [ - wbEDID, - wbFULL, - wbICON, - wbDESC, - wbSPLOs - ]); - - wbRecord(CELL, 'Cell', [ - wbEDID, - wbFULL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Is Interior Cell', - {0x02} 'Has water', - {0x04} 'Invert Fast Travel behavior', - {0x08} 'Force hide land (exterior cell) / Oblivion interior (interior cell)', - {0x10} '', - {0x20} 'Public place', - {0x40} 'Hand changed', - {0x80} 'Behave like exterior' - ]), cpNormal, True), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct(XCLL, 'Lighting', [ - wbStruct('Ambient Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Directional Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Fog Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade', cpNormal, False, 1, -1, nil, nil, 1.0), - wbFloat('Fog Clip Dist') - ]), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbInteger(XCMT, 'Music', itU8, wbMusicEnum), - wbFloat(XCLW, 'Water Height', cpBenign), - wbFormIDCk(XCCM, 'Climate', [CLMT]), - wbFormIDCk(XCWT, 'Water', [WATR]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], [XCLW, XCMT, XCCM]) - ], True, wbCellAddInfo, cpNormal, False, wbCELLAfterLoad); - - wbServiceFlags := - wbFlags([ - {0x00000001} 'Weapons', - {0x00000002} 'Armor', - {0x00000004} 'Clothing', - {0x00000008} 'Books', - {0x00000010} 'Ingredients', - {0x00000020} '', - {0x00000040} '', - {0x00000080} 'Lights', - {0x00000100} 'Apparatus', - {0x00000200} '', - {0x00000400} 'Miscellaneous', - {0x00000800} 'Spells', - {0x00001000} 'Magic Items', - {0x00002000} 'Potions', - {0x00004000} 'Training', - {0x00008000} '', - {0x00010000} 'Recharge', - {0x00020000} 'Repair' - ]); - - wbSpecializationEnum := wbEnum(['Combat', 'Magic', 'Stealth']); - - wbRecord(CLAS, 'Class', [ - wbEDID, - wbFULL, - wbDESC, - wbICON, - wbStruct(DATA, '', [ - wbArrayS('Primary Attributes', wbInteger('Primary Attribute', itS32, wbActorValueEnum), 2), - wbInteger('Specialization', itU32, wbSpecializationEnum), - wbArrayS('Major Skills', wbInteger('Major Skill', itS32, wbActorValueEnum), 7), - wbInteger('Flags', itU32, wbFlags(['Playable', 'Guard'])), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbInteger('Unused', itU16) - ], cpNormal, True, nil, 5) - ]); - - wbRecord(CLMT, 'Climate', [ - wbEDID, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itS32) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbRecord(CLOT, 'Clothing', [ - wbEDID, - wbFULL, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(BMDT, '', [ - wbInteger('Biped Flags', itU16, wbFlags([ - {0x00000001} 'Head', - {0x00000002} 'Hair', - {0x00000004} 'Upper Body', - {0x00000008} 'Lower Body', - {0x00000010} 'Hand', - {0x00000020} 'Foot', - {0x00000040} 'Right Ring', - {0x00000080} 'Left Ring', - {0x00000100} 'Amulet', - {0x00000200} 'Weapon', - {0x00000400} 'Back Weapon', - {0x00000800} 'Side Weapon', - {0x00001000} 'Quiver', - {0x00002000} 'Shield', - {0x00004000} 'Torch', - {0x00008000} 'Tail' - ])), - wbInteger('General Flags', itU8, wbFlags([ - {0x0001} 'Hide Rings', - {0x0002} 'Hide Amulets', - {0x0004} '', - {0x0008} '', - {0x0010} '', - {0x0020} '', - {0x0040} 'Non-Playable', - {0x0080} '' {Heavy armor} - ])), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbRStruct('Male biped model', [ - wbString(MODL, 'Model Filename'), - wbFloat(MODB, 'Bound Radius', cpBenign), - wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbFloat(MO2B, 'Bound Radius', cpBenign), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICON, 'Male icon filename'), - wbRStruct('Female biped model', [ - wbString(MOD3, 'Model Filename'), - wbFloat(MO3B, 'Bound Radius', cpBenign), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbFloat(MO4B, 'Bound Radius', cpBenign), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore) - ], []), - wbString(ICO2, 'Female icon filename'), - wbStruct(DATA, '', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbCNTO := - wbStructSK(CNTO, [0], 'Item', [ - wbFormIDCk('Item', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, LVLI, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Count', itS32) - ]); - - wbCNTOs := wbRArrayS('Items', wbCNTO); - - wbRecord(CONT, 'Container', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbCNTOs, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags(['', 'Respawns'])), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(SNAM, 'Open sound', [SOUN]), - wbFormIDCk(QNAM, 'Close sound', [SOUN]) - ]); - - wbCSDT := wbRStructSK([0], 'Sound Type', [ - wbInteger(CSDT, 'Type', itU32,wbEnum([ - {0x00} 'Left Foot', - {0x01} 'Right Foot', - {0x02} 'Left Back Foot', - {0x03} 'Right Back Foot', - {0x04} 'Idle', - {0x05} 'Aware', - {0x06} 'Attack', - {0x07} 'Hit', - {0x08} 'Death', - {0x09} 'Weapon' - ])), - wbRArrayS('Sounds', wbRStructSK([0], 'Sound', [ - wbFormIDCk(CSDI, 'Sound', [SOUN, NULL], False, cpNormal, True), - wbInteger(CSDC, 'Sound Chance', itU8, nil, cpNormal, True) - ], []), cpNormal, True) - ], []); - - wbCSDTs := wbRArrayS('Sound Types', wbCSDT); - - wbSoulGemEnum := wbEnum([ - {0} 'None', - {1} 'Petty', - {2} 'Lesser', - {3} 'Common', - {4} 'Greater', - {5} 'Grand' - ]); - - wbRecord(CREA, 'Creature', [ - wbEDID, - wbFULL, - wbMODL, - wbCNTOs, - wbSPLOs, - wbArrayS(NIFZ, 'Models', wbStringLC('Model')), - wbByteArray(NIFT, 'Texture Files Hashes', 0, cpIgnore), - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Biped', - {0x000002} 'Essential', - {0x000004} 'Weapon & Shield', - {0x000008} 'Respawn', - {0x000010} 'Swims', - {0x000020} 'Flies', - {0x000040} 'Walks', - {0x000080} 'PC Level Offset', - {0x000100} 'Unused', //?? - {0x000200} 'No Low Level Processing', - {0x000400} 'Unused', //?? - {0x000800} 'No Blood Spray', - {0x001000} 'No Blood Decal', - {0x002000} '', - {0x004000} '', - {0x008000} 'No Head', - {0x010000} 'No Right Arm', - {0x020000} 'No Left Arm', - {0x040000} 'No Combat in Water', - {0x080000} 'No Shadow', - {0x100000} 'No Corpse Check' - ])), - wbInteger('Base spell points', itU16), - wbInteger('Fatigue', itU16), - wbInteger('Barter gold', itU16), - wbInteger('Level (offset)', itS16), - wbInteger('Calc min', itU16), - wbInteger('Calc max', itU16) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]) - ), - wbFormIDCk(INAM, 'Death item', [LVLI]), - wbSCRI, - wbStruct(AIDT, 'AI Data', [ - wbInteger('Aggression', itU8), - wbInteger('Confidence', itU8), - wbInteger('Energy Level', itU8), - wbInteger('Responsibility', itU8), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbRArray('AI Packages', wbFormIDCk(PKID, 'AI Package', [PACK])), - wbArrayS(KFFZ, 'Animations', wbStringLC('Animation')), - wbStruct(DATA, 'Creature Data', [ - wbInteger('Type', itU8, wbEnum([ - 'Creature', - 'Daedra', - 'Undead', - 'Humanoid', - 'Horse', - 'Giant' - ])), - wbInteger('Combat Skill', itU8), - wbInteger('Magic Skill', itU8), - wbInteger('Stealth Skill', itU8), - wbInteger('Soul', itU8, wbSoulGemEnum), - wbByteArray('Unused', 1), - wbInteger('Health', itU16), - wbByteArray('Unused', 2), - wbInteger('Attack Damage', itU16), - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ], cpNormal, True), - wbInteger(RNAM, 'Attack reach', itU8, nil, cpNormal, True), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY]), - wbFloat(TNAM, 'Turning Speed', cpNormal, True), - wbFloat(BNAM, 'Base Scale', cpNormal, True), - wbFloat(WNAM, 'Foot Weight', cpNormal, True), - wbString(NAM0, 'Blood Spray'), - wbString(NAM1, 'Blood Decal'), - wbFormIDCk(CSCR, 'Inherits Sounds from', [CREA]), - wbCSDTs - ], True); - - wbRecord(CSTY, 'Combat Style', [ - wbEDID, - wbStruct(CSTD, 'Standard', [ - {000}wbInteger('Dodge % Chance', itU8), - {001}wbInteger('Left/Right % Chance', itU8), - {002}wbByteArray('Unused', 2), - {004}wbFloat('Dodge L/R Timer (min)'), - {008}wbFloat('Dodge L/R Timer (max)'), - {012}wbFloat('Dodge Forward Timer (min)'), - {016}wbFloat('Dodge Forward Timer (max)'), - {020}wbFloat('Dodge Back Timer Min'), - {024}wbFloat('Dodge Back Timer Max'), - {028}wbFloat('Idle Timer min'), - {032}wbFloat('Idle Timer max'), - {036}wbInteger('Block % Chance', itU8), - {037}wbInteger('Attack % Chance', itU8), - {038}wbByteArray('Unused', 2), - {040}wbFloat('Recoil/Stagger Bonus to Attack'), - {044}wbFloat('Unconscious Bonus to Attack'), - {048}wbFloat('Hand-To-Hand Bonus to Attack'), - {052}wbInteger('Power Attack % Chance', itU8), - {053}wbByteArray('Unused', 3), - {056}wbFloat('Recoil/Stagger Bonus to Power'), - {060}wbFloat('Unconscious Bonus to Power Attack'), - {064}wbInteger('Power Attack - Normal', itU8), - {065}wbInteger('Power Attack - Forward', itU8), - {066}wbInteger('Power Attack - Back', itU8), - {067}wbInteger('Power Attack - Left', itU8), - {068}wbInteger('Power Attack - Right', itU8), - {069}wbByteArray('Unused', 3), - {072}wbFloat('Hold Timer (min)'), - {076}wbFloat('Hold Timer (max)'), - {080}wbInteger('Flags 1', itU8, wbFlags([ - 'Advanced', - 'Choose Attack using % Chance', - 'Ignore Allies in Area', - 'Will Yield', - 'Rejects Yields', - 'Fleeing Disabled', - 'Prefers Ranged', - 'Melee Alert OK' - ])), - {081}wbInteger('Acrobatic Dodge % Chance', itU8), - {082}wbByteArray('Unused', 2), - {084}wbFloat('Range Mult (Optimal)'), - {088}wbFloat('Range Mult (Max)'), - {092}wbFloat('Switch Distance (Melee)'), - {096}wbFloat('Switch Distance (Ranged)'), - {100}wbFloat('Buff standoff Distance'), - {104}wbFloat('Ranged standoff Distance'), - {108}wbFloat('Group standoff Distance'), - {112}wbInteger('Rushing Attack % Chance', itU8), - {113}wbByteArray('Unused', 3), - {116}wbFloat('Rushing Attack Distance Mult'), - {120}wbInteger('Flags 2', itU32, wbFlags([ - 'Do Not Acquire' - ])) - ], cpNormal, True, nil, 31), - wbStruct(CSAD, 'Advanced', [ - wbFloat('Dodge Fatigue Mod Mult'), - wbFloat('Dodge Fatigue Mod Base'), - wbFloat('Encumb. Speed Mod Base'), - wbFloat('Encumb. Speed Mod Mult'), - wbFloat('Dodge While Under Attack Mult'), - wbFloat('Dodge Not Under Attack Mult'), - wbFloat('Dodge Back While Under Attack Mult'), - wbFloat('Dodge Back Not Under Attack Mult'), - wbFloat('Dodge Forward While Attacking Mult'), - wbFloat('Dodge Forward Not Attacking Mult'), - wbFloat('Block Skill Modifier Mult'), - wbFloat('Block Skill Modifier Base'), - wbFloat('Block While Under Attack Mult'), - wbFloat('Block Not Under Attack Mult'), - wbFloat('Attack Skill Modifier Mult'), - wbFloat('Attack Skill Modifier Base'), - wbFloat('Attack While Under Attack Mult'), - wbFloat('Attack Not Under Attack Mult'), - wbFloat('Attack During Block Mult'), - wbFloat('Power Att. Fatigue Mod Base'), - wbFloat('Power Att. Fatigue Mod Mult') - ]) - ]); - - wbRecord(DIAL, 'Dialog Topic', [ - wbEDID, - wbRArrayS('Quests', wbFormIDCk(QSTI, 'Quest', [QUST], False, cpBenign)), - wbRArrayS('Quests?', wbFormIDCk(QSTR, 'Quest?', [QUST], False, cpBenign)), - wbFULL, - wbInteger(DATA, 'Type', itU8, wbEnum([ - {0} 'Topic', - {1} 'Conversation', - {2} 'Combat', - {3} 'Persuasion', - {4} 'Detection', - {5} 'Service', - {6} 'Miscellaneous' - ]), cpNormal, True) - ], True); - - wbRecord(DOOR, 'Door', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(SNAM, 'Open sound', [SOUN]), - wbFormIDCk(ANAM, 'Close sound', [SOUN]), - wbFormIDCk(BNAM, 'Loop sound', [SOUN]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Oblivion gate', - {0x02} 'Automatic door', - {0x04} 'Hidden', - {0x08} 'Minimal use' - ]), cpNormal, True), - wbRArrayS('Random teleport destinations', wbFormIDCk(TNAM, 'Destination', [CELL, WRLD])) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - 'Normal', - 'Greater Than', - '', - 'Greater Than or Equal Than', - 'Always Show' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0} 'No Membrane Shader', - {1} '', - {2} '', - {3} 'No Particle Shader', - {4} 'Edge Effect - Inverse', - {5} 'Membrane Shader - Affect Skin Only' - ])), - wbByteArray('Unused', 3), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbStruct('Fill/Texture Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbStruct('Edge Effect - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pusle Frequence'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Birth Ratio'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbStruct('Color Key 1 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 2 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Color Key 3 - Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time') - ], cpNormal, True, nil, 25) - ]); - - wbRecord(ENCH, 'Enchantment', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbStruct(ENIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Scroll', - {1} 'Staff', - {2} 'Weapon', - {3} 'Apparel' - ])), - wbInteger('Charge Amount', itU32), - wbInteger('Enchant Cost', itU32), - wbInteger('Flags', itU8, wbFlags(['Manual Enchant Cost (Autocalc Off)'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(EYES, 'Eyes', [ - wbEDID, - wbFULL, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags(['Playable']), cpNormal, True) - ]); - - wbXNAM := - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCk('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32) - ]); - - wbXNAMs := wbRArrayS('Relations', wbXNAM); - - wbRecord(FACT, 'Faction', [ - wbEDID, - wbFULL, - wbXNAMs, - wbInteger(DATA, 'Flags', itU8, wbFlags(['Hidden from Player', 'Evil', 'Special Combat']), cpNormal, True), - wbFloat(CNAM, 'Crime Gold Multiplier', cpNormal, True, 1, -1, nil, nil, 1.0), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itS32), - wbString(MNAM, 'Male', 0, cpTranslate), - wbString(FNAM, 'Female', 0, cpTranslate), - wbString(INAM, 'Insignia') - ], []) - ]); - - wbRecord(FLOR, 'Flora', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbFormIDCk(PFIG, 'Ingredient', [INGR]), - wbStruct(PFPC, 'Seasonal ingredient production', [ - wbInteger('Spring', itU8), - wbInteger('Summer ', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ], cpNormal, True) - ]); - - wbRecord(FURN, 'Furniture', [ - wbEDID, - wbFULL, - wbMODL, - wbSCRI, - wbByteArray(MNAM, 'Marker Flags', 0, cpNormal, True) - ]); - - wbRecord(GLOB, 'Global', [ - wbEDID, - wbInteger(FNAM, 'Type', itU8, wbGLOBFNAM, nil, cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - wbRecord(GMST, 'Game Setting', [ - wbEDID, - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbString('', 0, cpTranslate), - wbInteger('', itS32), - wbFloat('') - ], cpNormal, True) - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDID, - wbMODL, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unused', 1), - wbInteger('Unit from water amount', itU16), - wbByteArray('Unused', 2), - wbInteger('Unit from water type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True) - ]); - - wbRecord(HAIR, 'Hair', [ - wbEDID, - wbFULL, - wbMODL, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'Playable', - 'Not Male', - 'Not Female', - 'Fixed' - ]), cpNormal, True) - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder', - 'Steal Horse' - ], [ - -1, 'None' - ]); - - wbFormTypeEnum := - wbEnum([], [ - $03, 'Game Setting', - $04, 'Global', - $05, 'Class', - $06, 'Faction', - $07, 'Hair', - $08, 'Eyes', - $09, 'Race', - $0A, 'Sound', - $0B, 'Skill', - $0C, 'Magic Effect', - $0D, 'Script', - $0E, 'Land Texture', - $0F, 'Enchantment', - $10, 'Spell', - $11, 'BirthSign', - $12, 'Activator', - $13, 'Apparatus', - $14, 'Armor', - $15, 'Book', - $16, 'Clothing', - $17, 'Container', - $18, 'Door', - $19, 'Ingredient', - $1A, 'Light', - $1B, 'Misc', - $1C, 'Static', - $1D, 'Grass', - $1E, 'Tree', - $1F, 'Flora', - $20, 'Furniture', - $21, 'Weapon', - $22, 'Ammi', - $23, 'NPC', - $24, 'Creature', - $25, 'Leveled Creature', - $26, 'Soul Gem', - $27, 'Key', - $28, 'Alchemy', - $29, 'SubSpace', - $2A, 'Sigil Stone', - $2B, 'Leveled Item', - $2D, 'Weather', - $2E, 'Climate', - $2F, 'Region', - $30, 'Cell', - $31, 'Placed Object', - $32, 'Placed NPC', - $33, 'Placed Creature', - $34, 'Path Grid', - $35, 'Worldspace', - $36, 'Landscape', - $38, 'Road', - $39, 'Dialog Topic', - $3A, 'Dialog Response', - $3B, 'Quest', - $3C, 'Idle Animation', - $3D, 'Package', - $3E, 'Combat Style', - $3F, 'Load Screen', - $40, 'Leveled Spell', - $41, 'Animated Object', - $42, 'Water', - $43, 'Effect Shader' - ]); - - wbSexEnum := - wbEnum(['Male','Female']); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCTDA := - wbRUnion('Condition', [ - wbStruct(CTDA, 'Condition', [ - wbInteger('Type', itU8, wbCtdaType), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage (INVALID)', itS32), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbInteger('Unused', itU32, nil, cpIgnore) - ], cpNormal, False, nil, 6), - wbStruct(CTDT, 'Condition (old format)', [ - wbInteger('Type', itU8, wbCtdaType), - wbByteArray('Unused', 3), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU32, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name (INVALID)', itS32), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage (INVALID)', itS32), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - {00} wbByteArray('Unknown', 4), - {01} wbByteArray('None', 4, cpIgnore), - {02} wbInteger('Integer', itS32), - {03} wbInteger('Variable Name', itS32, wbCTDAParam2VariableNameToStr, wbCTDAParam2VariableNameToInt), - {04} wbInteger('Sex', itU32, wbSexEnum), - {05} wbFormIDCk('Actor Value', [ACVA]), -// {05} wbInteger('Actor Value', itS32, wbActorValueEnum), - {06} wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - {07} wbInteger('Axis', itU32, wbAxisEnum), - {08} wbInteger('Form Type', itU32, wbFormTypeEnum), - {09} wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - {10} wbFormIDCk('Object Reference', [PLYR, REFR, ACHR, ACRE, TRGT]), - {12} wbFormIDCk('Inventory Object', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - {13} wbFormIDCk('Actor', [PLYR, ACHR, ACRE, TRGT]), - {14} wbFormIDCk('Quest', [QUST]), - {15} wbFormIDCk('Faction', [FACT]), - {16} wbFormIDCk('Cell', [CELL]), - {17} wbFormIDCk('Class', [CLAS]), - {18} wbFormIDCk('Race', [RACE]), - {19} wbFormIDCk('Actor Base', [NPC_, CREA, ACTI]), - {20} wbFormIDCk('Global', [GLOB]), - {21} wbFormIDCk('Weather', [WTHR]), - {22} wbFormIDCk('Package', [PACK]), - {23} wbFormIDCk('Owner', [FACT, NPC_]), - {24} wbFormIDCk('Birthsign', [BSGN]), - {25} wbFormIDCk('Furniture', [FURN]), - {26} wbFormIDCk('Magic Item', [SPEL]), - {27} wbFormIDCk('Magic Effect', [MGEF]), - {28} wbFormIDCk('Worldspace', [WRLD]), - {29} wbFormIDCk('Referenceable Object', [CREA, NPC_, TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS]) - ]), - wbEmpty('Unused', cpIgnore) - ]) - ], []); - - wbCTDAs := wbRArray('Conditions', wbCTDA); - - wbSCHR := - wbRUnion('Basic Script Data', [ - wbStruct(SCHR, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU32, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Magic Effect' - ])) - ]), - wbStruct(SCHD, 'Basic Script Data', [ - wbByteArray('Unused', 4), - wbInteger('RefCount', itU32), - wbInteger('CompiledSize', itU32), - wbInteger('VariableCount', itU32), - wbInteger('Type', itU32, wbEnum([ - 'Object', - 'Quest' - ], [ - $100, 'Magic Effect' - ])), - wbByteArray('Unknown') - ]) - ], []); - - wbSCROs := - wbRArray('References', - wbRUnion('', [ - wbFormID(SCRO, 'Global Reference'), -// wbFormIDCk(SCRO, 'Global Reference', -// [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, -// INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, QUST, PLYR, PACK, LVLI, -// FACT, ACHR, REFR, ACRE, GLOB, DIAL, CELL, SOUN, MGEF, WTHR, CLAS, EFSH, RACE, -// LVLC, CSTY, WATR, WRLD, SCPT, BSGN, TREE, ENCH, NULL]), - wbInteger(SCRV, 'Local Variable', itU32) - ], []) - ); - - wbResultScript := wbRStruct('Result Script', [ - wbSCHR, - wbByteArray(SCDA, 'Compiled result script'), - wbStringScript(SCTX, 'Result script source'), - wbSCROs - ], []); -{ - wbResultScriptOld := wbRStruct('Result Script (Old Format?)', [ - wbByteArray(SCHD, 'Unknown (Script Header?)'), - wbByteArray(SCDA, 'Compiled result script'), - wbStringScript(SCTX, 'Result script source'), - wbSCROs - ], []); -} - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbMODL, - wbCTDAs, - wbInteger(ANAM, 'Animation Group Section', itU8, wbIdleAnam, nil, cpNormal, True), - wbArray(DATA, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [IDLE, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True) - ]); - - wbRecord(INFO, 'Dialog response', [ - wbStruct(DATA, '', [ - wbInteger('Type', itU8, wbEnum([], [ - 0, 'Topic', - 1, 'Conversation', - 2, 'Combat', - 3, 'Persuasion', - 4, 'Detection', - 5, 'Service', - 6, 'Miscellaneous' - ])), - wbInteger('Next Speaker', itU8, wbEnum([ - {0} 'Target', - {1} 'Self', - {2} 'Either' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x0001} 'Goodbye', - {0x0002} 'Random', - {0x0004} 'Say Once', - {0x0008} 'Run Immediately', - {0x0010} 'Info Refusal', - {0x0020} 'Random End', - {0x0040} 'Run for Rumors' - ])) - ], cpNormal, True), - wbFormIDCk(QSTI, 'Quest', [QUST], False, cpNormal, True), - wbFormIDCk(TPIC, 'Topic', [DIAL]), - wbFormIDCk(PNAM, 'Previous INFO', [INFO, NULL]), - wbRArray('Add topics', wbFormIDCk(NAME, 'Topic', [DIAL])), - wbRArray('Responses', - wbRStruct('Response', [ - wbStruct(TRDT, 'Response Data', [ - wbInteger('Emotion Type', itU32, wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise' - ])), - wbInteger('Emotion Value', itS32), - wbByteArray('Unused', 4), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3) - ]), - wbStringKC(NAM1, 'Response Text', 0, cpTranslate), - wbString(NAM2, 'Actor notes', 0, cpTranslate) - ], []) - ), - wbCTDAs, - wbRArray('Choices', wbFormIDCk(TCLT, 'Choice', [DIAL])), - wbRArray('Link From', wbFormIDCk(TCLF, 'Topic', [DIAL])), - wbResultScript - ]); - - wbRecord(INGR, 'Ingredient', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, '', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU8, wbFlags(['No auto-calculation', 'Food item'])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(KEYM, 'Key', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', [ - wbByteArray(DATA, 'Unknown'), -// wbStruct(DATA, '', [ -// wbInteger('Flags', itU8, wbFlags([])), -// wbByteArray('Unknown') -// ]), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unused', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unused', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unused', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end; - - wbRecord(LIGH, 'Light', [ - wbEDID, - wbMODL, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbStruct('Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Dynamic', - {0x00000002} 'Can be Carried', - {0x00000004} 'Negative', - {0x00000008} 'Flicker', - {0x00000010} 'Unused', - {0x00000020} 'Off By Default', - {0x00000040} 'Flicker Slow', - {0x00000080} 'Pulse', - {0x00000100} 'Pulse Slow', - {0x00000200} 'Spot Light', - {0x00000400} 'Spot Shadow' - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True, nil, 6), - wbFloat(FNAM, 'Fade value', cpNormal, True, 1, -1, nil, nil, 1.0), - wbFormIDCk(SNAM, 'Sound', [SOUN]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); - - wbRecord(LSCR, 'Load Screen', [ - wbEDID, - wbICON, - wbDESC, - wbRArrayS('Locations', wbStructSK(LNAM, [0, 1], 'Location', [ - wbFormIDCk('Direct', [CELL, WRLD, NULL]), - wbStructSK([0, 1], 'Indirect', [ - wbFormIDCk('World', [NULL, WRLD]), - wbStructSK([0,1], 'Grid', [ - wbInteger('Y', itS16), - wbInteger('X', itS16) - ]) - ]) - ])) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDID, - wbICON, - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Material Type', itU8, wbEnum([ - {00} 'STONE', - {01} 'CLOTH', - {02} 'DIRT', - {03} 'GLASS', - {04} 'GRASS', - {05} 'METAL', - {06} 'ORGANIC', - {07} 'SKIN', - {08} 'WATER', - {09} 'WOOD', - {10} 'HEAVY STONE', - {11} 'HEAVY METAL', - {12} 'HEAVY WOOD', - {13} 'CHAIN', - {14} 'SNOW' - ]), cpNormal, True, nil, nil, 2), - wbInteger('Friction', itU8, nil, cpNormal, True, nil, nil, 30), - wbInteger('Restitution', itU8, nil, cpNormal, True, nil, nil, 30) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True, False, nil, nil, 30), - wbRArrayS('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])) - ]); - - wbRecord(LVLC, 'Leveled Creature', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [NPC_, CREA, LVLC]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True), - wbSCRI, - wbFormIDCk(TNAM, 'Creature template', [NPC_, CREA]) - ], True, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, LVLI, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True), - wbByteArray(DATA, 'Unused', 1) - ], False, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(LVSP, 'Leveled Spell', [ - wbEDID, - wbInteger(LVLD, 'Chance none', itU8, nil, cpNormal, True), - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use all spells' - ]), cpNormal, True), - wbRArrayS('Leveled List Entries', - wbStructExSK(LVLO , [0, 2], [3], 'Leveled List Entry', [ - wbInteger('Level', itS16), - wbByteArray('Unused', 2), - wbFormIDCk('Reference', [SPEL, LVSP]), - wbInteger('Count', itS16), - wbByteArray('Unused', 2) - ], cpNormal, False, nil, 3), - cpNormal, True) - ], False, nil, cpNormal, False, wbLVLAfterLoad); - - wbRecord(MGEF, 'Magic Effect', [ - wbStringMgefCode(EDID, 'Magic Effect Code'), - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbInteger('Param A Info', itU8, wbOBMEResolutionInfo), - wbInteger('Param B Info', itU8, wbOBMEResolutionInfo), - wbByteArray('Unused', 2), - wbString('Handler', 4), - wbInteger('Flag Overrides', itU32, wbFlags([ - { 0} '', - { 1} '', - { 2} 'ParamFlagA', - { 3} 'Beneficial', - { 4} '', - { 5} '', - { 6} '', - { 7} '', - { 8} '', - { 9} '', - {10} '', - {11} '', - {12} '', - {13} '', - {14} '', - {15} '', - {16} 'ParamFlagB', - {17} 'Magnitude Is Range', - {18} 'Atomic Resistance', - {19} 'ParamFlagC', - {20} 'ParamFlagD', - {21} '', - {22} '', - {23} '', - {24} '', - {25} '', - {26} '', - {27} '', - {28} '', - {29} '', - {30} 'Hidden' - ])), - wbByteArray('ParamB', 4), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbString(EDDX, 'EditorID', 0, cpNormal, False, wbEDDXDontShow), - wbFULL, - wbDESC, - wbICON, - wbMODL, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} 'Magnitude %', - {0x00000010} 'Self', - {0x00000020} 'Touch', - {0x00000040} 'Target', - {0x00000080} 'No duration', - {0x00000100} 'No magnitude', - {0x00000200} 'No area', - {0x00000400} 'FX persist', - {0x00000800} 'Spellmaking', - {0x00001000} 'Enchanting', - {0x00002000} 'No Ingredient', - {0x00004000} 'Unknown 14', - {0x00008000} 'Unknown 15', - {0x00010000} 'Use weapon', - {0x00020000} 'Use armor', - {0x00040000} 'Use creature', - {0x00080000} 'Use skill', - {0x00100000} 'Use attribute', - {0x00200000} 'Unknown 21', - {0x00400000} 'Unknown 22', - {0x00800000} 'Unknown 23', - {0x01000000} 'Use actor value', - {0x02000000} 'Spray projectile type (or Fog if Bolt is specified as well)', - {0x04000000} 'Bolt projectile type', - {0x08000000} 'No hit effect', - {0x10000000} 'Unknown 28', - {0x20000000} 'Unknown 29', - {0x40000000} 'Unknown 30', - {0x80000000} 'Unknown 31' - ])), - wbFloat('Base cost'), - wbUnion('Assoc. Item', wbMGEFFAssocItemDecider, [ - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Assoc. Weapon', [WEAP]), - wbFormIDCk('Assoc. Armor', [ARMO, NULL{?}]), - wbFormIDCk('Assoc. Creature', [CREA, LVLC, NPC_]), - wbInteger('Assoc. Actor Value', itS32, wbActorValueEnum) - ]), - wbInteger('Magic School', itS32, wbMagicSchoolEnum), - wbInteger('Resist value', itS32, wbActorValueEnum), - wbInteger('Counter Effect Count', itU16), //!!! must be updated automatically when ESCE length changes! - wbByteArray('Unused', 2), - wbFormIDCk('Light', [LIGH, NULL]), - wbFloat('Projectile speed'), - wbFormIDCk('Effect Shader', [EFSH, NULL]), - wbFormIDCk('Enchant effect', [EFSH, NULL]), - wbFormIDCk('Casting sound', [NULL, SOUN]), - wbFormIDCk('Bolt sound', [NULL, SOUN]), - wbFormIDCk('Hit sound', [NULL, SOUN]), - wbFormIDCk('Area sound', [NULL, SOUN]), - wbFloat('Constant Effect enchantment factor'), - wbFloat('Constant Effect barter factor') - ], cpNormal, True, nil, 10), - wbArrayS(ESCE, 'Counter Effects', wbStringMgefCode('Counter Effect Code', 4), - 0, cpNormal, False, nil, wbCounterEffectsAfterSet) - ], False, nil, cpNormal, False, wbMGEFAfterLoad, wbMGEFAfterSet); - - wbRecord(MISC, 'Misc. Item', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbUnion('', wbMISCActorValueDecider, [ - wbInteger('Value', itS32), - wbFormIDCk('Actor Value', [ACVA]) - ]), - wbUnion('', wbMISCActorValueDecider, [ - wbFloat('Weight'), - wbInteger('Group', itU32, wbEnum([], [ - $40E00000, ' [NONE]', - $40400000, 'AI', - $00000000, 'Attribute', - $40C00000, 'Combat', - $40A00000, 'Misc', - $40000000, 'Skill', - $40800000, 'Social', - $3F800000, 'Stat' - ])) - ]) - ], cpNormal, True) - ]); - - wbFaceGen := wbRStruct('FaceGen Data', [ - wbByteArray(FGGS, 'FaceGen Geometry-Symmetric', 0, cpNormal, True), - wbByteArray(FGGA, 'FaceGen Geometry-Asymmetric', 0, cpNormal, True), - wbByteArray(FGTS, 'FaceGen Texture-Symmetric', 0, cpNormal, True) - ], [], cpNormal, True); - - wbRecord(NPC_, 'Non-Player Character', [ - wbEDID, - wbFULL, - wbMODL, - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x000001} 'Female', - {0x000002} 'Essential', - {0x000004} '', - {0x000008} 'Respawn', - {0x000010} 'Auto-calc stats', - {0x000020} '', - {0x000040} '', - {0x000080} 'PC Level Offset', - {0x000100} '', - {0x000200} 'No Low Level Processing', - {0x000400} '', - {0x000800} '', - {0x001000} '', - {0x002000} 'No Rumors', - {0x004000} 'Summonable', - {0x008000} 'No Persuasion', - {0x010000} '', - {0x020000} '', - {0x040000} '', - {0x080000} '', - {0x100000} 'Can Corpse Check' - ])), - wbInteger('Base spell points', itU16), - wbInteger('Fatigue', itU16), - wbInteger('Barter gold', itU16), - wbInteger('Level (offset)', itS16), - wbInteger('Calc min', itU16), - wbInteger('Calc max', itU16) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3) - ]) - ), - wbFormIDCk(INAM, 'Death item', [LVLI]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True), - wbCNTOs, - wbSPLOs, - wbSCRI, - wbStruct(AIDT, 'AI Data', [ - wbInteger('Aggression', itU8), - wbInteger('Confidence', itU8), - wbInteger('Energy Level', itU8), - wbInteger('Responsibility', itU8), - wbInteger('Buys/Sells and Services', itU32, wbServiceFlags), - wbInteger('Teaches', itS8, wbSkillEnum), - wbInteger('Maximum training level', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True), - wbRArray('AI Packages', wbFormIDCk(PKID, 'AI Package', [PACK])), - wbArrayS(KFFZ, 'Animations', wbString('Animation')), - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True), - wbStruct(DATA, 'Stats', [ - wbInteger('Armorer', itU8), - wbInteger('Athletics', itU8), - wbInteger('Blade', itU8), - wbInteger('Block', itU8), - wbInteger('Blunt', itU8), - wbInteger('Hand to Hand', itU8), - wbInteger('Heavy Armor', itU8), - wbInteger('Alchemy', itU8), - wbInteger('Alteration', itU8), - wbInteger('Conjuration', itU8), - wbInteger('Destruction', itU8), - wbInteger('Illusion', itU8), - wbInteger('Mysticism', itU8), - wbInteger('Restoration', itU8), - wbInteger('Acrobatics', itU8), - wbInteger('Light Armor', itU8), - wbInteger('Marksman', itU8), - wbInteger('Mercantile', itU8), - wbInteger('Security', itU8), - wbInteger('Sneak', itU8), - wbInteger('Speechcraft', itU8), - wbInteger('Health', itU16), - wbByteArray('Unused', 2), - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ], cpNormal, True), - wbFormIDCk(HNAM, 'Hair', [HAIR]), - wbFloat(LNAM, 'Hair length'), - wbArray(ENAM, 'Eyes', wbFormIDCk('Eyes', [EYES])), - wbStruct(HCLR, 'Hair color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY]), - wbFaceGen, - wbByteArray(FNAM, 'Unknown', 0, cpBenign) - ], True); - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers services', - {0x00000002} 'Must reach location', - {0x00000004} 'Must complete', - {0x00000008} 'Lock doors at package start', - {0x00000010} 'Lock doors at package end', - {0x00000020} 'Lock doors at location', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Unlock doors at location', - {0x00000200} 'Continue if PC near', - {0x00000400} 'Once per day', - {0x00000800} 'Unused', - {0x00001000} 'Skip fallout behavior', - {0x00002000} 'Always run', - {0x00004000} '', - {0x00008000} '', - {0x00010000} '', - {0x00020000} 'Always sneak', - {0x00040000} 'Allow swimming', - {0x00080000} 'Allow falls', - {0x00100000} 'Armor unequipped', - {0x00200000} 'Weapons unequipped', - {0x00400000} 'Defensive combat', - {0x00800000} 'Use horse', - {0x01000000} 'No idle anims', - {0x02000000} '', - {0x04000000} '', - {0x08000000} '', - {0x10000000} '', - {0x20000000} '', - {0x40000000} '', - {0x80000000} '' - ]); - - wbPKDTType := wbEnum([ - {0} 'Find', - {1} 'Follow', - {2} 'Escort', - {3} 'Eat', - {4} 'Sleep', - {5} 'Wander', - {6} 'Travel', - {7} 'Accompany', - {8} 'Use item at', - {9} 'Ambush', - {10} 'Flee not combat', - {11} 'Cast magic' - ]); - - wbRecord(PACK, 'AI Package', [ - wbEDID, - wbUnion(PKDT, 'General', wbPACKPKDTDecider, [ - wbStruct('General', [ - wbInteger('Flags', itU16, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 1) - ]), - wbStruct('General', [ - wbInteger('Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbPKDTType), - wbByteArray('Unused', 3) - ]) - ]), - wbStruct(PLDT, 'Location', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near current location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object type' - ])), - wbUnion('Location', wbPxDTLocationDecider, [ - wbFormIDCk('Reference', [REFR, ACHR, ACRE, PLYR], True), - wbFormIDCk('Cell', [CELL]), - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Unused', [NULL]), - wbFormIDCk('Object ID', [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Object type', itU32) - ]), - wbInteger('Radius', itS32) - ]), - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sundas', - 'Morndas', - 'Tirdas', - 'Middas', - 'Turdas', - 'Fredas', - 'Loredas', - 'Morndas to Fredas', - 'Loredas, Sundas', - 'Morndas, Middas, Fredas', - 'Tirdas, Turdas' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Time', itS8), - wbInteger('Duration', itS32) - ]), - wbStruct(PTDT, 'Target', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific reference', - {1} 'Object ID', - {2} 'Object type' - ])), - wbUnion('Target', wbPxDTLocationDecider, [ - wbFormIDCk('Reference', [ACHR, ACRE, REFR, PLYR], True), - wbFormIDCk('Object ID', [ACTI, DOOR, FLOR, STAT, FURN, CREA, SPEL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH]), - wbInteger('Object type', itU32) - ]), - wbInteger('Count', itS32) - ]), - wbCTDAs - ]); - - wbPGRP := - wbArray(PGRP, 'Points', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z (Even = Red/Orange, Odd = Blue)'), - wbInteger('Connections', itU8{, wbPGRPConnectionsCallback}), - wbByteArray('Unused', 3) - ]), 0, nil, nil, cpNormal, True); - - {The Connection Count in the PGRP record specifies how many entries in this - array belong to each point. If the first 4 points in the PGRP array have - Connection Counts 2, 5, 2, 4 then the first 2 entries are the connections - of point 0, then next 5 are the connections of point 1, the next 2 of point 2, - the next 4 of point 3 and so on..., this can currently not be represented - declaratively } - - wbRecord(PGRD, 'Path Grid', [ - wbInteger(DATA, 'Point Count', itU16, nil, cpNormal, True), - wbPGRP, - wbByteArray(PGAG, 'Unknown'), - wbArray(PGRR, 'Point-to-Point Connections', - wbArrayS('Point', wbInteger('Point', itS16), wbCalcPGRRSize{, cpNormal, False, wbPGRRPointAfterLoad}) - ), - wbArrayS(PGRI, 'Inter-Cell Connections', wbStructSK([0,2,3,4], 'Inter-Cell Connection', [ - wbInteger('Point', itU16), - wbByteArray('Unused', 2), - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), 0, cpNormal, False, wbPGRIPointerAfterLoad), - wbRArrayS('Point-to-Reference Mappings', - wbStructSK(PGRL, [0], 'Point-to-Reference Mapping', [ - wbFormIDCk('Reference', [REFR]), - wbArrayS('Points', wbInteger('Point', itU32)) - ]) - ) - ], False, nil, cpNormal, False, wbPGRDAfterLoad); - - wbRecord(QUST, 'Quest', [ - wbEDID, - wbSCRI, - wbFULL, - wbICON, - wbStruct(DATA, 'General', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Start game enabled', - {0x02} '', - {0x04} 'Allow repeated conversation topics', - {0x08} 'Allow repeated stages' - ])), - wbInteger('Priority', itU8) - ], cpNormal, True), - wbCTDAs, - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbInteger(INDX, 'Stage index', itS16), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete quest' - ])), - wbCTDAs, - wbString(CNAM, 'Log Entry', 0, cpTranslate), - wbResultScript - ], [])) - ], [])), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbFormIDCk('Target', [REFR, ACRE, ACHR], True), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass marker ignores locks' - ])), - wbByteArray('Unused', 3) - ]), - wbCTDAs - ], [])) - ]); - - wbBodyDataIndex := - wbInteger(INDX, 'Index', itU32, wbEnum([ - 'Upper Body', - 'Lower Body', - 'Hand', - 'Foot', - 'Tail' - ])); - - wbRecord(RACE, 'Race', [ - wbEDID, - wbFULL, - wbDESC, - wbSPLOs, - wbXNAMs, - wbStruct(DATA, '', [ - wbArrayS('Skill Boosts', wbStructSK([0], 'Skill Boost', [ - wbInteger('Skill', itS8, wbActorValueEnum), - wbInteger('Boost', itS8) - ]), 7), - wbByteArray('Unused', 2), - wbFloat('Male Height'), - wbFloat('Female Height'), - wbFloat('Male Weight'), - wbFloat('Female Weight'), - wbInteger('Flags', itU32, wbFlags([ - 'Playable' - ])) - ], cpNormal, True), - wbStruct(VNAM, 'Voice', [ - wbFormIDCk('Male', [RACE, NULL]), - wbFormIDCk('Female', [RACE, NULL]) - ]), - wbStruct(DNAM, 'Default Hair', [ - wbFormIDCk('Male', [HAIR]), - wbFormIDCk('Female', [HAIR]) - ]), - wbInteger(CNAM, 'Default Hair Color', itU8, nil, cpNormal, True), - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - wbStruct(ATTR, 'Base Attributes', [ - wbStruct('Male', [ - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ]), - wbStruct('Female', [ - wbInteger('Strength', itU8), - wbInteger('Intelligence', itU8), - wbInteger('Willpower', itU8), - wbInteger('Agility', itU8), - wbInteger('Speed', itU8), - wbInteger('Endurance', itU8), - wbInteger('Personality', itU8), - wbInteger('Luck', itU8) - ]) - ]), - wbRStruct('Face Data', [ - wbEmpty(NAM0, 'Face Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbEnum([ - 'Head', - 'Ear (Male)', - 'Ear (Female)', - 'Mouth', - 'Teeth (Lower)', - 'Teeth (Upper)', - 'Tongue', - 'Eye (Left)', - 'Eye (Right)' - ])), - wbMODL, - wbICON - ], [])) - ], [], cpNormal, True), - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Body Data Marker'), - wbMODL, - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbBodyDataIndex, - wbICON - ], [])) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Body Data Marker'), - wbMODL, - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbBodyDataIndex, - wbICON - ], [])) - ], [], cpNormal, True), - wbArrayS(HNAM, 'Hairs', wbFormIDCk('Hair', [HAIR]), 0, cpNormal, True), - wbArrayS(ENAM, 'Eyes', wbFormIDCk('Eye', [EYES]), 0, cpNormal, True), - wbFaceGen, - wbByteArray(SNAM, 'Unknown', 2, cpNormal, True) - ], True); - - wbRecord(REFR, 'Placed Object', [ - wbEDID, - wbFormIDCk(NAME, 'Base', [TREE, SBSP, LVLC, SOUN, ACTI, DOOR, FLOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, INGR, SLGM, SGST, BOOK, KEYM, CLOT, ALCH, APPA, LIGH, GRAS], False, cpNormal, True), - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot - ]), - wbStruct(XLOC, 'Lock information', [ - wbInteger('Lock Level', itU8), - wbByteArray('Unused', 3), - wbFormIDCk('Key', [KEYM, NULL]), - wbUnion('Unused', wbXLOCFillerDecider, [ - wbEmpty('Unused'), - wbByteArray('Unused', 4) - ]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3) - ]), - wbRStruct('Ownership', [ - wbXOWN, - wbInteger(XRNK, 'Faction rank', itS32), - wbXGLB - ], [XLOC]), - wbXESP, - wbFormIDCk(XTRG, 'Target', [REFR, ACHR, ACRE], True), - wbStruct(XSED, 'SpeedTree', [ - wbInteger('Seed', itU8), - wbUnion('Unused', wbREFRXSEDDecider, [ - wbEmpty('Unused', cpIgnore), - wbByteArray('Unused', 3, cpIgnore) - ]) - ]), - wbXLOD, - wbFloat(XCHG, 'Charge'), - wbInteger(XHLT, 'Health', itS32), - wbRStruct('Unused', [ - wbFormIDCk(XPCI, 'Unused', [CELL]), - wbString(FULL, 'Unused') - ], []), - wbInteger(XLCM, 'Level Modifier', itS32), - wbFormIDCk(XRTM, 'Unknown', [REFR]), - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - wbInteger(XCNT, 'Count', itS32), - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Data'), - wbInteger(FNAM, 'Map Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([ - {0x00} 'None', - {0x01} 'Camp', - {0x02} 'Cave', - {0x03} 'City', - {0x04} 'Elven Ruin', - {0x05} 'Fort Ruin', - {0x06} 'Mine', - {0x07} 'Landmark', - {0x08} 'Tavern', - {0x09} 'Settlement', - {0x0A} 'Daedric Shrine', - {0x0B} 'Oblivion Gate', - {0x0C} 'Unknown? (door icon)' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ], []), - wbEmpty(ONAM, 'Open by Default'), - wbXRGD, - wbXSCL, - wbInteger(XSOL, 'Contained Soul', itU8, wbSoulGemEnum), - wbDATAPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbRecord(REGN, 'Region', [ - wbEDID, - wbICON, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ], cpNormal, True), - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad) - ], []), cpNormal, True), - - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0}'', - {1}'', - {2}'Objects', - {3}'Weather', - {4}'Map', - {5}'Unknown 5', - {6}'Grass', - {7}'Sound', - {8}'', - {9}'' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unused', 2) - ], cpNormal, True, nil, 3), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, FLOR, STAT, LTEX]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unused', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unused', 2), - wbByteArray('Unknown', 4) - ])), - - {--- Map ---} - wbString(RDMP, 'Map Name', 0, cpTranslate), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unused', 4) - ])), - - {--- Sound ---} - wbInteger(RDMD, 'Music Type', itU32, wbMusicEnum), - wbArrayS(RDSD, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Flags', itU32, wbFlags([ - 'Pleasant', - 'Cloudy', - 'Rainy', - 'Snowy' - ])), - wbInteger('Chance', itU32, wbScaledInt4ToStr, wbScaledInt4ToInt) - ])), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32) - ])) - ], [])) - ], True); - - wbRecord(ROAD, 'Road', [ - wbPGRP, - wbArray(PGRR, 'Point-to-Point Connections (complex structure can''t be represented, see source)', - {The Connection Count in the PGRP record specifies how many entries in this - array belong to each point. If the first 4 points in the PGRP array have - Connection Counts 2, 5, 2, 4 then the first 2 entries are the connections - of point 0, then next 5 are the connections of point 1, the next 2 of point 2, - the next 4 of point 3 and so on..., this can currently not be represented - declaratively } - wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), 0, nil, nil, cpNormal, True) - ]); - - wbRecord(SBSP, 'Subspace', [ - wbEDID, - wbStruct(DNAM, '', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, True) - ]); - - wbSLSD := wbStructSK(SLSD, [0], 'Local Variable Data', [ - wbInteger('Index', itU32), - wbByteArray('Unused', 12), - wbInteger('Flags', itU8, wbFlags(['IsLongOrShort']), cpCritical), - wbByteArray('Unused') - ]); - - wbRecord(SCPT, 'Script', [ - wbEDID, - wbByteArray(SCHD, 'Unknown (Script Header?)'), - wbSCHR, - wbByteArray(SCDA, 'Compiled Script'), - wbStringScript(SCTX, 'Script Source', 0, cpNormal, True), - wbRArrayS('Local Variables', wbRStructSK([0], 'Local Variable', [ - wbSLSD, - wbString(SCVR, 'Name', 0, cpCritical) - ], [])), - wbSCROs - ]); - - wbRecord(SGST, 'Sigil Stone', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbEffects, - wbStruct(DATA, '', [ - wbInteger('Uses ', itU8), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True) - ]); - - wbRecord(SKIL, 'Skill', [ - wbEDID, - wbInteger(INDX, 'Skill', itS32, wbActorValueEnum, cpNormal, True), - wbDESC, - wbICON, - wbStruct(DATA, 'Skill Data', [ - wbInteger('Action', itS32, wbActorValueEnum), - wbInteger('Attribute', itS32, wbActorValueEnum), - wbInteger('Specialization', itU32, wbSpecializationEnum), - wbArray('Use Values', wbFloat('Use Value'), 2) - ], cpNormal, True), - wbString(ANAM, 'Apprentice Text', 0, cpTranslate, True), - wbString(JNAM, 'Journeyman Text', 0, cpTranslate, True), - wbString(ENAM, 'Expert Text', 0, cpTranslate, True), - wbString(MNAM, 'Master Text', 0, cpTranslate, True) - ]); - - wbRecord(SLGM, 'Soul Gem', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbStruct(DATA, '', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbInteger(SOUL, 'Contained Soul', itU8, wbSoulGemEnum, cpNormal, True), - wbInteger(SLCP, 'Maximum Capacity', itU8, wbSoulGemEnum, cpNormal, True) - ]); - - wbRecord(SOUN, 'Sound', [ - wbEDID, - wbString(FNAM, 'Sound Filename'), - wbRUnion('Sound Data', [ - wbStruct(SNDX, 'Sound Data', [ - wbInteger('Minimum attenuation distance', itU8, wbMul(5)), - wbInteger('Maximum attenuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE' - ])), - wbByteArray('Unused', 2), - wbInteger('Static Attenuation (db)', itU16, wbDiv(100)), - wbInteger('Stop time', itU8), - wbInteger('Start time', itU8) - ], cpNormal, True), - wbStruct(SNDD, 'Sound Data', [ - wbInteger('Minimum attenuation distance', itU8, wbMul(5)), - wbInteger('Maximum attenuation distance', itU8, wbMul(100)), - wbInteger('Frequency adjustment %', itS8), - wbByteArray('Unused', 1), - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Random Frequency Shift', - {0x0002} 'Play At Random', - {0x0004} 'Environment Ignored', - {0x0008} 'Random Location', - {0x0010} 'Loop', - {0x0020} 'Menu Sound', - {0x0040} '2D', - {0x0080} '360 LFE' - ])), - wbByteArray('Unused', 2), - wbEmpty('Unused'), - wbEmpty('Unused'), - wbEmpty('Unused') - ], cpNormal, True) - ], [], cpNormal, True) - ]); - - wbRecord(SPEL, 'Spell', [ - wbEDID, - wbStruct(OBME, 'Oblivion Magic Extender', [ - wbInteger('Record Version', itU8), - wbStruct('OBME Version', [ - wbInteger('Beta', itU8), - wbInteger('Minor', itU8), - wbInteger('Major', itU8) - ]), - wbByteArray('Unused', $1C) - ], cpNormal, False, wbOBMEDontShow), - wbFULL, - wbStruct(SPIT, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Spell', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison' - ])), - wbInteger('Cost', itU32), - wbInteger('Level', itU32, wbEnum([ - {0} 'Novice', - {1} 'Apprentice', - {2} 'Journeyman', - {3} 'Expert', - {4} 'Master' - ])), - wbInteger('Flags', itU8, wbFlags([ - {0x00000001} 'Manual Spell Cost', - {0x00000002} 'Immune to Silence 1', - {0x00000004} 'Player Start Spell', - {0x00000008} 'Immune to Silence 2', - {0x00000010} 'Area Effect Ignores LOS', - {0x00000020} 'Script Effect Always Applies', - {0x00000040} 'Disallow Spell Absorb/Reflect', - {0x00000080} 'Touch Spell Explodes w/ no Target' - ])), - wbByteArray('Unused', 3) - ], cpNormal, True), - wbEffects - ]); - - wbRecord(STAT, 'Static', [ - wbEDID, - wbMODL - ]); - - wbRecord(TES4, 'Main File Header', [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), - wbByteArray(DELE, 'Unknown', 0, cpIgnore), - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - wbByteArray(DATA, 'Unused', 8, cpIgnore, True) - ], [])) - ], False, nil, cpNormal, True, wbRemoveOFST); - - wbRecord(TREE, 'Tree', [ - wbEDID, - wbMODL, - wbICON, - wbArrayS(SNAM, 'SpeedTree Seeds', wbInteger('SpeedTree Seed', itU32)), - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Leaf Curvature'), - wbFloat('Minimum Leaf Angle'), - wbFloat('Maximum Leaf Angle'), - wbFloat('Branch Dimming Value'), - wbFloat('Leaf Dimming Value'), - wbInteger('Shadow Radius', itS32), - wbFloat('Rock Speed'), - wbFloat('Rustle Speed') - ], cpNormal, True), - wbStruct(BNAM, 'Billboard Dimensions', [ - wbFloat('Width'), - wbFloat('Height') - ], cpNormal, True) - ]); - - wbRecord(WATR, 'Water', [ - wbEDID, - wbString(TNAM, 'Texture', 0, cpNormal, True), - wbInteger(ANAM, 'Opacity', itU8, nil, cpNormal, True), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0}'Causes Damage', - {1}'Reflective' - ]), cpNormal, True), - wbString(MNAM, 'Material ID'{>>>}, 0, cpNormal, True{<<<}), - wbFormIDCk(SNAM, 'Sound', [SOUN]), - wbStruct(DATA, '', [ - wbFloat('Wind Velocity'), - wbFloat('Wind Direction'), - wbFloat('Wave Amplitude'), - wbFloat('Wave Frequency'), - wbFloat('Sun Power'), - wbFloat('Reflectivity Amount'), - wbFloat('Fresnel Amount'), - wbFloat('Scroll X Speed'), - wbFloat('Scroll Y Speed'), - wbFloat('Fog Distance - Near Plane'), - wbFloat('Fog Distance - Far Plane'), - wbStruct('Shallow Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Deep Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbStruct('Reflection Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - wbInteger('Texture Blend', itU8), - wbByteArray('Unused', 3), - wbFloat('Rain Simulator - Force'), - wbFloat('Rain Simulator - Velocity'), - wbFloat('Rain Simulator - Falloff'), - wbFloat('Rain Simulator - Dampner'), - wbFloat('Rain Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Displacement Simulator - Starting Size'), - wbInteger('Damage', itU16) - ], cpNormal, True, nil, 0), - wbStruct(GNAM, 'Related Waters', [ - wbFormIDCk('Daytime', [WATR, NULL]), - wbFormIDCk('Nighttime', [WATR, NULL]), - wbFormIDCk('Underwater', [WATR, NULL]) - ], cpNormal{>>>, True<<<}) - ]); - - wbRecord(WEAP, 'Weapon', [ - wbEDID, - wbFULL, - wbMODL, - wbICON, - wbSCRI, - wbENAM, - wbInteger(ANAM, 'Enchantment Points', itU16), - wbStruct(DATA, '', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Blade One Hand', - {1} 'Blade Two Hand', - {2} 'Blunt One Hand', - {3} 'Blunt Two Hand', - {4} 'Staff', - {5} 'Bow' - ])), - wbFloat('Speed'), - wbFloat('Reach'), - wbInteger('Flags', itU32, wbFlags(['Ignores Normal Weapon Resistance'])), - wbInteger('Value', itU32), - wbInteger('Health', itU32), - wbFloat('Weight'), - wbInteger('Damage', itU16) - ], cpNormal, True) - ]); - - if wbSimpleRecords then - wbRecord(WRLD, 'Worldspace', [ - wbEDID, - wbFULL, - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small world', - {0x02} 'Can''t fast travel', - {0x04} 'Oblivion worldspace', - {0x08} '', - {0x10} 'No LOD water' - ]), cpNormal, True), - //wbArray(NAM0, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - //wbArray(NAM9, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbInteger(SNAM, 'Music', itU32, wbMusicEnum), - wbByteArray(OFST, 'Offset Data') - ], False, nil, cpNormal, False, wbRemoveOFST) - else - wbRecord(WRLD, 'Worldspace', [ - wbEDID, - wbFULL, - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbICON, - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]) - ]), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small world', - {0x02} 'Can''t fast travel', - {0x04} 'Oblivion worldspace', - {0x08} '', - {0x10} 'No LOD water' - ]), cpNormal, True), - //wbArray(NAM0, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - //wbArray(NAM9, 'Unknown', wbFloat(''), 0, nil, nil, cpNormal, True), - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbInteger(SNAM, 'Music', itU32, wbMusicEnum), - wbArray(OFST, 'Offset Data', wbArray('Rows', wbInteger('Offset', itU32), wbOffsetDataColsCounter), 0) - ], False, nil, cpNormal, False, wbRemoveOFST); - - wbRecord(WTHR, 'Weather', [ - wbEDID, - wbString(CNAM, 'Texture Lower Layer'), - wbString(DNAM, 'Texture Upper Layer'), - wbMODL, - wbArray(NAM0, 'Colors by Types/Times', - wbArray('Type', - wbStruct('Time', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]), - ['Sunrise', 'Day', 'Sunset', 'Night'] - ), - ['Sky-Upper','Fog','Clouds-Lower','Ambient','Sunlight','Sun','Stars','Sky-Lower','Horizon','Clouds-Upper'] - , cpNormal, True), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day Near'), - wbFloat('Day Far'), - wbFloat('Night Near'), - wbFloat('Night Far') - ], cpNormal, True), - wbStruct(HNAM, 'HDR Data', [ - wbFloat('Eye Adapt Speed'), - wbFloat('Blur Radius'), - wbFloat('Blur Passes'), - wbFloat('Emissive Mult'), - wbFloat('Target LUM'), - wbFloat('Upper LUM Clamp'), - wbFloat('Bright Scale'), - wbFloat('Bright Clamp'), - wbFloat('LUM Ramp No Tex'), - wbFloat('LUM Ramp Min'), - wbFloat('LUM Ramp Max'), - wbFloat('Sunlight Dimmer'), - wbFloat('Grass Dimmer'), - wbFloat('Tree Dimmer') - ], cpNormal, True), - wbStruct(DATA, '', [ - wbInteger('Wind Speed', itU8), - wbInteger('Cloud Speed (Lower)', itU8), - wbInteger('Cloud Speed (Upper)', itU8), - wbInteger('Trans Delta', itU8), - wbInteger('Sun Glare', itU8), - wbInteger('Sun Damage', itU8), - wbInteger('Precipitation - Begin Fade In', itU8), - wbInteger('Precipitation - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Weather Classification', itU8, wbWthrDataClassification), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]) - ], cpNormal, True), - wbRArray('Sounds', wbStruct(SNAM, 'Sound', [ - wbFormIDCk('Sound', [SOUN]), - wbInteger('Type', itU32, wbEnum([ - {0}'Default', - {1}'Precip', - {2}'Wind', - {3}'Thunder' - ])) - ])) - ]); - - wbAddGroupOrder(GMST); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HAIR); - wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(SKIL); - wbAddGroupOrder(MGEF); - wbAddGroupOrder(SCPT); - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - wbAddGroupOrder(BSGN); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(APPA); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CLOT); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(STAT); - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(FLOR); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(CREA); - wbAddGroupOrder(LVLC); - wbAddGroupOrder(SLGM); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(SBSP); - wbAddGroupOrder(SGST); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(REGN); - wbAddGroupOrder(CELL); - wbAddGroupOrder(WRLD); - wbAddGroupOrder(DIAL); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(LVSP); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); -end; - -initialization -end. diff --git a/lib/xedit/wbDefinitionsTES5.pas b/lib/xedit/wbDefinitionsTES5.pas deleted file mode 100644 index 0a7e6a0..0000000 --- a/lib/xedit/wbDefinitionsTES5.pas +++ /dev/null @@ -1,13667 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbDefinitionsTES5; - -{$I wbDefines.inc} - -interface - -uses - wbInterface; - -var - wbBipedObjectFlags: IwbFlagsDef; - wbEquipType: IwbFlagsDef; - wbFurnitureEntryTypeFlags: IwbFlagsDef; - wbPKDTFlags: IwbFlagsDef; - wbPKDTInterruptFlags: IwbFlagsDef; - wbSMNodeFlags: IwbFlagsDef; - - wbAdvanceActionEnum: IwbEnumDef; - wbAlignmentEnum: IwbEnumDef; - wbArmorTypeEnum: IwbEnumDef; - wbAttackAnimationEnum: IwbEnumDef; - wbAxisEnum: IwbEnumDef; - wbBipedObjectEnum: IwbEnumDef; - wbBlendModeEnum: IwbEnumDef; - wbBlendOpEnum: IwbEnumDef; - wbBodyPartIndexEnum: IwbEnumDef; - wbCastEnum: IwbEnumDef; - wbCastingSourceEnum: IwbEnumDef; - wbCrimeTypeEnum: IwbEnumDef; - wbCriticalStageEnum: IwbEnumDef; - wbEmotionTypeEnum: IwbEnumDef; - wbEntryPointsEnum: IwbEnumDef; - wbEventFunctionEnum: IwbEnumDef; - wbEventMemberEnum: IwbEnumDef; - wbFormTypeEnum: IwbEnumDef; - wbFunctionsEnum: IwbEnumDef; - wbFurnitureAnimTypeEnum: IwbEnumDef; - wbLocationEnum: IwbEnumDef; - wbMiscStatEnum: IwbEnumDef; - wbMusicEnum: IwbEnumDef; - wbObjectTypeEnum: IwbEnumDef; - wbPropTypeEnum: IwbEnumDef; - wbQuadrantEnum: IwbEnumDef; - wbSexEnum: IwbEnumDef; - wbSkillEnum: IwbEnumDef; - wbSoulGemEnum: IwbEnumDef; - wbSoundLevelEnum: IwbEnumDef; - wbTargetEnum: IwbEnumDef; - wbTintMaskTypeEnum: IwbEnumDef; - wbVatsValueFunctionEnum: IwbEnumDef; - wbWardStateEnum: IwbEnumDef; - wbWeaponAnimTypeEnum: IwbEnumDef; - wbZTestFuncEnum: IwbEnumDef; - -procedure DefineTES5; - -implementation - -uses - Types, - Classes, - SysUtils, - Math, - Variants, - wbHelpers; - -const - _00_IAD: TwbSignature = #$00'IAD'; - _01_IAD: TwbSignature = #$01'IAD'; - _02_IAD: TwbSignature = #$02'IAD'; - _03_IAD: TwbSignature = #$03'IAD'; - _04_IAD: TwbSignature = #$04'IAD'; - _05_IAD: TwbSignature = #$05'IAD'; - _06_IAD: TwbSignature = #$06'IAD'; - _07_IAD: TwbSignature = #$07'IAD'; - _08_IAD: TwbSignature = #$08'IAD'; - _09_IAD: TwbSignature = #$09'IAD'; - _0A_IAD: TwbSignature = #$0A'IAD'; - _0B_IAD: TwbSignature = #$0B'IAD'; - _0C_IAD: TwbSignature = #$0C'IAD'; - _0D_IAD: TwbSignature = #$0D'IAD'; - _0E_IAD: TwbSignature = #$0E'IAD'; - _0F_IAD: TwbSignature = #$0F'IAD'; - _10_IAD: TwbSignature = #$10'IAD'; - _11_IAD: TwbSignature = #$11'IAD'; - _12_IAD: TwbSignature = #$12'IAD'; - _13_IAD: TwbSignature = #$13'IAD'; - _14_IAD: TwbSignature = #$14'IAD'; - _40_IAD: TwbSignature = #$40'IAD'; - _41_IAD: TwbSignature = #$41'IAD'; - _42_IAD: TwbSignature = #$42'IAD'; - _43_IAD: TwbSignature = #$43'IAD'; - _44_IAD: TwbSignature = #$44'IAD'; - _45_IAD: TwbSignature = #$45'IAD'; - _46_IAD: TwbSignature = #$46'IAD'; - _47_IAD: TwbSignature = #$47'IAD'; - _48_IAD: TwbSignature = #$48'IAD'; - _49_IAD: TwbSignature = #$49'IAD'; - _4A_IAD: TwbSignature = #$4A'IAD'; - _4B_IAD: TwbSignature = #$4B'IAD'; - _4C_IAD: TwbSignature = #$4C'IAD'; - _4D_IAD: TwbSignature = #$4D'IAD'; - _4E_IAD: TwbSignature = #$4E'IAD'; - _4F_IAD: TwbSignature = #$4F'IAD'; - _50_IAD: TwbSignature = #$50'IAD'; - _51_IAD: TwbSignature = #$51'IAD'; - _52_IAD: TwbSignature = #$52'IAD'; - _53_IAD: TwbSignature = #$53'IAD'; - _54_IAD: TwbSignature = #$54'IAD'; - -{00TX} _00_0TX: TwbSignature = #$30'0TX'; -{10TX} _10_0TX: TwbSignature = #$31'0TX'; -{20TX} _20_0TX: TwbSignature = #$32'0TX'; -{30TX} _30_0TX: TwbSignature = #$33'0TX'; -{40TX} _40_0TX: TwbSignature = #$34'0TX'; -{50TX} _50_0TX: TwbSignature = #$35'0TX'; -{60TX} _60_0TX: TwbSignature = #$36'0TX'; -{70TX} _70_0TX: TwbSignature = #$37'0TX'; -{80TX} _80_0TX: TwbSignature = #$38'0TX'; -{90TX} _90_0TX: TwbSignature = #$39'0TX'; -{:0TX} _3A_0TX: TwbSignature = #$3A'0TX'; -{;0TX} _3B_0TX: TwbSignature = #$3B'0TX'; -{<0TX} _3C_0TX: TwbSignature = #$3C'0TX'; -{=0TX} _3D_0TX: TwbSignature = #$3D'0TX'; -{>0TX} _3E_0TX: TwbSignature = #$3E'0TX'; -{?0TX} _3F_0TX: TwbSignature = #$3F'0TX'; -{@0TX} _40h_0TX: TwbSignature = #$40'0TX'; -{A0TX} A0TX: TwbSignature = 'A0TX'; -{B0TX} B0TX: TwbSignature = 'B0TX'; -{C0TX} C0TX: TwbSignature = 'C0TX'; -{D0TX} D0TX: TwbSignature = 'D0TX'; -{E0TX} E0TX: TwbSignature = 'E0TX'; -{F0TX} F0TX: TwbSignature = 'F0TX'; -{G0TX} G0TX: TwbSignature = 'G0TX'; -{H0TX} H0TX: TwbSignature = 'H0TX'; -{I0TX} I0TX: TwbSignature = 'I0TX'; -{J0TX} J0TX: TwbSignature = 'J0TX'; -{K0TX} K0TX: TwbSignature = 'K0TX'; -{L0TX} L0TX: TwbSignature = 'L0TX'; - - AACT : TwbSignature = 'AACT'; - ACBS : TwbSignature = 'ACBS'; - ACEC : TwbSignature = 'ACEC'; { New To Dawnguard } - ACEP : TwbSignature = 'ACEP'; { New To Dawnguard } - ACHR : TwbSignature = 'ACHR'; - ACID : TwbSignature = 'ACID'; { New To Dawnguard } - ACPR : TwbSignature = 'ACPR'; { New To Skyrim } - ACSR : TwbSignature = 'ACSR'; { New To Dawnguard } - ACTI : TwbSignature = 'ACTI'; - ACUN : TwbSignature = 'ACUN'; { New To Dawnguard } - ADDN : TwbSignature = 'ADDN'; - AHCF : TwbSignature = 'AHCF'; { New To Skyrim } - AHCM : TwbSignature = 'AHCM'; { New To Skyrim } - AIDT : TwbSignature = 'AIDT'; - ALCA : TwbSignature = 'ALCA'; { New To Skyrim } - ALCH : TwbSignature = 'ALCH'; - ALCL : TwbSignature = 'ALCL'; { New To Skyrim } - ALCO : TwbSignature = 'ALCO'; { New To Skyrim } - ALDN : TwbSignature = 'ALDN'; { New To Skyrim } - ALEA : TwbSignature = 'ALEA'; { New To Skyrim } - ALED : TwbSignature = 'ALED'; { New To Skyrim } - ALEQ : TwbSignature = 'ALEQ'; { New To Skyrim } - ALFA : TwbSignature = 'ALFA'; { New To Skyrim } - ALFC : TwbSignature = 'ALFC'; { New To Skyrim } - ALFD : TwbSignature = 'ALFD'; { New To Skyrim } - ALFE : TwbSignature = 'ALFE'; { New To Skyrim } - ALFI : TwbSignature = 'ALFI'; { New To Skyrim } - ALFL : TwbSignature = 'ALFL'; { New To Skyrim } - ALFR : TwbSignature = 'ALFR'; { New To Skyrim } - ALID : TwbSignature = 'ALID'; { New To Skyrim } - ALLS : TwbSignature = 'ALLS'; { New To Skyrim } - ALNA : TwbSignature = 'ALNA'; { New To Skyrim } - ALNT : TwbSignature = 'ALNT'; { New To Skyrim } - ALPC : TwbSignature = 'ALPC'; { New To Skyrim } - ALRT : TwbSignature = 'ALRT'; { New To Skyrim } - ALSP : TwbSignature = 'ALSP'; { New To Skyrim } - ALST : TwbSignature = 'ALST'; { New To Skyrim } - ALUA : TwbSignature = 'ALUA'; { New To Skyrim } - AMMO : TwbSignature = 'AMMO'; - ANAM : TwbSignature = 'ANAM'; - ANIO : TwbSignature = 'ANIO'; - APPA : TwbSignature = 'APPA'; - ARMA : TwbSignature = 'ARMA'; - ARMO : TwbSignature = 'ARMO'; - ARTO : TwbSignature = 'ARTO'; - ASPC : TwbSignature = 'ASPC'; - ASTP : TwbSignature = 'ASTP'; - ATKD : TwbSignature = 'ATKD'; { New to Skyrim } - ATKE : TwbSignature = 'ATKE'; { New to Skyrim } - ATKR : TwbSignature = 'ATKR'; { New to Skyrim } - ATXT : TwbSignature = 'ATXT'; - AVIF : TwbSignature = 'AVIF'; - AVSK : TwbSignature = 'AVSK'; { New to Skyrim } - BAMT : TwbSignature = 'BAMT'; { New to Skyrim } - BIDS : TwbSignature = 'BIDS'; { New to Skyrim } - BIPL : TwbSignature = 'BIPL'; - BMCT : TwbSignature = 'BMCT'; - BNAM : TwbSignature = 'BNAM'; - BOD2 : TwbSignature = 'BOD2'; { New to Skyrim 1.6.91 CK} - BODT : TwbSignature = 'BODT'; { New to Skyrim } - BOOK : TwbSignature = 'BOOK'; - BPND : TwbSignature = 'BPND'; - BPNI : TwbSignature = 'BPNI'; - BPNN : TwbSignature = 'BPNN'; - BPNT : TwbSignature = 'BPNT'; - BPTD : TwbSignature = 'BPTD'; - BPTN : TwbSignature = 'BPTN'; - BTXT : TwbSignature = 'BTXT'; - CAMS : TwbSignature = 'CAMS'; - CELL : TwbSignature = 'CELL'; - CIS1 : TwbSignature = 'CIS1'; { New to Skyrim } - CIS2 : TwbSignature = 'CIS2'; { New to Skyrim } - CITC : TwbSignature = 'CITC'; { New to Skyrim } - CLAS : TwbSignature = 'CLAS'; - CLDC : TwbSignature = 'CLDC'; { New to Skyrim, but unused } - CLFM : TwbSignature = 'CLFM'; - CLMT : TwbSignature = 'CLMT'; - CNAM : TwbSignature = 'CNAM'; - CNTO : TwbSignature = 'CNTO'; - COBJ : TwbSignature = 'COBJ'; - COCT : TwbSignature = 'COCT'; { New to Skyrim 'Count'} - COED : TwbSignature = 'COED'; - COLL : TwbSignature = 'COLL'; - CONT : TwbSignature = 'CONT'; - CPTH : TwbSignature = 'CPTH'; - CRDT : TwbSignature = 'CRDT'; - CRGR : TwbSignature = 'CRGR'; { New to Skyrim } - CRIF : TwbSignature = 'CRIF'; { New to Skyrim } - CRVA : TwbSignature = 'CRVA'; { New to Skyrim } - CSCR : TwbSignature = 'CSCR'; - CSDC : TwbSignature = 'CSDC'; - CSDI : TwbSignature = 'CSDI'; - CSDT : TwbSignature = 'CSDT'; - CSFL : TwbSignature = 'CSFL'; { New to Skyrim } - CSGD : TwbSignature = 'CSGD'; { New to Skyrim } - CSLR : TwbSignature = 'CSLR'; { New to Skyrim } - CSMD : TwbSignature = 'CSMD'; { New to Skyrim } - CSME : TwbSignature = 'CSME'; { New to Skyrim } - CSTY : TwbSignature = 'CSTY'; - CTDA : TwbSignature = 'CTDA'; - DALC : TwbSignature = 'DALC'; { New to Skyrim } - DATA : TwbSignature = 'DATA'; - DEBR : TwbSignature = 'DEBR'; - DELE : TwbSignature = 'DELE'; - DEMO : TwbSignature = 'DEMO'; { New to Skyrim } - DESC : TwbSignature = 'DESC'; - DEST : TwbSignature = 'DEST'; - DEVA : TwbSignature = 'DEVA'; { New to Skyrim } - DFTF : TwbSignature = 'DFTF'; { New To Skyrim } - DFTM : TwbSignature = 'DFTM'; { New To Skyrim } - DIAL : TwbSignature = 'DIAL'; - DLBR : TwbSignature = 'DLBR'; - DLVW : TwbSignature = 'DLVW'; - DMAX : TwbSignature = 'DMAX'; { New to Skyrim } - DMDL : TwbSignature = 'DMDL'; - DMDS : TwbSignature = 'DMDS'; { New to Skyrim } - DMDT : TwbSignature = 'DMDT'; - DMIN : TwbSignature = 'DMIN'; { New to Skyrim } - DNAM : TwbSignature = 'DNAM'; - DOBJ : TwbSignature = 'DOBJ'; - DODT : TwbSignature = 'DODT'; - DOFT : TwbSignature = 'DOFT'; { New to Skyrim } - DOOR : TwbSignature = 'DOOR'; - DPLT : TwbSignature = 'DPLT'; { New to Skyrim } - DSTD : TwbSignature = 'DSTD'; - DSTF : TwbSignature = 'DSTF'; - DUAL : TwbSignature = 'DUAL'; - EAMT : TwbSignature = 'EAMT'; - ECOR : TwbSignature = 'ECOR'; { New to Skyrim } - ECZN : TwbSignature = 'ECZN'; - EDID : TwbSignature = 'EDID'; - EFID : TwbSignature = 'EFID'; - EFIT : TwbSignature = 'EFIT'; - EFSH : TwbSignature = 'EFSH'; - EITM : TwbSignature = 'EITM'; - ENAM : TwbSignature = 'ENAM'; - ENCH : TwbSignature = 'ENCH'; - ENIT : TwbSignature = 'ENIT'; - EPF2 : TwbSignature = 'EPF2'; - EPF3 : TwbSignature = 'EPF3'; - EPFD : TwbSignature = 'EPFD'; - EPFT : TwbSignature = 'EPFT'; - EQUP : TwbSignature = 'EQUP'; - ESCE : TwbSignature = 'ESCE'; - ETYP : TwbSignature = 'ETYP'; - EXPL : TwbSignature = 'EXPL'; - EYES : TwbSignature = 'EYES'; - FACT : TwbSignature = 'FACT'; - FCHT : TwbSignature = 'FCHT'; { New to Skyrim } - FLMV : TwbSignature = 'FLMV'; { New to Skyrim } - FLOR : TwbSignature = 'FLOR'; - FLST : TwbSignature = 'FLST'; - FLTR : TwbSignature = 'FLTR'; { New to Skyrim } - FLTV : TwbSignature = 'FLTV'; - FNAM : TwbSignature = 'FNAM'; - FNMK : TwbSignature = 'FNMK'; { New to Skyrim } - FNPR : TwbSignature = 'FNPR'; { New to Skyrim } - FPRT : TwbSignature = 'FPRT'; { New to Skyrim } - FSTP : TwbSignature = 'FSTP'; - FSTS : TwbSignature = 'FSTS'; - FTSF : TwbSignature = 'FTSF'; { New to Skyrim } - FTSM : TwbSignature = 'FTSM'; { New to Skyrim } - FTST : TwbSignature = 'FTST'; { New to Skyrim } - FULL : TwbSignature = 'FULL'; - FURN : TwbSignature = 'FURN'; - GLOB : TwbSignature = 'GLOB'; - GMST : TwbSignature = 'GMST'; - GNAM : TwbSignature = 'GNAM'; - GRAS : TwbSignature = 'GRAS'; - GWOR : TwbSignature = 'GWOR'; { New to Skyrim } - HAIR : TwbSignature = 'HAIR'; { Unused in Skyrim, but contained in Skyrim.esm } - HAZD : TwbSignature = 'HAZD'; - HCLF : TwbSignature = 'HCLF'; { New to Skyrim } - HDPT : TwbSignature = 'HDPT'; - HEAD : TwbSignature = 'HEAD'; { New to Skyrim } - HEDR : TwbSignature = 'HEDR'; - HNAM : TwbSignature = 'HNAM'; - HTID : TwbSignature = 'HTID'; { New to Skyrim } - ICO2 : TwbSignature = 'ICO2'; - ICON : TwbSignature = 'ICON'; - IDLA : TwbSignature = 'IDLA'; - IDLB : TwbSignature = 'IDLB'; - IDLC : TwbSignature = 'IDLC'; - IDLE : TwbSignature = 'IDLE'; - IDLF : TwbSignature = 'IDLF'; - IDLM : TwbSignature = 'IDLM'; - IDLT : TwbSignature = 'IDLT'; - IMAD : TwbSignature = 'IMAD'; - IMGS : TwbSignature = 'IMGS'; - IMSP : TwbSignature = 'IMSP'; { New to Skyrim } - INAM : TwbSignature = 'INAM'; - INCC : TwbSignature = 'INCC'; { New to Skyrim } - INDX : TwbSignature = 'INDX'; - INFO : TwbSignature = 'INFO'; - INGR : TwbSignature = 'INGR'; - INTV : TwbSignature = 'INTV'; - IPCT : TwbSignature = 'IPCT'; - IPDS : TwbSignature = 'IPDS'; - ITXT : TwbSignature = 'ITXT'; - JAIL : TwbSignature = 'JAIL'; { New To Skyrim } - JNAM : TwbSignature = 'JNAM'; - JOUT : TwbSignature = 'JOUT'; { New To Skyrim } - KEYM : TwbSignature = 'KEYM'; - KNAM : TwbSignature = 'KNAM'; - KSIZ : TwbSignature = 'KSIZ'; - KWDA : TwbSignature = 'KWDA'; - KYWD : TwbSignature = 'KYWD'; - LAND : TwbSignature = 'LAND'; - LCEC : TwbSignature = 'LCEC'; { New to Skyrim } - LCEP : TwbSignature = 'LCEP'; { New to Skyrim } - LCID : TwbSignature = 'LCID'; { New to Skyrim } - LCPR : TwbSignature = 'LCPR'; { New to Skyrim } - LCRT : TwbSignature = 'LCRT'; - LCSR : TwbSignature = 'LCSR'; { New to Skyrim } - LCTN : TwbSignature = 'LCTN'; - LCUN : TwbSignature = 'LCUN'; { New to Skyrim } - LENS : TwbSignature = 'LENS'; { New to SSE } - LFSD : TwbSignature = 'LFSD'; { New to SSE } - LFSP : TwbSignature = 'LFSP'; { New to SSE } - LGTM : TwbSignature = 'LGTM'; - LIGH : TwbSignature = 'LIGH'; - LLCT : TwbSignature = 'LLCT'; {New to Skyrim, part of LVLI 'Count'} - LNAM : TwbSignature = 'LNAM'; - LSCR : TwbSignature = 'LSCR'; - LTEX : TwbSignature = 'LTEX'; - LTMP : TwbSignature = 'LTMP'; - LVLC : TwbSignature = 'LVLC'; - LVLD : TwbSignature = 'LVLD'; - LVLF : TwbSignature = 'LVLF'; - LVLG : TwbSignature = 'LVLG'; - LVLI : TwbSignature = 'LVLI'; - LVLN : TwbSignature = 'LVLN'; - LVLO : TwbSignature = 'LVLO'; - LVSP : TwbSignature = 'LVSP'; - MAST : TwbSignature = 'MAST'; - MATO : TwbSignature = 'MATO'; - MATT : TwbSignature = 'MATT'; - MCHT : TwbSignature = 'MCHT'; { New to Skyrim } - MDOB : TwbSignature = 'MDOB'; - MESG : TwbSignature = 'MESG'; - MGEF : TwbSignature = 'MGEF'; - MHDT : TwbSignature = 'MHDT'; { New to Skyrim } - MIC2 : TwbSignature = 'MIC2'; - MICO : TwbSignature = 'MICO'; - MISC : TwbSignature = 'MISC'; - MNAM : TwbSignature = 'MNAM'; - MO2S : TwbSignature = 'MO2S'; - MO2T : TwbSignature = 'MO2T'; - MO3S : TwbSignature = 'MO3S'; - MO3T : TwbSignature = 'MO3T'; - MO4S : TwbSignature = 'MO4S'; - MO4T : TwbSignature = 'MO4T'; - MO5S : TwbSignature = 'MO5S'; { New to Skyrim } - MO5T : TwbSignature = 'MO5T'; { New to Skyrim } - MOD2 : TwbSignature = 'MOD2'; - MOD3 : TwbSignature = 'MOD3'; - MOD4 : TwbSignature = 'MOD4'; - MOD5 : TwbSignature = 'MOD5'; { New to Skyrim } - MODD : TwbSignature = 'MODD'; - MODL : TwbSignature = 'MODL'; - MODS : TwbSignature = 'MODS'; - MODT : TwbSignature = 'MODT'; - MOVT : TwbSignature = 'MOVT'; - MPAI : TwbSignature = 'MPAI'; { New To Skyrim } - MPAV : TwbSignature = 'MPAV'; { New To Skyrim } - MPRT : TwbSignature = 'MPRT'; { New to Skyrim } - MSTT : TwbSignature = 'MSTT'; - MTNM : TwbSignature = 'MTNM'; { New to Skyrim } - MTYP : TwbSignature = 'MTYP'; { New To Skyrim } - MUSC : TwbSignature = 'MUSC'; - MUST : TwbSignature = 'MUST'; - NAM0 : TwbSignature = 'NAM0'; - NAM1 : TwbSignature = 'NAM1'; - NAM2 : TwbSignature = 'NAM2'; - NAM3 : TwbSignature = 'NAM3'; - NAM4 : TwbSignature = 'NAM4'; - NAM5 : TwbSignature = 'NAM5'; - NAM6 : TwbSignature = 'NAM6'; - NAM7 : TwbSignature = 'NAM7'; - NAM8 : TwbSignature = 'NAM8'; - NAM9 : TwbSignature = 'NAM9'; - NAMA : TwbSignature = 'NAMA'; { New to Skyrim } - NAME : TwbSignature = 'NAME'; - NAVI : TwbSignature = 'NAVI'; - NAVM : TwbSignature = 'NAVM'; - NEXT : TwbSignature = 'NEXT'; - NNAM : TwbSignature = 'NNAM'; - NPC_ : TwbSignature = 'NPC_'; - NULL : TwbSignature = 'NULL'; - NVER : TwbSignature = 'NVER'; - NVMI : TwbSignature = 'NVMI'; - NVNM : TwbSignature = 'NVNM'; { New to Skyrim } - NVPP : TwbSignature = 'NVPP'; { New to Skyrim } - NVSI : TwbSignature = 'NVSI'; { New to Dawnguard } - OBND : TwbSignature = 'OBND'; - OCOR : TwbSignature = 'OCOR'; { New to Skyrim } - OFST : TwbSignature = 'OFST'; - ONAM : TwbSignature = 'ONAM'; - OTFT : TwbSignature = 'OTFT'; - PACK : TwbSignature = 'PACK'; - PARW : TwbSignature = 'PARW'; { New to Skyrim } - PBAR : TwbSignature = 'PBAR'; { New to Skyrim } - PBEA : TwbSignature = 'PBEA'; { New to Skyrim } - PCON : TwbSignature = 'PCON'; { New to Skyrim } - PDTO : TwbSignature = 'PDTO'; { New to Skyrim } - PERK : TwbSignature = 'PERK'; - PFIG : TwbSignature = 'PFIG'; - PFLA : TwbSignature = 'PFLA'; { New to Skyrim } - PFO2 : TwbSignature = 'PFO2'; { New to Skyrim } - PFOR : TwbSignature = 'PFOR'; { New to Skyrim } - PFPC : TwbSignature = 'PFPC'; - PGRE : TwbSignature = 'PGRE'; - PHTN : TwbSignature = 'PHTN'; { New to Skyrim } - PHWT : TwbSignature = 'PHWT'; { New to Skyrim } - PHZD : TwbSignature = 'PHZD'; - PKC2 : TwbSignature = 'PKC2'; { New to Skyrim } - PKCU : TwbSignature = 'PKCU'; { New to Skyrim } - PKDT : TwbSignature = 'PKDT'; - PKID : TwbSignature = 'PKID'; - PLCN : TwbSignature = 'PLCN'; { New to Skyrim } - PLDT : TwbSignature = 'PLDT'; - PLVD : TwbSignature = 'PLVD'; { New to Skyrim } - PLYR : TwbSignature = 'PLYR'; - PMIS : TwbSignature = 'PMIS'; - PNAM : TwbSignature = 'PNAM'; - POBA : TwbSignature = 'POBA'; - POCA : TwbSignature = 'POCA'; - POEA : TwbSignature = 'POEA'; - PRCB : TwbSignature = 'PRCB'; { New to Skyrim } - PRKC : TwbSignature = 'PRKC'; - PRKE : TwbSignature = 'PRKE'; - PRKF : TwbSignature = 'PRKF'; - PRKR : TwbSignature = 'PRKR'; { New to Skyrim } - PRKZ : TwbSignature = 'PRKZ'; { New to Skyrim } - PROJ : TwbSignature = 'PROJ'; - PSDT : TwbSignature = 'PSDT'; - PTDA : TwbSignature = 'PTDA'; { New to Skyrim } - PWAT : TwbSignature = 'PWAT'; { Unused in Skyrim, but contained in Skyrim.esm } - QNAM : TwbSignature = 'QNAM'; - QOBJ : TwbSignature = 'QOBJ'; - QSDT : TwbSignature = 'QSDT'; - QSTA : TwbSignature = 'QSTA'; - QTGL : TwbSignature = 'QTGL'; { New To Skyrim } - QUAL : TwbSignature = 'QUAL'; { New To Skyrim } - QUST : TwbSignature = 'QUST'; - RACE : TwbSignature = 'RACE'; - RCEC : TwbSignature = 'RCEC'; { New To Skyrim } - RCLR : TwbSignature = 'RCLR'; - RCPR : TwbSignature = 'RCPR'; { New to Dawnguard } - RCSR : TwbSignature = 'RCSR'; { New To Skyrim } - RCUN : TwbSignature = 'RCUN'; { New To Skyrim } - RDAT : TwbSignature = 'RDAT'; - RDGS : TwbSignature = 'RDGS'; - RDMO : TwbSignature = 'RDMO'; - RDMP : TwbSignature = 'RDMP'; - RDOT : TwbSignature = 'RDOT'; - RDSA : TwbSignature = 'RDSA'; { New to Skyrim } - RDWT : TwbSignature = 'RDWT'; - REFR : TwbSignature = 'REFR'; - REGN : TwbSignature = 'REGN'; - RELA : TwbSignature = 'RELA'; - REPL : TwbSignature = 'REPL'; - RGDL : TwbSignature = 'RGDL';{ Unused in Skyrim, but contained in Skyrim.esm } - REVB : TwbSignature = 'REVB'; - RFCT : TwbSignature = 'RFCT'; - RNAM : TwbSignature = 'RNAM'; - RNMV : TwbSignature = 'RNMV'; { New to Skyrim } - RPLD : TwbSignature = 'RPLD'; - RPLI : TwbSignature = 'RPLI'; - RPRF : TwbSignature = 'RPRF'; { New To Skyrim } - RPRM : TwbSignature = 'RPRM'; { New To Skyrim } - SCDA : TwbSignature = 'SCDA'; - SCEN : TwbSignature = 'SCEN'; - SCHR : TwbSignature = 'SCHR'; - SCOL : TwbSignature = 'SCOL'; { Unused in Skyrim, but contained in Skyrim.esm } - SCPT : TwbSignature = 'SCPT'; { Unused in Skyrim, but contained in Skyrim.esm } - SCRL : TwbSignature = 'SCRL'; - SCRN : TwbSignature = 'SCRN'; - SCRO : TwbSignature = 'SCRO'; - SCTX : TwbSignature = 'SCTX'; - SDSC : TwbSignature = 'SDSC'; { New to Skyrim } - SHOU : TwbSignature = 'SHOU'; - SHRT : TwbSignature = 'SHRT'; { New to Skyrim } - SLCP : TwbSignature = 'SLCP'; - SLGM : TwbSignature = 'SLGM'; - SMBN : TwbSignature = 'SMBN'; - SMEN : TwbSignature = 'SMEN'; - SMQN : TwbSignature = 'SMQN'; - SNAM : TwbSignature = 'SNAM'; - SNCT : TwbSignature = 'SNCT'; - SNDD : TwbSignature = 'SNDD'; - SNDR : TwbSignature = 'SNDR'; - SNMV : TwbSignature = 'SNMV'; { New to Skyrim } - SOFT : TwbSignature = 'SOFT'; { New to Skyrim } - SOPM : TwbSignature = 'SOPM'; - SOUL : TwbSignature = 'SOUL'; - SOUN : TwbSignature = 'SOUN'; - SPCT : TwbSignature = 'SPCT'; { New to Skyrim } - SPED : TwbSignature = 'SPED'; { New To Skyrim } - SPEL : TwbSignature = 'SPEL'; - SPGD : TwbSignature = 'SPGD'; - SPIT : TwbSignature = 'SPIT'; - SPLO : TwbSignature = 'SPLO'; - SPMV : TwbSignature = 'SPMV'; { New To Skyrim } - SPOR : TwbSignature = 'SPOR'; { New to Skyrim } - STAT : TwbSignature = 'STAT'; - STOL : TwbSignature = 'STOL'; { New to Skyrim } - SWMV : TwbSignature = 'SWMV'; { New to Skyrim } - TACT : TwbSignature = 'TACT'; - TCLT : TwbSignature = 'TCLT'; - TES4 : TwbSignature = 'TES4'; - TIAS : TwbSignature = 'TIAS'; { New to Skyrim } - TIFC : TwbSignature = 'TIFC'; { New To Skyrim } - TINC : TwbSignature = 'TINC'; { New to Skyrim } - TIND : TwbSignature = 'TIND'; { New to Skyrim } - TINI : TwbSignature = 'TINI'; { New to Skyrim } - TINL : TwbSignature = 'TINL'; { New to Skyrim } - TINP : TwbSignature = 'TINP'; { New to Skyrim } - TINT : TwbSignature = 'TINT'; { New to Skyrim } - TINV : TwbSignature = 'TINV'; { New to Skyrim } - TIRS : TwbSignature = 'TIRS'; { New to Skyrim } - TNAM : TwbSignature = 'TNAM'; - TPIC : TwbSignature = 'TPIC'; - TPLT : TwbSignature = 'TPLT'; - TRDT : TwbSignature = 'TRDT'; - TREE : TwbSignature = 'TREE'; - TVDT : TwbSignature = 'TVDT'; { New To Skyrim } - TWAT : TwbSignature = 'TWAT'; { New To Skyrim } - TX00 : TwbSignature = 'TX00'; - TX01 : TwbSignature = 'TX01'; - TX02 : TwbSignature = 'TX02'; - TX03 : TwbSignature = 'TX03'; - TX04 : TwbSignature = 'TX04'; - TX05 : TwbSignature = 'TX05'; - TX06 : TwbSignature = 'TX06'; { New To Skyrim } - TX07 : TwbSignature = 'TX07'; { New To Skyrim } - TXST : TwbSignature = 'TXST'; - UNAM : TwbSignature = 'UNAM'; - UNES : TwbSignature = 'UNES'; { New To Skyrim } - VATS : TwbSignature = 'VATS'; - VCLR : TwbSignature = 'VCLR'; - VENC : TwbSignature = 'VENC'; { New To Skyrim } - VEND : TwbSignature = 'VEND'; { New To Skyrim } - VENV : TwbSignature = 'VENV'; { New To Skyrim } - VHGT : TwbSignature = 'VHGT'; - VMAD : TwbSignature = 'VMAD'; - VNAM : TwbSignature = 'VNAM'; - VNML : TwbSignature = 'VNML'; - VOLI : TwbSignature = 'VOLI'; { New To SSE } - VTCK : TwbSignature = 'VTCK'; - VTEX : TwbSignature = 'VTEX'; - VTXT : TwbSignature = 'VTXT'; - VTYP : TwbSignature = 'VTYP'; - WAIT : TwbSignature = 'WAIT'; { New To Skyrim } - WATR : TwbSignature = 'WATR'; - WBDT : TwbSignature = 'WBDT'; { New to Skyrim } - WCTR : TwbSignature = 'WCTR'; { New To Skyrim } - WEAP : TwbSignature = 'WEAP'; - WKMV : TwbSignature = 'WKMV'; { New to Skyrim } - WLST : TwbSignature = 'WLST'; - WNAM : TwbSignature = 'WNAM'; - WOOP : TwbSignature = 'WOOP'; - WRLD : TwbSignature = 'WRLD'; - WTHR : TwbSignature = 'WTHR'; - XACT : TwbSignature = 'XACT'; - XALP : TwbSignature = 'XALP'; { New To Skyrim } - XAPD : TwbSignature = 'XAPD'; - XAPR : TwbSignature = 'XAPR'; - XATR : TwbSignature = 'XATR'; { New To Dawnguard } - XCAS : TwbSignature = 'XCAS'; - XCCM : TwbSignature = 'XCCM'; - XCHG : TwbSignature = 'XCHG'; - XCIM : TwbSignature = 'XCIM'; - XCLC : TwbSignature = 'XCLC'; - XCLL : TwbSignature = 'XCLL'; - XCLP : TwbSignature = 'XCLP'; - XCLR : TwbSignature = 'XCLR'; - XCLW : TwbSignature = 'XCLW'; - XCMO : TwbSignature = 'XCMO'; - XCNT : TwbSignature = 'XCNT'; - XCVL : TwbSignature = 'XCVL'; { New To Skyrim } - XCWT : TwbSignature = 'XCWT'; - XCZA : TwbSignature = 'XCZA'; { New To Skyrim } - XCZC : TwbSignature = 'XCZC'; { New To Skyrim } - XCZR : TwbSignature = 'XCZR'; { New To Skyrim } - XDCR : TwbSignature = 'XDCR'; - XEMI : TwbSignature = 'XEMI'; - XESP : TwbSignature = 'XESP'; - XEZN : TwbSignature = 'XEZN'; - XFVC : TwbSignature = 'XFVC'; { New To Skyrim } - XGLB : TwbSignature = 'XGLB'; - XHLP : TwbSignature = 'XHLP'; - XHOR : TwbSignature = 'XHOR'; { New To Skyrim } - XHTW : TwbSignature = 'XHTW'; { New To Skyrim } - XIBS : TwbSignature = 'XIBS'; - XILL : TwbSignature = 'XILL'; { New To Skyrim } - XIS2 : TwbSignature = 'XIS2'; { New To Skyrim } - XLCM : TwbSignature = 'XLCM'; - XLCN : TwbSignature = 'XLCN'; { New To Skyrim } - XLIB : TwbSignature = 'XLIB'; { New To Skyrim } - XLIG : TwbSignature = 'XLIG'; { New To Skyrim } - XLKR : TwbSignature = 'XLKR'; - XLOC : TwbSignature = 'XLOC'; - XLOD : TwbSignature = 'XLOD'; - XLRL : TwbSignature = 'XLRL'; { New To Skyrim } - XLRM : TwbSignature = 'XLRM'; - XLRT : TwbSignature = 'XLRT'; { New To Skyrim } - XLTW : TwbSignature = 'XLTW'; - XMBO : TwbSignature = 'XMBO'; - XMBP : TwbSignature = 'XMBP'; - XMBR : TwbSignature = 'XMBR'; - XMRC : TwbSignature = 'XMRC'; - XMRK : TwbSignature = 'XMRK'; - XNAM : TwbSignature = 'XNAM'; - XNDP : TwbSignature = 'XNDP'; - XOCP : TwbSignature = 'XOCP'; - XORD : TwbSignature = 'XORD'; - XOWN : TwbSignature = 'XOWN'; - XPOD : TwbSignature = 'XPOD'; - XPPA : TwbSignature = 'XPPA'; - XPRD : TwbSignature = 'XPRD'; - XPRM : TwbSignature = 'XPRM'; - XPTL : TwbSignature = 'XPTL'; - XPWR : TwbSignature = 'XPWR'; - XRDS : TwbSignature = 'XRDS'; - XRGB : TwbSignature = 'XRGB'; - XRGD : TwbSignature = 'XRGD'; - XRMR : TwbSignature = 'XRMR'; - XRNK : TwbSignature = 'XRNK'; - XSCL : TwbSignature = 'XSCL'; - XSPC : TwbSignature = 'XSPC'; { New To Skyrim } - XTEL : TwbSignature = 'XTEL'; - XTNM : TwbSignature = 'XTNM'; { New To Skyrim } - XTRI : TwbSignature = 'XTRI'; - XWEM : TwbSignature = 'XWEM'; { New To Skyrim } - XWCN : TwbSignature = 'XWCN'; { New To Skyrim } - XWCS : TwbSignature = 'XWCS'; { New To Skyrim } - XWCU : TwbSignature = 'XWCU'; { New To Skyrim } - XXXX : TwbSignature = 'XXXX'; - YNAM : TwbSignature = 'YNAM'; - ZNAM : TwbSignature = 'ZNAM'; - -var - wbPKDTSpecificFlagsUnused : Boolean; - wbEDID: IwbSubRecordDef; - wbCOED: IwbSubRecordDef; - wbXLCM: IwbSubRecordDef; - wbEITM: IwbSubRecordDef; - wbOBND: IwbSubRecordDef; - wbOBNDReq: IwbSubRecordDef; - wbDEST: IwbSubRecordStructDef; - wbDESTActor: IwbSubRecordStructDef; - wbDODT: IwbSubRecordDef; - wbXGLB: IwbSubRecordDef; - wbXRGD: IwbSubRecordDef; - wbXRGB: IwbSubRecordDef; - wbSPLO: IwbSubRecordDef; - wbSPLOs: IwbSubRecordArrayDef; - wbCNTO: IwbSubRecordStructDef; - wbCNTOs: IwbSubRecordArrayDef; - wbAIDT: IwbSubRecordDef; - wbCSDT: IwbSubRecordStructDef; - wbCSDTs: IwbSubRecordArrayDef; - wbFULL: IwbSubRecordDef; - wbFULLActor: IwbSubRecordDef; - wbFULLReq: IwbSubRecordDef; - wbDESC: IwbSubRecordDef; - wbDESCReq: IwbSubRecordDef; - wbXSCL: IwbSubRecordDef; - wbDATAPosRot: IwbSubRecordDef; - wbPosRot: IwbStructDef; - wbMODD: IwbSubRecordDef; - wbMODL: IwbSubRecordStructDef; - wbMODS: IwbSubRecordDef; - wbMO2S: IwbSubRecordDef; - wbMO3S: IwbSubRecordDef; - wbMO4S: IwbSubRecordDef; - wbMODLActor: IwbSubRecordStructDef; - wbMODLReq: IwbSubRecordStructDef; - wbCTDA: IwbSubRecordStructDef; - wbCTDAs: IwbSubRecordArrayDef; - wbCTDAsReq: IwbSubRecordArrayDef; - wbCTDAsCount: IwbSubRecordArrayDef; - wbCTDAsReqCount: IwbSubRecordArrayDef; - wbXLOD: IwbSubRecordDef; - wbXESP: IwbSubRecordDef; - wbICON: IwbSubRecordStructDef; - wbICONReq: IwbSubRecordStructDef; - wbICO2: IwbSubRecordStructDef; - wbActorValue: IwbIntegerDef; - wbETYP: IwbSubRecordDef; - wbETYPReq: IwbSubRecordDef; - wbEFID: IwbSubRecordDef; - wbEFIT: IwbSubRecordDef; - wbEffectsReq: IwbSubRecordArrayDef; - wbFirstPersonFlagsU32: IwbIntegerDef; - wbBODT: IwbSubRecordDef; - wbBOD2: IwbSubRecordDef; - wbBODTBOD2: IwbSubRecordUnionDef; - wbScriptEntry: IwbStructDef; - wbScriptFlags: IwbIntegerDef; - wbScriptPropertyObject: IwbUnionDef; - wbScriptProperties: IwbArrayDef; - wbScriptFragments: IwbStructDef; - wbScriptFragmentsQuest: IwbStructDef; - wbScriptFragmentsInfo: IwbStructDef; - wbScriptFragmentsPack: IwbStructDef; - wbScriptFragmentsScen: IwbStructDef; - wbPLDT: IwbSubRecordDef; - wbPLVD: IwbSubRecordDef; - wbTargetData: IwbStructDef; - wbAttackData: IwbSubRecordStructDef; - wbLLCT: IwbSubRecordDef; - wbLVLD: IwbSubRecordDef; - wbVMAD: IwbSubRecordDef; - wbVMADFragmentedPERK: IwbSubRecordDef; - wbVMADFragmentedPACK: IwbSubRecordDef; - wbVMADFragmentedQUST: IwbSubRecordDef; - wbVMADFragmentedSCEN: IwbSubRecordDef; - wbVMADFragmentedINFO: IwbSubRecordDef; - wbCOCT: IwbSubRecordDef; - wbKSIZ: IwbSubRecordDef; - wbKWDAs: IwbSubRecordDef; - wbReqKWDAs: IwbSubRecordDef; - wbKeywords: IwbSubRecordStructDef; - wbCNAM: IwbSubRecordDef; - wbCNAMReq: IwbSubRecordDef; - wbCITC: IwbSubRecordDef; - wbMGEFData: IwbSubRecordStructDef; - wbMGEFType: IwbIntegerDef; - wbMDOB: IwbSubRecordDef; - wbSPIT: IwbSubRecordDef; - wbDMDSs: IwbSubRecordDef; - wbMO5S: IwbSubRecordDef; - wbSPCT: IwbSubRecordDef; - wbTints: IwbSubRecordArrayDef; - wbMODT: IwbSubRecordDef; - wbDMDT: IwbSubRecordDef; - wbOwnership: IwbSubRecordStructDef; - wbRACE_DATAFlags01: IwbIntegerDef; - wbPhonemeTargets: IwbSubRecordDef; - wbNoseMorphFlags: IwbIntegerDef; - wbBrowMorphFlags: IwbIntegerDef; - wbEyesMorphFlags01: IwbIntegerDef; - wbEyesMorphFlags02: IwbIntegerDef; - wbLipMorphFlags: IwbIntegerDef; - wbPHWT: IwbSubRecordStructDef; - wbMorphs: IwbSubRecordStructDef; - wbHeadPart: IwbSubRecordStructDef; - wbQUSTAliasFlags: IwbSubRecordDef; - wbPDTO: IwbSubRecordDef; - wbPDTOs: IwbSubRecordArrayDef; - wbUNAMs: IwbSubRecordArrayDef; - wbNull: IwbValueDef; - wbTimeInterpolator: IwbStructDef; - wbColorInterpolator: IwbStructDef; - wbYNAM: IwbSubRecordDef; - wbZNAM: IwbSubRecordDef; - wbMaxHeightDataCELL: IwbSubRecordDef; - wbMaxHeightDataWRLD: IwbSubRecordDef; - wbTVDT: IwbSubRecordDef; - wbOFST: IwbSubRecordDef; - wbNVNM: IwbSubRecordDef; - wbNAVIslandData: IwbStructDef; - - -function IsSSE: Boolean; inline; overload; -begin - Result := wbGameMode = gmSSE; -end; - -function IsSSE(const aDef1, aDef2: String): String; inline; overload; -begin - if IsSSE then - Result := aDef1 - else - Result := aDef2; -end; - -function IsSSE(const aDef1, aDef2: IwbSubRecordDef): IwbSubRecordDef; inline; overload; -begin - if IsSSE then - Result := aDef1 - else - Result := aDef2; -end; - - -function Sig2Int(aSignature: TwbSignature): Cardinal; inline; -begin - Result := PCardinal(@aSignature)^; -end; - -function wbEPFDActorValueToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsCardinal := aInt; - AsFloat := PSingle(@AsCardinal)^; - aInt := Round(AsFloat); - case aType of - ctToStr: Result := wbActorValueEnum.ToString(aInt, aElement); - ctToSortKey: Result := wbActorValueEnum.ToSortKey(aInt, aElement); - ctCheck: Result := wbActorValueEnum.Check(aInt, aElement); - ctToEditValue: Result := wbActorValueEnum.ToEditValue(aInt, aElement); - ctEditType: Result := 'ComboBox'; - ctEditInfo: Result := wbActorValueEnum.EditInfo[aInt, aElement]; - end; -end; - -function wbEPFDActorValueToInt(const aString: string; const aElement: IwbElement): Int64; -var - AsCardinal : Cardinal; - AsFloat : Single; -begin - AsFloat := wbActorValueEnum.FromEditValue(aString, aElement); - PSingle(@AsCardinal)^ := AsFloat; - Result := AsCardinal; -end; - -function wbCTDAParam2QuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Parameter #1']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX\Stage Index']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbPerkDATAQuestStageToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Param1 : IwbElement; - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Stages : IwbContainerElementRef; - Stage : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Param1 := Container.ElementByName['Quest']; - - if not Assigned(Param1) then - Exit; - - if not Supports(Param1.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - try - if Supports(MainRecord.ElementByName['Stages'], IwbContainerElementRef, Stages) then begin - for i := 0 to Pred(Stages.ElementCount) do - if Supports(Stages.Elements[i], IwbContainerElementRef, Stage) then begin - j := Stage.ElementNativeValues['INDX\Stage Index']; - s := Trim(Stage.ElementValues['Log Entries\Log Entry\CNAM']); - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.AddObject(t, TObject(j)) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbCTDAParam2QuestStageToInt(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToInt(s); -end; - -function wbREFRNavmeshTriangleToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; - Navmesh : IwbElement; - MainRecord : IwbMainRecord; - Triangles : IwbContainerElementRef; -begin - case aType of - ctToStr: Result := IntToStr(aInt); - ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if not Assigned(aElement) then Exit; - Container := GetContainerRefFromUnionOrValue(aElement); - if not Assigned(Container) then Exit; - - Navmesh := Container.Elements[0]; - - if not Assigned(Navmesh) then - Exit; - - if not Supports(Navmesh.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> NAVM then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - if Supports(MainRecord.ElementByPath['NVNM\Triangles'], IwbContainerElementRef, Triangles) and (aType = ctCheck) then - if aInt >= Triangles.ElementCount then - Result := ''; -end; - -function wbStringToInt(const aString: string; const aElement: IwbElement): Int64; -begin - Result := StrToIntDef(aString, 0); -end; - - -{ Alias to string conversion, requires quest reference or quest record specific to record that references alias } -function wbAliasToStr(aInt: Int64; const aQuestRef: IwbElement; aType: TwbCallbackType): string; -var - MainRecord : IwbMainRecord; - EditInfos : TStringList; - Aliases : IwbContainerElementRef; - Alias : IwbContainerElementRef; - i, j : Integer; - s, t : string; -begin - case aType of - ctToStr: if aInt = -1 then Result := 'None' else - Result := IntToStr(aInt) + ' '; - ctToEditValue: if aInt = -1 then Result := 'None' else - Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: if aInt = -1 then Result := '' else - Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - if (aInt = -1) and (aType <> ctEditType) and (aType <> ctEditInfo) then - Exit; - - if not Assigned(aQuestRef) then - Exit; - - // aQuestRef can be a QUST record or reference to QUST record - if not Supports(aQuestRef, IwbMainRecord, MainRecord) then - if not Supports(aQuestRef.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - MainRecord := MainRecord.WinningOverride; - - if MainRecord.Signature <> QUST then begin - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - end; - Exit; - end; - - case aType of - ctEditType: begin - Result := 'ComboBox'; - Exit; - end; - ctEditInfo: - EditInfos := TStringList.Create; - else - EditInfos := nil; - end; - - try - if Supports(MainRecord.ElementByName['Aliases'], IwbContainerElementRef, Aliases) then begin - for i := 0 to Pred(Aliases.ElementCount) do - if Supports(Aliases.Elements[i], IwbContainerElementRef, Alias) then begin - j := Alias.Elements[0].NativeValue; - s := Alias.ElementEditValues['ALID']; - t := IntToStr(j); - while Length(t) < 3 do - t := '0' + t; - if s <> '' then - t := t + ' ' + s; - if Assigned(EditInfos) then - EditInfos.Add(t) - else if j = aInt then begin - case aType of - ctToStr, ctToEditValue: Result := t; - ctCheck: Result := ''; - end; - Exit; - end; - end; - end; - - case aType of - ctToStr: Result := IntToStr(aInt) + ' '; - ctCheck: Result := ''; - ctEditInfo: begin - EditInfos.Add('None'); - EditInfos.Sort; - Result := EditInfos.CommaText; - end; - end; - finally - FreeAndNil(EditInfos); - end; -end; - -function wbStrToAlias(const aString: string; const aElement: IwbElement): Int64; -var - i : Integer; - s : string; -begin - Result := -1; - - if aString = 'None' then - Exit; - - i := 1; - s := Trim(aString); - while (i <= Length(s)) and (s[i] in ['-', '0'..'9']) do - Inc(i); - s := Copy(s, 1, Pred(i)); - - Result := StrToIntDef(s, -1); -end; - -function wbScriptObjectAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainerElementRef; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerRefFromUnionOrValue(aElement); - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementByName['FormID'], aType); -end; - -function wbPackageLocationAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementBySignature['QNAM'], aType); -end; - -function wbQuestAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container, aType); -end; - -function wbQuestExternalAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := aElement.Container; - - if not Assigned(Container) then - Exit; - - Result := wbAliasToStr(aInt, Container.ElementBySignature['ALEQ'] , aType); -end; - -function wbConditionAliasToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Container : IwbContainer; - MainRecord : IwbMainRecord; - GroupRecord : IwbGroupRecord; -begin - if not wbResolveAlias then begin - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; - Exit; - end; - - if not Assigned(aElement) then - Exit; - - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - - if not Assigned(Container) then - Exit; - - if not Supports(Container, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.Signature = QUST then - Result := wbAliasToStr(aInt, Container, aType) - else if MainRecord.Signature = SCEN then - Result := wbAliasToStr(aInt, Container.ElementBySignature['PNAM'], aType) - else if MainRecord.Signature = PACK then - Result := wbAliasToStr(aInt, Container.ElementBySignature['QNAM'], aType) - else if MainRecord.Signature = INFO then begin - // get DIAL for INFO - if Supports(MainRecord.Container, IwbGroupRecord, GroupRecord) then - if Supports(GroupRecord.ChildrenOf, IwbMainRecord, MainRecord) then - Result := wbAliasToStr(aInt, MainRecord.ElementBySignature['QNAM'], aType); - end else - // this should never be called since aliases in conditions can be in the forms above only - // but just in case - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: Result := IntToHex64(aInt, 8); - else - Result := ''; - end; -end; - -function wbClmtMoonsPhaseLength(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - PhaseLength : Byte; - Masser : Boolean; - Secunda : Boolean; -begin - Result := ''; - if aType = ctToSortKey then begin - Result := IntToHex64(aInt, 2); - end else if aType = ctToStr then begin - PhaseLength := aInt mod 64; - Masser := (aInt and 64) <> 0; - Secunda := (aInt and 128) <> 0; - if Masser then - if Secunda then - Result := 'Masser, Secunda / ' - else - Result := 'Masser / ' - else - if Secunda then - Result := 'Secunda / ' - else - Result := 'No Moon / '; - Result := Result + IntToStr(PhaseLength); - end; -end; - -function wbClmtTime(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - try - Result := TimeToStr( EncodeTime(aInt div 6, (aInt mod 6) * 10, 0, 0) ) - except - Result := IntToStr(aInt) - end - else - Result := ''; -end; - - -var - wbCtdaTypeFlags : IwbFlagsDef; - -function wbCtdaTypeToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - s: string; -begin - Result := ''; - - if not Assigned(wbCtdaTypeFlags) then - wbCtdaTypeFlags := wbFlags([ - {0x01} 'Or', - {0x02} 'Use aliases', - {0x04} 'Use global', - {0x08} 'Use packdata', - {0x10} 'Swap Subject and Target' - ]); -{ - Compare operator (upper 3 bits) - LGE - 000 0=Equal to - 001 1=Not equal to - 010 2=Greater than - 011 3=Greater than or equal to - 100 4=Less than - 101 5=Less than or equal to - - Flags (lower 5 bits) - 0x01=OR (default is to AND conditions together) - 0x02=Parameters (use aliases) : Force function parameters to use quest alias data (exclusive with "use pack data") - 0x04=Use global - 0x08=Use Pack Data : Force function parameters to use pack data (exclusive with "use aliases") - 0x10=Swap Subject and Target -} - case aType of - ctEditType: - Result := 'CheckComboBox'; - ctEditInfo: - Result := 'Equal,Greater,Lesser,Or,"Use Aliases","Use Global","Use Packdata","Swap Subject and Target"'; - ctToEditValue: begin - Result := '00000000'; - case aInt and $E0 of - $00 : Result[1] := '1'; - $40 : Result[2] := '1'; - $60 : begin - Result[1] := '1'; - Result[2] := '1'; - end; - $80 : Result[3] := '1'; - $A0 : begin - Result[1] := '1'; - Result[3] := '1'; - end; - end; - if (aInt and $01) <> 0 then // Or - Result[4] := '1'; - if (aInt and $02) <> 0 then // Use aliases - Result[5] := '1'; - if (aInt and $04) <> 0 then // Use global - Result[6] := '1'; - if (aInt and $08) <> 0 then // Use packdata - Result[7] := '1'; - if (aInt and $10) <> 0 then // Swap Subject and Target - Result[8] := '1'; - end; - ctToStr: begin - case aInt and $E0 of - $00 : Result := 'Equal to'; - $20 : Result := 'Not equal to'; - $40 : Result := 'Greater than'; - $60 : Result := 'Greater than or equal to'; - $80 : Result := 'Less than'; - $A0 : Result := 'Less than or equal to'; - else - Result := '' - end; - s := wbCtdaTypeFlags.ToString(aInt and $1F, aElement); - if s <> '' then - Result := Result + ' / ' + s; - end; - ctToSortKey: begin - Result := IntToHex64(aInt, 2); - Exit; - end; - ctCheck: begin - case aInt and $E0 of - $00, $20, $40, $60, $80, $A0 : Result := ''; - else - Result := '' - end; - s := wbCtdaTypeFlags.Check(aInt and $1F, aElement); - if s <> '' then - Result := Result + ' / ' + s; - end; - end; -end; - -function wbCtdaTypeToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; -begin - s := aString + '00000000'; - if s[1] = '1' then begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $00; - end else begin - Result := $60; - end; - end else begin - if s[3] = '1' then begin - Result := $A0; - end else begin - Result := $00; - end; - end; - end else begin - if s[2] = '1' then begin - if s[3] = '1' then begin - Result := $20; - end else begin - Result := $40; - end; - end else begin - if s[3] = '1' then begin - Result := $80; - end else begin - Result := $20; - end; - end; - end; - // Or - if s[4] = '1' then - Result := Result or $01; - // Use aliases - if s[5] = '1' then - Result := Result or $02; - // Use global - if s[6] = '1' then - Result := Result or $04; - // Use packdata - if s[7] = '1' then - Result := Result or $08; - // Swap Subject and Target - if s[8] = '1' then - Result := Result or $10; -end; - -var - wbEventFunctionAndMemberEditInfo: string; - -function wbEventFunctionAndMemberToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - EventFunction, EventMember: Integer; - i, j: Integer; - s1, s2: string; - slMember: TStringList; -begin - Result := ''; - EventFunction := aInt and $FFFF; - EventMember := aInt shr 16; - case aType of - ctToStr, ctToEditValue: begin - Result := wbEventFunctionEnum.ToEditValue(EventFunction, nil); - Result := Result + ':' + wbEventMemberEnum.ToEditValue(EventMember, nil); - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - s1 := wbEventFunctionEnum.Check(EventFunction, nil); - if s1 <> '' then - s1 := 'EventFunction' + s1; - s2 := wbEventMemberEnum.Check(EventMember, nil); - if s2 <> '' then - s2 := 'EventMember' + s2; - if (s1 <> '') or (s2 <> '') then - Result := s1 + ':' + s2; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbEventFunctionAndMemberEditInfo; - if Result = '' then try - slMember := TStringList.Create; - slMember.CommaText := wbEventMemberEnum.EditInfo[0, nil]; - with TStringList.Create do try - for i := 0 to Pred(wbEventFunctionEnum.NameCount) do - for j := 0 to Pred(slMember.Count) do - Add(wbEventFunctionEnum.Names[i] + ':' + slMember[j]); - Sort; - Result := CommaText; - finally - Free; - end; - wbEventFunctionAndMemberEditInfo := Result; - finally - FreeAndNil(slMember); - end - end; - end; -end; - -function wbEventFunctionAndMemberToInt(const aString: string; const aElement: IwbElement): Int64; -var - EventFunction, EventMember, i: Integer; -begin - i := Pos(':', aString); - if i > 0 then begin - EventFunction := wbEventFunctionEnum.FromEditValue(Copy(aString, 1, i-1), nil); - EventMember := wbEventMemberEnum.FromEditValue(Copy(aString, i+1, Length(aString)), nil); - end - else begin - EventFunction := 0; - EventMember := 0; - end; - Result := EventMember shl 16 + EventFunction; -end; - -procedure wbMESGDNAMAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : Integer; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := Integer(aOldValue) and 1; - NewValue := Integer(aNewValue) and 1; - if NewValue = OldValue then - Exit; - if NewValue = 1 then - Container.RemoveElement('TNAM') - else - Container.Add('TNAM', True); - end; -end; - -procedure wbGMSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - Container : IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - if (Length(OldValue) < 1) or (Length(OldValue) < 1) or (OldValue[1] <> NewValue[1]) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - end; - end; -end; - -procedure wbFLSTEDIDAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue : string; - OldOrdered, NewOrdered : Boolean; - Container : IwbContainerElementRef; -const - OrderedList = 'OrderedList'; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - OldValue := aOldValue; - NewValue := aNewValue; - - if Length(OldValue) > Length(OrderedList) then - Delete(OldValue, 1, Length(OldValue)-Length(OrderedList)); - if Length(NewValue) > Length(OrderedList) then - Delete(NewValue, 1, Length(NewValue)-Length(OrderedList)); - - OldOrdered := SameText(OldValue, OrderedList); - NewOrdered := SameText(NewValue, OrderedList); - - if OldOrdered <> NewOrdered then - Container.RemoveElement('FormIDs'); - end; -end; - -procedure wbCtdaTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - OldValue, NewValue: Integer; - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - // reset value if "use global" has changed - OldValue := aOldValue and $04; - NewValue := aNewValue and $04; - if OldValue <> NewValue then - Container.ElementNativeValues['..\Comparison Value'] := 0; - - {>>> "run on target", no such flag in Skyrim <<<} -// if aNewValue and $02 then begin -// Container.ElementNativeValues['..\Run On'] := 1; -// if Integer(Container.ElementNativeValues['..\Run On']) = 1 then -// aElement.NativeValue := Byte(aNewValue) and not $02; -// end; -end; - -procedure wbAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - Exit; -end; - -function wbMODTCallback(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Strings: TDynStrings; - i: Integer; -begin - Result := ''; - if wbLoaderDone and (aType in [ctToStr, ctToSortKey] ) then begin - Strings := wbContainerHandler.ResolveHash(aInt); - for i := Low(Strings) to High(Strings) do - Result := Result + Strings[i] + ', '; - SetLength(Result, Length(Result) -2 ); - end; -end; - -{>>> Needs revision for Skyrim <<<} -//function wbIdleAnam(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -//begin -// Result := ''; -// case aType of -// ctToStr: begin -// case aInt and not $C0 of -// 0: Result := 'Idle'; -// 1: Result := 'Movement'; -// 2: Result := 'Left Arm'; -// 3: Result := 'Left Hand'; -// 4: Result := 'Weapon'; -// 5: Result := 'Weapon Up'; -// 6: Result := 'Weapon Down'; -// 7: Result := 'Special Idle'; -// 20: Result := 'Whole Body'; -// 21: Result := 'Upper Body'; -// else -// Result := ''; -// end; -// -// if (aInt and $80) = 0 then -// Result := Result + ', Must return a file'; -// if (aInt and $40) = 1 then -// Result := Result + ', Unknown Flag'; -// end; -// ctToSortKey: begin -// Result := IntToHex64(aInt, 2); -// end; -// ctCheck: begin -// case aInt and not $C0 of -// 0..7, 20, 21: Result := ''; -// else -// Result := ''; -// end; -// end; -// end; -//end; - -function wbScaledInt4ToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - ctToSortKey: begin - Result := FloatToStrF(aInt / 10000, ffFixed, 99, 4); - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[aInt < 0] + Result; - end; - ctCheck: Result := ''; - end; -end; - -function wbScaledInt4ToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f * 10000; - Result := Round(f); -end; - -function wbCloudSpeedToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := FloatToStrF((aInt - 127)/127/10, ffFixed, 99, 4); - ctCheck: Result := ''; - end; -end; - -function wbCloudSpeedToInt(const aString: string; const aElement: IwbElement): Int64; -var - f: Extended; -begin - f := StrToFloat(aString); - f := f*10*127 + 127; - Result := Min(Round(f), 254); -end; - -function wbShortXYtoStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - x, y: SmallInt; -begin - y := aInt and $FFFF; - x := aInt shr 16 and $FFFF; - Result := ''; - case aType of - ctToStr, ctToEditValue: Result := Format('%d, %d', [x, y]); - ctCheck: Result := ''; - end; -end; - -function wbStrToShortXY(const aString: string; const aElement: IwbElement): Int64; -var - x, y: SmallInt; - Value: Cardinal; -begin - y := StrToIntDef(Copy(aString, 1, Pred(Pos(', ', aString))), 0); - x := StrToIntDef(Copy(aString, Pos(', ', aString) + 2, Length(aString)), 0); - PWord(@Value)^ := x; - PWord(Cardinal(@Value) + SizeOf(SmallInt))^ := y; - Result := Value; -end; - -function wbHideFFFF(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt, 4) - else if aType = ctToStr then - if aInt = $FFFF then - Result := 'None' - else - Result := IntToStr(aInt); -end; - -function wbAtxtPosition(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - if aType = ctToSortKey then - Result := IntToHex64(aInt div 17, 2) + IntToHex64(aInt mod 17, 2) - else if aType = ctCheck then begin - if (aInt < 0) or (aInt > 288) then - Result := '' - else - Result := ''; - end else if aType = ctToStr then - Result := IntToStr(aInt) + ' -> ' + IntToStr(aInt div 17) + ':' + IntToStr(aInt mod 17); -end; - -function wbGLOBFNAM(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -begin - Result := ''; - case aType of - ctToStr: begin - case aInt of - Ord('s'): Result := 'Short'; - Ord('l'): Result := 'Long'; - Ord('f'): Result := 'Float'; - Ord('b'): Result := 'Boolean'; - else - Result := ''; - end; - end; - ctToSortKey: Result := Chr(aInt); - ctCheck: begin - case aInt of - Ord('s'), Ord('l'), Ord('f'), Ord('b'): Result := ''; - else - Result := ''; - end; - end; - end; -end; - -function wbPlacedAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - s: string; - Cell: IwbMainRecord; - Position: TwbVector; - Grid: TwbGridCell; -begin - Result := ''; - - Rec := aMainRecord.RecordBySignature['NAME']; - if Assigned(Rec) then begin - s := Trim(Rec.Value); - if s <> '' then - Result := 'places ' + s; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - - // grid position of persistent reference in exterior persistent cell (interior cells are not persistent) - if Supports(aMainRecord.Container, IwbGroupRecord, Container) then - Cell := IwbGroupRecord(Container).ChildrenOf; - if Assigned(Cell) and Cell.IsPersistent and (Cell.Signature = 'CELL') then - if aMainRecord.GetPosition(Position) then begin - Grid := wbPositionToGridCell(Position); - Result := Result + ' at ' + IntToStr(Grid.x) + ',' + IntToStr(Grid.y); - end; - end; - end; -end; - -function wbINFOAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := Trim(aMainRecord.ElementValues['Responses\Response\NAM1']); - if Result <> '' then - Result := '''' + Result + ''''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; - - s := Trim(aMainRecord.ElementValues['QNAM']); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'for ' + s; - end; -end; - -function wbNAVMAddInfo(const aMainRecord: IwbMainRecord): string; -var - Container: IwbContainer; - s: string; -begin - Result := ''; - - Container := aMainRecord.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if Assigned(Container) then begin - s := Trim(Container.Name); - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + 'in ' + s; - end; - end; -end; - -function wbCellAddInfo(const aMainRecord: IwbMainRecord): string; -var - Rec: IwbRecord; - Container: IwbContainer; - GroupRecord : IwbGroupRecord; - s: string; -begin - Result := ''; - - if not aMainRecord.IsPersistent then begin - Rec := aMainRecord.RecordBySignature['XCLC']; - if Assigned(Rec) then - Result := 'at ' + Rec.Elements[0].Value + ',' + Rec.Elements[1].Value; - end; - - Container := aMainRecord.Container; - while Assigned(Container) and not - (Supports(Container, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1)) do - Container := Container.Container; - - if Assigned(Container) then begin - s := wbFormID.ToString(GroupRecord.GroupLabel, aMainRecord); - if s <> '' then begin - if Result <> '' then - s := s + ' '; - Result := 'in ' + s + Result; - end; - end; -end; - -procedure wbCTDARunOnAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - if aOldValue <> aNewValue then - if aNewValue <> 2 then - aElement.Container.ElementNativeValues['Reference'] := 0; -end; - -{>>> Needs revision for Skyrim <<<} -procedure wbPERKPRKETypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -// rDATA : IwbRecord; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then begin - if Supports(Container.Container, IwbContainerElementRef, Container) then begin - Container.RemoveElement('DATA'); - Container.Add('DATA', True); - Container.RemoveElement('Perk Conditions'); - Container.RemoveElement('Entry Point Function Parameters'); - if aNewValue = 2 then begin - Container.Add('EPFT', True); - Container.ElementNativeValues['DATA\Entry Point\Function'] := 2; - end; - end; - end; -end; - -function wbNPCLevelDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - i := Container.ElementByName['Flags'].NativeValue; - if i and $00000080 <> 0 then - Result := 1; -end; - -function wbMGEFAssocItemDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Archtype : Variant; - DataContainer : IwbDataContainer; - Element : IwbElement; -const - OffsetArchtype = 56; - -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - VarClear(ArchType); - Element := Container.ElementByName['Archtype']; - if Assigned(Element) then - ArchType := Element.NativeValue - else if Supports(Container, IwbDataContainer, DataContainer) and - DataContainer.IsValidOffset(aBasePtr, aEndPtr, OffsetArchtype) then begin // we are part a proper structure - aBasePtr := Pointer(Cardinal(aBasePtr) + OffsetArchtype); - ArchType := PCardinal(aBasePtr)^; - end; - - if not VarIsEmpty(ArchType) then - case Integer(ArchType) of - 12: Result := 1; // Light - 17: Result := 2; // Bound Item - 18: Result := 3; // Summon Creature - 25: Result := 4; // Guide - 34: Result := 8; // Peak Mod - 35: Result := 5; // Cloak - 36: Result := 6; // Werewolf - 39: Result := 7; // Enhance Weapon - 40: Result := 4; // Spawn Hazard - 46: Result := 6; // Vampire Lord - end; -end; - -procedure wbMGEFAssocItemAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0) then begin - Element := Container.ElementByName['Archtype']; - if Assigned(Element) and (Element.NativeValue = 0) then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - // I assume this will alo protect Second AV Weight (The two actor values are after ArchType) - end; -end; - -procedure wbMGEFAV2WeightAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; - Element : IwbElement; -begin - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - if (aNewValue <> 0.0) then begin - Element := Container.ElementByName['Archtype']; - if Assigned(Element) and (Element.NativeValue = 0) then - Element.NativeValue := $FF; // Signals ArchType that it should not mess with us on the next change! - end; -end; - -procedure wbMGEFArchtypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container: IwbContainerElementRef; -begin - if VarSameValue(aOldValue, aNewValue) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if (aNewValue < $FF) and (aOldValue < $FF) then begin - Container.ElementNativeValues['..\Assoc. Item'] := 0; - case Integer(aNewValue) of - 06: Container.ElementNativeValues['..\Actor Value'] := 00;//Agression - 07: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 08: Container.ElementNativeValues['..\Actor Value'] := 00;//Agression - 11: Container.ElementNativeValues['..\Actor Value'] := 54;//Invisibility - 21: Container.ElementNativeValues['..\Actor Value'] := 53;//Paralysis - 24: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 38: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - 42: Container.ElementNativeValues['..\Actor Value'] := 01;//Confidence - else - Container.ElementNativeValues['..\Actor Value'] := -1; - end; - Container.ElementNativeValues['..\Second Actor Value'] := -1; - Container.ElementNativeValues['..\Second AV Weight'] := 0.0; - end; -end; - -function wbCTDAReferenceDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - if Integer(Container.ElementNativeValues['Run On']) = 2 then - Result := 1; -end; - -function wbNAVIIslandDataDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbMainRecord; - Element : IwbElement; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etsubRecord) do - Container := Container.Container; - - if not Supports(Container, IwbSubRecord, SubRecord) then - Exit; - - Element := SubRecord.ElementByName['Is Island']; - if not Assigned(Element) then - Exit; - - Result := Element.NativeValue; -end; - -function wbNAVIParentDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - SubRecord : IwbMainRecord; - Element : IwbElement; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etsubRecord) do - Container := Container.Container; - - if not Supports(Container, IwbSubRecord, SubRecord) then - Exit; - - Element := SubRecord.ElementByName['Parent Worldspace']; - if not Assigned(Element) then - Exit; - - if (Element.NativeValue = 0) then - Result := 1; -end; - -function wbNVNMParentDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Current : IwbContainer; - Parent : IwbContainer; - GroupRecord : IwbGroupRecord; - MainRecord : IwbMainRecord; - rData : IwbRecord; - i : integer; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etGroupRecord) do - Container := Container.Container; - - if not Supports(Container, IwbGroupRecord, GroupRecord) then - Exit; - - MainRecord := GroupRecord.ChildrenOf; // This does NOT work while adding master! - - if not Assigned(MainRecord) then begin // we expect: - // plugin \ CELL group \ Block \ Sub Block \ CELL - // \ CELL Children group \ Permanent children group - // \ Temporary children group = GroupRecord = Container - if Assigned(Container) and (Container.ElementType = etGroupRecord) then - Container := Container.Container; - if Assigned(Container) and (Container.ElementType = etGroupRecord) then - Parent := Container.Container; - i := 0; - while (i < Parent.ElementCount) and Supports(Parent.Elements[i], IwbContainer, Current) and (Current <> Container) do - Inc(i); - if (i = 0) or (i = Parent.ElementCount) or not Supports(Parent.Elements[i-1], IwbMainRecord,MainRecord) then begin - wbProgressCallback('Parent of a NVNM is not a MainRecord'); -// Assert(Assigned(MainRecord)); // Better an exception than to destroy the plugin. - Exit; - end; - end; - if (MainRecord.Signature<>CELL) then begin - wbProgressCallback('Parent of a NVNM is not identified as a CELL'); - Assert(MainRecord.Signature=CELL); // Better an exception than to destroy the plugin. - Exit; - end; - - rDATA := MainRecord.RecordBySignature['DATA']; - - if not Assigned(rData) then - Exit; - - i := rData.NativeValue; - - // is interior cell? - if i and 1 <> 0 then - Result := 1; -end; - -function wbCOEDOwnerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - LinksTo : IwbElement; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - LinksTo := Container.ElementByName['Owner'].LinksTo; - - if Supports(LinksTo, IwbMainRecord, MainRecord) then - if MainRecord.Signature = 'NPC_' then - Result := 1 - else if MainRecord.Signature = 'FACT' then - Result := 2; -end; - -function wbGMSTUnionDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rEDID: IwbRecord; - s: string; -begin - Result := 1; - rEDID := aElement.Container.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > 0 then - case s[1] of - 's': Result := 0; {String} {>>> Localization Strings <<<} - 'i': Result := 1; {intS32} - 'f': Result := 2; {Float} - 'b': Result := 3; {Boolean} - end; - end; -end; - -function wbFLSTLNAMIsSorted(const aContainer: IwbContainer): Boolean; -var - rEDID : IwbRecord; - s : string; -const - OrderedList = 'OrderedList'; -begin - Result := False; {>>> Should not be sorted according to Arthmoor and JustinOther <<<} - rEDID := aContainer.RecordBySignature[EDID]; - if Assigned(rEDID) then begin - s := rEDID.Value; - if Length(s) > Length(OrderedList) then - Delete(s, 1, Length(s)-Length(OrderedList)); - if SameText(s, OrderedList) then - Result := False; - end; -end; - -function wbPerkDATADecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rPRKE: IwbRecord; - eType: IwbElement; -begin - Result := 0; - rPRKE := aElement.Container.RecordBySignature[PRKE]; - if Assigned(rPRKE) then begin - eType := rPRKE.ElementByName['Type']; - if Assigned(eType) then begin - Result := eType.NativeValue; - end; - end; -end; - -function wbEPFDDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['EPFT']; - if Result = 2 then - case Integer(Container.ElementNativeValues['..\DATA\Entry Point\Function']) of - 5, 12, 13, 14: Result := 8; - end; -end; - -function wbSPGDFormatDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - MainRecord: IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then - Exit; - if not Supports(aElement.Container, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Version < 44 then - Result := 1; -end; - - -{>>> For VMAD <<<} -function wbScriptObjFormatDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - ObjFormat: Integer; - Container: IwbContainer; -begin - Result := 0; - - Container := aElement.Container; - while Assigned(Container) and (Container.ElementType <> etSubRecord) do - Container := Container.Container; - - if not Assigned(Container) then Exit; - - ObjFormat := Container.ElementNativeValues['Object Format']; - - if ObjFormat = 1 then - Result := 1; -end; - -{>>> For VMAD <<<} -function wbScriptPropertyDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - case Integer(Container.ElementNativeValues['Type']) of - 1: Result := 1; - 2: Result := 2; - 3: Result := 3; - 4: Result := 4; - 5: Result := 5; - 11: Result := 6; - 12: Result := 7; - 13: Result := 8; - 14: Result := 9; - 15: Result := 10; - end; -end; - -procedure wbScriptPropertyTypeAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainerElementRef; -begin - if aOldValue <> aNewValue then - if Supports(aElement.Container, IwbContainerElementRef, Container) then - Container.ElementByName['Value'].SetToDefault; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentExistsDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - MainRecord : IwbMainRecord; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.ElementType <> etMainRecord) do - Container := Container.Container; - if not Assigned(Container) then Exit; - - Supports(Container, IwbMainRecord, MainRecord); - if MainRecord.Signature = INFO then - Result := 1 - else if MainRecord.Signature = PACK then - Result := 2 - else if MainRecord.Signature = PERK then - Result := 3 - else if MainRecord.Signature = QUST then - Result := 4 - else if MainRecord.Signature = SCEN then - Result := 5; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsQuestCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - Result := Integer(Container.ElementNativeValues['fragmentCount']); -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsInfoCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 2 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; - for i := 3 to 7 do begin - if (F and 1) = 1 then begin - Inc(Result); - if Assigned(wbProgressCallback) then - wbProgressCallback('==='+aElement.Name+' ['+Container.Name+':'+Container.Path+'] = unknown info VMAD flag bit '+IntToStr(i)); - end; - F := F shr 1; - end; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsSceneCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 2 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; - for i := 3 to 7 do begin - if (F and 1) = 1 then begin - Inc(Result); - if Assigned(wbProgressCallback) then - wbProgressCallback('==='+aElement.Name+' ['+Container.Name+':'+Container.Path+'] = unknown scene VMAD flag bit '+IntToStr(i)); - end; - F := F shr 1; - end; -end; - -{>>> For VMAD <<<} -function wbScriptFragmentsPackCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbContainer; - F : Integer; - i : Integer; -begin - Result := 0; - if aElement.ElementType = etValue then - Container := aElement.Container - else - Container := aElement as IwbContainer; - if not Assigned(Container) then Exit; - while Assigned(Container) and (Container.Name <> 'Script Fragments') do - Container := Container.Container; - if not Assigned(Container) then Exit; - - F := Container.ElementByName['Flags'].NativeValue; - for i := 0 to 7 do begin - if (F and 1) = 1 then - Inc(Result); - F := F shr 1; - end; -end; - -function wbBOOKTeachesDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; - i: Int64; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - i := Container.ElementByName['Flags'].NativeValue; - if i and $00000004 <> 0 then Result := 1; -end; - - -type - TCTDAFunctionParamType = ( - ptNone, - ptInteger, - ptFloat, - ptVariableName, //Integer - ptSex, //Enum: Male, Female - ptActorValue, //Enum: wbActorValue - ptCrimeType, //?? Enum - ptAxis, //?? Char - ptQuestStage, //?? Integer - ptMiscStat, //?? Enum - ptAlignment, //?? Enum - ptEquipType, //?? Enum - ptFormType, //?? Enum - ptCriticalStage, //?? Enum - ptObjectReference, //REFR, ACHR - ptInventoryObject, //ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, ARMA, LIGH, LVLI, COBJ - ptActor, //ACHR - ptVoiceType, //VTYP - ptIdleForm, //IDLE - ptFormList, //FLST - ptQuest, //QUST - ptFaction, //FACT - ptCell, //CELL - ptClass, //CLAS - ptRace, //RACE - ptActorBase, //NPC_ - ptGlobal, //GLOB - ptWeather, //WTHR - ptPackage, //PACK - ptEncounterZone, //ECZN - ptPerk, //PERK - ptOwner, //FACT, NPC_ - ptFurniture, //FURN - ptMagicItem, //SPEL - ptMagicEffect, //MGEF - ptWorldspace, //WRLD - ptVATSValueFunction, - ptVATSValueParam, - ptReferencableObject, - ptRegion, //REGN - ptKeyword, //KYWD - ptAdvanceAction, // ?? Enum - ptCastingSource, // ?? Enum - ptShout, //SHOU - ptLocation, //LCTN - ptRefType, //LCRT - ptAlias, // index into QUST quest aliases - ptPackdata, // index into PACK package data inputs - ptAssociationType, // ASTP - ptFurnitureAnim, // enum - ptFurnitureEntry, // flags - ptScene, // SCEN - ptWardState, // enum - ptEvent, // Struct - ptEventData // LCTN, KYWD or FLST - ); - - PCTDAFunction = ^TCTDAFunction; - TCTDAFunction = record - Index: Integer; - Name: string; - ParamType1: TCTDAFunctionParamType; - ParamType2: TCTDAFunctionParamType; - ParamType3: TCTDAFunctionParamType; - end; - -const - {>> N means New, V means verified that the name has not changed <<<} - wbCTDAFunctions : array[0..399] of TCTDAFunction = ( -{N} (Index: 0; Name: 'GetWantBlocking'), -{V} (Index: 1; Name: 'GetDistance'; ParamType1: ptObjectReference), -{V} (Index: 5; Name: 'GetLocked'), -{V} (Index: 6; Name: 'GetPos'; ParamType1: ptAxis), -{V} (Index: 8; Name: 'GetAngle'; ParamType1: ptAxis), -{V} (Index: 10; Name: 'GetStartingPos'; ParamType1: ptAxis), -{V} (Index: 11; Name: 'GetStartingAngle'; ParamType1: ptAxis), -{V} (Index: 12; Name: 'GetSecondsPassed'), -{V} (Index: 14; Name: 'GetActorValue'; ParamType1: ptActorValue), -{V} (Index: 18; Name: 'GetCurrentTime'), -{V} (Index: 24; Name: 'GetScale'), -{V} (Index: 25; Name: 'IsMoving'), -{V} (Index: 26; Name: 'IsTurning'), -{V} (Index: 27; Name: 'GetLineOfSight'; ParamType1: ptObjectReference), -{V} (Index: 32; Name: 'GetInSameCell'; ParamType1: ptObjectReference), -{V} (Index: 35; Name: 'GetDisabled'), -{V} (Index: 36; Name: 'MenuMode'; ParamType1: ptInteger), // was ptMenuMode -{V} (Index: 39; Name: 'GetDisease'), -{V} (Index: 41; Name: 'GetClothingValue'), -{V} (Index: 42; Name: 'SameFaction'; ParamType1: ptActor), -{V} (Index: 43; Name: 'SameRace'; ParamType1: ptActor), -{V} (Index: 44; Name: 'SameSex'; ParamType1: ptActor), -{V} (Index: 45; Name: 'GetDetected'; ParamType1: ptActor), -{V} (Index: 46; Name: 'GetDead'), -{V} (Index: 47; Name: 'GetItemCount'; ParamType1: ptInventoryObject), -{V} (Index: 48; Name: 'GetGold'), -{V} (Index: 49; Name: 'GetSleeping'), -{V} (Index: 50; Name: 'GetTalkedToPC'), -{V} (Index: 53; Name: 'GetScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), -{V} (Index: 56; Name: 'GetQuestRunning'; ParamType1: ptQuest), -{V} (Index: 58; Name: 'GetStage'; ParamType1: ptQuest), -{V} (Index: 59; Name: 'GetStageDone'; ParamType1: ptQuest; ParamType2: ptQuestStage), -{V} (Index: 60; Name: 'GetFactionRankDifference'; ParamType1: ptFaction; ParamType2: ptActor), -{V} (Index: 61; Name: 'GetAlarmed'), -{V} (Index: 62; Name: 'IsRaining'), -{V} (Index: 63; Name: 'GetAttacked'), -{V} (Index: 64; Name: 'GetIsCreature'), -{V} (Index: 65; Name: 'GetLockLevel'), -{V} (Index: 66; Name: 'GetShouldAttack'; ParamType1: ptActor), -{V} (Index: 67; Name: 'GetInCell'; ParamType1: ptCell), -{V} (Index: 68; Name: 'GetIsClass'; ParamType1: ptClass), -{V} (Index: 69; Name: 'GetIsRace'; ParamType1: ptRace), -{V} (Index: 70; Name: 'GetIsSex'; ParamType1: ptSex), -{V} (Index: 71; Name: 'GetInFaction'; ParamType1: ptFaction), -{V} (Index: 72; Name: 'GetIsID'; ParamType1: ptReferencableObject), -{V} (Index: 73; Name: 'GetFactionRank'; ParamType1: ptFaction), -{V} (Index: 74; Name: 'GetGlobalValue'; ParamType1: ptGlobal), -{V} (Index: 75; Name: 'IsSnowing'), -{V} (Index: 77; Name: 'GetRandomPercent'), -{V} (Index: 79; Name: 'GetQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), -{V} (Index: 80; Name: 'GetLevel'), -{N} (Index: 81; Name: 'IsRotating'), -{V} (Index: 84; Name: 'GetDeadCount'; ParamType1: ptActorBase), -{V} (Index: 91; Name: 'GetIsAlerted'), -{V} (Index: 98; Name: 'GetPlayerControlsDisabled'; ParamType1: ptInteger; ParamType2: ptInteger), -{V} (Index: 99; Name: 'GetHeadingAngle'; ParamType1: ptObjectReference), -{N} (Index: 101; Name: 'IsWeaponMagicOut'), -{V} (Index: 102; Name: 'IsTorchOut'), -{V} (Index: 103; Name: 'IsShieldOut'), -{V} (Index: 106; Name: 'IsFacingUp'), -{V} (Index: 107; Name: 'GetKnockedState'), -{V} (Index: 108; Name: 'GetWeaponAnimType'), -{V} (Index: 109; Name: 'IsWeaponSkillType'; ParamType1: ptActorValue), -{V} (Index: 110; Name: 'GetCurrentAIPackage'), -{V} (Index: 111; Name: 'IsWaiting'), -{V} (Index: 112; Name: 'IsIdlePlaying'), -{N} (Index: 116; Name: 'IsIntimidatebyPlayer'), -{N} (Index: 117; Name: 'IsPlayerInRegion'; ParamType1: ptRegion), -{V} (Index: 118; Name: 'GetActorAggroRadiusViolated'), -{V} (Index: 122; Name: 'GetCrime'; ParamType1: ptActor; ParamType2: ptCrimeType), -{V} (Index: 123; Name: 'IsGreetingPlayer'), -{V} (Index: 125; Name: 'IsGuard'), -{V} (Index: 127; Name: 'HasBeenEaten'), -{V} (Index: 128; Name: 'GetStaminaPercentage'), -{V} (Index: 129; Name: 'GetPCIsClass'; ParamType1: ptClass), -{V} (Index: 130; Name: 'GetPCIsRace'; ParamType1: ptRace), -{V} (Index: 131; Name: 'GetPCIsSex'; ParamType1: ptSex), -{V} (Index: 132; Name: 'GetPCInFaction'; ParamType1: ptFaction), -{V} (Index: 133; Name: 'SameFactionAsPC'), -{V} (Index: 134; Name: 'SameRaceAsPC'), -{V} (Index: 135; Name: 'SameSexAsPC'), -{V} (Index: 136; Name: 'GetIsReference'; ParamType1: ptObjectReference), -{V} (Index: 141; Name: 'IsTalking'), -{V} (Index: 142; Name: 'GetWalkSpeed'), -{V} (Index: 143; Name: 'GetCurrentAIProcedure'), -{V} (Index: 144; Name: 'GetTrespassWarningLevel'), -{V} (Index: 145; Name: 'IsTrespassing'), -{V} (Index: 146; Name: 'IsInMyOwnedCell'), -{V} (Index: 147; Name: 'GetWindSpeed'), -{V} (Index: 148; Name: 'GetCurrentWeatherPercent'), -{V} (Index: 149; Name: 'GetIsCurrentWeather'; ParamType1: ptWeather), -{V} (Index: 150; Name: 'IsContinuingPackagePCNear'), -{N} (Index: 152; Name: 'GetIsCrimeFaction'; ParamType1: ptFaction), -{V} (Index: 153; Name: 'CanHaveFlames'), -{V} (Index: 154; Name: 'HasFlames'), -{V} (Index: 157; Name: 'GetOpenState'), -{V} (Index: 159; Name: 'GetSitting'), -{V} (Index: 161; Name: 'GetIsCurrentPackage'; ParamType1: ptPackage), -{V} (Index: 162; Name: 'IsCurrentFurnitureRef'; ParamType1: ptObjectReference), -{V} (Index: 163; Name: 'IsCurrentFurnitureObj'; ParamType1: ptFurniture), -{V} (Index: 170; Name: 'GetDayOfWeek'), -{V} (Index: 172; Name: 'GetTalkedToPCParam'; ParamType1: ptActor), -{V} (Index: 175; Name: 'IsPCSleeping'), -{V} (Index: 176; Name: 'IsPCAMurderer'), -{N} (Index: 180; Name: 'HasSameEditorLocAsRef'; ParamType1: ptObjectReference; ParamType2: ptKeyword), -{N} (Index: 181; Name: 'HasSameEditorLocAsRefAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), -{V} (Index: 182; Name: 'GetEquipped'; ParamType1: ptInventoryObject), -{V} (Index: 185; Name: 'IsSwimming'), -{V} (Index: 190; Name: 'GetAmountSoldStolen'), -{V} (Index: 192; Name: 'GetIgnoreCrime'), -{V} (Index: 193; Name: 'GetPCExpelled'; ParamType1: ptFaction), -{V} (Index: 195; Name: 'GetPCFactionMurder'; ParamType1: ptFaction), -{V} (Index: 197; Name: 'GetPCEnemyofFaction'; ParamType1: ptFaction), -{V} (Index: 199; Name: 'GetPCFactionAttack'; ParamType1: ptFaction), -{V} (Index: 203; Name: 'GetDestroyed'), -{V} (Index: 214; Name: 'HasMagicEffect'; ParamType1: ptMagicEffect), -{V} (Index: 215; Name: 'GetDefaultOpen'), -{V} (Index: 219; Name: 'GetAnimAction'), -{V} (Index: 223; Name: 'IsSpellTarget'; ParamType1: ptMagicItem), -{V} (Index: 224; Name: 'GetVATSMode'), -{V} (Index: 225; Name: 'GetPersuasionNumber'), -{V} (Index: 226; Name: 'GetVampireFeed'), -{V} (Index: 227; Name: 'GetCannibal'), -{V} (Index: 228; Name: 'GetIsClassDefault'; ParamType1: ptClass), -{V} (Index: 229; Name: 'GetClassDefaultMatch'), -{V} (Index: 230; Name: 'GetInCellParam'; ParamType1: ptCell; ParamType2: ptObjectReference), -{V} (Index: 235; Name: 'GetVatsTargetHeight'), -{V} (Index: 237; Name: 'GetIsGhost'), -{V} (Index: 242; Name: 'GetUnconscious'), -{V} (Index: 244; Name: 'GetRestrained'), -{V} (Index: 246; Name: 'GetIsUsedItem'; ParamType1: ptReferencableObject), -{V} (Index: 247; Name: 'GetIsUsedItemType'; ParamType1: ptFormType), -{N} (Index: 248; Name: 'IsScenePlaying'; ParamType1: ptScene), -{N} (Index: 249; Name: 'IsInDialogueWithPlayer'), -{N} (Index: 250; Name: 'GetLocationCleared'; ParamType1: ptLocation), -{V} (Index: 254; Name: 'GetIsPlayableRace'), -{V} (Index: 255; Name: 'GetOffersServicesNow'), -{N} (Index: 258; Name: 'HasAssociationType'; ParamType1: ptActor; ParamType2: ptAssociationType), -{N} (Index: 259; Name: 'HasFamilyRelationship'; ParamType1: ptActor), -{N} (Index: 261; Name: 'HasParentRelationship'; ParamType1: ptActor), -{N} (Index: 262; Name: 'IsWarningAbout'; ParamType1: ptFormList), -{V} (Index: 263; Name: 'IsWeaponOut'), -{N} (Index: 264; Name: 'HasSpell'; ParamType1: ptMagicItem), -{V} (Index: 265; Name: 'IsTimePassing'), -{V} (Index: 266; Name: 'IsPleasant'), -{V} (Index: 267; Name: 'IsCloudy'), -{N} (Index: 274; Name: 'IsSmallBump'), -{V} (Index: 277; Name: 'GetBaseActorValue'; ParamType1: ptActorValue), -{V} (Index: 278; Name: 'IsOwner'; ParamType1: ptOwner), -{V} (Index: 280; Name: 'IsCellOwner'; ParamType1: ptCell; ParamType2: ptOwner), -{V} (Index: 282; Name: 'IsHorseStolen'), -{V} (Index: 285; Name: 'IsLeftUp'), -{V} (Index: 286; Name: 'IsSneaking'), -{V} (Index: 287; Name: 'IsRunning'), -{V} (Index: 288; Name: 'GetFriendHit'), -{V} (Index: 289; Name: 'IsInCombat'; ParamType1: ptInteger), -{V} (Index: 300; Name: 'IsInInterior'), -{V} (Index: 304; Name: 'IsWaterObject'), -{N} (Index: 305; Name: 'GetPlayerAction'), -{V} (Index: 306; Name: 'IsActorUsingATorch'), -{V} (Index: 309; Name: 'IsXBox'), -{V} (Index: 310; Name: 'GetInWorldspace'; ParamType1: ptWorldSpace), -{V} (Index: 312; Name: 'GetPCMiscStat'; ParamType1: ptMiscStat), -{N} (Index: 313; Name: 'GetPairedAnimation'), -{V} (Index: 314; Name: 'IsActorAVictim'), -{V} (Index: 315; Name: 'GetTotalPersuasionNumber'), -{V} (Index: 318; Name: 'GetIdleDoneOnce'), -{V} (Index: 320; Name: 'GetNoRumors'), -{N} (Index: 323; Name: 'GetCombatState'), -{N} (Index: 325; Name: 'GetWithinPackageLocation'; ParamType1: ptPackdata), -{V} (Index: 327; Name: 'IsRidingMount'), -{N} (Index: 329; Name: 'IsFleeing'), -{V} (Index: 332; Name: 'IsInDangerousWater'), -{V} (Index: 338; Name: 'GetIgnoreFriendlyHits'), -{V} (Index: 339; Name: 'IsPlayersLastRiddenMount'), -{V} (Index: 353; Name: 'IsActor'), -{V} (Index: 354; Name: 'IsEssential'), -{V} (Index: 358; Name: 'IsPlayerMovingIntoNewSpace'), -{N} (Index: 359; Name: 'GetInCurrentLoc'; ParamType1: ptLocation), -{N} (Index: 360; Name: 'GetInCurrentLocAlias'; ParamType1: ptAlias), -{V} (Index: 361; Name: 'GetTimeDead'), -{N} (Index: 362; Name: 'HasLinkedRef'; ParamType1: ptKeyword), -{V} (Index: 365; Name: 'IsChild'), -{N} (Index: 366; Name: 'GetStolenItemValueNoCrime'; ParamType1: ptFaction), -{V} (Index: 367; Name: 'GetLastPlayerAction'), -{V} (Index: 368; Name: 'IsPlayerActionActive'; ParamType1: ptInteger), // was ptPlayerAction -{V} (Index: 370; Name: 'IsTalkingActivatorActor'; ParamType1: ptActor), -{V} (Index: 372; Name: 'IsInList'; ParamType1: ptFormList), -{N} (Index: 373; Name: 'GetStolenItemValue'; ParamType1: ptFaction), -{N} (Index: 375; Name: 'GetCrimeGoldViolent'), -{N} (Index: 376; Name: 'GetCrimeGoldNonviolent'), -{N} (Index: 378; Name: 'HasShout'; ParamType1: ptShout), -{V} (Index: 381; Name: 'GetHasNote'; ParamType1: ptInteger), // was ptNote -{V} (Index: 390; Name: 'GetHitLocation'), -{V} (Index: 391; Name: 'IsPC1stPerson'), -{V} (Index: 396; Name: 'GetCauseofDeath'), -{V} (Index: 397; Name: 'IsLimbGone'; ParamType1: ptInteger), // was ptBodyLocation -{V} (Index: 398; Name: 'IsWeaponInList'; ParamType1: ptFormList), -{N} (Index: 402; Name: 'IsBribedbyPlayer'), -{V} (Index: 403; Name: 'GetRelationshipRank'; ParamType1: ptObjectReference), -{V} (Index: 407; Name: 'GetVATSValue'; ParamType1: ptVATSValueFunction; ParamType2: ptVATSValueParam), -{V} (Index: 408; Name: 'IsKiller'; ParamType1: ptActor), -{V} (Index: 409; Name: 'IsKillerObject'; ParamType1: ptFormList), -{V} (Index: 410; Name: 'GetFactionCombatReaction'; ParamType1: ptFaction; ParamType2: ptFaction), -{V} (Index: 414; Name: 'Exists'; ParamType1: ptObjectReference), -{V} (Index: 415; Name: 'GetGroupMemberCount'), -{V} (Index: 416; Name: 'GetGroupTargetCount'), -{V} (Index: 426; Name: 'GetIsVoiceType'; ParamType1: ptVoiceType), -{V} (Index: 427; Name: 'GetPlantedExplosive'), -{N} (Index: 429; Name: 'IsScenePackageRunning'), -{V} (Index: 430; Name: 'GetHealthPercentage'), -{V} (Index: 432; Name: 'GetIsObjectType'; ParamType1: ptFormType), -{V} (Index: 434; Name: 'GetDialogueEmotion'), -{V} (Index: 435; Name: 'GetDialogueEmotionValue'), -{V} (Index: 437; Name: 'GetIsCreatureType'; ParamType1: ptInteger), -{N} (Index: 444; Name: 'GetInCurrentLocFormList'; ParamType1: ptFormList), -{V} (Index: 445; Name: 'GetInZone'; ParamType1: ptEncounterZone), -{N} (Index: 446; Name: 'GetVelocity'; ParamType1: ptAxis), -{N} (Index: 447; Name: 'GetGraphVariableFloat'; ParamType1: ptVariableName), -{V} (Index: 448; Name: 'HasPerk'; ParamType1: ptPerk; ParamType2: ptInteger{Alt?}), -{V} (Index: 449; Name: 'GetFactionRelation'; ParamType1: ptActor), -{V} (Index: 450; Name: 'IsLastIdlePlayed'; ParamType1: ptIdleForm), -{V} (Index: 453; Name: 'GetPlayerTeammate'), -{V} (Index: 454; Name: 'GetPlayerTeammateCount'), -{V} (Index: 458; Name: 'GetActorCrimePlayerEnemy'), -{V} (Index: 459; Name: 'GetCrimeGold'), -{V} (Index: 463; Name: 'IsPlayerGrabbedRef'; ParamType1: ptObjectReference), -{N} (Index: 465; Name: 'GetKeywordItemCount'; ParamType1: ptKeyword), -{V} (Index: 470; Name: 'GetDestructionStage'), -{V} (Index: 473; Name: 'GetIsAlignment'; ParamType1: ptAlignment), -{N} (Index: 476; Name: 'IsProtected'), -{V} (Index: 477; Name: 'GetThreatRatio'; ParamType1: ptActor), -{V} (Index: 479; Name: 'GetIsUsedItemEquipType'; ParamType1: ptEquipType), -{N} (Index: 487; Name: 'IsCarryable'), -{V} (Index: 488; Name: 'GetConcussed'), -{V} (Index: 491; Name: 'GetMapMarkerVisible'), -{N} (Index: 493; Name: 'PlayerKnows'; ParamType1: ptMagicEffect), -{V} (Index: 494; Name: 'GetPermanentActorValue'; ParamType1: ptActorValue), -{V} (Index: 495; Name: 'GetKillingBlowLimb'), -{N} (Index: 497; Name: 'CanPayCrimeGold'), -{N} (Index: 499; Name: 'GetDaysInJail'), -{N} (Index: 500; Name: 'EPAlchemyGetMakingPoison'), -{N} (Index: 501; Name: 'EPAlchemyEffectHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 503; Name: 'GetAllowWorldInteractions'), -{V} (Index: 508; Name: 'GetLastHitCritical'), -{N} (Index: 513; Name: 'IsCombatTarget'; ParamType1: ptActor), -{V} (Index: 515; Name: 'GetVATSRightAreaFree'; ParamType1: ptObjectReference), -{V} (Index: 516; Name: 'GetVATSLeftAreaFree'; ParamType1: ptObjectReference), -{V} (Index: 517; Name: 'GetVATSBackAreaFree'; ParamType1: ptObjectReference), -{V} (Index: 518; Name: 'GetVATSFrontAreaFree'; ParamType1: ptObjectReference), -{N} (Index: 519; Name: 'GetLockIsBroken'), -{N} (Index: 520; Name: 'IsPS3'), -{N} (Index: 521; Name: 'IsWin32'), -{V} (Index: 522; Name: 'GetVATSRightTargetVisible'; ParamType1: ptObjectReference), -{V} (Index: 523; Name: 'GetVATSLeftTargetVisible'; ParamType1: ptObjectReference), -{V} (Index: 524; Name: 'GetVATSBackTargetVisible'; ParamType1: ptObjectReference), -{V} (Index: 525; Name: 'GetVATSFrontTargetVisible'; ParamType1: ptObjectReference), -{V} (Index: 528; Name: 'IsInCriticalStage'; ParamType1: ptCriticalStage), -{N} (Index: 530; Name: 'GetXPForNextLevel'), -{N} (Index: 533; Name: 'GetInfamy'), -{N} (Index: 534; Name: 'GetInfamyViolent'), -{N} (Index: 535; Name: 'GetInfamyNonViolent'), -{V} (Index: 543; Name: 'GetQuestCompleted'; ParamType1: ptQuest), -{V} (Index: 547; Name: 'IsGoreDisabled'), -{N} (Index: 550; Name: 'IsSceneActionComplete'; ParamType1: ptScene; ParamType2: ptInteger), -{V} (Index: 552; Name: 'GetSpellUsageNum'; ParamType1: ptMagicItem), -{N} (Index: 554; Name: 'GetActorsInHigh'), -{V} (Index: 555; Name: 'HasLoaded3D'), -{N} (Index: 560; Name: 'HasKeyword'; ParamType1: ptKeyword), -{N} (Index: 561; Name: 'HasRefType'; ParamType1: ptRefType), -{N} (Index: 562; Name: 'LocationHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 563; Name: 'LocationHasRefType'; ParamType1: ptRefType), -{N} (Index: 565; Name: 'GetIsEditorLocation'; ParamType1: ptLocation), -{N} (Index: 566; Name: 'GetIsAliasRef'; ParamType1: ptAlias), -{N} (Index: 567; Name: 'GetIsEditorLocAlias'; ParamType1: ptAlias), -{N} (Index: 568; Name: 'IsSprinting'), -{N} (Index: 569; Name: 'IsBlocking'), -{N} (Index: 570; Name: 'HasEquippedSpell'; ParamType1: ptCastingSource), -{N} (Index: 571; Name: 'GetCurrentCastingType'; ParamType1: ptCastingSource), -{N} (Index: 572; Name: 'GetCurrentDeliveryType'; ParamType1: ptCastingSource), -{N} (Index: 574; Name: 'GetAttackState'), -{N} (Index: 576; Name: 'GetEventData'; ParamType1: ptEvent; ParamType2: ptEventData; ParamType3: ptNone), -{N} (Index: 577; Name: 'IsCloserToAThanB'; ParamType1: ptObjectReference; ParamType2: ptObjectReference), -{N} (Index: 579; Name: 'GetEquippedShout'; ParamType1: ptShout), -{N} (Index: 580; Name: 'IsBleedingOut'), -{N} (Index: 584; Name: 'GetRelativeAngle'; ParamType1: ptObjectReference; ParamType2: ptAxis), -{N} (Index: 589; Name: 'GetMovementDirection'), -{N} (Index: 590; Name: 'IsInScene'), -{N} (Index: 591; Name: 'GetRefTypeDeadCount'; ParamType1: ptLocation; ParamType2: ptRefType), -{N} (Index: 592; Name: 'GetRefTypeAliveCount'; ParamType1: ptLocation; ParamType2: ptRefType), -{N} (Index: 594; Name: 'GetIsFlying'), -{N} (Index: 595; Name: 'IsCurrentSpell'; ParamType1: ptMagicItem; ParamType2: ptCastingSource), -{N} (Index: 596; Name: 'SpellHasKeyword'; ParamType1: ptCastingSource; ParamType2: ptKeyword), -{N} (Index: 597; Name: 'GetEquippedItemType'; ParamType1: ptCastingSource), -{N} (Index: 598; Name: 'GetLocationAliasCleared'; ParamType1: ptAlias), -{N} (Index: 600; Name: 'GetLocAliasRefTypeDeadCount'; ParamType1: ptAlias; ParamType2: ptRefType), -{N} (Index: 601; Name: 'GetLocAliasRefTypeAliveCount'; ParamType1: ptAlias; ParamType2: ptRefType), -{N} (Index: 602; Name: 'IsWardState'; ParamType1: ptWardState), -{N} (Index: 603; Name: 'IsInSameCurrentLocAsRef'; ParamType1: ptObjectReference; ParamType2: ptKeyword), -{N} (Index: 604; Name: 'IsInSameCurrentLocAsRefAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), -{N} (Index: 605; Name: 'LocAliasIsLocation'; ParamType1: ptAlias; ParamType2: ptLocation), -{N} (Index: 606; Name: 'GetKeywordDataForLocation'; ParamType1: ptLocation; ParamType2: ptKeyword), -{N} (Index: 608; Name: 'GetKeywordDataForAlias'; ParamType1: ptAlias; ParamType2: ptKeyword), -{N} (Index: 610; Name: 'LocAliasHasKeyword'; ParamType1: ptAlias; ParamType2: ptKeyword), -{N} (Index: 611; Name: 'IsNullPackageData'; ParamType1: ptPackdata), -{N} (Index: 612; Name: 'GetNumericPackageData'; ParamType1: ptInteger), -{N} (Index: 613; Name: 'IsFurnitureAnimType'; ParamType1: ptFurnitureAnim), -{N} (Index: 614; Name: 'IsFurnitureEntryType'; ParamType1: ptFurnitureEntry), -{N} (Index: 615; Name: 'GetHighestRelationshipRank'), -{N} (Index: 616; Name: 'GetLowestRelationshipRank'), -{N} (Index: 617; Name: 'HasAssociationTypeAny'; ParamType1: ptAssociationType), -{N} (Index: 618; Name: 'HasFamilyRelationshipAny'), -{N} (Index: 619; Name: 'GetPathingTargetOffset'; ParamType1: ptAxis), -{N} (Index: 620; Name: 'GetPathingTargetAngleOffset'; ParamType1: ptAxis), -{N} (Index: 621; Name: 'GetPathingTargetSpeed'), -{N} (Index: 622; Name: 'GetPathingTargetSpeedAngle'; ParamType1: ptAxis), -{N} (Index: 623; Name: 'GetMovementSpeed'), -{N} (Index: 624; Name: 'GetInContainer'; ParamType1: ptObjectReference), -{N} (Index: 625; Name: 'IsLocationLoaded'; ParamType1: ptLocation), -{N} (Index: 626; Name: 'IsLocAliasLoaded'; ParamType1: ptAlias), -{N} (Index: 627; Name: 'IsDualCasting'), -{N} (Index: 629; Name: 'GetVMQuestVariable'; ParamType1: ptQuest; ParamType2: ptVariableName), -{N} (Index: 630; Name: 'GetVMScriptVariable'; ParamType1: ptObjectReference; ParamType2: ptVariableName), -{N} (Index: 631; Name: 'IsEnteringInteractionQuick'), -{N} (Index: 632; Name: 'IsCasting'), -{N} (Index: 633; Name: 'GetFlyingState'), -{N} (Index: 635; Name: 'IsInFavorState'), -{N} (Index: 636; Name: 'HasTwoHandedWeaponEquipped'), -{N} (Index: 637; Name: 'IsExitingInstant'), -{N} (Index: 638; Name: 'IsInFriendStateWithPlayer'), -{N} (Index: 639; Name: 'GetWithinDistance'; ParamType1: ptObjectReference; ParamType2: ptFloat), -{N} (Index: 640; Name: 'GetActorValuePercent'; ParamType1: ptActorValue), -{N} (Index: 641; Name: 'IsUnique'), -{N} (Index: 642; Name: 'GetLastBumpDirection'), -{N} (Index: 644; Name: 'IsInFurnitureState'; ParamType1: ptFurnitureAnim), -{N} (Index: 645; Name: 'GetIsInjured'), -{N} (Index: 646; Name: 'GetIsCrashLandRequest'), -{N} (Index: 647; Name: 'GetIsHastyLandRequest'), -{N} (Index: 650; Name: 'IsLinkedTo'; ParamType1: ptObjectReference; ParamType2: ptKeyword), -{N} (Index: 651; Name: 'GetKeywordDataForCurrentLocation'; ParamType1: ptKeyword), -{N} (Index: 652; Name: 'GetInSharedCrimeFaction'; ParamType1: ptObjectReference), -{N} (Index: 654; Name: 'GetBribeSuccess'), -{N} (Index: 655; Name: 'GetIntimidateSuccess'), -{N} (Index: 656; Name: 'GetArrestedState'), -{N} (Index: 657; Name: 'GetArrestingActor'), -{N} (Index: 659; Name: 'EPTemperingItemIsEnchanted'), -{N} (Index: 660; Name: 'EPTemperingItemHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 664; Name: 'GetReplacedItemType'; ParamType1: ptCastingSource), -{N} (Index: 672; Name: 'IsAttacking'), -{N} (Index: 673; Name: 'IsPowerAttacking'), -{N} (Index: 674; Name: 'IsLastHostileActor'), -{N} (Index: 675; Name: 'GetGraphVariableInt'; ParamType1: ptVariableName), -{N} (Index: 676; Name: 'GetCurrentShoutVariation'), -{N} (Index: 678; Name: 'ShouldAttackKill'; ParamType1: ptActor), -{N} (Index: 680; Name: 'GetActivatorHeight'), -{N} (Index: 681; Name: 'EPMagic_IsAdvanceSkill'; ParamType1: ptActorValue), -{N} (Index: 682; Name: 'WornHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 683; Name: 'GetPathingCurrentSpeed'), -{N} (Index: 684; Name: 'GetPathingCurrentSpeedAngle'; ParamType1: ptAxis), -{N} (Index: 691; Name: 'EPModSkillUsage_AdvanceObjectHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 692; Name: 'EPModSkillUsage_IsAdvanceAction'; ParamType1: ptAdvanceAction), -{N} (Index: 693; Name: 'EPMagic_SpellHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 694; Name: 'GetNoBleedoutRecovery'), -{N} (Index: 696; Name: 'EPMagic_SpellHasSkill'; ParamType1: ptActorValue), -{N} (Index: 697; Name: 'IsAttackType'; ParamType1: ptKeyword), -{N} (Index: 698; Name: 'IsAllowedToFly'), -{N} (Index: 699; Name: 'HasMagicEffectKeyword'; ParamType1: ptKeyword), -{N} (Index: 700; Name: 'IsCommandedActor'), -{N} (Index: 701; Name: 'IsStaggered'), -{N} (Index: 702; Name: 'IsRecoiling'), -{N} (Index: 703; Name: 'IsExitingInteractionQuick'), -{N} (Index: 704; Name: 'IsPathing'), -{N} (Index: 705; Name: 'GetShouldHelp'; ParamType1: ptActor), -{N} (Index: 706; Name: 'HasBoundWeaponEquipped'; ParamType1: ptCastingSource), -{N} (Index: 707; Name: 'GetCombatTargetHasKeyword'; ParamType1: ptKeyword), -{N} (Index: 709; Name: 'GetCombatGroupMemberCount'), -{N} (Index: 710; Name: 'IsIgnoringCombat'), -{N} (Index: 711; Name: 'GetLightLevel'), -{N} (Index: 713; Name: 'SpellHasCastingPerk'; ParamType1: ptPerk), -{N} (Index: 714; Name: 'IsBeingRidden'), -{N} (Index: 715; Name: 'IsUndead'), -{N} (Index: 716; Name: 'GetRealHoursPassed'), -{N} (Index: 718; Name: 'IsUnlockedDoor'), -{N} (Index: 719; Name: 'IsHostileToActor'; ParamType1: ptActor), -{N} (Index: 720; Name: 'GetTargetHeight'; ParamType1: ptObjectReference), -{N} (Index: 721; Name: 'IsPoison'), -{N} (Index: 722; Name: 'WornApparelHasKeywordCount'; ParamType1: ptKeyword), -{N} (Index: 723; Name: 'GetItemHealthPercent'), -{N} (Index: 724; Name: 'EffectWasDualCast'), -{N} (Index: 725; Name: 'GetKnockedStateEnum'), -{N} (Index: 726; Name: 'DoesNotExist'), -{N} (Index: 730; Name: 'IsOnFlyingMount'), -{N} (Index: 731; Name: 'CanFlyHere'), -{N} (Index: 732; Name: 'IsFlyingMountPatrolQueud'), -{N} (Index: 733; Name: 'IsFlyingMountFastTravelling'), - - // Added by SKSE - (Index: 1024; Name: 'GetSKSEVersion'; ), - (Index: 1025; Name: 'GetSKSEVersionMinor'; ), - (Index: 1026; Name: 'GetSKSEVersionBeta'; ), - (Index: 1027; Name: 'GetSKSERelease'; ), - (Index: 1028; Name: 'ClearInvalidRegistrations'; ) - ); - -var - wbCTDAFunctionEditInfo: string; - -function wbCTDAParamDescFromIndex(aIndex: Integer): PCTDAFunction; -var - L, H, I, C: Integer; -begin - Result := nil; - - L := Low(wbCTDAFunctions); - H := High(wbCTDAFunctions); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(wbCTDAFunctions[I].Index, aIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - L := I; - Result := @wbCTDAFunctions[L]; - end; - end; - end; -end; - -function wbCTDACompValueDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container: IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - // "use global" flag - if Integer(Container.ElementByName['Type'].NativeValue) and $04 <> 0 then - Result := 1; -end; - -function wbCTDAParam1Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; - ParamFlag: Byte; - ParamType: TCTDAFunctionParamType; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - - if Assigned(Desc) then begin - ParamType := Desc.ParamType1; - ParamFlag := Container.ElementByName['Type'].NativeValue; - if ParamType in [ptObjectReference, ptActor, ptPackage] then begin - if ParamFlag and $02 > 0 then ParamType := ptAlias else {>>> 'use aliases' is set <<<} - if ParamFlag and $08 > 0 then ParamType := ptPackdata; {>>> 'use packdata' is set <<<} - end; - Result := Succ(Integer(ParamType)); - end; -end; - -function wbCTDAParam2Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Desc: PCTDAFunction; - Container: IwbContainer; - ParamFlag: Byte; - ParamType: TCTDAFunctionParamType; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Desc := wbCTDAParamDescFromIndex(Container.ElementByName['Function'].NativeValue); - - if Assigned(Desc) then begin - ParamType := Desc.ParamType2; - ParamFlag := Container.ElementByName['Type'].NativeValue; - if ParamType in [ptObjectReference, ptActor, ptPackage] then begin - if ParamFlag and $02 > 0 then ParamType := ptAlias else {>>> 'use aliases' is set <<<} - if ParamFlag and $08 > 0 then ParamType := ptPackdata; {>>> 'use packdata' is set <<<} - end; - Result := Succ(Integer(ParamType)); - end; -end; - -function wbCTDAParam2VATSValueParamDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Result := Container.ElementByName['Parameter #1'].NativeValue; -end; - -function wbCTDAFunctionToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; -var - Desc : PCTDAFunction; - i : Integer; -begin - Result := ''; - case aType of - ctToStr, ctToEditValue: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := Desc.Name - else if aType = ctToEditValue then - Result := IntToStr(aInt) - else - Result := ''; - end; - ctToSortKey: Result := IntToHex(aInt, 8); - ctCheck: begin - Desc := wbCTDAParamDescFromIndex(aInt); - if Assigned(Desc) then - Result := '' - else - Result := ''; - end; - ctEditType: - Result := 'ComboBox'; - ctEditInfo: begin - Result := wbCTDAFunctionEditInfo; - if Result = '' then begin - with TStringList.Create do try - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - Add(wbCTDAFunctions[i].Name); - Sort; - Result := CommaText; - finally - Free; - end; - wbCTDAFunctionEditInfo := Result; - end; - end; - end; -end; - -function wbCTDAFunctionToInt(const aString: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - for i := Low(wbCTDAFunctions) to High(wbCTDAFunctions) do - with wbCTDAFunctions[i] do - if SameText(Name, aString) then begin - Result := Index; - Exit; - end; - Result := StrToInt64(aString); -end; - -function wbNeverShow(const aElement: IwbElement): Boolean; -begin - Result := wbHideNeverShow; -end; - -function GetREGNType(aElement: IwbElement): Integer; -var - Container: IwbContainerElementRef; -begin - Result := -1; - if not Assigned(aElement) then - Exit; - while aElement.Name <> 'Region Data Entry' do begin - aElement := aElement.Container; - if not Assigned(aElement) then - Exit; - end; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - Result := Container.ElementNativeValues['RDAT\Type']; -end; - -function wbREGNObjectsDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 2; -end; - -function wbREGNWeatherDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 3; -end; - -function wbREGNMapDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 4; -end; - -function wbREGNLandDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 5; -end; - -function wbREGNGrassDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 6; -end; - -function wbREGNSoundDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 7; -end; - -function wbREGNImposterDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetREGNType(aElement) <> 8; -end; - -function wbMESGTNAMDontShow(const aElement: IwbElement): Boolean; -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - Result := False; - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if Integer(Container.ElementNativeValues['DNAM']) and 1 <> 0 then - Result := True; -end; - -function wbEPFDDontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [1..3]) then - Result := True; -end; - -function wbTES4ONAMDontShow(const aElement: IwbElement): Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := False; - if not Assigned(aElement) then - Exit; - MainRecord := aElement.ContainingMainRecord; - if not Assigned(MainRecord) then - Exit; - if not MainRecord.IsESM then - Result := True; -end; - -function wbEPF2DontShow(const aElement: IwbElement): Boolean; -var - Container: IwbContainerElementRef; -begin - Result := False; - if aElement.Name <> 'Entry Point Function Parameters' then - Exit; - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - if not (Integer(Container.ElementNativeValues['EPFT']) in [4]) then - Result := True; -end; - -procedure wbRemoveOFST(const aElement: IwbElement); -var - Container: IwbContainer; - rOFST: IwbRecord; -begin - if not wbRemoveOffsetData then - Exit; - - if Supports(aElement, IwbContainer, Container) then begin - if wbBeginInternalEdit then try - Container.RemoveElement(OFST); - finally - wbEndInternalEdit; - end else begin - rOFST := Container.RecordBySignature[OFST]; - if Assigned(rOFST) then - Container.RemoveElement(rOFST); - end; - end; -end; - -procedure wbWRLDAfterLoad(const aElement: IwbElement); - function OutOfRange(aValue: Integer; aRange: Integer = 256): Boolean; - begin - Result := (aValue < -aRange) or (aValue > aRange); - end; -var - MainRecord: IwbMainRecord; - Container: IwbContainer; -begin - wbRemoveOFST(aElement); - - if wbBeginInternalEdit then try - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - // not used in Skyrim - if MainRecord.ElementExists['Unused RNAM'] then - MainRecord.RemoveElement('Unused RNAM'); - - // used in SSE but remove from the game master to speed up worldspace browsing since it is huge - // and the game master is never saved anyway - if IsSSE and (MainRecord._File.LoadOrder = 0) then - MainRecord.RemoveElement('Large References'); - - // large values in object bounds cause stutter and performance issues in game (reported by Arthmoor) - // CK can occasionally set them wrong, so make a warning - if Supports(MainRecord.ElementByName['Object Bounds'], IwbContainer, Container) then - if OutOfRange(StrToIntDef(Container.ElementEditValues['NAM0\X'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM0\Y'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM9\X'], 0)) or - OutOfRange(StrToIntDef(Container.ElementEditValues['NAM9\Y'], 0)) - then - wbProgressCallback(''); - - finally - wbEndInternalEdit; - end; -end; - -procedure wbDOBJObjectsAfterLoad(const aElement: IwbElement); -var - ObjectsContainer : IwbContainerElementRef; - i : Integer; - ObjectContainer : IwbContainerElementRef; -begin - wbRemoveOFST(aElement); - - if wbBeginInternalEdit then try - - if not Supports(aElement, IwbContainerElementRef, ObjectsContainer) then - Exit; - - for i := Pred(ObjectsContainer.ElementCount) downto 0 do - if Supports(ObjectsContainer.Elements[i], IwbContainerElementRef, ObjectContainer) then - if ObjectContainer.ElementNativeValues['Use'] = 0 then - ObjectsContainer.RemoveElement(i, True); - finally - wbEndInternalEdit; - end; -end; - -function wbActorTemplateUseTraits(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000001) <> 0; - end; -end; - -function wbActorTemplateUseStats(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000002) <> 0; - end; -end; - -function wbActorAutoCalcDontShow(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseStatsAutoCalc(const aElement: IwbElement): Boolean; -begin - Result := wbActorTemplateUseStats(aElement) or wbActorAutoCalcDontShow(aElement); -end; - -function wbActorTemplateUseFactions(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000004) <> 0; - end; -end; - -function wbActorTemplateUseActorEffectList(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000008) <> 0; - end; -end; - -function wbActorTemplateUseAIData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000010) <> 0; - end; -end; - -function wbActorTemplateUseAIPackages(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000020) <> 0; - end; -end; - -function wbActorTemplateUseModelAnimation(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000040) <> 0; - end; -end; - -function wbActorTemplateUseBaseData(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000080) <> 0; - end; -end; - -function wbActorTemplateUseInventory(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000100) <> 0; - end; -end; - -function wbActorTemplateUseScript(const aElement: IwbElement): Boolean; -var - Element : IwbElement; - MainRecord : IwbMainRecord; - i : Int64; -begin - Result := False; - Element := aElement; - MainRecord := nil; - while Assigned(Element) and not Supports(Element, IwbMainRecord, MainRecord) do - Element := Element.Container; - if Assigned(MainRecord) then begin - i := MainRecord.ElementNativeValues['ACBS\Template Flags']; - Result := (i and $00000200) <> 0; - end; -end; - -procedure wbRemoveEmptyKWDA(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Assigned(Container.ElementBySignature['KSIZ']) then - if Assigned(Container.ElementBySignature['KWDA']) then - Container.ElementBySignature['KWDA'].Remove; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbReplaceBODTwithBOD2(const aElement: IwbElement); -var - MainRecord : IwbMainRecord; - ContainerBOD2 : IwbContainerElementRef; - ContainerBODT : IwbContainerElementRef; -begin - Exit; {>>> Looks like causes problems with Dawnguard.esm <<<} - - if wbBeginInternalEdit then try - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if not Supports(MainRecord.ElementBySignature[BODT], IwbContainerElementRef, ContainerBODT) then - Exit; - - if Supports(MainRecord.Add('BOD2', True), IwbContainerElementRef, ContainerBOD2) then begin - ContainerBOD2.ElementNativeValues['First Person Flags'] := ContainerBODT.ElementNativeValues['First Person Flags']; - ContainerBOD2.ElementNativeValues['Armor Type'] := ContainerBODT.ElementNativeValues['Armor Type']; - MainRecord.RemoveElement(BODT); - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbARMOAfterLoad(const aElement: IwbElement); -begin - wbRemoveEmptyKWDA(aElement); - wbReplaceBODTwithBOD2(aElement); -end; - -procedure wbARMAAfterLoad(const aElement: IwbElement); -{var - MainRecord : IwbMainRecord;} -begin - wbReplaceBODTwithBOD2(aElement); - {if wbBeginInternalEdit then try - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.ElementNativeValues['DNAM\Weight slider - Male'] = 0 then - MainRecord.ElementNativeValues['DNAM\Weight slider - Male'] := 2; - if MainRecord.ElementNativeValues['DNAM\Weight slider - Female'] = 0 then - MainRecord.ElementNativeValues['DNAM\Weight slider - Female'] := 2; - finally - wbEndInternalEdit; - end;} -end; - -procedure wbNPCAfterLoad(const aElement: IwbElement); -begin - wbRemoveEmptyKWDA(aElement); -end; - -procedure wbREFRAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Container.ElementExists['XLOC'] then begin - if Container.ElementNativeValues['XLOC - Lock Data\Level'] = 0 then - Container.ElementNativeValues['XLOC - Lock Data\Level'] := 1; - end; - - Container.RemoveElement('XPTL'); - finally - wbEndInternalEdit; - end; -end; - -procedure wbRACEAfterLoad(const aElement: IwbElement); -begin - wbReplaceBODTwithBOD2(aElement); -end; - -procedure wbWEAPAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - Flags : Cardinal; -begin - wbRemoveEmptyKWDA(aElement); - - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - // clear IronSights flags which are randomly assigned in CK - if Container.ElementExists['DNAM'] then begin - Flags := Container.ElementNativeValues['DNAM - Data\Flags']; - Flags := Flags and ($FFFF xor $0040); - Container.ElementNativeValues['DNAM - Data\Flags'] := Flags; - Flags := Container.ElementNativeValues['DNAM - Data\Flags2']; - Flags := Flags and ($FFFFFFFF xor $0100); - Container.ElementNativeValues['DNAM - Data\Flags2'] := Flags; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbCELLXCLWGetConflictPriority(const aElement: IwbElement; var aCP: TwbConflictPriority); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - DataRec : IwbElement; - Flags : Cardinal; -begin - if not Assigned(aElement) then - Exit; - - if not Supports(aElement.Container, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(Container, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - DataRec := MainRecord.ElementBySignature[DATA]; - - if not Assigned(DataRec) then - Exit; - - Flags := DataRec.NativeValue; - - {0x0001 Is Interior Cell} - if (Flags and 1) = 1 then - {Interior cells don't use water level in Skyrim at all} - aCP := cpIgnore; -end; - -procedure wbCELLDATAAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Container : IwbContainer; -begin - if not Assigned(aElement) then - Exit; - Container := aElement.Container; - while Assigned(Container) and not (Container.Def.DefType = dtRecord) do - Container := Container.Container; - if Assigned(Container) then - Container.ResetConflict; -end; - -procedure wbCELLAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; -// Container2 : IwbContainerElementRef; - MainRecord : IwbMainRecord; - DataSubRec : IwbSubrecord; - Flags8 : Byte; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if Supports(Container.ElementBySignature['DATA'] , IwbSubRecord, DataSubRec) then begin - // expand legacy itU8 flags to itU16 - if DataSubRec.SubRecordHeaderSize = 1 then begin - Flags8 := PByte(DataSubRec.DataBasePtr)^; - DataSubRec.SetToDefault; - DataSubRec.NativeValue := Flags8; - end; - // 'Default' water height for exterior cells if not set (so water height will be taken from WRLD by game) - if (not Container.ElementExists['XCLW']) and ((Integer(DataSubRec.NativeValue) and $02) <> 0) then begin - Container.Add('XCLW', True); - Container.ElementEditValues['XCLW'] := 'Default'; - end; - end; - - // Min (-0 as in CK) water height is set to 0 when saving in CK - if Container.ElementEditValues['XCLW'] = 'Min' then - Container.ElementEditValues['XCLW'] := '0.0'; - -// if Supports(Container.ElementBySignature[XCLR], IwbContainerElementRef, Container2) then begin -// for i := Pred(Container2.ElementCount) downto 0 do -// if not Supports(Container2.Elements[i].LinksTo, IwbMainRecord, MainRecord) or (MainRecord.Signature <> 'REGN') then -// Container2.RemoveElement(i); -// if Container2.ElementCount < 1 then -// Container2.Remove; -// end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbMESGAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - MainRecord : IwbMainRecord; - IsMessageBox : Boolean; - HasTimeDelay : Boolean; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - IsMessageBox := (Integer(Container.ElementNativeValues['DNAM']) and 1) = 1; - HasTimeDelay := Container.ElementExists['TNAM']; - - if IsMessageBox = HasTimeDelay then - if IsMessageBox then - Container.RemoveElement('TNAM') - else begin - if not Container.ElementExists['DNAM'] then - Container.Add('DNAM', True); - Container.ElementNativeValues['DNAM'] := Integer(Container.ElementNativeValues['DNAM']) or 1; - end; - - finally - wbEndInternalEdit; - end; -end; - - -{>>> - Updated, but not called for Skyrim - Why is it required to fix particle counts? Because 1 pass = 79 particles? ->>>} -//procedure wbEFSHAfterLoad(const aElement: IwbElement); -//var -// Container: IwbContainerElementRef; -// MainRecord : IwbMainRecord; -// FullParticleBirthRatio : Extended; -// PersistantParticleCount : Extended; -//begin -// if wbBeginInternalEdit then try -// if not Supports(aElement, IwbContainerElementRef, Container) then -// Exit; -// -// if Container.ElementCount < 1 then -// Exit; -// -// if not Supports(aElement, IwbMainRecord, MainRecord) then -// Exit; -// -// if MainRecord.IsDeleted then -// Exit; -// -// if not Container.ElementExists['DATA'] then -// Exit; -// -// FullParticleBirthRatio := Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio']; -// PersistantParticleCount := Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Count']; -// -// if ((FullParticleBirthRatio <> 0) and (FullParticleBirthRatio <= 1)) then begin -// FullParticleBirthRatio := FullParticleBirthRatio * 78.0; -// Container.ElementNativeValues['DATA\Particle Shader - Full Particle Birth Ratio'] := FullParticleBirthRatio; -// end; -// -// if ((PersistantParticleCount <> 0) and (PersistantParticleCount <= 1)) then begin -// PersistantParticleCount := PersistantParticleCount * 78.0; -// Container.ElementNativeValues['DATA\Particle Shader - Persistant Particle Count'] := PersistantParticleCount; -// end; -// -// finally -// wbEndInternalEdit; -// end; -//end; - -procedure wbLIGHAfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - if not Supports(aElement, IwbMainRecord, MainRecord) then - Exit; - - if MainRecord.IsDeleted then - Exit; - - if not Container.ElementExists['FNAM'] then begin - Container.Add('FNAM', True); - Container.ElementNativeValues['FNAM'] := 1.0; - end; - - if Container.ElementExists['DATA'] then begin - if SameValue(Container.ElementNativeValues['DATA\Falloff Exponent'], 0.0) then - Container.ElementNativeValues['DATA\Falloff Exponent'] := 1.0; - if SameValue(Container.ElementNativeValues['DATA\FOV'], 0.0) then - Container.ElementNativeValues['DATA\FOV'] := 90.0; - end; - - finally - wbEndInternalEdit; - end; -end; - -procedure wbEFITAfterLoad(const aElement: IwbElement); -var - Container : IwbContainerElementRef; - Element : IwbElement; - ActorValue: Variant; - MainRecord: IwbMainRecord; -begin - if wbBeginInternalEdit then try - if not Supports(aElement, IwbContainerElementRef, Container) then - Exit; - - if Container.ElementCount < 1 then - Exit; - - MainRecord := Container.ContainingMainRecord; - if not Assigned(MainRecord) or MainRecord.IsDeleted then - Exit; - - Element := Container.ElementByPath['..\EFID']; - if not Assigned(Element) then - Exit; - if not Supports(Element.LinksTo, IwbMainRecord, MainRecord) then - Exit; - if MainRecord.Signature <> 'MGEF' then - Exit; - ActorValue := MainRecord.ElementNativeValues['DATA - Data\Actor Value']; - if VarIsNull(ActorValue) or VarIsClear(ActorValue) then - Exit; - if VarCompareValue(ActorValue, Container.ElementNativeValues['Actor Value']) <> vrEqual then - Container.ElementNativeValues['Actor Value'] := ActorValue; - finally - wbEndInternalEdit; - end; -end; - -procedure wbRPLDAfterLoad(const aElement: IwbElement); -var - Container: IwbContainer; - a, b: Single; - NeedsFlip: Boolean; -begin - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - NeedsFlip := False; - if Container.ElementCount > 1 then begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[0].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[0].Value); - case CompareValue(a, b) of - EqualsValue: begin - a := StrToFloat((Container.Elements[0] as IwbContainer).Elements[1].Value); - b := StrToFloat((Container.Elements[Pred(Container.ElementCount)] as IwbContainer).Elements[1].Value); - NeedsFlip := CompareValue(a, b) = GreaterThanValue; - end; - GreaterThanValue: - NeedsFlip := True; - end; - end; - if NeedsFlip then - Container.ReverseElements; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbPubPackCNAMDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - rANAM: IwbRecord; - ctype: string; -begin - Result := 0; - rANAM := aElement.Container.RecordBySignature[ANAM]; - if Assigned(rANAM) then begin - ctype := rANAM.NativeValue; - if ctype = 'Bool' then Result := 1 else - if ctype = 'Int' then Result := 2 else - if ctype = 'Float' then Result := 3 else - if ctype = 'ObjectList' then Result := 3; - end; -end; - -function wbTypeDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Container : IwbContainer; - Element : IwbElement; -begin - Result := 0; - if not Assigned(aElement) then Exit; - Container := GetContainerFromUnion(aElement); - if not Assigned(Container) then Exit; - - Element := Container.ElementByName['Type']; - if Assigned(Element) then - Result := Element.NativeValue - else if wbMoreInfoForDecider then - wbProgressCallback('"'+Container.Name+'" does not contain an element named Type'); -end; - -procedure wbCNTOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('COCT - Count', aElement); -end; - -procedure wbContainerAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('COCT - Count', 'Items', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbSPLOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('SPCT - Count', aElement); -end; - -procedure wbKWDAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('KSIZ - Keyword Count', aElement); -end; - -procedure wbNPCAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('COCT - Count', 'Items', aElement); - wbCounterContainerAfterSet('SPCT - Count', 'Actor Effects', aElement); - wbCounterContainerAfterSet('LLCT - Count', 'Leveled List Entries', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); - wbCounterContainerAfterSet('PRKZ - Perk Count', 'Perks', aElement); -end; - -procedure wbRaceAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('SPCT - Count', 'Actor Effects', aElement); - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbKeywordsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('KSIZ - Keyword Count', 'KWDA - Keywords', aElement); -end; - -procedure wbLVLOsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('LLCT - Count', aElement); -end; - -procedure wbLLEAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('LLCT - Count', 'Leveled List Entries', aElement); -end; - -procedure wbPRKRsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('PRKZ - Perk Count', aElement); -end; - -procedure wbSMQNQuestsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('QNAM - Quest Count', aElement); -end; - -procedure wbCTDAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('CITC - Condition Count', aElement); -end; - -procedure wbConditionsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterContainerAfterSet('CITC - Condition Count', 'Conditions', aElement); -end; - -procedure wbCounterEffectsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - // if it is really possible to have both counter effects and multiple data, this is going to be tricky. - wbCounterByPathAfterSet('Magic Effect Data\DATA - Data\Counter effect count', aElement); -end; - -procedure wbMGEFAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbKeywordsAfterSet(aElement, aOldValue, aNewValue); - wbCounterContainerByPathAfterSet('Magic Effect Data\DATA - Data\Counter effect count', 'Counter Effects', aElement); -end; - -procedure wbLENSAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - wbCounterAfterSet('LFSP - Count', aElement); -end; - -procedure wbIDLAsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - if wbBeginInternalEdit then try - if not wbCounterAfterSet('IDLC - Animation Count', aElement) then - if Supports(aElement.Container, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - if Assigned(Element) and Supports(aElement, IwbContainer, SelfAsContainer) and - (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - end; - finally - wbEndInternalEdit; - end; -end; - -procedure wbAnimationsAfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - if wbBeginInternalEdit then try - if not wbCounterContainerAfterSet('IDLC - Animation Count', 'IDLA - Animations', aElement) then - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByPath['IDLC\Animation Count']; - Elems := Container.ElementByName['IDLA - Animations']; - if Assigned(Element) and not Assigned(Elems) then - if Element.GetNativeValue<>0 then - Element.SetNativeValue(0); - end; - finally - wbEndInternalEdit; - end; -end; - -function wbOffsetDataColsCounter(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; -var - Container : IwbDataContainer; - Element : IwbElement; - fResult : Extended; -begin - Result := 0; - - if Supports(aElement.Container, IwbDataContainer, Container) and (Container.Name = 'OFST - Offset Data') and - Supports(Container.Container, IwbDataContainer, Container) then begin - Element := Container.ElementByPath['Object Bounds\NAM0 - Min\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 0 - else - Result := Trunc(fResult); - Element := Container.ElementByPath['Object Bounds\NAM9 - Max\X']; - if Assigned(Element) then begin - fResult := Element.NativeValue; - if fResult >= MaxInt then - Result := 1 - else - Result := Trunc(fResult) - Result + 1; - end; - end; - end; -end; - -function wbREFRRecordFlagsDecider(const aElement: IwbElement): Integer; -var - MainRecord : IwbMainRecord; - NameRec : IwbElement; -begin - Result := 0; - - if not Assigned(aElement) then - Exit; - - MainRecord := aElement.ContainingMainRecord; - - if not Assigned(MainRecord) then - Exit; - - NameRec := MainRecord.ElementBySignature[NAME]; - if not Assigned(NameRec) then - Exit; - - if not Supports(NameRec.LinksTo, IwbMainRecord, MainRecord) then - Exit; - - if (MainRecord.Signature = ACTI) or - (MainRecord.Signature = STAT) or - (MainRecord.Signature = TREE) - then - Result := 1 - else if MainRecord.Signature = CONT then - Result := 2 - else if MainRecord.Signature = DOOR then - Result := 3 - else if MainRecord.Signature = LIGH then - Result := 4 - else if MainRecord.Signature = MSTT then - Result := 5 - else if MainRecord.Signature = ADDN then - Result := 6 - else if - (MainRecord.Signature = SCRL) or - (MainRecord.Signature = AMMO) or - (MainRecord.Signature = ARMO) or - (MainRecord.Signature = BOOK) or - (MainRecord.Signature = INGR) or - (MainRecord.Signature = KEYM) or - (MainRecord.Signature = MISC) or - (MainRecord.Signature = SLGM) or - (MainRecord.Signature = WEAP) or - (MainRecord.Signature = ALCH) - then - Result := 7; -end; - -function wbByteColors(const aName: string = 'Color'): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unused', 1) - ]); -end; - -function wbFloatColors(const aName: string = 'Color'): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0) - ]); -end; - -function wbWeatherColors(const aName: string): IwbStructDef; -begin - Result := wbStruct(aName, [ - wbByteColors('Sunrise'), - wbByteColors('Day'), - wbByteColors('Sunset'), - wbByteColors('Night') - ], cpNormal, True); -end; - -function wbAmbientColors(const aSignature: TwbSignature; const aName: string = 'Directional Ambient Lighting Colors'): IwbSubRecordDef; overload; -begin - Result := wbStruct(aSignature, aName, [ - wbStruct('Directional', [ - wbByteColors('X+'), - wbByteColors('X-'), - wbByteColors('Y+'), - wbByteColors('Y-'), - wbByteColors('Z+'), - wbByteColors('Z-') - ]), - wbByteColors('Specular'), - wbFloat('Scale') - ], cpNormal, False, nil, 1) -end; - -function wbAmbientColors(const aName: string = 'Directional Ambient Lighting Colors'): IwbStructDef; overload; -begin - Result := wbStruct(aName, [ - wbStruct('Directional', [ - wbByteColors('X+'), - wbByteColors('X-'), - wbByteColors('Y+'), - wbByteColors('Y-'), - wbByteColors('Z+'), - wbByteColors('Z-') - ]), - wbByteColors('Specular'), - wbFloat('Scale', cpIgnore) - ], cpNormal, False, nil, 1); -end; - -function wbStrToInt(const aString: string; const aElement: IwbElement): Int64; -var - s: string; - i: integer; -begin - // ignore anything after space or : - i := Pos(' ', aString); - if i = 0 then - i := Pos(':', aString); - - if i <> 0 then - s := Copy(aString, 1, i - 1) - else - s := aString; - - try - Result := StrToInt64(s) - except - Result := 0; - end; -end; - -type - TFaceGenFeature = record - RaceID : String; - Female : Boolean; - Entries : array of record - Index: Cardinal; - Name : String; - end; - end; - PFaceGenFeature = ^TFaceGenFeature; - -var - // cache of race specific tint layers - TintLayers: array of TFaceGenFeature; - -function wbTintLayerToStr(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; - - function GetCached(const aRaceID: string; aFemale: boolean): PFaceGenFeature; - var - i: integer; - begin - Result := nil; - if Length(TintLayers) <> 0 then - for i := Low(TintLayers) to High(TintLayers) do - if (TintLayers[i].Female = aFemale) and (TintLayers[i].RaceID = aRaceID) then begin - Result := @TintLayers[i]; - Break; - end; - end; - -var - Actor, Race : IwbMainRecord; - Element : IwbElement; - Container, Entry : IwbContainerElementRef; - Female, Female2 : Boolean; - RaceID, EntryName : string; - s : string; - Cache : PFaceGenFeature; - Index : Cardinal; - i, j : integer; -begin - // defaults - case aType of - ctToStr, ctToEditValue: Result := IntToStr(aInt); - ctToSortKey: begin - Result := IntToHex64(aInt, 8); - Exit; - end; - ctCheck: Result := ''; - ctEditType: Result := ''; - ctEditInfo: Result := ''; - end; - - Actor := aElement.ContainingMainRecord; - if not Assigned(Actor) then - Exit; - - Female := Actor.ElementEditValues['ACBS\Flags\Female'] = '1'; - - Element := Actor.ElementBySignature['RNAM']; - if not Assigned(Element) then - Exit; - - Element := Element.LinksTo; - if not Supports(Element, IwbMainRecord, Race) then - Exit; - - Race := Race.WinningOverride; - RaceID := Race.EditorID; - - Cache := GetCached(RaceID, Female); - - // cache not found, fill with data from RACE - if not Assigned(Cache) then begin - - for i := 0 to 1 do begin - - Female2 := i = 1; - SetLength(TintLayers, Succ(Length(TintLayers))); - Cache := @TintLayers[Pred(Length(TintLayers))]; - Cache.RaceID := RaceID; - Cache.Female := Female2; - - if not Female2 then - Element := Race.ElementByPath['Head Data\Male Head Data\Tint Masks'] - else - Element := Race.ElementByPath['Head Data\Female Head Data\Tint Masks']; - - if not Supports(Element, IwbContainerElementRef, Container) then - Continue; - - SetLength(Cache.Entries, Container.ElementCount); - - for j := 0 to Pred(Container.ElementCount) do begin - if not Supports(Container.Elements[j], IwbContainerElementRef, Entry) then - Break; - Cache.Entries[j].Index := Entry.ElementNativeValues['Tint Layer\Texture\TINI']; - s := Entry.ElementEditValues['Tint Layer\Texture\TINP']; - // add texture name - if s <> '' then - s := '[' + s + '] '; - s := s + ChangeFileExt(ExtractFileName(Entry.ElementEditValues['Tint Layer\Texture\TINT']), ''); - Cache.Entries[j].Name := s; - end; - end; - - Cache := GetCached(RaceID, Female); - end; - - if not Assigned(Cache) then - Exit; - - EntryName := ''; - Index := Cardinal(aInt); - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do - if Cache.Entries[i].Index = Index then begin - EntryName := Cache.Entries[i].Name; - Break; - end; - - case aType of - ctToStr: begin - if EntryName <> '' then - Result := IntToStr(aInt) + ' ' + EntryName - else - Result := IntToStr(aInt) + ' '; - end; - ctCheck: begin - if EntryName = '' then - Result := '' - else - Result := ''; - end; - ctEditType: Result := 'ComboBox'; - ctEditInfo: begin - Result := ''; - if Length(Cache.Entries) <> 0 then - for i := Low(Cache.Entries) to High(Cache.Entries) do begin - if Result <> '' then Result := Result + ','; - Result := Result + '"' + IntToStr(Cache.Entries[i].Index) + ' ' + Cache.Entries[i].Name + '"'; - end; - end; - end; -end; - - -var - wbRecordFlagsFlags : IwbFlagsDef; - -procedure DefineTES5a; - -begin - wbNull := wbByteArray('Unused', -255); - wbLLCT := wbInteger(LLCT, 'Count', itU8, nil, cpBenign); - wbCITC := wbInteger(CITC, 'Condition Count', itU32, nil, cpBenign); - wbLVLD := wbInteger(LVLD, 'Chance None', itU8, nil, cpNormal, True); - - wbSPCT := wbInteger(SPCT, 'Count', itU32, nil, cpBenign); - wbSPLO := wbFormIDCk(SPLO, 'Actor Effect', [SPEL, SHOU, LVSP]); - wbSPLOs := wbRArrayS('Actor Effects', wbSPLO, cpNormal, False, nil, wbSPLOsAfterSet, nil{wbActorTemplateUseActorEffectList}); - - wbKSIZ := wbInteger(KSIZ, 'Keyword Count', itU32, nil, cpBenign); - wbKWDAs := wbArrayS(KWDA, 'Keywords', wbFormIDCk('Keyword', [KYWD, NULL]), 0, cpNormal, False, nil, wbKWDAsAfterSet); - wbReqKWDAs := wbArrayS(KWDA, 'Keywords', wbFormIDCk('Keyword', [KYWD, NULL]), 0, cpNormal, True, nil, wbKWDAsAfterSet); - - wbKeywords := wbRStruct('Keywords', [ - wbKSIZ, - wbReqKWDAs - ], []); - - wbCOED := wbStructExSK(COED, [2], [0, 1], 'Extra Data', [ - {00} wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - {04} wbUnion('Global Variable / Required Rank', wbCOEDOwnerDecider, [ - wbByteArray('Unused', 4, cpIgnore), - wbFormIDCk('Global Variable', [GLOB, NULL]), - wbInteger('Required Rank', itS32) - ]), - {08} wbFloat('Item Condition') - ]); - - wbCNTO := - wbRStructExSK([0], [1], 'Item', [ - wbStructExSK(CNTO, [0], [1], 'Item', [ - wbFormIDCk('Item', [ARMO, AMMO, APPA, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, INGR, LIGH, SLGM, SCRL]), - wbInteger('Count', itS32) - ]), - wbCOED - ], []); - wbCOCT := wbInteger(COCT, 'Count', itU32, nil, cpBenign); - wbCNTOs := wbRArrayS('Items', wbCNTO, cpNormal, False, nil, wbCNTOsAfterSet); - - wbArmorTypeEnum := wbEnum([ - 'Light Armor', - 'Heavy Armor', - 'Clothing' - ]); - - {>>> When NAME is user defined these will be incorrect <<<} - wbBipedObjectEnum := wbEnum([ - '30 - Head', - '31 - Hair', - '32 - Body', - '33 - Hands', - '34 - Forearms', - '35 - Amulet', - '36 - Ring', - '37 - Feet', - '38 - Calves', - '39 - Shield', - '40 - Tail', - '41 - LongHair', - '42 - Circlet', - '43 - Ears', - '44 - Unnamed', - '45 - Unnamed', - '46 - Unnamed', - '47 - Unnamed', - '48 - Unnamed', - '49 - Unnamed', - '50 - DecapitateHead', - '51 - Decapitate', - '52 - Unnamed', - '53 - Unnamed', - '54 - Unnamed', - '55 - Unnamed', - '56 - Unnamed', - '57 - Unnamed', - '58 - Unnamed', - '59 - Unnamed', - '60 - Unnamed', - '61 - FX01' - ], [ - -1, 'None' - ]); - - wbBipedObjectFlags := wbFlags([ - {0x00000001} '30 - Head', - {0x00000002} '31 - Hair', - {0x00000004} '32 - Body', - {0x00000008} '33 - Hands', - {0x00000010} '34 - Forearms', - {0x00000020} '35 - Amulet', - {0x00000040} '36 - Ring', - {0x00000080} '37 - Feet', - {0x00000100} '38 - Calves', - {0x00000200} '39 - Shield', - {0x00000400} '40 - Tail', - {0x00000800} '41 - LongHair', - {0x00001000} '42 - Circlet', - {0x00002000} '43 - Ears', - {0x00004000} '44 - Unnamed', - {0x00008000} '45 - Unnamed', - {0x00010000} '46 - Unnamed', - {0x00020000} '47 - Unnamed', - {0x00040000} '48 - Unnamed', - {0x00080000} '49 - Unnamed', - {0x00100000} '50 - DecapitateHead', - {0x00200000} '51 - Decapitate', - {0x00400000} '52 - Unnamed', - {0x00800000} '53 - Unnamed', - {0x01000000} '54 - Unnamed', - {0x02000000} '55 - Unnamed', - {0x04000000} '56 - Unnamed', - {0x08000000} '57 - Unnamed', - {0x10000000} '58 - Unnamed', - {0x20000000} '59 - Unnamed', - {0x40000000} '60 - Unnamed', - {0x80000000} '61 - FX01' - ], True); - - wbFirstPersonFlagsU32 := wbInteger('First Person Flags', itU32, wbBipedObjectFlags); - - wbBODT := wbStruct(BODT, 'Body Template', [ - wbFirstPersonFlagsU32, - wbInteger('General Flags', itU8, wbFlags([ - {0x00000001}'(ARMA)Modulates Voice', {>>> From ARMA <<<} - {0x00000002}'Unknown 2', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'(ARMO)Non-Playable', {>>> From ARMO <<<} - {0x00000020}'Unknown 6', - {0x00000040}'Unknown 7', - {0x00000080}'Unknown 8' - ], True)), - wbByteArray('Unused', 3, cpIgnore), - wbInteger('Armor Type', itU32, wbArmorTypeEnum) - ], cpNormal, False, nil, 3); - - wbBOD2 := wbStruct(BOD2, 'Biped Body Template', [ - wbFirstPersonFlagsU32, - wbInteger('Armor Type', itU32, wbArmorTypeEnum) - ], cpNormal, False); - - wbBODTBOD2 := - wbRUnion('Biped Body Template', [ - wbStruct(BOD2, 'Biped Body Template', [ - wbFirstPersonFlagsU32, - wbInteger('General Flags', it0, wbFlags([ - {0x00000001}'(ARMA)Modulates Voice', {>>> From ARMA <<<} - {0x00000002}'Unknown 2', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'(ARMO)Non-Playable', {>>> From ARMO <<<} - {0x00000020}'Unknown 6', - {0x00000040}'Unknown 7', - {0x00000080}'Unknown 8' - ], True)), - wbEmpty('Unused'), - wbInteger('Armor Type', itU32, wbArmorTypeEnum) - ], cpNormal, False), - wbStruct(BODT, 'Body Template', [ - wbFirstPersonFlagsU32, - wbInteger('General Flags', itU8, wbFlags([ - {0x00000001}'(ARMA)Modulates Voice', {>>> From ARMA <<<} - {0x00000002}'Unknown 2', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'(ARMO)Non-Playable', {>>> From ARMO <<<} - {0x00000020}'Unknown 6', - {0x00000040}'Unknown 7', - {0x00000080}'Unknown 8' - ], True)), - wbByteArray('Unused', 3, cpIgnore), - wbInteger('Armor Type', itU32, wbArmorTypeEnum) - ], cpNormal, False, nil, 3) - ], []); - - wbMDOB := wbFormID(MDOB, 'Menu Display Object', cpNormal, False); - wbCNAM := wbStruct(CNAM, 'Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unknown', 1) - ]); - wbCNAMReq := wbStruct(CNAM, 'Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unknown', 1) - ], cpNormal, True); - - wbDODT := wbStruct(DODT, 'Decal Data', [ - wbFloat('Min Width'), - wbFloat('Max Width'), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Depth'), - wbFloat('Shininess'), - wbStruct('Parallax', [ - wbFloat('Scale'), - wbInteger('Passes', itU8) {>>> This can't be higher than 30 <<<} - ]), - wbInteger('Flags', itU8, wbFlags([ - {0x01}'Parallax', - {0x02}'Alpha - Blending', - {0x04}'Alpha - Testing', - {0x08}'No Subtextures' - ], True)), - wbByteArray('Unknown', 2), - wbByteColors('Color') - ]); - -// wbRecordFlagsFlags := wbFlags([ -// {>>> 0x00000000 ACTI: Collision Geometry (default) <<<} -// {0x00000001}'ESM', -// {0x00000002}'Unknown 2', -// {>>> 0x00000004 ARMO: Not playable <<<} -// {0x00000004}'NotPlayable', -// {0x00000008}'Unknown 4', -// {0x00000010}'Unknown 5', -// {0x00000020}'Deleted', -// {>>> 0x00000040 ACTI: Has Tree LOD <<<} -// {>>> 0x00000040 REGN: Border Region <<<} -// {>>> 0x00000040 STAT: Has Tree LOD <<<} -// {>>> 0x00000040 REFR: Hidden From Local Map <<<} -// {0x00000040}'Constant HiddenFromLocalMap BorderRegion HasTreeLOD', -// {>>> 0x00000080 TES4: Localized <<<} -// {>>> 0x00000080 PHZD: Turn Off Fire <<<} -// {>>> 0x00000080 SHOU: Treat Spells as Powers <<<} -// {>>> 0x00000080 STAT: Add-on LOD Object <<<} -// {0x00000080}'Localized IsPerch AddOnLODObject TurnOffFire TreatSpellsAsPowers', -// {>>> 0x00000100 ACTI: Must Update Anims <<<} -// {>>> 0x00000100 REFR: Inaccessible <<<} -// {>>> 0x00000100 REFR for LIGH: Doesn't light water <<<} -// {0x00000100}'MustUpdateAnims Inaccessible DoesntLightWater', -// {>>> 0x00000200 ACTI: Local Map - Turns Flag Off, therefore it is Hidden <<<} -// {>>> 0x00000200 REFR: MotionBlurCastsShadows <<<} -// {0x00000200}'HiddenFromLocalMap StartsDead MotionBlurCastsShadows', -// {>>> 0x00000400 LSCR: Displays in Main Menu <<<} -// {0x00000400}'PersistentReference QuestItem DisplaysInMainMenu', -// {0x00000800}'InitiallyDisabled', -// {0x00001000}'Ignored', -// {0x00002000}'ActorChanged', -// {0x00004000}'Unknown 15', -// {>>> 0x00008000 STAT: Has Distant LOD <<<} -// {0x00008000}'VWD', -// {>>> 0x00010000 ACTI: Random Animation Start <<<} -// {>>> 0x00010000 REFR light: Never fades <<<} -// {0x00010000}'RandomAnimationStart NeverFades', -// {>>> 0x00020000 ACTI: Dangerous <<<} -// {>>> 0x00020000 REFR light: Doesn't light landscape <<<} -// {>>> 0x00020000 SLGM: Can hold NPC's soul <<<} -// {>>> 0x00020000 STAT: Use High-Detail LOD Texture <<<} -// {0x00020000}'Dangerous OffLimits DoesntLightLandscape HighDetailLOD CanHoldNPC', -// {0x00040000}'Compressed', -// {>>> 0x00080000 STAT: Has Currents <<<} -// {0x00080000}'CantWait HasCurrents', -// {>>> 0x00100000 ACTI: Ignore Object Interaction <<<} -// {0x00100000}'IgnoreObjectInteraction', -// {0x00200000}'(Used in Memory Changed Form)', -// {0x00400000}'Unknown 23', -// {>>> 0x00800000 ACTI: Is Marker <<<} -// {0x00800000}'IsMarker', -// {0x01000000}'Unknown 25', -// {>>> 0x02000000 ACTI: Obstacle <<<} -// {>>> 0x02000000 REFR: No AI Acquire <<<} -// {0x02000000}'Obstacle NoAIAcquire', -// {>>> 0x04000000 ACTI: Filter <<<} -// {0x04000000}'NavMeshFilter', -// {>>> 0x08000000 ACTI: Bounding Box <<<} -// {0x08000000}'NavMeshBoundingBox', -// {>>> 0x10000000 STAT: Show in World Map <<<} -// {0x10000000}'MustExitToTalk ShowInWorldMap', -// {>>> 0x20000000 ACTI: Child Can Use <<<} -// {>>> 0x20000000 REFR: Don't Havok Settle <<<} -// {0x20000000}'ChildCanUse DontHavokSettle', -// {>>> 0x40000000 ACTI: GROUND <<<} -// {>>> 0x40000000 REFR: NoRespawn <<<} -// {0x40000000}'NavMeshGround NoRespawn', -// {>>> 0x80000000 REFR: MultiBound <<<} -// {0x80000000}'MultiBound' -// ], [18]); - - wbRecordFlagsFlags := wbFlags(wbRecordFlagsFlags, [ - {0x00000001} { 0} 'Unknown 0', - {0x00000002} { 1} 'Unknown 1', - {0x00000004} { 2} 'Unknown 2', - {0x00000008} { 3} 'Unknown 3', - {0x00000010} { 4} 'Unknown 4', - {0x00000020} { 4} 'Unknown 5', - {0x00000040} { 6} 'Unknown 6', - {0x00000080} { 7} 'Unknown 7', - {0x00000100} { 8} 'Unknown 8', - {0x00000200} { 9} 'Unknown 9', - {0x00000400} {10} 'Unknown 10', - {0x00000800} {11} 'Unknown 11', - {0x00001000} {12} 'Unknown 12', - {0x00002000} {13} 'Unknown 13', - {0x00004000} {14} 'Unknown 14', - {0x00008000} {15} 'Unknown 15', - {0x00010000} {16} 'Unknown 16', - {0x00020000} {17} 'Unknown 17', - {0x00040000} {18} 'Unknown 18', - {0x00080000} {19} 'Unknown 19', - {0x00100000} {20} 'Unknown 20', - {0x00200000} {21} 'Unknown 21', - {0x00400000} {22} 'Unknown 22', - {0x00800000} {23} 'Unknown 23', - {0x01000000} {24} 'Unknown 24', - {0x02000000} {25} 'Unknown 25', - {0x04000000} {26} 'Unknown 26', - {0x08000000} {27} 'Unknown 27', - {0x10000000} {28} 'Unknown 28', - {0x20000000} {29} 'Unknown 29', - {0x40000000} {30} 'Unknown 30', - {0x80000000} {31} 'Unknown 31' - ]); - - wbRecordFlags := wbInteger('Record Flags', itU32, wbFlags(wbRecordFlagsFlags, wbFlagsList([]))); - - wbMainRecordHeader := wbStruct('Record Header', [ - wbString('Signature', 4, cpCritical), - wbInteger('Data Size', itU32, nil, cpIgnore), - wbRecordFlags, - wbFormID('FormID', cpFormID), - wbByteArray('Version Control Info 1', 4, cpIgnore), - wbInteger('Form Version', itU16, nil, cpIgnore), - wbByteArray('Version Control Info 2', 2, cpIgnore) - ]); - - wbSizeOfMainRecordStruct := 24; - - wbIgnoreRecords.Add(XXXX); - - wbXRGD := wbByteArray(XRGD, 'Ragdoll Data'); - wbXRGB := wbByteArray(XRGB, 'Ragdoll Biped Data'); - - wbMusicEnum := wbEnum(['Default', 'Public', 'Dungeon']); - wbSoundLevelEnum := wbEnum([ - 'Loud', - 'Normal', - 'Silent', - 'Very Loud' - ]); - - wbEntryPointsEnum := wbEnum([ - { 0} 'Calculate Weapon Damage', - { 1} 'Calculate My Critical Hit Chance', - { 2} 'Calculate My Critical Hit Damage', - { 3} 'Calculate Mine Explode Chance', - { 4} 'Adjust Limb Damage', - { 5} 'Adjust Book Skill Points', - { 6} 'Mod Recovered Health', - { 7} 'Get Should Attack', - { 8} 'Mod Buy Prices', - { 9} 'Add Leveled List On Death', - {10} 'Get Max Carry Weight', - {11} 'Mod Addiction Chance', - {12} 'Mod Addiction Duration', - {13} 'Mod Positive Chem Duration', - {14} 'Activate', - {15} 'Ignore Running During Detection', - {16} 'Ignore Broken Lock', - {17} 'Mod Enemy Critical Hit Chance', - {18} 'Mod Sneak Attack Mult', - {19} 'Mod Max Placeable Mines', - {20} 'Mod Bow Zoom', - {21} 'Mod Recover Arrow Chance', - {22} 'Mod Skill Use', - {23} 'Mod Telekinesis Distance', - {24} 'Mod Telekinesis Damage Mult', - {25} 'Mod Telekinesis Damage', - {26} 'Mod Bashing Damage', - {27} 'Mod Power Attack Stamina', - {28} 'Mod Power Attack Damage', - {29} 'Mod Spell Magnitude', - {30} 'Mod Spell Duration', - {31} 'Mod Secondary Value Weight', - {32} 'Mod Armor Weight', - {33} 'Mod Incoming Stagger', - {34} 'Mod Target Stagger', - {35} 'Mod Attack Damage', - {36} 'Mod Incoming Damage', - {37} 'Mod Target Damage Resistance', - {38} 'Mod Spell Cost', - {39} 'Mod Percent Blocked', - {40} 'Mod Shield Deflect Arrow Chance', - {41} 'Mod Incoming Spell Magnitude', - {42} 'Mod Incoming Spell Duration', - {43} 'Mod Player Intimidation', - {44} 'Mod Player Reputation', - {45} 'Mod Favor Points', - {46} 'Mod Bribe Amount', - {47} 'Mod Detection Light', - {48} 'Mod Detection Movement', - {49} 'Mod Soul Gem Recharge', - {50} 'Set Sweep Attack', - {51} 'Apply Combat Hit Spell', - {52} 'Apply Bashing Spell', - {53} 'Apply Reanimate Spell', - {54} 'Set Boolean Graph Variable', - {55} 'Mod Spell Casting Sound Event', - {56} 'Mod Pickpocket Chance', - {57} 'Mod Detection Sneak Skill', - {58} 'Mod Falling Damage', - {59} 'Mod Lockpick Sweet Spot', - {60} 'Mod Sell Prices', - {61} 'Can Pickpocket Equipped Item', - {62} 'Mod Lockpick Level Allowed', - {63} 'Set Lockpick Starting Arc', - {64} 'Set Progression Picking', - {65} 'Make Lockpicks Unbreakable', - {66} 'Mod Alchemy Effectiveness', - {67} 'Apply Weapon Swing Spell', - {68} 'Mod Commanded Actor Limit', - {69} 'Apply Sneaking Spell', - {70} 'Mod Player Magic Slowdown', - {71} 'Mod Ward Magicka Absorption Pct', - {72} 'Mod Initial Ingredient Effects Learned', - {73} 'Purify Alchemy Ingredients', - {74} 'Filter Activation', - {75} 'Can Dual Cast Spell', - {76} 'Mod Tempering Health', - {77} 'Mod Enchantment Power', - {78} 'Mod Soul Pct Captured to Weapon', - {79} 'Mod Soul Gem Enchanting', - {80} 'Mod # Applied Enchantments Allowed', - {81} 'Set Activate Label', - {82} 'Mod Shout OK', - {83} 'Mod Poison Dose Count', - {84} 'Should Apply Placed Item', - {85} 'Mod Armor Rating', - {86} 'Mod Lockpicking Crime Chance', - {87} 'Mod Ingredients Harvested', - {88} 'Mod Spell Range (Target Loc.)', - {89} 'Mod Potions Created', - {90} 'Mod Lockpicking Key Reward Chance', - {91} 'Allow Mount Actor' - ]); - - wbLocationEnum := wbEnum([ - {0} 'Near reference', - {1} 'In cell', - {2} 'Near package start location', - {3} 'Near editor location', - {4} 'Object ID', - {5} 'Object Type', - {6} 'Near linked reference', - {7} 'At package location', - {8} 'Alias (reference)', - {9} 'Alias (location)', - {10} 'Unknown 10', - {11} 'Unknown 11', - {12} 'Near self' - ]); - - wbEquipType := wbFlags([ - {0x00000001}'Hand To Hand Melee', - {0x00000002}'One Hand Sword', - {0x00000004}'One Hand Dagger', - {0x00000008}'One Hand Axe', - {0x00000010}'One Hand Mace', - {0x00000020}'Two Hand Sword', - {0x00000040}'Two Hand Axe', - {0x00000080}'Bow', - {0x00000100}'Staff', - {0x00000200}'Spell', - {0x00000400}'Shield', - {0x00000800}'Torch', - {0x00001000}'Crossbow' - ], True); - - wbEmotionTypeEnum := wbEnum([ - {0} 'Neutral', - {1} 'Anger', - {2} 'Disgust', - {3} 'Fear', - {4} 'Sad', - {5} 'Happy', - {6} 'Surprise', - {7} 'Puzzled' - ]); - - wbFurnitureAnimTypeEnum := wbEnum([ - {0} '', - {1} 'Sit', - {2} 'Lay', - {3} '', - {4} 'Lean' - ]); - - wbFurnitureEntryTypeFlags := wbFlags([ - {0x01} 'Front', - {0x02} 'Behind', - {0x04} 'Right', - {0x08} 'Left', - {0x10} 'Up' - ]); - - wbWardStateEnum := wbEnum([ - 'None', - 'Absorb', - 'Break' - ]); - - wbEventFunctionEnum := wbEnum([ - 'GetIsID', - 'IsInList', - 'GetValue', - 'HasKeyword', - 'GetItemValue' - ]); - - // Event member names and availability are different depending on event type - // Using generic names for the last 3 of them: Form, Value1, Value2 - wbEventMemberEnum := wbEnum([], [ - $0000, 'None', - $314F, 'CreatedObject', - $314C, '(Old)Location', - $324C, '(New)Location', - $314B, 'Keyword', - $3146, 'Form', - $3156, 'Value1', - $3256, 'Value2' - ]); - - wbWeaponAnimTypeEnum := wbEnum([ - {0} 'HandToHandMelee', - {1} 'OneHandSword', - {2} 'OneHandDagger', - {3} 'OneHandAxe', - {4} 'OneHandMace', - {5} 'TwoHandSword', - {6} 'TwoHandAxe', - {7} 'Bow', - {8} 'Staff', - {9} 'Crossbow' - ]); - - wbEDID := wbString(EDID, 'Editor ID', 0, cpNormal); // not cpBenign according to Arthmoor - wbFULL := wbLStringKC(FULL, 'Name', 0, cpTranslate); - wbFULLActor := wbLStringKC(FULL, 'Name', 0, cpTranslate, False, nil{wbActorTemplateUseBaseData}); - wbFULLReq := wbLStringKC(FULL, 'Name', 0, cpTranslate, True); - wbDESC := wbLStringKC(DESC, 'Description', 0, cpTranslate); - wbDESCReq := wbLStringKC(DESC, 'Description', 0, cpTranslate, True); - wbXSCL := wbFloat(XSCL, 'Scale'); - - wbOBND := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ]); - - wbOBNDReq := wbStruct(OBND, 'Object Bounds', [ - wbInteger('X1', itS16), - wbInteger('Y1', itS16), - wbInteger('Z1', itS16), - wbInteger('X2', itS16), - wbInteger('Y2', itS16), - wbInteger('Z2', itS16) - ], cpNormal, True); - - wbPropTypeEnum := wbEnum([ - {00} 'None', - {01} 'Object', - {02} 'String', - {03} 'Int32', - {04} 'Float', - {05} 'Bool', - {06} '', - {07} '', - {08} '', - {09} '', - {10} '', - {11} 'Array of Object', - {12} 'Array of String', - {13} 'Array of Int32', - {14} 'Array of Float', - {15} 'Array of Bool' - ]); - - wbScriptFlags := wbInteger('Flags', itU8, wbEnum([ - {0x00} 'Local', - {0x01} 'Inherited', - {0x02} 'Removed', - {0x03} 'Inherited and Removed' - ])); - - wbScriptPropertyObject := wbUnion('Object Union', wbScriptObjFormatDecider, [ - wbStructSK([1], 'Object v2', [ - wbInteger('Unused', itU16, nil, cpIgnore), - wbInteger('Alias', itS16, wbScriptObjectAliasToStr, wbStrToAlias), - wbFormID('FormID') - ], [2, 1, 0]), - wbStructSK([1], 'Object v1', [ - wbFormID('FormID'), - wbInteger('Alias', itS16, wbScriptObjectAliasToStr, wbStrToAlias), - wbInteger('Unused', itU16, nil, cpIgnore) - ]) - ]); - - wbScriptProperties := - wbArrayS('Properties', wbStructSK([0], 'Property', [ - wbLenString('propertyName', 2), - wbInteger('Type', itU8, wbPropTypeEnum, cpNormal, False, nil, wbScriptPropertyTypeAfterSet), - wbInteger('Flags', itU8, wbEnum([ - {0x00} '', - {0x01} 'Edited', - {0x02} '', - {0x03} 'Removed' - ])), - wbUnion('Value', wbScriptPropertyDecider, [ - {00} wbNull, - {01} wbScriptPropertyObject, - {02} wbLenString('String', 2), - {03} wbInteger('Int32', itS32), - {04} wbFloat('Float'), - {05} wbInteger('Bool', itU8, wbEnum(['False', 'True'])), - {11} wbArray('Array of Object', wbScriptPropertyObject, -1), - {12} wbArray('Array of String', wbLenString('Element', 2), -1), - {13} wbArray('Array of Int32', wbInteger('Element', itS32), -1), - {14} wbArray('Array of Float', wbFloat('Element'), -1), - {15} wbArray('Array of Bool', wbInteger('Element', itU8, wbEnum(['False', 'True'])), -1) - ]) - ]), -2, cpNormal, False, nil, nil, nil, False); - - wbScriptEntry := wbStructSK([0], 'Script', [ - wbLenString('scriptName', 2), - wbScriptFlags, - wbScriptProperties - ]); - - wbScriptFragmentsInfo := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd' - ])), - wbLenString('fileName', 2), - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsInfoCounter) - ]); - - wbScriptFragmentsPack := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd', - {4} 'OnChange' - ])), - wbLenString('fileName', 2), - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd, OnChange - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsPackCounter) - ]); - - wbScriptFragmentsQuest := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('fragmentCount', itU16), - wbLenString('fileName', 2), - wbArrayS('Fragments', - wbStructSK([0, 2], 'Fragment', [ - wbInteger('Quest Stage', itU16), - wbInteger('Unknown', itS16), - wbInteger('Quest Stage Index', itS32), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), wbScriptFragmentsQuestCounter) - ]); - - wbScriptFragmentsScen := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbInteger('Flags', itU8, wbFlags([ - {1} 'OnBegin', - {2} 'OnEnd' - ])), - wbLenString('fileName', 2), - wbArray('Fragments', // Do NOT sort, ordered OnBegin, OnEnd - wbStruct('Fragment', [ - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), [], wbScriptFragmentsSceneCounter), - wbArray('Phase Fragments', - wbStructSK([0, 1], 'Phase Fragment', [ - wbInteger('Phase Flag', itU8, wbFlags([ - {1} 'OnStart', - {2} 'OnCompletion' - ])), - wbInteger('Phase Index', itU8), - wbInteger('Unknown', itS16), - wbInteger('Unknown', itS8), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), -2) - ]); - - wbScriptFragments := wbStruct('Script Fragments', [ - wbInteger('Unknown', itS8), - wbLenString('fileName', 2), - wbArrayS('Fragments', - wbStructSK([0], 'Fragment', [ - wbInteger('Fragment Index', itU16), - wbInteger('Unknown', itS16), - wbInteger('Unknown', itS8), - wbLenString('scriptName', 2), - wbLenString('fragmentName', 2) - ]), -2) - ]); - - {>>> http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format/VMAD_Field <<<} - - wbVMAD := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False) - ]); - - wbVMADFragmentedPERK := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragments - ], cpNormal, False, nil, 3); - - wbVMADFragmentedPACK := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsPack - ], cpNormal, False, nil, 3); - - wbVMADFragmentedQUST := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsQuest, - wbArrayS('Aliases', wbStructSK([0], 'Alias', [ - wbScriptPropertyObject, - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Alias Scripts', wbScriptEntry, -2) - ]), -2) - ], cpNormal, False, nil, 3); - - wbVMADFragmentedSCEN := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsScen - ], cpNormal, False, nil, 3); - - wbVMADFragmentedINFO := wbStruct(VMAD, 'Virtual Machine Adapter', [ - wbInteger('Version', itS16, nil, cpIgnore), - wbInteger('Object Format', itS16, nil, cpIgnore), - wbArrayS('Scripts', wbScriptEntry, -2, cpNormal, False, nil, nil, nil, False), - wbScriptFragmentsInfo - ], cpNormal, False, nil, 3); - - - wbAttackData := wbRStructSK([1], 'Attack', [ - wbStruct(ATKD, 'Attack Data', [ - wbFloat('Damage Mult'), - wbFloat('Attack Chance'), - wbFormIDCk('Attack Spell', [SPEL, SHOU, NULL]), - wbInteger('Attack Flags', itU32, wbFlags([ - {0x00000001} 'Ignore Weapon', - {0x00000002} 'Bash Attack', - {0x00000004} 'Power Attack', - {0x00000008} 'Left Attack', - {0x00000010} 'Rotating Attack', - {0x00000020} 'Unknown 5', - {0x00000040} 'Unknown 6', - {0x00000080} 'Unknown 7', - {0x00000100} 'Unknown 8', - {0x00000200} 'Unknown 9', - {0x00000400} 'Unknown 10', - {0x00000800} 'Unknown 11', - {0x00001000} 'Unknown 12', - {0x00002000} 'Unknown 13', - {0x00004000} 'Unknown 14', - {0x00008000} 'Unknown 15', - {0x00010000} 'Unknown 16', - {0x00020000} 'Unknown 17', - {0x00040000} 'Unknown 18', - {0x00080000} 'Unknown 19', - {0x00100000} 'Unknown 20', - {0x00200000} 'Unknown 21', - {0x00400000} 'Unknown 22', - {0x00800000} 'Unknown 23', - {0x01000000} 'Unknown 24', - {0x02000000} 'Unknown 25', - {0x04000000} 'Unknown 26', - {0x08000000} 'Unknown 27', - {0x10000000} 'Unknown 28', - {0x20000000} 'Unknown 29', - {0x40000000} 'Unknown 30', - {0x80000000} 'Override Data' - ])), - wbFloat('Attack Angle'), - wbFloat('Strike Angle'), - wbFloat('Stagger'), - wbFormIDCk('Attack Type', [KYWD, NULL]), - wbFloat('Knockdown'), - wbFloat('Recovery Time'), - wbFloat('Stamina Mult') - ]), - wbString(ATKE, 'Attack Event') - ], []); - - wbPLDT := wbStruct(PLDT, 'Location', [ - wbInteger('Type', itS32, wbLocationEnum), - wbUnion('Location Value', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', [NULL, DOOR, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - {1} wbFormIDCkNoReach('Cell', [NULL, CELL]), - {2} wbByteArray('Near Package Start Location', 4, cpIgnore), - {3} wbByteArray('Near Editor Location', 4, cpIgnore), - {4} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, SCRL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, FACT, FLST, IDLM, SHOU]), - {5} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {6} wbFormIDCk('Keyword', [NULL, KYWD]), - {7} wbByteArray('Unused', 4, cpIgnore), - {8} wbInteger('Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {9} wbInteger('Reference', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {10} wbByteArray('Unknown', 4, cpIgnore), - {11} wbByteArray('Unknown', 4, cpIgnore), - {12} wbByteArray('Unknown', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]); - - wbPLVD := wbStruct(PLVD, 'Location', [ - wbInteger('Type', itS32, wbLocationEnum), - wbUnion('Location Value', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', [NULL, DOOR, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - {1} wbFormIDCkNoReach('Cell', [NULL, CELL]), - {2} wbByteArray('Near Package Start Location', 4, cpIgnore), - {3} wbByteArray('Near Editor Location', 4, cpIgnore), - {4} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, SCRL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, INGR, LIGH, FACT, FLST, IDLM, SHOU]), - {5} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {6} wbFormIDCk('Keyword', [NULL, KYWD]), - {7} wbByteArray('Unused', 4, cpIgnore), - {8} wbInteger('Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {9} wbInteger('Reference', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {10} wbByteArray('Unknown', 4, cpIgnore), - {11} wbByteArray('Unknown', 4, cpIgnore), - {12} wbByteArray('Unknown', 4, cpIgnore) - ]), - wbInteger('Radius', itS32) - ]); - - wbTargetData := wbStruct('Target Data', [ - wbInteger('Type', itS32, wbEnum([ - {0} 'Specific Reference', - {1} 'Object ID', - {2} 'Object Type', - {3} 'Linked Reference', - {4} 'Ref Alias', - {5} 'Unknown 5', - {6} 'Self' - ]), cpNormal, False, nil, nil, 2), - wbUnion('Target', wbTypeDecider, [ - {0} wbFormIDCkNoReach('Reference', [NULL, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], True), - {1} wbFormIDCkNoReach('Object ID', [NULL, ACTI, DOOR, STAT, MSTT, FURN, SPEL, SCRL, NPC_, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, INGR, LIGH, FACT, FLST, IDLM, SHOU, SOUN, TXST, PROJ]), - {2} wbInteger('Object Type', itU32, wbObjectTypeEnum), - {3} wbFormID('Reference'), - {4} wbInteger('Alias', itS32, wbPackageLocationAliasToStr, wbStrToAlias), - {5} wbByteArray('Unknown', 4, cpIgnore), - {6} wbByteArray('Unknown', 4, cpIgnore) - ]), - wbInteger('Count / Distance', itS32) - ]); - - wbEITM := wbFormIDCk(EITM, 'Object Effect', [ENCH, SPEL]); - - wbPosRot := - wbStruct('Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]); - - wbDATAPosRot := - wbStruct(DATA, 'Position/Rotation', [ - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation', [ - wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ], cpNormal, True); - - wbMO2S := - wbArrayS(MO2S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO3S := - wbArrayS(MO3S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO4S := - wbArrayS(MO4S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - wbMO5S := - wbArrayS(MO5S, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - - wbMODS := - wbArrayS(MODS, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - - wbMODD := - wbInteger(MODD, 'FaceGen Model Flags', itU8, wbFlags([ - 'Head', - 'Torso', - 'Right Hand', - 'Left Hand' - ])); - - wbMODT := wbByteArray(MODT, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow); - wbDMDT := wbByteArray(DMDT, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow); - - wbMODL := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS - ], [], cpNormal, False, nil, True); - - wbMODLActor := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS - ], [], cpNormal, False, nil{wbActorTemplateUseModelAnimation}, True); - - wbMODLReq := - wbRStructSK([0], 'Model', [ - wbString(MODL, 'Model Filename', 0, cpNormal, True), - wbMODT, - wbMODS - ], [], cpNormal, True, nil, True); - - wbDMDSs := wbArrayS(DMDS, 'Alternate Textures', - wbStructSK([0, 2], 'Alternate Texture', [ - wbLenString('3D Name'), - wbFormIDCk('New Texture', [TXST]), - wbInteger('3D Index', itS32) - ]), - -1); - - wbDEST := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('DEST Count', itU8), - wbInteger('VATS Targetable', itU8, wbEnum(['False', 'True'])), - wbByteArray('Unknown', 2) - ]), - wbRArray('Stages', - wbRStruct('Stage', [ - wbStruct(DSTD, 'Destruction Stage Data', [ - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Model Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy', - 'Ignore External Dmg' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), - wbRStructSK([0], 'Model', [ - wbString(DMDL, 'Model Filename'), - wbDMDT, - wbDMDSs - ], [], cpNormal, False, nil), - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], [], cpNormal, False, nil) - ) - ], [], cpNormal, False, nil); - - wbDESTActor := wbRStruct('Destructable', [ - wbStruct(DEST, 'Header', [ - wbInteger('Health', itS32), - wbInteger('Count', itU8), - wbInteger('VATS Targetable', itU8, wbEnum(['False', 'True'])), - wbByteArray('Unknown', 2) - ]), - wbRArray('Stages', // Begin Stage Array - wbRStruct('Stage', [ // Begin Stage RStruct - wbStruct(DSTD, 'Destruction Stage Data', [ // Begin DSTD - wbInteger('Health %', itU8), - wbInteger('Index', itU8), - wbInteger('Damage Stage', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Cap Damage', - 'Disable', - 'Destroy' - ])), - wbInteger('Self Damage per Second', itS32), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Debris', [DEBR, NULL]), - wbInteger('Debris Count', itS32) - ], cpNormal, True), // End DSTD - wbRStructSK([0], 'Model', [ // Begin DMDL - wbString(DMDL, 'Model Filename') - ], []), // End DMDL - wbDMDT, - wbDMDSs, - wbEmpty(DSTF, 'End Marker', cpNormal, True) - ], []) // Begin Stage RStruct - ) // End Stage Array - ], [], cpNormal, False, nil{wbActorTemplateUseModelAnimation}); - - wbXLOD := wbArray(XLOD, 'Distant LOD Data', wbFloat('Unknown'), 3); - - wbXESP := wbStruct(XESP, 'Enable Parent', [ - wbFormIDCk('Reference', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbInteger('Flags', itU8, wbFlags([ - 'Set Enable State to Opposite of Parent', - 'Pop In' - ])), - wbByteArray('Unused', 3, cpIgnore) - ]); - - wbPDTO := - wbStruct(PDTO, 'Topic Data', [ - wbInteger('Type', itU32, wbEnum([ - 'Topic Ref', - 'Topic Subtype' - ])), - wbUnion('Data', wbTypeDecider, [ - wbFormIDCk('Topic', [DIAL, NULL]), - wbString('Subtype', 4) - ]) - ]); - - wbPDTOs := wbRArray('Topic', wbPDTO, cpNormal, False, nil); - - wbXLCM := wbInteger(XLCM, 'Level Modifier', itS32, wbEnum([ - 'Easy', - 'Medium', - 'Hard', - 'Very Hard' - ])); - - wbTVDT := wbByteArray(TVDT, 'Occlusion Data', 0, cpNormal); -// wbTVDT := wbArray(TVDT, 'Occlusion Data', wbInteger('Unknown', itS32)), - - if wbSimpleRecords then begin - wbMaxHeightDataCELL := wbByteArray(MHDT, 'Max Height Data', 0, cpNormal); - wbMaxHeightDataWRLD := wbByteArray(MHDT, 'Max Height Data', 0, cpNormal); - end - else begin - wbMaxHeightDataCELL := wbStruct(MHDT, 'Max Height Data', [ - wbFloat('Offset'), - wbArray('Rows', - wbByteArray('Columns', 32) - // way too verbose for no practical use - //wbStruct('Row', [ wbArray('Columns', wbInteger('Column', itU8), 32) ]) - , 32) - ]); - wbMaxHeightDataWRLD := wbStruct(MHDT, 'Max Height Data', [ - wbStruct('Min', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('Max', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbByteArray('Cell Data', 0) - // way too verbose for no practical use - {wbArray('Cell Data', wbStruct('Quad Height', [ - wbInteger('Bottom Left', itU8), - wbInteger('Bottom Right', itU8), - wbInteger('Top Left', itU8), - wbInteger('Top Right', itU8) - ]))} - ]); - end; - - if wbSimpleRecords then - wbOFST := wbByteArray(OFST, 'Offset Data') - else - wbOFST := wbArray(OFST, 'Offset Data', wbArray('Rows', wbInteger('Offset', itU32), wbOffsetDataColsCounter), 0); - - wbOwnership := wbRStruct('Ownership', [ - wbFormIDCkNoReach(XOWN, 'Owner', [FACT, ACHR, NPC_]), - wbInteger(XRNK, 'Faction rank', itS32) - ], [XRGD]); - - wbXGLB := wbFormIDCk(XGLB, 'Global variable', [GLOB]); -end; - -procedure DefineTES5b; -begin - - wbRecord(ACHR, 'Placed NPC', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Starts Dead', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x02000000} 25, 'No AI Acquire', - {0x20000000} 29, 'Don''t Havok Settle' - ], True, True)), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Base', [NPC_], False, cpNormal, True), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Ragdoll ---} - wbXRGD, - wbXRGB, - - {--- Patrol Data ---} - wbRStruct('Patrol Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - {>>> BEGIN leftover from earlier CK versions <<<} - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbPDTOs, - wbFormIDCk(TNAM, 'Topic', [DIAL, NULL], False, cpNormal) - ], []), - - {--- Leveled Actor ----} - wbXLCM, - - {--- Merchant Container ----} - wbFormIDCk(XMRC, 'Merchant Container', [REFR], True), - - {--- Extra ---} - wbInteger(XCNT, 'Count', itS32), - wbFloat(XRDS, 'Radius'), - wbFloat(XHLP, 'Health'), - - wbRArrayS('Linked References', wbStructSK(XLKR, [0], 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]) - ], cpNormal, False, nil, 1)), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbFloat('Delay') - ]) - ) - ], []), - - {--- Linked Ref ---} - wbStruct(XCLP, 'Linked Reference Color', [ - wbByteColors('Link Start Color'), - wbByteColors('Link End Color') - ]), - - wbFormIDCk(XLCN, 'Persistent Location', [LCTN]), - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - wbEmpty(XIS2, 'Ignored by Sandbox'), - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - wbFormIDCk(XHOR, 'Horse', [ACHR]), - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - - {--- Enable Parent ---} - wbXESP, - - {--- Ownership ---} - wbOwnership, - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - - {--- Flags ---} - wbEmpty(XIBS, 'Ignored By Sandbox'), - - {--- 3D Data ---} - wbXSCL, - wbDATAPosRot - ], True, wbPlacedAddInfo); - - wbRecord(ACTI, 'Activator', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Has Tree LOD', - {0x00000100} 8, 'Must Update Anims', - {0x00000200} 9, 'Hidden From Local Map', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Dangerous', - {0x00100000} 20, 'Ignore Object Interaction', - {0x00800000} 23, 'Is Marker', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x20000000} 29, 'Child Can Use', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbStruct(PNAM, 'Marker Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ]), - wbFormIDCk(SNAM, 'Sound - Looping', [SNDR]), - wbFormIDCk(VNAM, 'Sound - Activation', [SNDR]), - wbFormIDCk(WNAM, 'Water Type', [WATR]), - wbLString(RNAM, 'Activate Text Override', 0, cpTranslate), - wbInteger(FNAM, 'Flags', itU16, wbFlags([ - 'No Displacement', - 'Ignored by Sandbox' - ])), - wbFormIDCk(KNAM, 'Interaction Keyword', [KYWD]) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(TACT, 'Talking Activator', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Hidden From Local Map', - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Radio Station' - ]), [17]), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbUnknown(PNAM, cpIgnore, True), - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]), - wbUnknown(FNAM, cpIgnore, True), - wbFormIDCk(VNAM, 'Voice Type', [VTYP]) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbICON := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename', 0, cpNormal, True), - wbString(MICO, 'Small Icon filename') - ], [], cpNormal, False, nil, True); - - wbICONReq := wbRStruct('Icon', [ - wbString(ICON, 'Large Icon filename', 0, cpNormal, True), - wbString(MICO, 'Small Icon filename') - ], [], cpNormal, True, nil, True); - - wbICO2 := wbRStruct('Icon 2 (female)', [ - wbString(ICO2, 'Large Icon filename', 0, cpNormal, True), - wbString(MIC2, 'Small Icon filename') - ], [], cpNormal, False, nil, True); - - wbVatsValueFunctionEnum := - wbEnum([ - { 0} 'Weapon Is', - { 1} 'Weapon In List', - { 2} 'Target Is', - { 3} 'Target In List', - { 4} 'Target Distance', - { 5} 'Target Part', - { 6} 'VATS Action', - { 7} 'Is Success', - { 8} 'Is Critical', - { 9} 'Critical Effect Is', - {10} 'Critical Effect In List', - {11} 'Is Fatal', - {12} 'Explode Part', - {13} 'Dismember Part', - {14} 'Cripple Part', - {15} 'Weapon Type Is', - {16} 'Is Stranger', - {17} 'Is Paralyzing Palm', - {18} 'Projectile Type Is', - {19} 'Delivery Type Is', - {20} 'Casting Type Is' - ]); - - wbActorValueEnum := - wbEnum([ - {00} 'Aggresion', - {01} 'Confidence', - {02} 'Energy', - {03} 'Morality', - {04} 'Mood', - {05} 'Assistance', - {06} 'One-Handed', - {07} 'Two-Handed', - {08} 'Archery', - {09} 'Block', - {10} 'Smithing', - {11} 'Heavy Armor', - {12} 'Light Armor', - {13} 'Pickpocket', - {14} 'Lockpicking', - {15} 'Sneak', - {16} 'Alchemy', - {17} 'Speech', - {18} 'Alteration', - {19} 'Conjuration', - {20} 'Destruction', - {21} 'Illusion', - {22} 'Restoration', - {23} 'Enchanting', - {24} 'Health', - {25} 'Magicka', - {26} 'Stamina', - {27} 'Heal Rate', - {28} 'Magicka Rate', - {29} 'Stamina Rate', - {30} 'Speed Mult', - {31} 'Inventory Weight', - {32} 'Carry Weight', - {33} 'Critical Chance', - {34} 'Melee Damage', - {35} 'Unarmed Damage', - {36} 'Mass', - {37} 'Voice Points', - {38} 'Voice Rate', - {39} 'Damage Resist', - {40} 'Poison Resist', - {41} 'Resist Fire', - {42} 'Resist Shock', - {43} 'Resist Frost', - {44} 'Resist Magic', - {45} 'Resist Disease', - {46} 'Unknown 46', - {47} 'Unknown 47', - {48} 'Unknown 48', - {49} 'Unknown 49', - {50} 'Unknown 50', - {51} 'Unknown 51', - {52} 'Unknown 52', - {53} 'Paralysis', - {54} 'Invisibility', - {55} 'Night Eye', - {56} 'Detect Life Range', - {57} 'Water Breathing', - {58} 'Water Walking', - {59} 'Unknown 59', - {60} 'Fame', - {61} 'Infamy', - {62} 'Jumping Bonus', - {63} 'Ward Power', - {64} 'Right Item Charge', - {65} 'Armor Perks', - {66} 'Shield Perks', - {67} 'Ward Deflection', - {68} 'Variable01', - {69} 'Variable02', - {70} 'Variable03', - {71} 'Variable04', - {72} 'Variable05', - {73} 'Variable06', - {74} 'Variable07', - {75} 'Variable08', - {76} 'Variable09', - {77} 'Variable10', - {78} 'Bow Speed Bonus', - {79} 'Favor Active', - {80} 'Favors Per Day', - {81} 'Favors Per Day Timer', - {82} 'Left Item Charge', - {83} 'Absorb Chance', - {84} 'Blindness', - {85} 'Weapon Speed Mult', - {86} 'Shout Recovery Mult', - {87} 'Bow Stagger Bonus', - {88} 'Telekinesis', - {89} 'Favor Points Bonus', - {90} 'Last Bribed Intimidated', - {91} 'Last Flattered', - {92} 'Movement Noise Mult', - {93} 'Bypass Vendor Stolen Check', - {94} 'Bypass Vendor Keyword Check', - {95} 'Waiting For Player', - {96} 'One-Handed Modifier', - {97} 'Two-Handed Modifier', - {98} 'Marksman Modifier', - {99} 'Block Modifier', - {100} 'Smithing Modifier', - {101} 'Heavy Armor Modifier', - {102} 'Light Armor Modifier', - {103} 'Pickpocket Modifier', - {104} 'Lockpicking Modifier', - {105} 'Sneaking Modifier', - {106} 'Alchemy Modifier', - {107} 'Speechcraft Modifier', - {108} 'Alteration Modifier', - {109} 'Conjuration Modifier', - {110} 'Destruction Modifier', - {111} 'Illusion Modifier', - {112} 'Restoration Modifier', - {113} 'Enchanting Modifier', - {114} 'One-Handed Skill Advance', - {115} 'Two-Handed Skill Advance', - {116} 'Marksman Skill Advance', - {117} 'Block Skill Advance', - {118} 'Smithing Skill Advance', - {119} 'Heavy Armor Skill Advance', - {120} 'Light Armor Skill Advance', - {121} 'Pickpocket Skill Advance', - {122} 'Lockpicking Skill Advance', - {123} 'Sneaking Skill Advance', - {124} 'Alchemy Skill Advance', - {125} 'Speechcraft Skill Advance', - {126} 'Alteration Skill Advance', - {127} 'Conjuration Skill Advance', - {128} 'Destruction Skill Advance', - {129} 'Illusion Skill Advance', - {130} 'Restoration Skill Advance', - {131} 'Enchanting Skill Advance', - {132} 'Left Weapon Speed Multiply', - {133} 'Dragon Souls', - {134} 'Combat Health Regen Multiply', - {135} 'One-Handed Power Modifier', - {136} 'Two-Handed Power Modifier', - {137} 'Marksman Power Modifier', - {138} 'Block Power Modifier', - {139} 'Smithing Power Modifier', - {140} 'Heavy Armor Power Modifier', - {141} 'Light Armor Power Modifier', - {142} 'Pickpocket Power Modifier', - {143} 'Lockpicking Power Modifier', - {144} 'Sneaking Power Modifier', - {145} 'Alchemy Power Modifier', - {146} 'Speechcraft Power Modifier', - {147} 'Alteration Power Modifier', - {148} 'Conjuration Power Modifier', - {149} 'Destruction Power Modifier', - {150} 'Illusion Power Modifier', - {151} 'Restoration Power Modifier', - {152} 'Enchanting Power Modifier', - {153} 'Dragon Rend', - {154} 'Attack Damage Mult', - {155} 'Heal Rate Mult', - {156} 'Magicka Rate Mult', - {157} 'Stamina Rate Mult', - {158} 'Werewolf Perks', - {159} 'Vampire Perks', - {160} 'Grab Actor Offset', - {161} 'Grabbed', - {162} 'Unknown 162', - {163} 'Reflect Damage' - ], [ - -1, 'None' - ]); - - wbSkillEnum := - wbEnum([ - 'Unknown 1', - 'Unknown 2', - 'Unknown 3', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'One Handed', - 'Two Handed', - 'Archery', - 'Block', - 'Smithing', - 'Heavy Armor', - 'Light Armor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speech', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ], [ - -1, 'None' - ]); - - wbCastEnum := wbEnum([ - {0} 'Constant Effect', - {1} 'Fire and Forget', - {2} 'Concentration', - {3} 'Scroll' - ]); - - wbTargetEnum := wbEnum([ - {0} 'Self', - {1} 'Touch', - {2} 'Aimed', - {3} 'Target Actor', - {4} 'Target Location' - ]); - - wbCastingSourceEnum := wbEnum([ - 'Left', - 'Right', - 'Voice', - 'Instant' - ]); - - wbCrimeTypeEnum := - wbEnum([ - 'Steal', - 'Pickpocket', - 'Trespass', - 'Attack', - 'Murder', - 'Escape Jail', - 'Werewolf Transformation' - ], [ - -1, 'None' - ]); - - wbActorValue := wbInteger('Actor Value', itS32, wbActorValueEnum); - - wbETYP := wbFormIDCk(ETYP, 'Equipment Type', [EQUP, NULL]); - wbETYPReq := wbFormIDCk(ETYP, 'Equipment Type', [EQUP, NULL], False, cpNormal, True); - - wbFormTypeEnum := wbEnum([], [ - 0, 'Activator', - 1, 'Armor', - 2, 'Book', - 3, 'Container', - 4, 'Door', - 5, 'Ingredient', - 6, 'Light', - 7, 'MiscItem', - 8, 'Static', - 9, 'Grass', - 10, 'Tree', - 12, 'Weapon', - 13, 'Actor', - 14, 'LeveledCharacter', - 15, 'Spell', - 16, 'Enchantment', - 17, 'Potion', - 18, 'LeveledItem', - 19, 'Key', - 20, 'Ammo', - 21, 'Flora', - 22, 'Furniture', - 23, 'Sound Marker', - 24, 'LandTexture', - 25, 'CombatStyle', - 26, 'LoadScreen', - 27, 'LeveledSpell', - 28, 'AnimObject', - 29, 'WaterType', - 30, 'IdleMarker', - 31, 'EffectShader', - 32, 'Projectile', - 33, 'TalkingActivator', - 34, 'Explosion', - 35, 'TextureSet', - 36, 'Debris', - 37, 'MenuIcon', - 38, 'FormList', - 39, 'Perk', - 40, 'BodyPartData', - 41, 'AddOnNode', - 42, 'MovableStatic', - 43, 'CameraShot', - 44, 'ImpactData', - 45, 'ImpactDataSet', - 46, 'Quest', - 47, 'Package', - 48, 'VoiceType', - 49, 'Class', - 50, 'Race', - 51, 'Eyes', - 52, 'HeadPart', - 53, 'Faction', - 54, 'Note', - 55, 'Weather', - 56, 'Climate', - 57, 'ArmorAddon', - 58, 'Global', - 59, 'Imagespace', - 60, 'Imagespace Modifier', - 61, 'Encounter Zone', - 62, 'Message', - 63, 'Constructible Object', - 64, 'Acoustic Space', - 65, 'Ragdoll', - 66, 'Script', - 67, 'Magic Effect', - 68, 'Music Type', - 69, 'Static Collection', - 70, 'Keyword', - 71, 'Location', - 72, 'Location Ref Type', - 73, 'Footstep', - 74, 'Footstep Set', - 75, 'Material Type', - 76, 'Actor Action', - 77, 'Music Track', - 78, 'Word of Power', - 79, 'Shout', - 80, 'Relationship', - 81, 'Equip Slot', - 82, 'Association Type', - 83, 'Outfit', - 84, 'Art Object', - 85, 'Material Object', - 87, 'Lighting Template', - 88, 'Shader Particle Geometry', - 89, 'Visual Effect', - 90, 'Apparatus', - 91, 'Movement Type', - 92, 'Hazard', - 93, 'SM Event Node', - 94, 'Sound Descriptor', - 95, 'Dual Cast Data', - 96, 'Sound Category', - 97, 'Soul Gem', - 98, 'Sound Output Model', - 99, 'Collision Layer', - 100, 'Scroll', - 101, 'ColorForm', - 102, 'Reverb Parameters' - ]); - - wbMiscStatEnum := wbEnum([], [ - Int64($FCDD5011), 'Animals Killed', - Int64($366D84CF), 'Armor Improved', - Int64($023497E6), 'Armor Made', - Int64($8E20D7C9), 'Assaults', - Int64($579FFA75), 'Automations Killed', - Int64($B9B50725), 'Backstabs', - Int64($ED6A0EF2), 'Barters', - Int64($CCB952CE), 'Books Read', - Int64($317E8B4C), 'Brawls Won', - Int64($1D79006B), 'Bribes', - Int64($3602DE8F), 'Bunnies Slaughtered', - Int64($53D9E9B5), 'Chests Looted', - Int64($683C1980), 'Civil War Quests Completed', - Int64($66CCC50A), 'College of Winterhold Quests Completed', - Int64($40B11EFE), 'Creatures Killed', - Int64($22D5BA38), 'Critical Strikes', - Int64($A930980F), 'Daedra Killed', - Int64($3558374B), 'Daedric Quests Completed', - Int64($37A76425), 'Dawnguard Quests Completed', - Int64($2BDAC36F), 'Days as a Vampire', - Int64($6E684590), 'Days as a Werewolf', - Int64($B6F118DB), 'Days Jailed', - Int64($3C626A90), 'Days Passed', - Int64($8556AD88), 'Diseases Contracted', - Int64($46D6FBBC), 'Dragon Souls Collected', - Int64($AA444695), 'Dungeons Cleared', - Int64($1A37F336), 'Eastmarch Bounty', - Int64($5AC3A8ED), 'Falkreath Bounty', - Int64($87B12ECC), 'Favorite School', - Int64($518BBC4E), 'Favorite Shout', - Int64($41DD77A6), 'Favorite Spell', - Int64($171C5391), 'Favorite Weapon', - Int64($4F041AA2), 'Fines Paid', - Int64($9311B22B), 'Food Eaten', - Int64($57C089F7), 'Gold Found', - Int64($D20EDA4F), 'Haafingar Bounty', - Int64($516C486D), 'Hjaalmarch Bounty', - Int64($B0A1E32E), 'Horses Owned', - Int64($EBAE35E8), 'Horses Stolen', - Int64($FA024018), 'Hours Slept', - Int64($CAD2ECA1), 'Hours Waiting', - Int64($527DF857), 'Houses Owned', - Int64($47B4A015), 'Ingredients Eaten', - Int64($CE842356), 'Ingredients Harvested', - Int64($7D2E57C0), 'Intimidations', - Int64($C21702B5), 'Items Pickpocketed', - Int64($82F190C2), 'Items Stolen', - Int64($6627464B), 'Jail Escapes', - Int64($3520E710), 'Largest Bounty', - Int64($8A24FDE2), 'Locations Discovered', - Int64($5829CC2E), 'Locks Picked', - Int64($88089979), 'Magic Items Made', - Int64($7EA26C2D), 'Main Quests Completed', - Int64($7187A208), 'Mauls', - Int64($98EE55DC), 'Misc Objectives Completed', - Int64($FA06230B), 'Most Gold Carried', - Int64($D37C6909), 'Murders', - Int64($22C2CBD0), 'Necks Bitten', - Int64($BEEBCC87), 'Nirnroots Found', - Int64($56CCFC54), 'NumVampirePerks', - Int64($76A1A5C0), 'NumWerewolfPerks', - Int64($F22A8133), 'People Killed', - Int64($47A78467), 'Persuasions', - Int64($F2BAC234), 'Pockets Picked', - Int64($17C64668), 'Poisons Mixed', - Int64($7D8F2EA6), 'Poisons Used', - Int64($4228DE85), 'Potions Mixed', - Int64($9631EC11), 'Potions Used', - Int64($DE6C73FE), 'Questlines Completed', - Int64($0D7B8B16), 'Quests Completed', - Int64($BB39399E), 'Shouts Learned', - Int64($731B5333), 'Shouts Mastered', - Int64($F921D8BA), 'Shouts Unlocked', - Int64($B1AE4792), 'Side Quests Completed', - Int64($ACE470D7), 'Skill Books Read', - Int64($F33130CE), 'Skill Increases', - Int64($B556CC52), 'Sneak Attacks', - Int64($A74CBE83), 'Soul Gems Used', - Int64($C2C9E233), 'Souls Trapped', - Int64($5EC89F1A), 'Spells Learned', - Int64($B251A346), 'Standing Stones Found', - Int64($05D45702), 'Stores Invested In', - Int64($D0FE7031), 'The Companions Quests Completed', - Int64($52BA68CB), 'The Dark Brotherhood Quests Completed', - Int64($3E267D77), 'The Pale Bounty', - Int64($69B48177), 'The Reach Bounty', - Int64($50A23F69), 'The Rift Bounty', - Int64($62B2E95D), 'Thieves'' Guild Quests Completed', - Int64($944CEA93), 'Times Jailed', - Int64($50AAB633), 'Times Shouted', - Int64($99BB86D8), 'Total Lifetime Bounty', - Int64($4C252391), 'Training Sessions', - Int64($7AEA9C2B), 'Trespasses', - Int64($A67626F4), 'Tribal Orcs Bounty', - Int64($41D4BC0F), 'Undead Killed', - Int64($F39260A1), 'Vampirism Cures', - Int64($61A5C5A9), 'Weapons Disarmed', - Int64($1D3BA844), 'Weapons Improved', - Int64($25F1EA25), 'Weapons Made', - Int64($38A2DD66), 'Werewolf Transformations', - Int64($4231FA4F), 'Whiterun Bounty', - Int64($92565767), 'Wings Plucked', - Int64($C7FC518D), 'Winterhold Bounty', - Int64($949FA7BC), 'Words of Power Learned', - Int64($2C6E3FC0), 'Words of Power Unlocked' - ]); - - wbAdvanceActionEnum := wbEnum([ - 'Normal Usage', - 'Power Attack', - 'Bash', - 'Lockpick Success', - 'Lockpick Broken' - ]); - - wbAlignmentEnum := - wbEnum([ - 'Good', - 'Neutral', - 'Evil', - 'Very Good', - 'Very Evil' - ]); - - wbAxisEnum := - wbEnum([], [ - 88, 'X', - 89, 'Y', - 90, 'Z' - ]); - - wbCriticalStageEnum := - wbEnum([ - 'None', - 'Goo Start', - 'Goo End', - 'Disintegrate Start', - 'Disintegrate End' - ]); - - wbSexEnum := wbEnum(['Male','Female']); - - wbEFID := wbFormIDCk(EFID, 'Base Effect', [MGEF]); - - wbEFIT := - wbStructSK(EFIT, [3, 4], '', [ - wbFloat('Magnitude', cpNormal, True), - wbInteger('Area', itU32), - wbInteger('Duration', itU32) - ], cpNormal, True, nil, -1, wbEFITAfterLoad); - - wbCTDA := wbRStruct('Condition', [ - wbStruct(CTDA, '', [ - wbInteger('Type', itU8, wbCtdaTypeToStr, wbCtdaTypeToInt, cpNormal, False, nil, wbCtdaTypeAfterSet), - wbByteArray('Unused', 3, cpIgnore, False, wbNeverShow), - wbUnion('Comparison Value', wbCTDACompValueDecider, [ - wbFloat('Comparison Value - Float'), - wbFormIDCk('Comparison Value - Global', [GLOB]) - ]), - wbInteger('Function', itU16, wbCTDAFunctionToStr, wbCTDAFunctionToInt), - wbByteArray('Unused', 2, cpIgnore, False, wbNeverShow), - wbUnion('Parameter #1', wbCTDAParam1Decider, [ - wbByteArray('Unknown', 4), - wbByteArray('None', 4, cpIgnore), - wbInteger('Integer', itS32), - wbFloat('Float'), - wbByteArray('Variable Name (unused)', 4, cpIgnore), - wbInteger('Sex', itU32, wbSexEnum), - wbInteger('Actor Value', itS32, wbActorValueEnum), - wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - wbInteger('Axis', itU32, wbAxisEnum), - wbInteger('Quest Stage (unused)', itS32), - wbInteger('Misc Stat', itU32, wbMiscStatEnum), - wbInteger('Alignment', itU32, wbAlignmentEnum), - wbFormIDCkNoReach('Equip Type', [EQUP]), - wbInteger('Form Type', itU32, wbFormTypeEnum), - wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - wbFormIDCkNoReach('Object Reference', [NULL, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, SCRL, SLGM, INGR, FLST, LIGH, LVLI, COBJ]), - wbFormIDCkNoReach('Actor', [NULL, PLYR, ACHR, REFR]), - wbFormIDCkNoReach('Voice Type', [VTYP, FLST]), - wbFormIDCkNoReach('Idle', [IDLE]), - wbFormIDCkNoReach('Form List', [FLST]), - wbFormIDCkNoReach('Quest', [QUST]), - wbFormIDCkNoReach('Faction', [FACT]), - wbFormIDCkNoReach('Cell', [CELL]), - wbFormIDCkNoReach('Class', [CLAS]), - wbFormIDCkNoReach('Race', [RACE]), - wbFormIDCkNoReach('Actor Base', [NPC_]), - wbFormIDCkNoReach('Global', [GLOB]), - wbFormIDCkNoReach('Weather', [WTHR]), - wbFormIDCkNoReach('Package', [PACK]), - wbFormIDCkNoReach('Encounter Zone', [ECZN]), - wbFormIDCkNoReach('Perk', [PERK]), - wbFormIDCkNoReach('Owner', [NULL, FACT, NPC_]), - wbFormIDCkNoReach('Furniture', [FURN, FLST]), - wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR, SCRL]), - wbFormIDCkNoReach('Base Effect', [MGEF]), - wbFormIDCkNoReach('Worldspace', [WRLD, FLST]), - wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - wbInteger('VATS Value Param (INVALID)', itU32), - wbFormIDCkNoReach('Referenceable Object', [NULL, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, TACT, FLST, LVLI, LVSP, SPEL, SCRL, SHOU, SLGM, ENCH], [NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, TACT, LVLI, LVSP, SPEL, SCRL, SHOU, SLGM, ENCH]), - wbFormIDCkNoReach('Region', [REGN]), - wbFormIDCkNoReach('Keyword', [KYWD, NULL]), - wbInteger('Player Action', itU32, wbAdvanceActionEnum), - wbInteger('Casting Type', itU32, wbCastingSourceEnum), - wbFormIDCkNoReach('Shout', [SHOU]), - wbFormIDCkNoReach('Location', [LCTN]), - wbFormIDCkNoReach('Location Ref Type', [LCRT]), - wbInteger('Alias', itS32, wbConditionAliasToStr, wbStrToAlias), - wbInteger('Packdata ID', itU32), - wbFormIDCk('Association Type', [ASTP]), - wbInteger('Furniture Anim', itU32, wbFurnitureAnimTypeEnum), - wbInteger('Furniture Entry', itU32, wbEnum([], [$010000, 'Front', $020000, 'Behind', $040000, 'Right', $80000, 'Left', $100000, 'Up'])), - wbFormIDCk('Scene', [NULL, SCEN]), - wbInteger('Ward State', itU32, wbWardStateEnum), - wbInteger('Event', itU32, wbEventFunctionAndMemberToStr, wbEventFunctionAndMemberToInt), - wbFormID('Event Data') - ]), - wbUnion('Parameter #2', wbCTDAParam2Decider, [ - wbByteArray('Unknown', 4), - wbByteArray('None', 4, cpIgnore), - wbInteger('Integer', itS32), - wbFloat('Float'), - wbByteArray('Variable Name (unused)', 4, cpIgnore), - wbInteger('Sex', itU32, wbSexEnum), - wbInteger('Actor Value', itS32, wbActorValueEnum), - wbInteger('Crime Type', itU32, wbCrimeTypeEnum), - wbInteger('Axis', itU32, wbAxisEnum), - wbInteger('Quest Stage', itS32, wbCTDAParam2QuestStageToStr, wbCTDAParam2QuestStageToInt), - wbInteger('Misc Stat', itU32, wbMiscStatEnum), - wbInteger('Alignment', itU32, wbAlignmentEnum), - wbFormIDCkNoReach('Equip Type', [EQUP]), - wbInteger('Form Type', itU32, wbFormTypeEnum), - wbInteger('Critical Stage', itU32, wbCriticalStageEnum), - wbFormIDCkNoReach('Object Reference', [NULL, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbFormIDCkNoReach('Inventory Object', [ARMO, BOOK, MISC, WEAP, AMMO, KEYM, ALCH, SCRL, SLGM, INGR, FLST, LIGH, LVLI, COBJ]), - wbFormIDCkNoReach('Actor', [NULL, PLYR, ACHR, REFR]), - wbFormIDCkNoReach('Voice Type', [VTYP, FLST]), - wbFormIDCkNoReach('Idle', [IDLE]), - wbFormIDCkNoReach('Form List', [FLST]), - wbFormIDCkNoReach('Quest', [QUST]), - wbFormIDCkNoReach('Faction', [FACT]), - wbFormIDCkNoReach('Cell', [CELL]), - wbFormIDCkNoReach('Class', [CLAS]), - wbFormIDCkNoReach('Race', [RACE]), - wbFormIDCkNoReach('Actor Base', [NPC_]), - wbFormIDCkNoReach('Global', [GLOB]), - wbFormIDCkNoReach('Weather', [WTHR]), - wbFormIDCkNoReach('Package', [PACK]), - wbFormIDCkNoReach('Encounter Zone', [ECZN]), - wbFormIDCkNoReach('Perk', [PERK]), - wbFormIDCkNoReach('Owner', [NULL, FACT, NPC_]), - wbFormIDCkNoReach('Furniture', [FURN, FLST]), - wbFormIDCkNoReach('Effect Item', [SPEL, ENCH, ALCH, INGR, SCRL]), - wbFormIDCkNoReach('Base Effect', [MGEF]), - wbFormIDCkNoReach('Worldspace', [WRLD, FLST]), - wbInteger('VATS Value Function', itU32, wbVATSValueFunctionEnum), - wbUnion('VATS Value Param', wbCTDAParam2VATSValueParamDecider, [ - { 0} wbFormIDCkNoReach('Weapon', [WEAP]), - { 1} wbFormIDCkNoReach('Weapon List', [FLST], [WEAP]), - { 2} wbFormIDCkNoReach('Target', [NPC_]), - { 3} wbFormIDCkNoReach('Target List', [FLST], [NPC_]), - { 4} wbByteArray('Unknown', 4, cpIgnore), - { 5} wbInteger('Target Part', itS32, wbActorValueEnum), - { 6} wbInteger('VATS Action', itU32, wbEnum([ - 'Unarmed Attack', - 'One Hand Melee Attack', - 'Two Hand Melee Attack', - 'Magic Attack', - 'Ranged Attack', - 'Reload', - 'Crouch', - 'Stand', - 'Switch Weapon', - 'Toggle Weapon Drawn', - 'Heal', - 'Player Death' - ])), - { 7} wbByteArray('Unknown', 4, cpIgnore), - { 8} wbByteArray('Unknown', 4, cpIgnore), - { 9} wbFormIDCkNoReach('Critical Effect', [SPEL]), - {10} wbFormIDCkNoReach('Critical Effect List', [FLST], [SPEL]), - {11} wbByteArray('Unknown', 4, cpIgnore), - {12} wbByteArray('Unknown', 4, cpIgnore), - {13} wbByteArray('Unknown', 4, cpIgnore), - {14} wbByteArray('Unknown', 4, cpIgnore), - {15} wbInteger('Weapon Type', itU32, wbWeaponAnimTypeEnum), - {16} wbByteArray('Unknown', 4, cpIgnore), - {17} wbByteArray('Unknown', 4, cpIgnore), - {18} wbInteger('Projectile Type', itU32, wbEnum([ - 'Missile', - 'Lobber', - 'Beam', - 'Flame', - 'Cone', - 'Barrier', - 'Arrow' - ])), - {19} wbInteger('Delivery Type', itU32, wbTargetEnum), - {20} wbInteger('Casting Type', itU32, wbCastEnum) - ]), - wbFormIDCkNoReach('Referenceable Object', [NULL, NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, TACT, FLST, LVLI, LVSP, SPEL, SCRL, SHOU, SLGM, ENCH], [NPC_, PROJ, TREE, SOUN, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, MSTT, TACT, LVLI, LVSP, SPEL, SCRL, SHOU, SLGM, ENCH]), - wbFormIDCkNoReach('Region', [REGN]), - wbFormIDCkNoReach('Keyword', [KYWD, NULL]), - wbInteger('Player Action', itU32, wbAdvanceActionEnum), - wbInteger('Casting Type', itU32, wbCastingSourceEnum), - wbFormIDCkNoReach('Shout', [SHOU]), - wbFormIDCkNoReach('Location', [LCTN]), - wbFormIDCkNoReach('Location Ref Type', [LCRT]), - wbInteger('Alias', itS32, wbConditionAliasToStr, wbStrToAlias), - wbInteger('Packdata ID', itU32), - wbFormIDCk('Association Type', [ASTP]), - wbInteger('Furniture Anim', itU32, wbFurnitureAnimTypeEnum), - wbInteger('Furniture Entry', itU32, wbEnum([], [$010000, 'Front', $020000, 'Behind', $040000, 'Right', $80000, 'Left', $100000, 'Up'])), - wbFormIDCk('Scene', [NULL, SCEN]), - wbInteger('Ward State', itU32, wbWardStateEnum), - wbInteger('Event', itU32, wbEventFunctionAndMemberToStr, wbEventFunctionAndMemberToInt), - wbFormID('Event Data') - ]), - wbInteger('Run On', itU32, wbEnum([ - {0} 'Subject', - {1} 'Target', - {2} 'Reference', - {3} 'Combat Target', - {4} 'Linked Reference', - {5} 'Quest Alias', - {6} 'Package Data', - {7} 'Event Data' - ]), cpNormal, False, nil, wbCTDARunOnAfterSet), - wbUnion('Reference', wbCTDAReferenceDecider, [ - wbInteger('Unused', itU32, nil, cpIgnore), - wbFormIDCkNoReach('Reference', [NULL, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False) - ]), - wbInteger('Parameter #3', itS32, nil, cpNormal, False, nil, nil, -1) - ], cpNormal, False{, nil, 0, wbCTDAAfterLoad}), - wbString(CIS1, 'Parameter #1'), - wbString(CIS2, 'Parameter #2') - ], [], cpNormal); - - wbCTDAs := wbRArray('Conditions', wbCTDA, cpNormal, False); - wbCTDAsCount := wbRArray('Conditions', wbCTDA, cpNormal, False, nil, wbCTDAsAfterSet); - wbCTDAsReq := wbRArray('Conditions', wbCTDA, cpNormal, True); - wbCTDAsReqCount := wbRArray('Conditions', wbCTDA, cpNormal, True, nil, wbCTDAsAfterSet); - wbYNAM := wbFormIDCk(YNAM, 'Sound - Pick Up', [SNDR]); - wbZNAM := wbFormIDCk(ZNAM, 'Sound - Put Down', [SNDR]); - - wbEffectsReq := - wbRStructs('Effects', 'Effect', [ - wbEFID, - wbEFIT, - wbCTDAs - ], [], cpNormal, True); - - wbRecord(ALCH, 'Ingestible', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x20000000} 29, 'Medicine' - ])), [ - wbEDID, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbDESC, - wbMODL, - wbDEST, - wbICON, - wbYNAM, - wbZNAM, - wbETYP, - wbFloat(DATA, 'Weight', cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Value', itS32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'No Auto-Calc', - {0x00000002} 'Food Item', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Unknown 9', - {0x00000200} 'Unknown 10', - {0x00000400} 'Unknown 11', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Unknown 14', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Medicine', - {0x00020000} 'Poison' - ])), - wbFormID('Addiction'), - wbFloat('Addiction Chance'), - wbFormIDCk('Sound - Consume', [SNDR, NULL]) - ], cpNormal, True), - wbEffectsReq - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(AMMO, 'Ammunition', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbDESC, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, 'Data', [ - wbFormIDCk('Projectile', [PROJ, NULL]), - wbInteger('Flags', itU32, wbFlags([ - 'Ignores Normal Weapon Resistance', - 'Non-Playable', - 'Non-Bolt' - ])), - wbFloat('Damage'), - wbInteger('Value', itU32) - ], cpNormal, True), - wbString(ONAM, 'Short Name') - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(ANIO, 'Animated Object', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Unknown 9' // always present in updated records, not in Skyrim.esm - ]), [9]), [ - wbEDID, - wbMODL, - wbString(BNAM, 'Unload Event') - ]); - - wbRecord(ARMO, 'Armor', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable', - {0x00000040} 6, 'Shield', - {0x00000400} 10, 'Unknown 10', - {0x00008000} 15, 'Unknown 15' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbEITM, - wbInteger(EAMT, 'Enchantment Amount', itU16), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO2S - ], []), - wbICON, - wbRStruct('Female world model', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO4S - ], []), - wbICO2, - wbBODTBOD2, - wbDEST, - wbYNAM, - wbZNAM, - wbString(BMCT, 'Ragdoll Constraint Template'), - wbETYP, - wbFormIDCk(BIDS, 'Bash Impact Data Set', [IPDS]), - wbFormIDCk(BAMT, 'Alternate Block Material', [MATT]), - wbFormIDCk(RNAM, 'Race', [RACE]), - wbKSIZ, - wbKWDAs, - wbDESC, - wbRArray('Armature', wbFormIDCK(MODL, 'Model Filename', [ARMA, NULL])), - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbInteger(DNAM, 'Armor Rating', itS32, wbDiv(100), cpNormal, True), - wbFormIDCk(TNAM, 'Template Armor', [ARMO]) - ], False, nil, cpNormal, False, wbARMOAfterLoad, wbKeywordsAfterSet); - - wbRecord(ARMA, 'Armor Addon', [ - wbEDID, - wbBODTBOD2, - wbFormIDCk(RNAM, 'Race', [RACE]), - wbStruct(DNAM, 'Data', [ - wbInteger('Male Priority', itU8), - wbInteger('Female Priority', itU8), - // essentialy a number of world models for different weights (Enabled = 2 models _0.nif and _1.nif) - wbInteger('Weight slider - Male', itU8, wbFlags([ - {0x01} 'Unknown 0', - {0x02} 'Enabled' - ])), - wbInteger('Weight slider - Female', itU8, wbFlags([ - {0x01} 'Unknown 0', - {0x02} 'Enabled' - ])), - wbByteArray('Unknown', 2), - wbInteger('Detection Sound Value', itU8), - wbByteArray('Unknown', 1), - wbFloat('Weapon Adjust') - ], cpNormal, True), - wbRStruct('Male world model', [ - wbString(MOD2, 'Model Filename'), - wbByteArray(MO2T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO2S - ], [], cpNormal, False), - wbRStruct('Female world model', [ - wbString(MOD3, 'Model Filename'), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO3S - ], []), - wbRStruct('Male 1st Person', [ - wbString(MOD4, 'Model Filename'), - wbByteArray(MO4T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO4S - ], []), - wbRStruct('Female 1st Person', [ - wbString(MOD5, 'Model Filename'), - wbByteArray(MO5T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO5S - ], []), - wbFormIDCK(NAM0, 'Male Skin Texture', [TXST, NULL]), - wbFormIDCK(NAM1, 'Female Skin texture', [TXST, NULL]), - wbFormIDCK(NAM2, 'Male Skin Texture Swap List', [FLST, NULL]), - wbFormIDCK(NAM3, 'Female Skin Texture Swap List', [FLST, NULL]), - wbRArrayS('Additional Races', wbFormIDCK(MODL, 'Race', [RACE, NULL])), - wbFormIDCk(SNDD, 'Footstep Sound', [FSTS, NULL]), - wbFormIDCk(ONAM, 'Art Object', [ARTO]) - ], False, nil, cpNormal, False, wbARMAAfterLoad); - - wbRecord(BOOK, 'Book', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbLStringKC(DESC, 'Book Text', 0, cpTranslate, True), - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Teaches Skill', - {0x02} 'Can''t be Taken', - {0x04} 'Teaches Spell', - {0x08} 'Unknown 4', - {0x10} 'Unknown 5', - {0x20} 'Unknown 6', - {0x40} 'Unknown 7', - {0x80} 'Unknown 8' - ])), - wbInteger('Type', itU8, wbEnum([], [ - 0, 'Book/Tome', 255, 'Note/Scroll' - ])), - wbByteArray('Unused', 2), - wbUnion('Teaches', wbBOOKTeachesDecider, [ - wbInteger('Skill', itS32, wbSkillEnum), - wbFormIDCk('Spell', [SPEL, NULL]) - ]), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(INAM, 'Inventory Art', [STAT]), - wbLString(CNAM, 'Description', 0, cpTranslate) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); -end; - -procedure DefineTES5c; - - procedure ReferenceRecord(aSignature: TwbSignature; const aName: string); - begin - wbRecord(aSignature, aName, - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000080} 7, 'Turn Off Fire', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn' - ], True, True)), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Projectile', [PROJ, HAZD]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbOwnership, - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ], cpNormal, False, nil, 1) - ), - wbRArrayS('Linked References', wbStructSK(XLKR, [0], 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]) - ], cpNormal, False, nil, 1)), - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbFloat('Delay') - ]) - ) - ], []), - wbXESP, - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - wbEmpty(XIS2, 'Ignored by Sandbox'), - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - wbXLOD, - wbXSCL, - wbDataPosRot - ], True, wbPlacedAddInfo); - end; - -begin -{>>> - Skrim has its own ref record for every projectile type - PARW 'Arrow' - PBEA 'Beam' - PFLA 'Flame' - PCON 'Cone' (voice) - PBAR 'Barrier' - PGRE 'Traps' - PHZD 'Hazards' - I guess all of them have the same structure -<<<} - ReferenceRecord(PARW, 'Placed Arrow'); - ReferenceRecord(PBAR, 'Placed Barrier'); - ReferenceRecord(PBEA, 'Placed Beam'); - ReferenceRecord(PCON, 'Placed Cone/Voice'); - ReferenceRecord(PFLA, 'Placed Flame'); - ReferenceRecord(PGRE, 'Placed Projectile'); - ReferenceRecord(PHZD, 'Placed Hazard'); - ReferenceRecord(PMIS, 'Placed Missile'); - - wbRecord(CELL, 'Cell', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00020000} 17, 'Off Limits', - {0x00040000} 18, 'Compressed', - {0x00080000} 19, 'Can''t Wait' - ]), [18]), [ - wbEDID, - wbFULL, - {>>> - Flags can be itU8, but CELL\DATA has a critical role in various wbImplementation.pas routines - and replacing it with wbUnion generates error when setting for example persistent flag in REFR. - So let it always be an integer - <<<} - wbInteger(DATA, 'Flags', itU16, wbFlags([ - {0x0001} 'Is Interior Cell', - {0x0002} 'Has Water', - {0x0004} 'Can''t Travel From Here', - {0x0008} 'No LOD Water', - {0x0010} 'Unknown 5', - {0x0020} 'Public Area', - {0x0040} 'Hand Changed', - {0x0080} 'Show Sky', - {0x0100} 'Use Sky Lighting' - ]), cpNormal, True, False, nil, wbCELLDATAAfterSet), - wbStruct(XCLC, 'Grid', [ - wbInteger('X', itS32), - wbInteger('Y', itS32), - wbInteger('Force Hide Land', itU32, wbFlags([ - 'Quad 1', - 'Quad 2', - 'Quad 3', - 'Quad 4' - ], True)) - ], cpNormal, False, nil, 2), - wbStruct(XCLL, 'Lighting', [ - wbByteColors('Ambient Color'), - wbByteColors('Directional Color'), - wbByteColors('Fog Color Near'), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Distance'), - wbFloat('Fog Power'), - wbAmbientColors('Ambient Colors'), - wbByteColors('Fog Color Far'), - wbFloat('Fog Max'), - wbFloat('Light Fade Begin'), - wbFloat('Light Fade End'), - wbInteger('Inherits', itU32, wbFlags([ - {0x00000001}'Ambient Color', - {0x00000002}'Directional Color', - {0x00000004}'Fog Color', - {0x00000008}'Fog Near', - {0x00000010}'Fog Far', - {0x00000020}'Directional Rotation', - {0x00000040}'Directional Fade', - {0x00000080}'Clip Distance', - {0x00000100}'Fog Power', - {0x00000200}'Fog Max', - {0x00000400}'Light Fade Distances' - ])) - ], cpNormal, False, nil, 11), - - wbTVDT, - wbMaxHeightDataCELL, - wbFormIDCk(LTMP, 'Lighting Template', [LGTM, NULL], False, cpNormal, True), - wbByteArray(LNAM, 'Unknown', 0, cpIgnore), // leftover flags, they are now in XCLC - - {>>> XCLW sometimes has $FF7FFFFF and causes invalid floation point <<<} - wbFloat(XCLW, 'Water Height', cpNormal, False, 1, -1, nil, nil, 0, wbCELLXCLWGetConflictPriority), - //wbByteArray(XCLW, 'Water Height', 4), - wbString(XNAM, 'Water Noise Texture'), - wbArrayS(XCLR, 'Regions', wbFormIDCk('Region', [REGN])), - wbFormIDCk(XLCN, 'Location', [LCTN]), - wbByteArray(XWCN, 'Unknown', 0, cpIgnore), // leftover - wbByteArray(XWCS, 'Unknown', 0, cpIgnore), // leftover - wbStruct(XWCU, 'Water Velocity', [ - wbFloat('X Offset'), - wbFloat('Y Offset'), - wbFloat('Z Offset'), - wbByteArray('Unknown', 4), - wbFloat('X Angle'), - wbFloat('Y Angle'), - wbFloat('Z Angle'), - wbByteArray('Unknown', 0) - ]), - wbFormIDCk(XCWT, 'Water', [WATR]), - wbOwnership, - wbFormIDCk(XILL, 'Lock List', [FLST, NPC_]), - wbString(XWEM, 'Water Environment Map'), - wbFormIDCk(XCCM, 'Sky/Weather from Region', [REGN]), - wbFormIDCk(XCAS, 'Acoustic Space', [ASPC]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - wbFormIDCk(XCMO, 'Music Type', [MUSC]), - wbFormIDCk(XCIM, 'Image Space', [IMGS]) - ], True, wbCellAddInfo, cpNormal, False, wbCELLAfterLoad); - - - wbRecord(CLAS, 'Class', [ - wbEDID, - wbFULLReq, - wbDESCReq, - wbICON, - wbStruct(DATA, '', [ - wbByteArray('Unknown', 4), - wbInteger('Teaches', itS8, wbEnum([ - 'One Handed', - 'Two Handed', - 'Archery', - 'Block', - 'Smithing', - 'Heavy Armor', - 'Light Armor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speech', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ])), - wbInteger('Maximum training level', itU8), - wbArray('Skill Weights', wbInteger('Weight', itU8), [ - 'One Handed', - 'Two Handed', - 'Archery', - 'Block', - 'Smithing', - 'Heavy Armor', - 'Light Armor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speech', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ]), - wbFloat('Bleedout Default'), - wbInteger('Voice Points', itU32), - wbArray('Attribute Weights', wbInteger('Weight', itU8), [ - 'Health', - 'Magicka', - 'Stamina', - 'Unknown' - ]) - ], cpNormal, True) - ]); - - wbRecord(CLMT, 'Climate', [ - wbEDID, - wbArrayS(WLST, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR, NULL]), - wbInteger('Chance', itS32), - wbFormIDCk('Global', [GLOB, NULL]) - ])), - wbString(FNAM, 'Sun Texture'), - wbString(GNAM, 'Sun Glare Texture'), - wbMODL, - wbStruct(TNAM, 'Timing', [ - wbStruct('Sunrise', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbStruct('Sunset', [ - wbInteger('Begin', itU8, wbClmtTime), - wbInteger('End', itU8, wbClmtTime) - ]), - wbInteger('Volatility', itU8), - wbInteger('Moons / Phase Length', itU8, wbClmtMoonsPhaseLength) - ], cpNormal, True) - ]); - - wbRecord(SPGD, 'Shader Particle Geometry', [ - wbEDID, - // FO4 SPGD format for Form Version 44 - wbUnion(DATA, '', wbSPGDFormatDecider, [ - wbStruct('Data', [ - wbFloat('Gravity Velocity'), - wbByteArray('Unknown', 4), - wbFloat('Rotation Velocity'), - wbByteArray('Unknown', 4), - wbFloat('Particle Size X'), - wbFloat('Center Offset Min'), - wbFloat('Particle Size Y'), - wbByteArray('Unknown', 4), - wbFloat('Center Offset Min'), - wbByteArray('Unknown', 4), - wbFloat('Center Offset Max'), - wbByteArray('Unknown', 4), - wbFloat('Initial Rotation'), - wbByteArray('Unknown', 4), - wbInteger('# of Subtextures X', itU32), - wbByteArray('Unknown', 4), - wbInteger('# of Subtextures Y', itU32), - wbByteArray('Unknown', 4), - wbInteger('Type', itU32, wbEnum([ - 'Rain', - 'Snow' - ])), - wbByteArray('Unknown', 4), - wbInteger('Box Size', itU32), - wbByteArray('Unknown', 4), - wbFloat('Particle Density'), - wbByteArray('Unknown', 4) - ], cpNormal, True), - wbStruct('Data', [ - wbFloat('Gravity Velocity'), - wbFloat('Rotation Velocity'), - wbFloat('Particle Size X'), - wbFloat('Particle Size Y'), - wbFloat('Center Offset Min'), - wbFloat('Center Offset Max'), - wbFloat('Initial Rotation Range'), - wbInteger('# of Subtextures X', itU32), - wbInteger('# of Subtextures Y', itU32), - wbInteger('Type', itU32, wbEnum([ - 'Rain', - 'Snow' - ])), - wbInteger('Box Size', itU32), - wbFloat('Particle Density') - ], cpNormal, True, nil, 10) - ]), - wbString(ICON, 'Particle Texture') - ]); - - wbRecord(RFCT, 'Visual Effect', [ - wbEDID, - wbStruct(DATA, 'Effect Data', [ - wbFormIDCK('Effect Art', [ARTO, NULL]), - wbFormIDCK('Shader', [EFSH, NULL]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Rotate to Face Target', - {0x00000002}'Attach to Camera', - {0x00000004}'Inherit Rotation' - ])) - ], cpNormal, True) - ]); - - wbRecord(CONT, 'Container', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbCOCT, - wbCNTOs, - wbDEST, - wbStruct(DATA, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Allow Sounds When Animation', - {0x02} 'Respawns', - {0x04} 'Show Owner' - ])), - wbFloat('Weight') - ], cpNormal, True), - wbFormIDCk(SNAM, 'Sound - Open', [SNDR]), - wbFormIDCk(QNAM, 'Sound - Close', [SNDR]) - ], True, nil, cpNormal, False, nil, wbContainerAfterSet); - - wbCSDT := wbRStructSK([0], 'Sound Type', [ - wbInteger(CSDT, 'Type', itU32,wbEnum([ - {00} 'Left Foot', - {01} 'Right Foot', - {02} 'Left Back Foot', - {03} 'Right Back Foot', - {04} 'Idle', - {05} 'Aware', - {06} 'Attack', - {07} 'Hit', - {08} 'Death', - {09} 'Weapon', - {10} 'Movement Loop', - {11} 'Conscious Loop', - {12} 'Auxiliary 1', - {13} 'Auxiliary 2', - {14} 'Auxiliary 3', - {15} 'Auxiliary 4', - {16} 'Auxiliary 5', - {17} 'Auxiliary 6', - {18} 'Auxiliary 7', - {19} 'Auxiliary 8', - {19} 'Auxiliary 8', - {20} 'Jump', - {21} 'PlayRandom/Loop' - ])), - wbRArrayS('Sounds', wbRStructSK([0], 'Sound', [ - wbFormIDCk(CSDI, 'Sound', [SNDR, NULL], False, cpNormal, True), - wbInteger(CSDC, 'Sound Chance', itU8, nil, cpNormal, True) - ], []), cpNormal, True) - ], []); - - wbCSDTs := wbRArrayS('Sound Types', wbCSDT, cpNormal, False, nil, nil, nil{wbActorTemplateUseModelAnimation}); - - wbAIDT := - wbStruct(AIDT, 'AI Data', [ - {00} wbInteger('Aggression', itU8, wbEnum([ - 'Unaggressive', - 'Aggressive', - 'Very Aggressive', - 'Frenzied' - ])), - {01} wbInteger('Confidence', itU8, wbEnum([ - 'Cowardly', - 'Cautious', - 'Average', - 'Brave', - 'Foolhardy' - ])), - {02} wbInteger('Energy Level', itU8), - {03} wbInteger('Responsibility', itU8, wbEnum([ - 'Any crime', - 'Violence against enemies', - 'Property crime only', - 'No crime' - ])), - {04} wbInteger('Mood', itU8, wbEnum([ - 'Neutral', - 'Angry', - 'Fear', - 'Happy', - 'Sad', - 'Surprised', - 'Puzzled', - 'Disgusted' - ])), - wbInteger('Assistance', itU8, wbEnum([ - 'Helps Nobody', - 'Helps Allies', - 'Helps Friends and Allies' - ])), - wbStruct('Aggro', [ - wbInteger('Aggro Radius Behavior', itU8, wbEnum(['False', 'True'])), - wbInteger('Unknown', itU8), - wbInteger('Warn', itU32), - wbInteger('Warn/Attack', itU32), - wbInteger('Attack', itU32) - ]) - ], cpNormal, True, nil{wbActorTemplateUseAIData}); - - wbAttackAnimationEnum := wbEnum([], [ - 26, 'AttackLeft', - 32, 'AttackRight', - 38, 'Attack3', - 44, 'Attack4', - 50, 'Attack5', - 56, 'Attack6', - 62, 'Attack7', - 68, 'Attack8', - 74, 'AttackLoop', - 80, 'AttackSpin', - 86, 'AttackSpin2', - 97, 'PlaceMine', - 103, 'PlaceMine2', - 109, 'AttackThrow', - 115, 'AttackThrow2', - 121, 'AttackThrow3', - 127, 'AttackThrow4', - 133, 'AttackThrow5', - 255, ' DEFAULT' - ]); - - wbRecord(CSTY, 'Combat Style', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Allow Dual Wielding' - ])), [ - wbEDID, - wbStruct(CSGD, 'General', [ - wbFloat('Offensive Mult'), - wbFloat('Defensive Mult'), - wbFloat('Group Offensive Mult'), - // keep as separate floats, some elements can be omitted - wbFloat('Equipment Score Mult - Melee'), - wbFloat('Equipment Score Mult - Magic'), - wbFloat('Equipment Score Mult - Ranged'), - wbFloat('Equipment Score Mult - Shout'), - wbFloat('Equipment Score Mult - Unarmed'), - wbFloat('Equipment Score Mult - Staff'), - wbFloat('Avoid Threat Chance') - ], cpNormal, True, nil, 0), - wbUnknown(CSMD, cpIgnore), - wbStruct(CSME, 'Melee', [ - wbFloat('Attack Staggered Mult'), - wbFloat('Power Attack Staggered Mult'), - wbFloat('Power Attack Blocking Mult'), - wbFloat('Bash Mult'), - wbFloat('Bash Recoil Mult'), - wbFloat('Bash Attack Mult'), - wbFloat('Bash Power Attack Mult'), - wbFloat('Special Attack Mult') - ], cpNormal, False, nil, 0), - wbStruct(CSCR, 'Close Range', [ - wbFloat('Circle Mult'), - wbFloat('Fallback Mult'), - wbFloat('Flank Distance'), - wbFloat('Stalk Time') - ], cpNormal, False, nil, 0), - wbStruct(CSLR, 'Long Range', [ - wbFloat('Strafe Mult') - ], cpNormal, False), - wbStruct(CSFL, 'Flight', [ - wbFloat('Hover Chance'), - wbFloat('Dive Bomb Chance'), - wbFloat('Ground Attack Chance'), - wbFloat('Hover Time'), - wbFloat('Ground Attack Time'), - wbFloat('Perch Attack Chance'), - wbFloat('Perch Attack Time'), - wbFloat('Flying Attack Chance') - ], cpNormal, False, nil, 0), - wbInteger(DATA, 'Flags', itU32, wbFlags([ - {0x01} 'Dueling', - {0x02} 'Flanking', - {0x04} 'Allow Dual Wielding' - ]), cpNormal, False) - ]); -end; - -procedure DefineTES5d; -begin - wbRecord(DIAL, 'Dialog Topic', [ - wbEDID, - wbFULL, - wbFloat(PNAM, 'Priority', cpNormal, True, 1, -1, nil, nil, 50.0), - wbFormIDCk(BNAM, 'Branch', [DLBR, NULL]), - wbFormIDCk(QNAM, 'Quest', [QUST, NULL], False, cpNormal, False), - wbStruct(DATA, 'Data', [ - // this should not be named Flags since TwbFile.BuildReachable - // expects Top-Level flag here from FNV - wbInteger('Topic Flags', itU8, wbFlags([ - 'Do All Before Repeating' - ]), cpNormal, True), - wbInteger('Category', itU8, wbEnum([ - {0} 'Topic', - {1} 'Favor', // only in DA14 quest topics - {2} 'Scene', - {3} 'Combat', - {4} 'Favors', - {5} 'Detection', - {6} 'Service', - {7} 'Miscellaneous' - ])), - wbInteger('Subtype', itU16, wbEnum([], [ - 0, 'Custom', - 1, 'ForceGreet', - 2, 'Rumors', - 3, 'Custom?', - 4, 'Intimidate', - 5, 'Flatter', - 6, 'Bribe', - 7, 'Ask Gift', - 8, 'Gift', - 9, 'Ask Favor', - 10, 'Favor', - 11, 'Show Relationships', - 12, 'Folow', - 13, 'Reject', - 14, 'Scene', - 15, 'Show', - 16, 'Agree', - 17, 'Refuse', - 18, 'ExitFavorState', - 19, 'MoralRefusal', - 20, 'FlyingMountLand', - 21, 'FlyingMountCancelLand', - 22, 'FlyingMountAcceptTarget', - 23, 'FlyingMountRejectTarget', - 24, 'FlyingMountNoTarget', - 25, 'FlyingMountDestinationReached', - 26, 'Attack', - 27, 'PowerAttack', - 28, 'Bash', - 29, 'Hit', - 30, 'Flee', - 31, 'Bleedout', - 32, 'AvoidThreat', - 33, 'Death', - 34, 'GroupStrategy', - 35, 'Block', - 36, 'Taunt', - 37, 'AllyKilled', - 38, 'Steal', - 39, 'Yield', - 40, 'AcceptYield', - 41, 'PickpocketCombat', - 42, 'Assault', - 43, 'Murder', - 44, 'AssaultNC', - 45, 'MurderNC', - 46, 'PickpocketNC', - 47, 'StealFromNC', - 48, 'TrespassAgainstNC', - 49, 'Trespass', - 50, 'WereTransformCrime', - 51, 'VoicePowerStartShort', - 52, 'VoicePowerStartLong', - 53, 'VoicePowerEndShort', - 54, 'VoicePowerEndLong', - 55, 'AlertIdle', - 56, 'LostIdle', - 57, 'NormalToAlert', - 58, 'AlertToCombat', - 59, 'NormalToCombat', - 60, 'AlertToNormal', - 61, 'CombatToNormal', - 62, 'CombatToLost', - 63, 'LostToNormal', - 64, 'LostToCombat', - 65, 'DetectFriendDie', - 66, 'ServiceRefusal', - 67, 'Repair', - 68, 'Travel', - 69, 'Training', - 70, 'BarterExit', - 71, 'RepairExit', - 72, 'Recharge', - 73, 'RechargeExit', - 74, 'TrainingExit', - 75, 'ObserveCombat', - 76, 'NoticeCorpse', - 77, 'TimeToGo', - 78, 'GoodBye', - 79, 'Hello', - 80, 'SwingMeleeWeapon', - 81, 'ShootBow', - 82, 'ZKeyObject', - 83, 'Jump', - 84, 'KnockOverObject', - 85, 'DestroyObject', - 86, 'StandonFurniture', - 87, 'LockedObject', - 88, 'PickpocketTopic', - 89, 'PursueIdleTopic', - 90, 'SharedInfo', - 91, 'PlayerCastProjectileSpell', - 92, 'PlayerCastSelfSpell', - 93, 'PlayerShout', - 94, 'Idle', - 95, 'EnterSprintBreath', - 96, 'EnterBowZoomBreath', - 97, 'ExitBowZoomBreath', - 98, 'ActorCollidewithActor', - 99, 'PlayerinIronSights', - 100, 'OutofBreath', - 101, 'CombatGrunt', - 102, 'LeaveWaterBreath' - ])) - ]), - wbString(SNAM, 'Subtype Name', 4), - wbInteger(TIFC, 'Info Count', itU32, nil, cpBenign) - ]); - - wbRecord(DOOR, 'Door', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00800000} 23, 'Is Marker' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbFormIDCk(SNAM, 'Sound - Open', [SNDR]), - wbFormIDCk(ANAM, 'Sound - Close', [SNDR]), - wbFormIDCk(BNAM, 'Sound - Loop', [SNDR]), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - '', - 'Automatic', - 'Hidden', - 'Minimal Use', - 'Sliding', - 'Do Not Open in Combat Search' - ]), cpNormal, True) - ]); - - wbBlendModeEnum := wbEnum([ - '', - 'Zero', - 'One', - 'Source Color', - 'Source Inverse Color', - 'Source Alpha', - 'Source Inverted Alpha', - 'Dest Alpha', - 'Dest Inverted Alpha', - 'Dest Color', - 'Dest Inverse Color', - 'Source Alpha SAT' - ]); - - wbBlendOpEnum := wbEnum([ - '', - 'Add', - 'Subtract', - 'Reverse Subtract', - 'Minimum', - 'Maximum' - ]); - - wbZTestFuncEnum := wbEnum([ - '', - '', - '', - 'Equal To', - 'Normal', - 'Greater Than', - '', - 'Greater Than or Equal To', - 'Always Show' - ]); - - wbRecord(EFSH, 'Effect Shader', [ - wbEDID, - wbString(ICON, 'Fill Texture'), - wbString(ICO2, 'Particle Shader Texture'), - wbString(NAM7, 'Holes Texture'), - wbString(NAM8, 'Membrane Palette Texture'), - wbString(NAM9, 'Particle Palette Texture'), - wbStruct(DATA, '', [ - wbByteArray('Unknown', 4), - wbInteger('Membrane Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Membrane Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Membrane Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbByteColors('Fill/Texture Effect - Color Key 1'), - wbFloat('Fill/Texture Effect - Alpha Fade In Time'), - wbFloat('Fill/Texture Effect - Full Alpha Time'), - wbFloat('Fill/Texture Effect - Alpha Fade Out Time'), - wbFloat('Fill/Texture Effect - Presistent Alpha Ratio'), - wbFloat('Fill/Texture Effect - Alpha Pulse Amplitude'), - wbFloat('Fill/Texture Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (U)'), - wbFloat('Fill/Texture Effect - Texture Animation Speed (V)'), - wbFloat('Edge Effect - Fall Off'), - wbByteColors('Edge Effect - Color'), - wbFloat('Edge Effect - Alpha Fade In Time'), - wbFloat('Edge Effect - Full Alpha Time'), - wbFloat('Edge Effect - Alpha Fade Out Time'), - wbFloat('Edge Effect - Persistent Alpha Ratio'), - wbFloat('Edge Effect - Alpha Pulse Amplitude'), - wbFloat('Edge Effect - Alpha Pulse Frequency'), - wbFloat('Fill/Texture Effect - Full Alpha Ratio'), - wbFloat('Edge Effect - Full Alpha Ratio'), - wbInteger('Membrane Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Source Blend Mode', itU32, wbBlendModeEnum), - wbInteger('Particle Shader - Blend Operation', itU32, wbBlendOpEnum), - wbInteger('Particle Shader - Z Test Function', itU32, wbZTestFuncEnum), - wbInteger('Particle Shader - Dest Blend Mode', itU32, wbBlendModeEnum), - wbFloat('Particle Shader - Particle Birth Ramp Up Time'), - wbFloat('Particle Shader - Full Particle Birth Time'), - wbFloat('Particle Shader - Particle Birth Ramp Down Time'), - wbFloat('Particle Shader - Full Particle Birth Ratio'), - wbFloat('Particle Shader - Persistant Particle Count'), - wbFloat('Particle Shader - Particle Lifetime'), - wbFloat('Particle Shader - Particle Lifetime +/-'), - wbFloat('Particle Shader - Initial Speed Along Normal'), - wbFloat('Particle Shader - Acceleration Along Normal'), - wbFloat('Particle Shader - Initial Velocity #1'), - wbFloat('Particle Shader - Initial Velocity #2'), - wbFloat('Particle Shader - Initial Velocity #3'), - wbFloat('Particle Shader - Acceleration #1'), - wbFloat('Particle Shader - Acceleration #2'), - wbFloat('Particle Shader - Acceleration #3'), - wbFloat('Particle Shader - Scale Key 1'), - wbFloat('Particle Shader - Scale Key 2'), - wbFloat('Particle Shader - Scale Key 1 Time'), - wbFloat('Particle Shader - Scale Key 2 Time'), - wbByteColors('Color Key 1 - Color'), - wbByteColors('Color Key 2 - Color'), - wbByteColors('Color Key 3 - Color'), - wbFloat('Color Key 1 - Color Alpha'), - wbFloat('Color Key 2 - Color Alpha'), - wbFloat('Color Key 3 - Color Alpha'), - wbFloat('Color Key 1 - Color Key Time'), - wbFloat('Color Key 2 - Color Key Time'), - wbFloat('Color Key 3 - Color Key Time'), - wbFloat('Particle Shader - Initial Speed Along Normal +/-'), - wbFloat('Particle Shader - Initial Rotation (deg)'), - wbFloat('Particle Shader - Initial Rotation (deg) +/-'), - wbFloat('Particle Shader - Rotation Speed (deg/sec)'), - wbFloat('Particle Shader - Rotation Speed (deg/sec) +/-'), - wbFormIDCk('Addon Models', [DEBR, NULL]), - wbFloat('Holes - Start Time'), - wbFloat('Holes - End Time'), - wbFloat('Holes - Start Val'), - wbFloat('Holes - End Val'), - wbFloat('Edge Width (alpha units)'), - wbByteColors('Edge Color'), - wbFloat('Explosion Wind Speed'), - wbInteger('Texture Count U', itU32), - wbInteger('Texture Count V', itU32), - wbFloat('Addon Models - Fade In Time'), - wbFloat('Addon Models - Fade Out Time'), - wbFloat('Addon Models - Scale Start'), - wbFloat('Addon Models - Scale End'), - wbFloat('Addon Models - Scale In Time'), - wbFloat('Addon Models - Scale Out Time'), - wbFormIDCk('Ambient Sound', [SNDR, SOUN, NULL]), - wbByteColors('Fill/Texture Effect - Color Key 2'), - wbByteColors('Fill/Texture Effect - Color Key 3'), - wbStruct('Fill/Texture Effect - Color Key Scale/Time', [ - wbFloat('Color Key 1 - Scale'), - wbFloat('Color Key 2 - Scale'), - wbFloat('Color Key 3 - Scale'), - wbFloat('Color Key 1 - Time'), - wbFloat('Color Key 2 - Time'), - wbFloat('Color Key 3 - Time') - ]), - wbFloat('Color Scale'), - wbFloat('Birth Position Offset'), - wbFloat('Birth Position Offset Range +/-'), - wbStruct('Particle Shader Animated', [ - wbInteger('Start Frame', itU32), - wbInteger('Start Frame Variation', itU32), - wbInteger('End Frame', itU32), - wbInteger('Loop Start Frame', itU32), - wbInteger('Loop Start Variation', itU32), - wbInteger('Frame Count', itU32), - wbInteger('Frame Count Variation', itU32) - ]), - wbInteger('Flags', itU32, wbFlags([ - 'No Membrane Shader', - 'Membrane Grayscale Color', - 'Membrane Grayscale Alpha', - 'No Particle Shader', - 'Edge Effect Inverse', - 'Affect Skin Only', - 'Ignore Alpha', - 'Project UVs', - 'Ignore Base Geometry Alpha', - 'Lighting', - 'No Weapons', - 'Unknown 11', - 'Unknown 12', - 'Unknown 13', - 'Unknown 14', - 'Particle Animated', - 'Particle Grayscale Color', - 'Particle Grayscale Alpha', - 'Unknown 18', - 'Unknown 19', - 'Unknown 20', - 'Unknown 21', - 'Unknown 22', - 'Unknown 23', - 'Use Blood Geometry' - ])), - wbFloat('Fill/Texture Effect - Texture Scale (U)'), - wbFloat('Fill/Texture Effect - Texture Scale (V)'), - wbInteger('Scene Graph Emit Depth Limit (unused)', itU32) - ], cpNormal, True, nil, 0) - ], False, nil, cpNormal, False, nil {wbEFSHAfterLoad}); - - wbRecord(ENCH, 'Object Effect', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Enchantment Cost', itS32), - wbInteger('Flags', itU32, wbFlags([ - 'No Auto-Calc', - '', - 'Extend Duration On Recast' - ])), - wbInteger('Cast Type', itU32, wbCastEnum), - wbInteger('Enchantment Amount', itS32), - wbInteger('Target Type', itU32, wbTargetEnum), - wbInteger('Enchant Type', itU32, wbEnum([], [ - $06, 'Enchantment', - $0C, 'Staff Enchantment' - ])), - wbFloat('Charge Time'), - wbFormIDCk('Base Enchantment', [ENCH, NULL]), - wbFormIDCk('Worn Restrictions', [FLST, NULL]) - ], cpNormal, True, nil, 8), - wbEffectsReq - ]); - - wbRecord(EYES, 'Eyes', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbFULLReq, - wbString(ICON, 'Texture', 0, cpNormal, True), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01}'Playable', - {0x02}'Not Male', - {0x04}'Not Female', - {0x08}'Unknown 4', - {0x10}'Unknown 5', - {0x20}'Unknown 6', - {0x40}'Unknown 7', - {0x80}'Unknown 8' - ]), cpNormal, True) - ]); - - wbRecord(FACT, 'Faction', [ - wbEDID, - wbFULL, - wbRArrayS('Relations', - wbStructSK(XNAM, [0], 'Relation', [ - wbFormIDCkNoReach('Faction', [FACT, RACE]), - wbInteger('Modifier', itS32), - wbInteger('Group Combat Reaction', itU32, wbEnum([ - {0x00000001}'Neutral', - {0x00000002}'Enemy', - {0x00000004}'Ally', - {0x00000008}'Friend' - ])) - ])), - wbStruct(DATA, 'Flags', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Hidden From NPC', - {0x00000002}'Special Combat', - {0x00000004}'Unknown 3', - {0x00000008}'Unknown 4', - {0x00000010}'Unknown 5', - {0x00000020}'Unknown 6', - {0x00000040}'Track Crime', - {0x00000080}'Ignore Crimes: Murder', - {0x00000100}'Ignore Crimes: Assault', - {0x00000200}'Ignore Crimes: Stealing', - {0x00000400}'Ignore Crimes: Trespass', - {0x00000800}'Do Not Report Crimes Against Members', - {0x00001000}'Crime Gold - Use Defaults', - {0x00002000}'Ignore Crimes: Pickpocket', - {0x00004000}'Vendor', - {0x00008000}'Can Be Owner', - {0x00010000}'Ignore Crimes: Werewolf', - {0x00020000}'Unknown 18', - {0x00040000}'Unknown 19', - {0x00080000}'Unknown 20', - {0x00100000}'Unknown 21', - {0x00200000}'Unknown 22', - {0x00400000}'Unknown 23', - {0x00800000}'Unknown 24', - {0x01000000}'Unknown 25', - {0x02000000}'Unknown 26', - {0x04000000}'Unknown 27', - {0x08000000}'Unknown 28', - {0x10000000}'Unknown 29', - {0x20000000}'Unknown 30', - {0x40000000}'Unknown 31', - {0x80000000}'Unknown 32' - ])) - ], cpNormal, True, nil, 1), - wbFormIDCk(JAIL, 'Exterior Jail Marker', [REFR]), - wbFormIDCk(WAIT, 'Follower Wait Marker', [REFR]), - wbFormIDCk(STOL, 'Stolen Goods Container', [REFR]), - wbFormIDCk(PLCN, 'Player Inventory Container', [REFR]), - wbFormIDCk(CRGR, 'Shared Crime Faction List', [FLST]), - wbFormIDCk(JOUT, 'Jail Outfit', [OTFT]), - wbStruct(CRVA, 'Crime Values', [ - {01} wbInteger('Arrest', itU8, wbEnum(['False', 'True'])), - {02} wbInteger('Attack On Sight', itU8, wbEnum(['False', 'True'])), - {02} wbInteger('Murder', itU16), - {02} wbInteger('Assault', itU16), - {02} wbInteger('Trespass', itU16), - {02} wbInteger('Pickpocket', itU16), - {02} wbInteger('Unknown', itU16), - {02} wbFloat('Steal Multiplier'), - {02} wbInteger('Escape', itU16), - {02} wbInteger('Werewolf', itU16) - ], cpNormal, False, nil, 7), - wbRStructsSK('Ranks', 'Rank', [0], [ - wbInteger(RNAM, 'Rank#', itU32), - wbLString(MNAM, 'Male Title', 0, cpTranslate), - wbLString(FNAM, 'Female Title', 0, cpTranslate), - wbString(INAM, 'Insignia Unused') - ], []), - wbFormIDCk(VEND, 'Vendor Buy/Sell List', [FLST]), - wbFormIDCk(VENC, 'Merchant Container', [REFR]), - wbStruct(VENV, 'Vendor Values', [ - {01} wbInteger('Start Hour', itU16), - {02} wbInteger('End Hour', itU16), - {02} wbInteger('Radius', itU16), - {02} wbByteArray('Unknown 1', 2), - wbInteger('Only Buys Stolen Items', itU8, wbEnum(['False', 'True'])), - wbInteger('Not/Sell Buy', itU8, wbEnum(['False', 'True'])), - {02} wbByteArray('Unknown 2', 2) - ]), - wbPLVD, - wbCITC, - wbCTDAsCount - ], False, nil, cpNormal, False, nil {wbFACTAfterLoad}, wbConditionsAfterSet); - - wbRecord(FURN, 'Furniture', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000080} 7, 'Is Perch', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00800000} 23, 'Is Marker', - {0x10000000} 28, 'Must Exit To Talk', - {0x20000000} 29, 'Child Can Use' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbUnknown(PNAM), - wbInteger(FNAM, 'Flags', itU16, wbFlags([ - {0x0001} 'Unknown 0', - {0x0002} 'Ignored By Sandbox' - ])), - wbFormIDCk(KNAM, 'Interaction Keyword', [KYWD, NULL]), - wbInteger(MNAM, 'Active Markers / Flags', itU32, wbFlags([ - {0x00000001} 'Sit 0', - {0x00000002} 'Sit 1', - {0x00000004} 'Sit 2', - {0x00000008} 'Sit 3', - {0x00000010} 'Sit 4', - {0x00000020} 'Sit 5', - {0x00000040} 'Sit 6', - {0x00000080} 'Sit 7', - {0x00000100} 'Sit 8', - {0x00000200} 'Sit 9', - {0x00000400} 'Sit 10', - {0x00000800} 'Sit 11', - {0x00001000} 'Sit 12', - {0x00002000} 'Sit 13', - {0x00004000} 'Sit 14', - {0x00008000} 'Sit 15', - {0x00010000} 'Sit 16', - {0x00020000} 'Sit 17', - {0x00040000} 'Sit 18', - {0x00080000} 'Sit 19', - {0x00100000} 'Sit 20', - {0x00200000} 'Sit 21', - {0x00400000} 'Sit 22', - {0x00800000} 'Sit 23', - {0x01000000} 'Unknown 25', - {0x02000000} 'Disables Activation', - {0x04000000} 'Is Perch', - {0x08000000} 'Must Exit to Talk', - {0x10000000} 'Unknown 29', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbStruct(WBDT, 'Workbench Data', [ - wbInteger('Bench Type', itU8, wbEnum([ - {0} 'None', - {1} 'Create object', - {2} 'Smithing Weapon', - {3} 'Enchanting', - {4} 'Enchanting Experiment', - {5} 'Alchemy', - {6} 'Alchemy Experiment', - {7} 'Smithing Armor' - ])), - wbInteger('Uses Skill', itS8, wbSkillEnum) - ]), - wbFormIDCk(NAM1, 'Associated Spell', [SPEL]), - wbRArray('Markers', wbRStruct('Marker', [ - wbInteger(ENAM, 'Marker Index', itU32), - wbStruct(NAM0, 'Disabled Entry Points', [ - wbByteArray('Unknown', 2), - wbInteger('Disabled Points', itU16, wbFurnitureEntryTypeFlags) - ]), - wbFormIDCk(FNMK, 'Marker Keyword', [KYWD, NULL]) - ], [])), - wbRArray('Marker Entry Points', wbStruct(FNPR, 'Marker', [ - wbInteger('Type', itU16, wbFurnitureAnimTypeEnum), - wbInteger('Entry Points', itU16, wbFurnitureEntryTypeFlags) - ])), - wbString(XMRK, 'Model Filename') - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - -//---------------------------------------------------------------------------- -// For expansion to use wbGLOBUnionDecider to display Short, Long, Float -// correctly without making a signed float by default -//---------------------------------------------------------------------------- - wbRecord(GLOB, 'Global', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Constant' - ])), [ - wbEDID, - wbInteger(FNAM, 'Type', itU8, wbGLOBFNAM, nil, cpNormal, True), - wbFloat(FLTV, 'Value', cpNormal, True) - ]); - - wbRecord(GMST, 'Game Setting', [ - wbString(EDID, 'Editor ID', 0, cpCritical, True, nil, wbGMSTEDIDAfterSet), - wbUnion(DATA, 'Value', wbGMSTUnionDecider, [ - wbLString('Name', 0, cpTranslate), - wbInteger('Int', itS32), - wbFloat('Float'), - wbInteger('Bool', itU32, wbEnum(['False', 'True'])) - ], cpNormal, True) - ]); - - wbRecord(KYWD, 'Keyword', [ - wbEDID, - wbCNAM - ]); -end; - -procedure DefineTES5e; -begin - wbRecord(LCRT, 'Location Reference Type', [ - wbEDID, - wbCNAM - ]); - - wbRecord(AACT, 'Action', [ - wbEDID, - wbCNAM - ]); - - wbRecord(TXST, 'Texture Set', [ - wbEDID, - wbOBNDReq, - wbRStruct('Textures (RGB/A)', [ - wbString(TX00,'Difuse'), - wbString(TX01,'Normal/Gloss'), - wbString(TX02,'Environment Mask/Subsurface Tint'), - wbString(TX03,'Glow/Detail Map'), - wbString(TX04,'Height'), - wbString(TX05,'Environment'), - wbString(TX06,'Multilayer'), - wbString(TX07,'Backlight Mask/Specular') - ], []), - wbDODT, - wbInteger(DNAM, 'Flags', itU16, wbFlags([ - {0x0001}'No Specular Map', - {0x0002}'Facegen Textures', - {0x0004}'Has Model Space Normal Map' - ]), cpNormal, False) - ]); - - wbRecord(HDPT, 'Head Part', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbFULL, - wbMODL, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Playable', - {0x02} 'Male', - {0x04} 'Female', - {0x10} 'Is Extra Part', - {0x20} 'Use Solid Tint' - ]), cpNormal, True), - wbInteger(PNAM, 'Type', itU32, wbEnum([ - 'Misc', - 'Face', - 'Eyes', - 'Hair', - 'Facial Hair', - 'Scar', - 'Eyebrows' - ])), - wbRArrayS('Extra Parts', - wbFormIDCk(HNAM, 'Part', [HDPT]) - ), - wbRStructs('Parts', 'Part', [ - wbInteger(NAM0, 'Part Type', itU32, wbEnum([ - 'Race Morph', - 'Tri', - 'Chargen Morph' - ])), - wbString(NAM1, 'Filename', 0, cpTranslate, True) - ], []), - wbFormIDCk(TNAM, 'Texture Set', [TXST, NULL]), - wbFormIDCk(CNAM, 'Color', [CLFM, NULL]), - wbFormIDCk(RNAM, 'Valid Races', [FLST, NULL]) - ]); - - wbRecord(ASPC, 'Acoustic Space', [ - wbEDID, - wbOBNDReq, - wbFormIDCk(SNAM, 'Ambient Sound', [SNDR]), - wbFormIDCk(RDAT, 'Use Sound from Region (Interiors Only)', [REGN]), - wbFormIDCk(BNAM, 'Environment Type (reverb)', [REVB]) - ]); - - wbRecord(MSTT, 'Moveable Static', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000100} 8, 'Must Update Anims', - {0x00000200} 9, 'Hidden From Local Map', - {0x00008000} 15, 'Has Distant LOD', - {0x00010000} 16, 'Random Anim Start', - {0x00080000} 19, 'Has Currents', - {0x02000000} 25, 'Obstacle', - {0x04000000} 26, 'NavMesh Generation - Filter', - {0x08000000} 27, 'NavMesh Generation - Bounding Box', - {0x40000000} 30, 'NavMesh Generation - Ground' - ])), [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbInteger(DATA, 'Flags', itU8, wbFlags([ - 'On Local Map', - 'Unknown 1', - 'Unknown 2' - ]), cpNormal, True), - wbFormIDCk(SNAM, 'Looping Sound', [SNDR]) - ]); -end; - -procedure DefineTES5f; -begin - wbRecord(IDLM, 'Idle Marker', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x20000000} 29, 'Child Can Use' - ])), [ - wbEDID, - wbOBNDReq, - wbInteger(IDLF, 'Flags', itU8, wbFlags([ - 'Run in Sequence', - 'Unknown 1', - 'Do Once', - 'Unknown 3', - 'Ignored by Sandbox' - ]), cpNormal, False), - wbInteger(IDLC, 'Animation Count', itU8, nil, cpBenign), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, False), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, False), - wbMODL - ], False, nil, cpNormal, False, nil, wbAnimationsAfterSet); - - wbRecord(PROJ, 'Projectile', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbDEST, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Flags', itU16, wbFlags([ - 'Hitscan', - 'Explosion', - 'Alt. Trigger', - 'Muzzle Flash', - '', - 'Can Be Disabled', - 'Can Be Picked Up', - 'Supersonic', - 'Pins Limbs', - 'Pass Through Small Transparent', - 'Disable Combat Aim Correction', - 'Rotation' - ])), - {02} wbInteger('Type', itU16, wbEnum([], [ - $01, 'Missile', - $02, 'Lobber', - $04, 'Beam', - $08, 'Flame', - $10, 'Cone', - $20, 'Barrier', - $40, 'Arrow' - ])), - {04} wbFloat('Gravity'), - {08} wbFloat('Speed'), - {12} wbFloat('Range'), - {16} wbFormIDCk('Light', [LIGH, NULL]), - {20} wbFormIDCk('Muzzle Flash - Light', [LIGH, NULL]), - {24} wbFloat('Tracer Chance'), - {28} wbFloat('Explosion - Alt. Trigger - Proximity'), - {32} wbFloat('Explosion - Alt. Trigger - Timer'), - {36} wbFormIDCk('Explosion', [EXPL, NULL]), - {40} wbFormIDCk('Sound', [SNDR, NULL]), - {44} wbFloat('Muzzle Flash - Duration'), - {48} wbFloat('Fade Duration'), - {52} wbFloat('Impact Force'), - {56} wbFormIDCk('Sound - Countdown', [SNDR, NULL]), - {60} wbFormIDCk('Sound - Disable', [SNDR, NULL]), - {64} wbFormIDCk('Default Weapon Source', [WEAP, NULL]), - {68} wbFloat('Cone Spread'), - {72} wbFloat('Collision Radius'), - {76} wbFloat('Lifetime'), - {80} wbFloat('Relaunch Interval'), - wbFormIDCk('Decal Data', [TXST, NULL]), - wbFormIDCk('Collision Layer', [COLL, NULL]) - ], cpNormal, True, nil, 22), - wbRStructSK([0], 'Muzzle Flash Model', [ - wbString(NAM1, 'Model Filename'), - wbByteArray(NAM2, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow) - ], [], cpNormal, True), - wbInteger(VNAM, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ]); - - wbRecord(HAZD, 'Hazard', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbMODL, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD, NULL]), - wbStruct(DATA, 'Data', [ - wbInteger('Limit', itU32), - wbFloat('Radius'), - wbFloat('Lifetime'), - wbFloat('Image Space Radius'), - wbFloat('Target Interval'), - wbInteger('Flags', itU32, wbFlags([ - {0x01} 'Affects Player Only', - {0x02} 'Inherit Duration from Spawn Spell', - {0x04} 'Align to Impact Normal', - {0x08} 'Inherit Radius from Spawn Spell', - {0x10} 'Drop to Ground' - ])), - wbFormIDCk('Spell', [SPEL, NULL]), - wbFormIDCk('Light', [LIGH, NULL]), - wbFormIDCk('Impact Data Set', [IPDS, NULL]), - wbFormIDCk('Sound', [SNDR, NULL]) - ]) - ]); - - wbSoulGemEnum := wbEnum([ - {0} 'None', - {1} 'Petty', - {2} 'Lesser', - {3} 'Common', - {4} 'Greater', - {5} 'Grand' - ]); - - wbRecord(SLGM, 'Soul Gem', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00020000} 17, 'Can Hold NPC Soul' - ])), [ - wbEDID, - wbOBND, - wbFULL, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, '', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbInteger(SOUL, 'Contained Soul', itU8, wbSoulGemEnum, cpNormal, True), - wbInteger(SLCP, 'Maximum Capacity', itU8, wbSoulGemEnum, cpNormal, True), - wbFormIDCk(NAM0, 'Linked To', [SLGM]) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - - if wbSimpleRecords then - wbNVNM := - wbStruct(NVNM, 'Geometry', [ - wbByteArray('Unknown', 8), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNVNMParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]), - wbArray('Vertices', wbByteArray('Vertex', 12), -1), - wbArray('Triangles', wbByteArray('Triangle', 16), -1), - wbArray('External Connections', - wbStruct('Connection', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Mesh', [NAVM]), - wbInteger('Triangle', itS16) - ]) - , -1), - wbArray('Door Triangles', - wbStruct('Door Triangle', [ - wbInteger('Triangle before door', itS16), - wbByteArray('Unknown', 4), - wbFormIDCk('Door', [REFR]) - ]) - , -1), - wbUnknown - ]) - else - wbNVNM := - wbStruct(NVNM, 'Geometry', [ - wbInteger('Unknown', itU32), - wbByteArray('Unknown', 4), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNVNMParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]), - wbArray('Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), -1), - wbArray('Triangles', - wbStruct('Triangle', [ - wbInteger('Vertex 0', itS16), - wbInteger('Vertex 1', itS16), - wbInteger('Vertex 2', itS16), - wbInteger('Edge 0-1', itS16), - wbInteger('Edge 1-2', itS16), - wbInteger('Edge 2-0', itS16), - wbInteger('Flags', itU16, wbFlags([ - 'Edge 0-1 link', - 'Edge 1-2 link', - 'Edge 2-0 link', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Preferred', - 'Unknown 8', - 'Unknown 9', - 'Water', - 'Door', - 'Found', - 'Unknown 13', - 'Unknown 14', - 'Unknown 15', - 'Unknown 16' - ])), - wbInteger('Cover Flags', itU16, wbFlags([ - 'Edge 0-1 wall', - 'Edge 0-1 ledge cover', - 'Unknown 3', - 'Unknown 4', - 'Edge 0-1 left', - 'Edge 0-1 right', - 'Edge 1-2 wall', - 'Edge 1-2 ledge cover', - 'Unknown 9', - 'Unknown 10', - 'Edge 1-2 left', - 'Edge 1-2 right', - 'Unknown 13', - 'Unknown 14', - 'Unknown 15', - 'Unknown 16' - ])) - //wbInteger('Cover Edge #1 Flags', itU8), - //wbInteger('Cover Edge #2 Flags', itU8) - ]) - , -1), - wbArray('Edge Links', - wbStruct('Edge Link', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Mesh', [NAVM]), - wbInteger('Triangle', itS16) - ]) - , -1), - wbArray('Door Triangles', - wbStruct('Door Triangle', [ - wbInteger('Triangle before door', itS16), - wbByteArray('Unknown', 4), - wbFormIDCk('Door', [REFR]) - ]) - , -1), - wbArray('Cover Triangles', wbInteger('Triangle', itS16), -1), - wbInteger('NavMeshGrid Divisor', itU32), - wbFloat('Max X Distance'), - wbFloat('Max Y Distance'), - wbFloat('Min X'), - wbFloat('Min Y'), - wbFloat('Min Z'), - wbFloat('Max X'), - wbFloat('Max Y'), - wbFloat('Max Z'), - wbArray('NavMeshGrid', wbArray('NavMeshGridCell', wbInteger('Triangle', itS16), -1)) - ]); - - wbRecord(NAVM, 'Navigation Mesh', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed', - {0x04000000} 26, 'AutoGen', - {0x80000000} 31, 'NavmeshGenCell' - ]), [18]), [ - wbEDID, - wbNVNM, - wbUnknown(ONAM), - wbUnknown(PNAM), - wbUnknown(NNAM) - ], False, wbNAVMAddInfo); - - - if wbSimpleRecords then - wbNAVIslandData := - wbStruct('Island Data', [ - wbByteArray('Unknown', 24), - wbArray('Triangles', wbByteArray('Triangle', 6), -1), - wbArray('Vertices', wbByteArray('Vertex', 12), -1) - ]) - else - wbNAVIslandData := - wbStruct('Island Data', [ - wbFloat('Min X'), - wbFloat('Min Y'), - wbFloat('Min Z'), - wbFloat('Max X'), - wbFloat('Max Y'), - wbFloat('Max Z'), - wbArray('Triangles', - wbStruct('Triangle', [ - wbArray('Vertices', wbInteger('Vertex', itS16), 3) - ]) - , -1), - wbArray('Vertices', wbStruct('Vertex', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), -1) - ]); - - wbRecord(NAVI, 'Navigation Mesh Info Map', [ - wbEDID, - wbInteger(NVER, 'Version', itU32), - wbRArray('Navigation Map Infos', - wbStruct(NVMI, 'Navigation Map Info', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbByteArray('Unknown', 4), - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z'), - wbInteger('Preferred Merges Flag', itU32), - wbArray('Merged To', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Preferred Merges', wbFormIDCk('Mesh', [NAVM]), -1), - wbArray('Linked Doors', wbStruct('Door', [ - wbByteArray('Unknown', 4), - wbFormIDCk('Door Ref', [REFR]) - ]), -1), - wbInteger('Is Island', itU8, wbEnum(['False', 'True'])), - wbUnion('Island', wbNAVIIslandDataDecider, [ - wbNull, - wbNAVIslandData - ]), - wbByteArray('Unknown', 4), - wbFormIDCk('Parent Worldspace', [WRLD, NULL]), - wbUnion('Parent', wbNAVIParentDecider, [ - wbStruct('Coordinates', [ - wbInteger('Grid Y', itS16), - wbInteger('Grid X', itS16) - ]), - wbFormIDCk('Parent Cell', [CELL]) - ]) - ]) - ), - wbStruct(NVPP, 'Preferred Pathing', [ - wbArray('NavMeshes', wbArray('Set', wbFormIDCk('', [NAVM]), -1), -1), - wbArray('NavMesh Tree?', wbStruct('', [ - wbFormIDCk('NavMesh', [NAVM]), - wbInteger('Index/Node', itU32) - ]), -1) - ]), - wbArray(NVSI, 'Unknown', wbFormIDCk('Navigation Mesh', [NAVM])) - ]); - -end; - -procedure DefineTES5g; -begin - - wbRecord(EXPL, 'Explosion', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbEITM, - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]), - wbStruct(DATA, 'Data', [ // Contradicted by FireStormExplosion02 [EXPL:000877F9] - wbFormIDCk('Light', [LIGH, NULL]), - wbFormIDCk('Sound 1', [SNDR, NULL]), - wbFormIDCk('Sound 2', [SNDR, NULL]), - wbFormIDCk('Impact Data Set', [IPDS, NULL]), - wbFormID('Placed Object'), - wbFormIDCk('Spawn Projectile', [PROJ, NULL]), - wbFloat('Force'), - wbFloat('Damage'), - wbFloat('Radius'), - wbFloat('IS Radius'), - wbFloat('Vertical Offset Mult'), - wbInteger('Flags', itU32, wbFlags([ - 'Unknown 0', - 'Always Uses World Orientation', - 'Knock Down - Always', - 'Knock Down - By Formula', - 'Ignore LOS Check', - 'Push Explosion Source Ref Only', - 'Ignore Image Space Swap', - 'Chain', - 'No Controller Vibration' - ])), - wbInteger('Sound Level', itU32, wbSoundLevelEnum, cpNormal, True) - ], cpNormal, True, nil, 10) - ]); - - wbRecord(DEBR, 'Debris', [ - wbEDID, - wbRStructs('Models', 'Model', [ - wbStruct(DATA, 'Data', [ - wbInteger('Percentage', itU8), - wbString('Model Filename'), - wbInteger('Flags', itU8, wbFlags([ - 'Has Collision Data' - ])) - ], cpNormal, True), - wbMODT - ], [], cpNormal, True) - ]); - - wbRecord(IMGS, 'Image Space', [ - wbEDID, - wbUnknown(ENAM, cpIgnore), - wbStruct(HNAM, 'HDR', [ - wbFloat('Eye Adapt Speed'), - wbFloat('Bloom Blur Radius'), - wbFloat('Bloom Threshold'), - wbFloat('Bloom Scale'), - wbFloat('Receive Bloom Threshold'), - wbFloat('White'), - wbFloat('Sunlight Scale'), - wbFloat('Sky Scale'), - wbFloat('Eye Adapt Strength') - ]), - wbStruct(CNAM, 'Cinematic', [ - wbFloat('Saturation'), - wbFloat('Brightness'), - wbFloat('Contrast') - ]), - wbStruct(TNAM, 'Tint', [ - wbFloat('Amount'), - wbFloatColors('Color') - ]), - wbStruct(DNAM, 'Depth of Field', [ - wbFloat('Strength'), - wbFloat('Distance'), - wbFloat('Range'), - wbByteArray('Unknown', 2), - wbInteger('Sky / Blur Radius', itU16, wbEnum([], [ - 16384, 'Radius 0', - 16672, 'Radius 1', - 16784, 'Radius 2', - 16848, 'Radius 3', - 16904, 'Radius 4', - 16936, 'Radius 5', - 16968, 'Radius 6', - 17000, 'Radius 7', - 16576, 'No Sky, Radius 0', - 16736, 'No Sky, Radius 1', - 16816, 'No Sky, Radius 2', - 16880, 'No Sky, Radius 3', - 16920, 'No Sky, Radius 4', - 16952, 'No Sky, Radius 5', - 16984, 'No Sky, Radius 6', - 17016, 'No Sky, Radius 7' - ])) - ], cpNormal, False, nil, 3) - ]); - - wbTimeInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Value') - ]); - - wbColorInterpolator := wbStruct('Data', [ - wbFloat('Time'), - wbFloat('Red', cpNormal, False, 255, 0), - wbFloat('Green', cpNormal, False, 255, 0), - wbFloat('Blue', cpNormal, False, 255, 0), - wbFloat('Alpha', cpNormal, False, 255, 0) - ]); - - wbRecord(IMAD, 'Image Space Adapter', [ - wbEDID, - wbStruct(DNAM, 'Data Count', [ - wbInteger('Flags', itU32, wbFlags(['Animatable'])), - wbFloat('Duration'), - wbStruct('HDR', [ - wbInteger('Eye Adapt Speed Mult', itU32), - wbInteger('Eye Adapt Speed Add', itU32), - wbInteger('Bloom Blur Radius Mult', itU32), - wbInteger('Bloom Blur Radius Add', itU32), - wbInteger('Bloom Threshold Mult', itU32), - wbInteger('Bloom Threshold Add', itU32), - wbInteger('Bloom Scale Mult', itU32), - wbInteger('Bloom Scale Add', itU32), - wbInteger('Target Lum Min Mult', itU32), - wbInteger('Target Lum Min Add', itU32), - wbInteger('Target Lum Max Mult', itU32), - wbInteger('Target Lum Max Add', itU32), - wbInteger('Sunlight Scale Mult', itU32), - wbInteger('Sunlight Scale Add', itU32), - wbInteger('Sky Scale Mult', itU32), - wbInteger('Sky Scale Add', itU32) - ]), - wbInteger('Unknown08 Mult', itU32), - wbInteger('Unknown48 Add', itU32), - wbInteger('Unknown09 Mult', itU32), - wbInteger('Unknown49 Add', itU32), - wbInteger('Unknown0A Mult', itU32), - wbInteger('Unknown4A Add', itU32), - wbInteger('Unknown0B Mult', itU32), - wbInteger('Unknown4B Add', itU32), - wbInteger('Unknown0C Mult', itU32), - wbInteger('Unknown4C Add', itU32), - wbInteger('Unknown0D Mult', itU32), - wbInteger('Unknown4D Add', itU32), - wbInteger('Unknown0E Mult', itU32), - wbInteger('Unknown4E Add', itU32), - wbInteger('Unknown0F Mult', itU32), - wbInteger('Unknown4F Add', itU32), - wbInteger('Unknown10 Mult', itU32), - wbInteger('Unknown50 Add', itU32), - wbStruct('Cinematic', [ - wbInteger('Saturation Mult', itU32), - wbInteger('Saturation Add', itU32), - wbInteger('Brightness Mult', itU32), - wbInteger('Brightness Add', itU32), - wbInteger('Contrast Mult', itU32), - wbInteger('Contrast Add', itU32) - ]), - wbInteger('Unknown14 Mult', itU32), - wbInteger('Unknown54 Add', itU32), - wbInteger('Tint Color', itU32), - wbInteger('Blur Radius', itU32), - wbInteger('Double Vision Strength', itU32), - wbInteger('Radial Blur Strength', itU32), - wbInteger('Radial Blur Ramp Up', itU32), - wbInteger('Radial Blur Start', itU32), - wbInteger('Radial Blur Flags', itU32, wbFlags(['Use Target'])), - wbFloat('Radial Blur Center X'), - wbFloat('Radial Blur Center Y'), - wbInteger('DoF Strength', itU32), - wbInteger('DoF Distance', itU32), - wbInteger('DoF Range', itU32), - wbInteger('DoF Flags', itU32, wbFlags([ - {0x00000001} 'Use Target', - {0x00000002} 'Unknown 2', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Mode - Front', - {0x00000200} 'Mode - Back', - {0x00000400} 'No Sky', - {0x00000800} 'Blur Radius Bit 2', - {0x00001000} 'Blur Radius Bit 1', - {0x00002000} 'Blur Radius Bit 0' - ])), - wbInteger('Radial Blur Ramp Down', itU32), - wbInteger('Radial Blur Down Start', itU32), - wbInteger('Fade Color', itU32), - wbInteger('Motion Blur Strength', itU32) - ]), - wbArray(BNAM, 'Blur Radius', wbTimeInterpolator), - wbArray(VNAM, 'Double Vision Strength', wbTimeInterpolator), - wbArray(TNAM, 'Tint Color', wbColorInterpolator), - wbArray(NAM3, 'Fade Color', wbColorInterpolator), - wbArray(RNAM, 'Radial Blur Strength', wbTimeInterpolator), - wbArray(SNAM, 'Radial Blur Ramp Up', wbTimeInterpolator), - wbArray(UNAM, 'Radial Blur Start', wbTimeInterpolator), - wbArray(NAM1, 'Radial Blur Ramp Down', wbTimeInterpolator), - wbArray(NAM2, 'Radial Blur Down Start', wbTimeInterpolator), - wbArray(WNAM, 'DoF Strength', wbTimeInterpolator), - wbArray(XNAM, 'DoF Distance', wbTimeInterpolator), - wbArray(YNAM, 'DoF Range', wbTimeInterpolator), - wbArray(NAM4, 'Motion Blur Strength', wbTimeInterpolator), - wbRStruct('HDR', [ - wbArray(_00_IAD, 'Eye Adapt Speed Mult', wbTimeInterpolator), - wbArray(_40_IAD, 'Eye Adapt Speed Add', wbTimeInterpolator), - wbArray(_01_IAD, 'Bloom Blur Radius Mult', wbTimeInterpolator), - wbArray(_41_IAD, 'Bloom Blur Radius Add', wbTimeInterpolator), - wbArray(_02_IAD, 'Bloom Threshold Mult', wbTimeInterpolator), - wbArray(_42_IAD, 'Bloom Threshold Add', wbTimeInterpolator), - wbArray(_03_IAD, 'Bloom Scale Mult', wbTimeInterpolator), - wbArray(_43_IAD, 'Bloom Scale Add', wbTimeInterpolator), - wbArray(_04_IAD, 'Target Lum Min Mult', wbTimeInterpolator), - wbArray(_44_IAD, 'Target Lum Min Add', wbTimeInterpolator), - wbArray(_05_IAD, 'Target Lum Max Mult', wbTimeInterpolator), - wbArray(_45_IAD, 'Target Lum Max Add', wbTimeInterpolator), - wbArray(_06_IAD, 'Sunlight Scale Mult', wbTimeInterpolator), - wbArray(_46_IAD, 'Sunlight Scale Add', wbTimeInterpolator), - wbArray(_07_IAD, 'Sky Scale Mult', wbTimeInterpolator), - wbArray(_47_IAD, 'Sky Scale Add', wbTimeInterpolator) - ], []), - wbUnknown(_08_IAD), - wbUnknown(_48_IAD), - wbUnknown(_09_IAD), - wbUnknown(_49_IAD), - wbUnknown(_0A_IAD), - wbUnknown(_4A_IAD), - wbUnknown(_0B_IAD), - wbUnknown(_4B_IAD), - wbUnknown(_0C_IAD), - wbUnknown(_4C_IAD), - wbUnknown(_0D_IAD), - wbUnknown(_4D_IAD), - wbUnknown(_0E_IAD), - wbUnknown(_4E_IAD), - wbUnknown(_0F_IAD), - wbUnknown(_4F_IAD), - wbUnknown(_10_IAD), - wbUnknown(_50_IAD), - wbRStruct('Cinematic', [ - wbArray(_11_IAD, 'Saturation Mult', wbTimeInterpolator), - wbArray(_51_IAD, 'Saturation Add', wbTimeInterpolator), - wbArray(_12_IAD, 'Brightness Mult', wbTimeInterpolator), - wbArray(_52_IAD, 'Brightness Add', wbTimeInterpolator), - wbArray(_13_IAD, 'Contrast Mult', wbTimeInterpolator), - wbArray(_53_IAD, 'Contrast Add', wbTimeInterpolator) - ], []), - wbUnknown(_14_IAD), - wbUnknown(_54_IAD) - ]); - - wbRecord(FLST, 'FormID List', [ - wbString(EDID, 'Editor ID', 0, cpBenign, True, nil, wbFLSTEDIDAfterSet), - wbRArrayS('FormIDs', wbFormID(LNAM, 'FormID'), cpNormal, False, nil, nil, nil, wbFLSTLNAMIsSorted) - ]); - - wbRecord(PERK, 'Perk', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbVMADFragmentedPERK, - wbFULL, - wbDESCReq, - wbICON, - wbCTDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Trait', itU8, wbEnum(['False', 'True'])), - wbInteger('Level', itU8), - wbInteger('Num Ranks', itU8), - wbInteger('Playable', itU8, wbEnum(['False', 'True'])), - wbInteger('Hidden', itU8, wbEnum(['False', 'True'])) - ], cpNormal, True), - wbFormIDCK(NNAM, 'Next Perk', [PERK, NULL]), - - wbRStructsSK('Effects', 'Effect', [0, 1], [ - wbStructSK(PRKE, [1, 2, 0], 'Header', [ - wbInteger('Type', itU8, wbEnum([ - 'Quest + Stage', - 'Ability', - 'Entry Point' - ]), cpNormal, False, nil, wbPERKPRKETypeAfterSet), - wbInteger('Rank', itU8), - wbInteger('Priority', itU8) - ]), - wbUnion(DATA, 'Effect Data', wbPerkDATADecider, [ - wbStructSK([0, 1], 'Quest + Stage', [ - wbFormIDCk('Quest', [QUST]), - wbInteger('Quest Stage', itU8, wbPerkDATAQuestStageToStr, wbCTDAParam2QuestStageToInt), - wbByteArray('Unused', 3) - ]), - wbFormIDCk('Ability', [SPEL]), - wbStructSK([0, 1], 'Entry Point', [ - wbInteger('Entry Point', itU8, wbEntryPointsEnum, cpNormal, True, nil{, wbPERKEntryPointAfterSet}), - wbInteger('Function', itU8, wbEnum([ - {0} 'Unknown 0', - {1} 'Set Value', // EPFT=1 - {2} 'Add Value', // EPFT=1 - {3} 'Multiply Value', // EPFT=1 - {4} 'Add Range To Value', // EPFT=2 - {5} 'Add Actor Value Mult', // EPFT=2 - {6} 'Absolute Value', // no params - {7} 'Negative Absolute Value', // no params - {8} 'Add Leveled List', // EPFT=3 - {9} 'Add Activate Choice', // EPFT=4 - {10} 'Select Spell', // EPFT=5 - {11} 'Select Text', // EPFT=6 - {12} 'Set to Actor Value Mult', // EPFT=2 - {13} 'Multiply Actor Value Mult', // EPFT=2 - {14} 'Multiply 1 + Actor Value Mult', // EPFT=2 - {15} 'Set Text' // EPFT=7 - ])), - wbInteger('Perk Condition Tab Count', itU8, nil, cpIgnore) - ]) - ], cpNormal, True), - - wbRStructsSK('Perk Conditions', 'Perk Condition', [0], [ - wbInteger(PRKC, 'Run On (Tab Index)', itS8{, wbPRKCToStr, wbPRKCToInt}), - wbCTDAsReq - ], [], cpNormal, False{, nil, nil, wbPERKPRKCDontShow}), - - wbRStruct('Function Parameters', [ - wbInteger(EPFT, 'Type', itU8, wbEnum([ - {0} 'None', - {1} 'Float', - {2} 'Float/AV,Float', - {3} 'LVLI', - {4} 'SPEL,lstring,flags', - {5} 'SPEL', - {6} 'string', - {7} 'lstring' - ])), - // case(EPFT) of - // 1: EPFD=float - // 2: EPFD=float,float - // 3: EPFD=LVLI - // 4: EPFD=SPEL, EPF2=lstring, EPF3=int32 flags - // 5: EPFD=SPEL - // 6: EPFD=string - // 7: EPFD=lstring - wbLString(EPF2, 'Button Label', 0, cpTranslate), - wbStruct(EPF3, 'Script Flags', [ - wbInteger('Script Flags', itU8, wbFlags([ - 'Run Immediately', - 'Replace Default' - ])), - wbByteArray('Unknown', 3) - ]), - wbUnion(EPFD, 'Data', wbEPFDDecider, [ - {0} wbByteArray('Unknown'), - {1} wbFloat('Float'), - {2} wbStruct('Float, Float', [ - wbFloat('Float 1'), - wbFloat('Float 2') - ]), - {3} wbFormIDCk('Leveled Item', [LVLI]), - {4} wbFormIDCk('Spell', [SPEL]), - {5} wbFormIDCk('Spell', [SPEL]), - {6} wbString('Text', 0, cpTranslate), - {7} wbLString('Text', 0, cpTranslate), - {8} wbStruct('Actor Value, Float', [ - wbInteger('Actor Value', itU32, wbEPFDActorValueToStr, wbEPFDActorValueToInt), - wbFloat('Float') - ]) - ], cpNormal, False{, wbEPFDDontShow}) - ], [], cpNormal, False{, wbPERKPRKCDontShow}), - wbEmpty(PRKF, 'End Marker', cpIgnore, True) - ], []) - ]); - - wbRecord(BPTD, 'Body Part Data', [ - wbEDID, - wbMODL, - wbRStructsSK('Body Parts', 'Body Part', [2], [ - wbLString(BPTN, 'Part Name', 0, cpTranslate, True), - wbString(PNAM, 'Pose Matching', 0, cpNormal, False), - wbString(BPNN, 'Part Node', 0, cpNormal, True), - wbString(BPNT, 'VATS Target', 0, cpNormal, True), - wbString(BPNI, 'IK Data - Start Node', 0, cpNormal, True), - wbStruct(BPND, '', [ - {00} wbFloat('Damage Mult'), - {04} wbInteger('Flags', itU8, wbFlags([ - 'Severable', - 'IK Data', - 'IK Data - Biped Data', - 'Explodable', - 'IK Data - Is Head', - 'IK Data - Headtracking', - 'To Hit Chance - Absolute' - ])), - {05} wbInteger('Part Type', itU8, wbEnum([ - 'Torso', - 'Head', - 'Eye', - 'LookAt', - 'Fly Grab', - 'Saddle' - ])), - {06} wbInteger('Health Percent', itU8), - {07} wbInteger('Actor Value', itS8, wbActorValueEnum), - {08} wbInteger('To Hit Chance', itU8), - {09} wbInteger('Explodable - Explosion Chance %', itU8), - {10} wbInteger('Explodable - Debris Count', itU16), - {12} wbFormIDCk('Explodable - Debris', [DEBR, NULL]), - {16} wbFormIDCk('Explodable - Explosion', [EXPL, NULL]), - {20} wbFloat('Tracking Max Angle'), - {24} wbFloat('Explodable - Debris Scale'), - {28} wbInteger('Severable - Debris Count', itS32), - {32} wbFormIDCk('Severable - Debris', [DEBR, NULL]), - {36} wbFormIDCk('Severable - Explosion', [EXPL, NULL]), - {40} wbFloat('Severable - Debris Scale'), - wbStruct('Gore Effects Positioning', [ - wbStruct('Translate', [ - {44} wbFloat('X'), - {48} wbFloat('Y'), - {52} wbFloat('Z') - ]), - wbStruct('Rotation', [ - {56} wbFloat('X', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {60} wbFloat('Y', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - {64} wbFloat('Z', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ]) - ]), - {68} wbFormIDCk('Severable - Impact DataSet', [IPDS, NULL]), - {72} wbFormIDCk('Explodable - Impact DataSet', [IPDS, NULL]), - {28} wbInteger('Severable - Decal Count', itU8), - {28} wbInteger('Explodable - Decal Count', itU8), - {76} wbByteArray('Unknown', 2), - {80} wbFloat('Limb Replacement Scale') - ], cpNormal, True), - wbString(NAM1, 'Limb Replacement Model', 0, cpNormal, True), - wbString(NAM4, 'Gore Effects - Target Bone', 0, cpNormal, True), - wbByteArray(NAM5, 'Texture Files Hashes', 0, cpNormal) - ], [], cpNormal, True) - ]); - - wbRecord(ADDN, 'Addon Node', [ - wbEDID, - wbOBNDReq, - wbMODL, - wbInteger(DATA, 'Node Index', itS32, nil, cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SNDR, NULL]), - wbStruct(DNAM, 'Data', [ - wbInteger('Master Particle System Cap', itU16), - wbInteger('Flags', itU16, wbEnum([], [ - {>>> Value Must be 1 or 3 <<<} - 1, 'Unknown 1', // {0x0001}'Unknown 0', : The Check-Box is Unchecked in the CK - 3, 'Always Loaded' // {0x0002}'Always Loaded' : The Check-Box is Unchecked in the CK - ])) - ], cpNormal, True) - ]); -end; - -procedure DefineTES5h; -begin - wbRecord(AVIF, 'Actor Value Information', [ - wbEDID, - wbFULL, - wbDESCReq, - wbString(ANAM, 'Abbreviation'), - wbUnknown(CNAM), - wbStruct(AVSK, 'Skill', [ - wbFloat('Skill Use Mult'), - wbFloat('Skill Offset Mult'), - wbFloat('Skill Improve Mult'), - wbFloat('Skill Improve Offset') - ]), - wbRArray('Perk Tree', - wbRStruct('Node', [ - wbFormIDCk(PNAM, 'Perk', [PERK, NULL]), - wbUnknown(FNAM), - wbInteger(XNAM, 'Perk-Grid X', itU32), - wbInteger(YNAM, 'Perk-Grid Y', itU32), - wbFloat(HNAM, 'Horizontal Position'), - wbFloat(VNAM, 'Vertical Position'), - wbFormIDCk(SNAM, 'Associated Skill', [AVIF, NULL]), - wbRArray('Connections', wbInteger(CNAM, 'Line to Index', itU32)), - wbInteger(INAM, 'Index', itU32) - ], []) - ) - ]); - - wbRecord(CAMS, 'Camera Shot', [ - wbEDID, - wbMODL, - wbStruct(DATA, 'Data', [ - {00} wbInteger('Action', itU32, wbEnum([ - 'Shoot', - 'Fly', - 'Hit', - 'Zoom' - ])), - {04} wbInteger('Location', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target', - 'Lead Actor' - ])), - {08} wbInteger('Target', itU32, wbEnum([ - 'Attacker', - 'Projectile', - 'Target', - 'Lead Actor' - ])), - {12} wbInteger('Flags', itU32, wbFlags([ - 'Position Follows Location', - 'Rotation Follows Target', - 'Don''t Follow Bone', - 'First Person Camera', - 'No Tracer', - 'Start At Time Zero' - ])), - wbStruct('Time Multipliers', [ - {16} wbFloat('Player'), - {20} wbFloat('Target'), - {24} wbFloat('Global') - ]), - {28} wbFloat('Max Time'), - {32} wbFloat('Min Time'), - {36} wbFloat('Target % Between Actors'), - {40} wbFloat('Near Target Distance') - ], cpNormal, True, nil, 8), - wbFormIDCk(MNAM, 'Image Space Modifier', [IMAD]) - ]); - - wbRecord(CPTH, 'Camera Path', [ - wbEDID, - wbCTDAs, - wbArray(ANAM, 'Related Camera Paths', wbFormIDCk('Related Camera Path', [CPTH, NULL]), ['Parent', 'Previous Sibling'], cpNormal, True), - wbInteger(DATA, 'Camera Zoom', itU8, wbEnum([], [ - 0, 'Default, Must Have Camera Shots', - 1, 'Disable, Must Have Camera Shots', - 2, 'Shot List, Must Have Camera Shots', - 128, 'Default', - 129, 'Disable', - 130, 'Shot List' - ]), cpNormal, True), - wbRArray('Camera Shots', wbFormIDCk(SNAM, 'Camera Shot', [CAMS])) - ]); - - wbRecord(VTYP, 'Voice Type', [ - wbEDID, - wbInteger(DNAM, 'Flags', itU8, wbFlags([ - 'Allow Default Dialog', - 'Female' - ]), cpNormal, True) - ]); - - wbRecord(MATT, 'Material Type', [ - wbEDID, - wbFormIDCk(PNAM, 'Material Parent', [MATT, NULL]), - wbString(MNAM, 'Material Name'), - wbStruct(CNAM, 'Havok Display Color', [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0) - ]), - wbFloat(BNAM, 'Buoyancy'), - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - 'Stair Material', - 'Arrows Stick' - ], False)), - wbFormIDCk(HNAM, 'Havok Impact Data Set', [IPDS, NULL]) - ]); - - wbRecord(IPCT, 'Impact', [ - wbEDID, - wbMODL, - wbStruct(DATA, '', [ - wbFloat('Effect - Duration'), - wbInteger('Effect - Orientation', itU32, wbEnum([ - 'Surface Normal', - 'Projectile Vector', - 'Projectile Reflection' - ])), - wbFloat('Angle Threshold'), - wbFloat('Placement Radius'), - wbInteger('Sound Level', itU32, wbSoundLevelEnum), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'No Decal Data' - ])), - wbInteger('Impact Result', itU8, wbEnum([ - {0} 'Default', - {1} 'Destroy', - {2} 'Bounce', - {3} 'Impale', - {4} 'Stick' - ])), - wbByteArray('Unknown', 2) - ], cpNormal, True, nil, 4), - wbDODT, - wbFormIDCk(DNAM, 'Texture Set', [TXST]), - wbFormIDCk(ENAM, 'Secondary Texture Set', [TXST]), - wbFormIDCk(SNAM, 'Sound 1', [SNDR, SOUN, NULL]), - wbFormIDCk(NAM1, 'Sound 2', [SNDR, SOUN, NULL]), - wbFormIDCk(NAM2, 'Hazard', [HAZD, NULL]) - ]); - - wbRecord(IPDS, 'Impact Data Set', [ - wbEDID, - wbRArrayS('Data', wbStructSK(PNAM, [0], '', [ - wbFormIDCk('Material', [MATT]), - wbFormIDCk('Impact', [IPCT]) - ])) - ]); - - wbRecord(ECZN, 'Encounter Zone', [ - wbEDID, - wbStruct(DATA, '', [ - wbFormIDCkNoReach('Owner', [NPC_, FACT, NULL]), - wbFormIDCk('Location', [LCTN, NULL]), - wbInteger('Rank', itS8), - wbInteger('Min Level', itS8), - wbInteger('Flags', itU8, wbFlags([ - 'Never Resets', - 'Match PC Below Minimum Level', - 'Disable Combat Boundary' - ])), - wbInteger('Max Level', itS8) - ], cpNormal, True, nil, 2) - ]); - - wbRecord(LCTN, 'Location', [ - wbEDID, - - wbArray(ACPR, 'Actor Cell Persistent Reference', wbStruct('', [ - wbFormIDCk('Actor', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCPR, 'Location Cell Persistent Reference', wbStruct('', [ - wbFormIDCk('Actor', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - {>>> From Danwguard.esm, Does not follow similar previous patterns <<<} - wbArray(RCPR, 'Reference Cell Persistent Reference', wbFormIDCk('Ref', [ACHR, REFR], False, cpBenign)), - - wbArray(ACUN, 'Actor Cell Unique', wbStruct('', [ - wbFormIDCk('Actor', [NPC_], False, cpBenign), - wbFormIDCk('Ref', [ACHR], False, cpBenign), - wbFormIDCk('Location', [LCTN, NULL], False, cpBenign) - ])), - wbArray(LCUN, 'Location Cell Unique', wbStruct('', [ - wbFormIDCk('Actor', [NPC_], False, cpBenign), - wbFormIDCk('Ref', [ACHR], False, cpBenign), - wbFormIDCk('Location', [LCTN, NULL], False, cpBenign) - ])), - {>>> in Unofficial Skyrim patch <<<} - wbArray(RCUN, 'Reference Cell Unique', wbFormIDCk('Actor', [NPC_], False, cpBenign)), - - wbArray(ACSR, 'Actor Cell Static Reference', wbStruct('', [ - wbFormIDCk('Loc Ref Type', [LCRT], False, cpBenign), - wbFormIDCk('Marker', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCSR, 'Location Cell Static Reference', wbStruct('', [ - wbFormIDCk('Loc Ref Type', [LCRT], False, cpBenign), - wbFormIDCk('Marker', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - {>>> Seen in Open Cities <<<} - wbArray(RCSR, 'Reference Cell Static Reference', wbFormIDCk('Ref', [ACHR, REFR], False, cpBenign)), - - wbRArray('Actor Cell Encounter Cell', - wbStruct(ACEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - wbRArray('Location Cell Encounter Cell', - wbStruct(LCEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - {>>> Seen in Open Cities <<<} - wbRArray('Reference Cell Encounter Cell', - wbStruct(RCEC, 'Unknown', [ - wbFormIDCk('Location', [WRLD, CELL], False, cpBenign), - wbArray('Coordinates', wbStruct('', [ - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])) - ]) - ), - - wbArray(ACID, 'Actor Cell Marker Reference', wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign)), - wbArray(LCID, 'Location Cell Marker Reference', wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign)), - - wbArray(ACEP, 'Actor Cell Enable Point', wbStruct('', [ - wbFormIDCk('Actor', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - wbArray(LCEP, 'Location Cell Enable Point', wbStruct('', [ - wbFormIDCk('Actor', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], False, cpBenign), - wbInteger('Grid Y', itS16, nil, cpBenign), - wbInteger('Grid X', itS16, nil, cpBenign) - ])), - - wbFULL, - wbKSIZ, - wbKWDAs, - wbFormIDCk(PNAM, 'Parent Location', [LCTN, NULL]), - wbFormIDCk(NAM1, 'Music', [MUSC, NULL]), - wbFormIDCk(FNAM, 'Unreported Crime Faction', [FACT]), - wbFormIDCk(MNAM, 'World Location Marker Ref', [REFR, ACHR]), - wbFloat(RNAM, 'World Location Radius'), - wbFormIDCk(NAM0, 'Horse Marker Ref', [REFR]), - wbCNAM - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - -end; - -{this is required to prevent XE6 compiler error} -type - TVarRecs = array of TVarRec; - -function CombineVarRecs(const a, b : array of const) - : TVarRecs; -begin - SetLength(Result, Length(a) + Length(b)); - if Length(a) > 0 then - Move(a[0], Result[0], SizeOf(TVarRec) * Length(a)); - if Length(b) > 0 then - Move(b[0], Result[Length(a)], SizeOf(TVarRec) * Length(b)); -end; - -function MakeVarRecs(const a : array of const) - : TVarRecs; -begin - SetLength(Result, Length(a)); - if Length(a) > 0 then - Move(a[0], Result[0], SizeOf(TVarRec) * Length(a)); -end; - - -procedure DefineTES5i; -var - a, b, c : TVarRecs; -begin - wbRecord(MESG, 'Message', [ - wbEDID, - wbDESCReq, - wbFULL, - wbFormIDCk(INAM, 'Icon (unused)', [NULL], False, cpIgnore, True), // leftover - wbFormIDCk(QNAM, 'Owner Quest', [QUST]), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - 'Message Box', - 'Auto Display' - ]), cpNormal, True, False, nil, wbMESGDNAMAfterSet), - wbInteger(TNAM, 'Display Time', itU32, nil, cpNormal, False, False, wbMESGTNAMDontShow), - wbRStructs('Menu Buttons', 'Menu Button', [ - wbLString(ITXT, 'Button Text', 0, cpTranslate), - wbCTDAs - ], []) - ], False, nil, cpNormal, False, wbMESGAfterLoad); - - a := MakeVarRecs([ - 0, 'None', - Sig2Int('RADA'), 'RADA (Unused)', - Sig2Int('MORP'), 'MORP (Unused)', - Sig2Int('PPAR'), 'PPAR (Unused)', - Sig2Int('MYSN'), 'MYSN (Unused)', - Sig2Int('MYSF'), 'MYSF (Unused)', - Sig2Int('WWSP'), 'Werewolf Spell', - Sig2Int('SALT'), 'Sitting Angle Limit', - Sig2Int('APSH'), 'Allow Player Shout', - Sig2Int('GOLD'), 'Gold', - Sig2Int('LKPK'), 'Lockpick', - Sig2Int('SKLK'), 'SkeletonKey', - Sig2Int('PFAC'), 'Player Faction', - Sig2Int('GFAC'), 'Guard Faction', - Sig2Int('DFMS'), 'Default Music', - Sig2Int('BTMS'), 'Battle Music', - Sig2Int('DTMS'), 'Death Music', - Sig2Int('SCMS'), 'Success Music', - Sig2Int('LUMS'), 'Level Up Music', - Sig2Int('DCMS'), 'Dungeon Cleared Music', - Sig2Int('PVMA'), 'Player Voice (Male)', - Sig2Int('PVMC'), 'Player Voice (Male Child)', - Sig2Int('PVFA'), 'Player Voice (Female)', - Sig2Int('PVFC'), 'Player Voice (Female Child)', - Sig2Int('EPDF'), 'Eat Package Default Food', - Sig2Int('LHEQ'), 'LeftHand Equip', - Sig2Int('RHEQ'), 'RightHand Equip', - Sig2Int('EHEQ'), 'EitherHand Equip', - Sig2Int('VOEQ'), 'Voice Equip', - Sig2Int('POEQ'), 'Potion Equip', - Sig2Int('EACA'), 'Every Actor Ability', - Sig2Int('CACA'), 'Commanded Actor Ability', - Sig2Int('DEIS'), 'Drug Wears Off Image Space', - Sig2Int('DFTS'), 'Footstep Set', - Sig2Int('DLMT'), 'Landscape Material', - Sig2Int('DLZM'), 'Dragon Land Zone Marker', - Sig2Int('DCZM'), 'Dragon Crash Zone Marker', - Sig2Int('CSTY'), 'Combat Style', - Sig2Int('PLST'), 'Default Pack List', - Sig2Int('PWFD'), 'Wait-For-Dialogue Package', - Sig2Int('LRTB'), 'LocRefType Boss', - Sig2Int('VLOC'), 'Virtual Location', - Sig2Int('PLOC'), 'PersistAll Location', - Sig2Int('INVP'), 'Inventory Player', - Sig2Int('PTNP'), 'Pathing Test NPC', - Sig2Int('FPCS'), 'Favor Cost Small', - Sig2Int('FPCM'), 'Favor Cost Medium', - Sig2Int('FPCL'), 'Favor Cost Large', - Sig2Int('FGPD'), 'Favor Gifts Per Day', - Sig2Int('AASW'), 'Action Swim State Change', - Sig2Int('AALK'), 'Action Look', - Sig2Int('AALA'), 'Action LeftAttack', - Sig2Int('AALD'), 'Action LeftReady', - Sig2Int('AALR'), 'Action LeftRelease', - Sig2Int('AALI'), 'Action LeftInterrupt', - Sig2Int('AARA'), 'Action RightAttack', - Sig2Int('AARD'), 'Action RightReady', - Sig2Int('AARR'), 'Action RightRelease', - Sig2Int('AARI'), 'Action RightInterrupt', - Sig2Int('AADA'), 'Action DualAttack', - Sig2Int('AADL'), 'Action DualRelease', - Sig2Int('AAAC'), 'Action Activate', - Sig2Int('AAJP'), 'Action Jump', - Sig2Int('AAFA'), 'Action Fall', - Sig2Int('AALN'), 'Action Land', - Sig2Int('AASN'), 'Action Sneak', - Sig2Int('AAVC'), 'Action Voice', - Sig2Int('AAVD'), 'Action VoiceReady', - Sig2Int('AAVR'), 'Action VoiceRelease', - Sig2Int('AAVI'), 'Action VoiceInterrupt', - Sig2Int('AAID'), 'Action Idle', - Sig2Int('AAST'), 'Action Sprint Start', - Sig2Int('AASP'), 'Action Sprint Stop', - Sig2Int('AADR'), 'Action Draw', - Sig2Int('AASH'), 'Action Sheath', - Sig2Int('ALPA'), 'Action Left Power Attack', - Sig2Int('AAPA'), 'Action Right Power Attack', - Sig2Int('ADPA'), 'Action Dual Power Attack', - Sig2Int('AAS1'), 'Action Stagger Start', - Sig2Int('AABH'), 'Action Block Hit', - Sig2Int('AABA'), 'Action Block Anticipate', - Sig2Int('AARC'), 'Action Recoil', - Sig2Int('AAR2'), 'Action Large Recoil', - Sig2Int('AAB1'), 'Action Bleedout Start', - Sig2Int('AAB2'), 'Action Bleedout Stop', - Sig2Int('AAIS'), 'Action Idle Stop', - Sig2Int('AAWH'), 'Action Ward Hit', - Sig2Int('AAFQ'), 'Action Force Equip', - Sig2Int('AASC'), 'Action Shield Change', - Sig2Int('AAPS'), 'Action Path Start', - Sig2Int('AAPE'), 'Action Path End', - Sig2Int('AALM'), 'Action Large Movement Delta', - Sig2Int('AAF1'), 'Action Fly Start', - Sig2Int('AAF2'), 'Action Fly Stop', - Sig2Int('AAH1'), 'Action Hover Start', - Sig2Int('AAH2'), 'Action Hover Stop', - Sig2Int('AABI'), 'Action Bumped Into', - Sig2Int('AASS'), 'Action Summoned Start', - Sig2Int('ATKI'), 'Action Talking Idle', - Sig2Int('ALTI'), 'Action Listen Idle', - Sig2Int('AADE'), 'Action Death', - Sig2Int('AADW'), 'Action Death Wait', - Sig2Int('AIDW'), 'Action Idle Warn', - Sig2Int('AMST'), 'Action Move Start', - Sig2Int('AMSP'), 'Action Move Stop', - Sig2Int('ATRI'), 'Action Turn Right', - Sig2Int('ATLE'), 'Action Turn Left', - Sig2Int('ATSP'), 'Action Turn Stop', - Sig2Int('AMFD'), 'Action Move Forward', - Sig2Int('AMBK'), 'Action Move Backward', - Sig2Int('AMLT'), 'Action Move Left', - Sig2Int('AMRT'), 'Action Move Right', - Sig2Int('ARAG'), 'Action Reset Animation Graph', - Sig2Int('AKDN'), 'Action Knockdown', - Sig2Int('AAGU'), 'Action Get Up', - Sig2Int('ASID'), 'Action Idle Stop Instant', - Sig2Int('ARGI'), 'Action Ragdoll Instant', - Sig2Int('AWWS'), 'Action Waterwalk Start', - Sig2Int('AREL'), 'Action Reload', - Sig2Int('PUSG'), 'Pickup Sound Generic', - Sig2Int('PDSG'), 'Putdown Sound Generic', - Sig2Int('PUSW'), 'Pickup Sound Weapon', - Sig2Int('PDSW'), 'Putdown Sound Weapon', - Sig2Int('PUSA'), 'Pickup Sound Armor', - Sig2Int('PDSA'), 'Putdown Sound Armor', - Sig2Int('PUSB'), 'Pickup Sound Book', - Sig2Int('PDSB'), 'Putdown Sound Book', - Sig2Int('PUSI'), 'Pickup Sound Ingredient', - Sig2Int('PDSI'), 'Putdown Sound Ingredient', - Sig2Int('HVSS'), 'Harvest Sound', - Sig2Int('HVFS'), 'Harvest Failed Sound', - Sig2Int('WBSN'), 'Ward Break Sound', - Sig2Int('WASN'), 'Ward Absorb Sound', - Sig2Int('WDSN'), 'Ward Deflect Sound', - Sig2Int('MFSN'), 'Magic Fail Sound', - Sig2Int('SFSN'), 'Shout Fail Sound', - Sig2Int('HFSD'), 'Heartbeat Sound Fast', - Sig2Int('HSSD'), 'Heartbeat Sound Slow', - Sig2Int('IMLH'), 'Imagespace: Low Health', - Sig2Int('SCSD'), 'Soul Captured Sound', - Sig2Int('NASD'), 'No-Activation Sound', - Sig2Int('MMSD'), 'Map Menu Looping Sound', - Sig2Int('DDSC'), 'Dialogue Voice Category', - Sig2Int('NDSC'), 'Non-Dialogue Voice Category', - Sig2Int('SFDC'), 'SFX To Fade In Dialogue Category', - Sig2Int('PDMC'), 'Pause During Menu Category (Fade)', - Sig2Int('PIMC'), 'Pause During Menu Category (Immediate)', - Sig2Int('PDLC'), 'Pause During Loading Menu Category', - Sig2Int('MDSC'), 'Music Sound Category', - Sig2Int('SMSC'), 'Stats Mute Category', - Sig2Int('SSSC'), 'Stats Music', - Sig2Int('MTSC'), 'Master Sound Category', - Sig2Int('TSSC'), 'Time Sensitive Sound Category', - Sig2Int('DOP2'), 'Dialogue Output Model (3D)', - Sig2Int('DOP3'), 'Dialogue Output Model (2D)', - Sig2Int('POPM'), 'Player''s Output Model (1st Person)', - Sig2Int('P3OM'), 'Player''s Output Model (3rd Person)', - Sig2Int('IOPM'), 'Interface Output Model', - Sig2Int('RVBT'), 'Reverb Type', - Sig2Int('UWLS'), 'Underwater Loop Sound', - Sig2Int('URVT'), 'Underwater Reverb Type', - Sig2Int('HRSK'), 'Keyword - Horse', - Sig2Int('UNDK'), 'Keyword - Undead', - Sig2Int('NPCK'), 'Keyword - NPC', - Sig2Int('KWBR'), 'Keyword - BeastRace', - Sig2Int('KWDM'), 'Keyword - DummyObject', - Sig2Int('KWGE'), 'Keyword - UseGeometryEmitter', - Sig2Int('KWMS'), 'Keyword - MustStop', - Sig2Int('KWUA'), 'Keyword - UpdateDuringArchery', - Sig2Int('KWOT'), 'Keyword - Skip Outfit Items', - Sig2Int('FTHD'), 'Male Face Texture Set: Head', - Sig2Int('FTMO'), 'Male Face Texture Set: Mouth', - Sig2Int('FTEL'), 'Male Face Texture Set: Eyes', - Sig2Int('FTHF'), 'Female Face Texture Set: Head', - Sig2Int('FTMF'), 'Female Face Texture Set: Mouth', - Sig2Int('FTRF'), 'Female Face Texture Set: Eyes', - Sig2Int('IMID'), 'ImageSpaceModifier for inventory menu.', - Sig2Int('PTEM'), 'Package template', - Sig2Int('MMCL'), 'Main Menu Cell', - Sig2Int('DMWL'), 'Default MovementType: Walk', - Sig2Int('DMRN'), 'Default MovementType: Run', - Sig2Int('DMSW'), 'Default MovementType: Swim', - Sig2Int('DMFL'), 'Default MovementType: Fly', - Sig2Int('DMSN'), 'Default MovementType: Sneak', - Sig2Int('DMSP'), 'Default MovementType: Sprint', - Sig2Int('SPFK'), 'Keyword - Special Furniture', - Sig2Int('FFFP'), 'Keyword - Furniture Forces 1st Person', - Sig2Int('FFTP'), 'Keyword - Furniture Forces 3rd Person', - Sig2Int('AFNP'), 'Keyword - Activator Furniture No Player', - Sig2Int('TKGS'), 'Telekinesis Grab Sound', - Sig2Int('TKTS'), 'Telekinesis Throw Sound', - Sig2Int('WMWE'), 'World Map Weather', - Sig2Int('HMPC'), 'Help Manual PC', - Sig2Int('HMXB'), 'Help Manual XBox', - Sig2Int('TKAM'), 'Keyword - Type Ammo', - Sig2Int('TKAR'), 'Keyword - Type Armor', - Sig2Int('TKBK'), 'Keyword - Type Book', - Sig2Int('TKIG'), 'Keyword - Type Ingredient', - Sig2Int('TKKY'), 'Keyword - Type Key', - Sig2Int('TKMS'), 'Keyword - Type Misc', - Sig2Int('TKSG'), 'Keyword - Type SoulGem', - Sig2Int('TKWP'), 'Keyword - Type Weapon', - Sig2Int('TKPT'), 'Keyword - Type Potion', - Sig2Int('BENW'), 'Base Weapon Enchantment', - Sig2Int('BENA'), 'Base Armor Enchantment', - Sig2Int('BAPO'), 'Base Potion', - Sig2Int('BAPS'), 'Base Poison', - Sig2Int('DRAK'), 'Keyword - Dragon', - Sig2Int('MVBL'), 'Keyword - Movable', - Sig2Int('ABSE'), 'Art Object - Absorb Effect', - Sig2Int('WEML'), 'Weapon Material List', - Sig2Int('ARTL'), 'Armor Material List', - Sig2Int('DIEN'), 'Keyword - Disallow Enchanting', - Sig2Int('FTML'), 'Favor travel marker location', - Sig2Int('LKHO'), 'Keyword - Hold Location', - Sig2Int('CWOK'), 'Keyword - Civil War Owner', - Sig2Int('CWNE'), 'Keyword - Civil War Neutral', - Sig2Int('LRSO'), 'LocRefType - Civil War Soldier', - Sig2Int('KWDO'), 'Keyword - ClearableLocation', - Sig2Int('LRRD'), 'LocRefType - Resource Destructible', - Sig2Int('HCLL'), 'FormList - Hair Color List', - Sig2Int('CMPX'), 'Complex Scene Object', - Sig2Int('RUSG'), 'Keyword - Reusable SoulGem', - Sig2Int('ANML'), 'Keyword - Animal', - Sig2Int('DAED'), 'Keyword - Daedra' - ]); - - b := MakeVarRecs([ - Sig2Int('BEEP'), 'Keyword - Robot', - Sig2Int('NRNT'), 'Keyword - Nirnroot', - Sig2Int('FTGF'), 'Fighters'' Guild Faction', - Sig2Int('MGGF'), 'Mages'' Guild Faction', - Sig2Int('TVGF'), 'Thieves'' Guild Faction', - Sig2Int('DBHF'), 'Dark Brotherhood Faction', - Sig2Int('JRLF'), 'Jarl Faction', - Sig2Int('AWWW'), 'Bunny Faction', - Sig2Int('PIVV'), 'Player Is Vampire Variable', - Sig2Int('PIWV'), 'Player Is Werewolf Variable', - Sig2Int('NMRD'), 'Road Marker', - Sig2Int('SAT1'), 'Keyword: Scale Actor To 1.0', - Sig2Int('VAMP'), 'Keyword: Vampire', - Sig2Int('FORG'), 'Keyword: Forge', - Sig2Int('COOK'), 'Keyword: Cooking Pot', - Sig2Int('SMLT'), 'Keyword: Smelter', - Sig2Int('TANN'), 'Keyword: Tanning Rack', - Sig2Int('HBLK'), 'Help - Basic Lockpicking (PC)', - Sig2Int('HBLX'), 'Help - Basic Lockpicking (Console)', - Sig2Int('HBFG'), 'Help - Basic Forging', - Sig2Int('HBCO'), 'Help - Basic Cooking', - Sig2Int('HBML'), 'Help - Basic Smelting', - Sig2Int('HBTA'), 'Help - Basic Tanning', - Sig2Int('HBOC'), 'Help - Basic Object Creation', - Sig2Int('HBEC'), 'Help - Basic Enchanting', - Sig2Int('HBSM'), 'Help - Basic Smithing Weapon', - Sig2Int('HBSA'), 'Help - Basic Smithing Armor', - Sig2Int('HBAL'), 'Help - Basic Alchemy', - Sig2Int('HBBR'), 'Help - Barter', - Sig2Int('HBLU'), 'Help - Leveling up', - Sig2Int('HBSK'), 'Help - Skills Menu', - Sig2Int('HBMM'), 'Help - Map Menu', - Sig2Int('HBJL'), 'Help - Journal', - Sig2Int('HBLH'), 'Help - Low Health', - Sig2Int('HBLM'), 'Help - Low Magicka', - Sig2Int('HBLS'), 'Help - Low Stamina', - Sig2Int('HBHJ'), 'Help - Jail', - Sig2Int('HBFT'), 'Help - Teamate Favor', - Sig2Int('HBWC'), 'Help - Weapon Charge', - Sig2Int('HBFS'), 'Help - Favorites', - Sig2Int('KHFL'), 'Kinect Help FormList', - Sig2Int('HBFM'), 'Help - Flying Mount', - Sig2Int('HBTL'), 'Help - Target Lock', - Sig2Int('HBAT'), 'Help - Attack Target', - Sig2Int('MHFL'), 'Help - Mods', - Sig2Int('LSIS'), 'Imagespace: Load screen', - Sig2Int('WMDA'), 'Keyword - Weapon Material Daedric', - Sig2Int('WMDR'), 'Keyword - Weapon Material Draugr', - Sig2Int('WMDH'), 'Keyword - Weapon Material DraugrHoned', - Sig2Int('WMDW'), 'Keyword - Weapon Material Dwarven', - Sig2Int('WMEB'), 'Keyword - Weapon Material Ebony', - Sig2Int('WMEL'), 'Keyword - Weapon Material Elven', - Sig2Int('WMFA'), 'Keyword - Weapon Material Falmer', - Sig2Int('WMFH'), 'Keyword - Weapon Material FalmerHoned', - Sig2Int('WMGL'), 'Keyword - Weapon Material Glass', - Sig2Int('WMIM'), 'Keyword - Weapon Material Imperial', - Sig2Int('WMIR'), 'Keyword - Weapon Material Iron', - Sig2Int('WMOR'), 'Keyword - Weapon Material Orcish', - Sig2Int('WMST'), 'Keyword - Weapon Material Steel', - Sig2Int('WMWO'), 'Keyword - Weapon Material Wood', - Sig2Int('WTBA'), 'Keyword - WeaponTypeBoundArrow', - Sig2Int('AODA'), 'Keyword - Armor Material Daedric', - Sig2Int('AODP'), 'Keyword - Armor Material Dragonplate', - Sig2Int('AODS'), 'Keyword - Armor Material Dragonscale', - Sig2Int('AODB'), 'Keyword - Armor Material Dragonbone', - Sig2Int('AODW'), 'Keyword - Armor Material Dwarven', - Sig2Int('AOEB'), 'Keyword - Armor Material Ebony', - Sig2Int('AOEL'), 'Keyword - Armor Material Elven', - Sig2Int('AOES'), 'Keyword - Armor Material ElvenSplinted', - Sig2Int('AOFL'), 'Keyword - Armor Material FullLeather', - Sig2Int('AOGL'), 'Keyword - Armor Material Glass', - Sig2Int('AOHI'), 'Keyword - Armor Material Hide', - Sig2Int('AOIM'), 'Keyword - Armor Material Imperial', - Sig2Int('AOIH'), 'Keyword - Armor Material ImperialHeavy', - Sig2Int('AOIR'), 'Keyword - Armor Material ImperialReinforced', - Sig2Int('AOFE'), 'Keyword - Armor Material Iron', - Sig2Int('AOIB'), 'Keyword - Armor Material IronBanded', - Sig2Int('AOOR'), 'Keyword - Armor Material Orcish', - Sig2Int('AOSC'), 'Keyword - Armor Material Scaled', - Sig2Int('AOST'), 'Keyword - Armor Material Steel', - Sig2Int('AOSP'), 'Keyword - Armor Material SteelPlate', - Sig2Int('AOSK'), 'Keyword - Armor Material Stormcloak', - Sig2Int('AOSD'), 'Keyword - Armor Material Studded', - Sig2Int('GCK1'), 'Keyword - Generic Craftable Keyword 01', - Sig2Int('GCK2'), 'Keyword - Generic Craftable Keyword 02', - Sig2Int('GCK3'), 'Keyword - Generic Craftable Keyword 03', - Sig2Int('GCK4'), 'Keyword - Generic Craftable Keyword 04', - Sig2Int('GCK5'), 'Keyword - Generic Craftable Keyword 05', - Sig2Int('GCK6'), 'Keyword - Generic Craftable Keyword 06', - Sig2Int('GCK7'), 'Keyword - Generic Craftable Keyword 07', - Sig2Int('GCK8'), 'Keyword - Generic Craftable Keyword 08', - Sig2Int('GCK9'), 'Keyword - Generic Craftable Keyword 09', - Sig2Int('GCKX'), 'Keyword - Generic Craftable Keyword 10', - Sig2Int('JWLR'), 'Keyword - Jewelry', - Sig2Int('KWCU'), 'Keyword - Cuirass', - Sig2Int('MNTK'), 'Keyword - Mount', - Sig2Int('LMHP'), 'Local Map Hide Plane', - Sig2Int('SLDM'), 'Snow LOD Material', - Sig2Int('SLHD'), 'Snow LOD Material (HD)', - Sig2Int('ALDM'), 'Ash LOD Material', - Sig2Int('ALHD'), 'Ash LOD Material (HD)', - Sig2Int('DGFL'), 'DialogueFollower Quest', - Sig2Int('PTFR'), 'PotentialFollower Faction', - Sig2Int('AVWP'), 'Werewolf Available Perks', - Sig2Int('AVVP'), 'Vampire Available Perks', - Sig2Int('RIWR'), 'Werewolf Race', - Sig2Int('RIVR'), 'Vampire Race', - Sig2Int('RIVS'), 'Vampire Spells', - Sig2Int('DMXL'), 'Dragon Mount No Land List', - Sig2Int('PCMD'), 'Player Can Mount Dragon Here List', - Sig2Int('FMYS'), 'Flying Mount - Allowed Spells', - Sig2Int('FMNS'), 'Flying Mount - Disallowed Spells', - Sig2Int('MNT2'), 'Keyword - Mount', - Sig2Int('AIVC'), 'Verlet Cape', - Sig2Int('FTNP'), 'Furniture Test NPC', - Sig2Int('COEX'), 'Keyword - Conditional Explosion', - Sig2Int('VFNC'), 'Vampire Feed No Crime Faction', - Sig2Int('KWSP'), 'Skyrim - Worldspace', - Sig2Int('ALBM'), 'Keyword - Armor Material Light Bonemold', - Sig2Int('ALCH'), 'Keyword - Armor Material Light Chitin', - Sig2Int('ALNC'), 'Keyword - Armor Material Light Nordic', - Sig2Int('ALSM'), 'Keyword - Armor Material Light Stalhrim', - Sig2Int('FMFF'), 'Flying Mount - Fly Fast Worldspaces', - Sig2Int('AHBM'), 'Keyword - Armor Material Heavy Bonemold', - Sig2Int('AHCH'), 'Keyword - Armor Material Heavy Chitin', - Sig2Int('AHNC'), 'Keyword - Armor Material Heavy Nordic', - Sig2Int('AHSM'), 'Keyword - Armor Material Heavy Stalhrim', - Sig2Int('WPNC'), 'Keyword - Weapon Material Nordic', - Sig2Int('WPSM'), 'Keyword - Weapon Material Stalhrim' - ]); - - c := CombineVarRecs(a, b); - - wbRecord(DOBJ, 'Default Object Manager', [ - wbEDID, - wbArrayS(DNAM, 'Objects', - wbStructSK([0], 'Object', [ - wbInteger('Use', itU32, wbEnum([], c), cpNormalIgnoreEmpty), - wbFormID('Object ID', cpNormalIgnoreEmpty) - ]), 0, cpNormalIgnoreEmpty, True, wbDOBJObjectsAfterLoad - ) - ]); - - wbRecord(LGTM, 'Lighting Template', [ - wbEDID, - wbStruct(DATA, 'Lighting', [ - wbByteColors('Ambient Color'), - wbByteColors('Directional Color'), - wbByteColors('Fog Color Near'), - wbFloat('Fog Near'), - wbFloat('Fog Far'), - wbInteger('Directional Rotation XY', itS32), - wbInteger('Directional Rotation Z', itS32), - wbFloat('Directional Fade'), - wbFloat('Fog Clip Dist'), - wbFloat('Fog Power'), - wbAmbientColors('Ambient Colors'), // WindhelmLightingTemplate [LGTM:0007BA87] only find 24 ! - wbByteColors('Fog Color Far'), - wbFloat('Fog Max'), - wbStruct('Light Fade Distances', [ - wbFloat('Start'), - wbFloat('End') - ]), - wbByteArray('Unknown', 4) - ], cpNormal, True, nil, 11), - wbAmbientColors(DALC) - ]); - - wbRecord(MUSC, 'Music Type', [ - wbEDID, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x01} 'Plays One Selection', - {0x02} 'Abrupt Transition', - {0x04} 'Cycle Tracks', - {0x08} 'Maintain Track Order', - {0x10} 'Unknown 4', - {0x20} 'Ducks Current Track', - {0x40} IsSSE('Doesn''t Queue', 'Unknown 6') - ]), cpNormal, True), - wbStruct(PNAM, 'Data', [ - wbInteger('Priority', itU16), - wbInteger('Ducking (dB)', itU16, wbDiv(100)) - ]), - wbFloat(WNAM, 'Fade Duration'), - wbArray(TNAM, 'Music Tracks', wbFormIDCk('Track', [MUST, NULL])) - ]); - - wbRecord(FSTP, 'Footstep', [ - wbEDID, - wbFormIDCk(DATA, 'Impact Data Set', [IPDS, NULL], False, cpNormal, True), - wbString(ANAM, 'Tag', 0, cpNormal, True) - ]); - - wbRecord(FSTS, 'Footstep Set', [ - wbEDID, - wbStruct(XCNT, 'Count', [ - wbInteger('Walk Forward Sets', itU32), - wbInteger('Run Forward Sets', itU32), - wbInteger('Walk Forward Alternate Sets', itU32), - wbInteger('Run Forward Alternate Sets', itU32), - wbInteger('Walk Forward Alternate 2 Sets', itU32) - ], cpNormal, True), - wbArray(DATA, 'Footstep Sets', wbFormIDCk('Footstep', [FSTP]), 0, nil, nil, cpNormal, True) - ]); - - wbSMNodeFlags := wbFlags([ - 'Random', - 'Warn if no child quest started' - ]); - - wbRecord(SMBN, 'Story Manager Branch Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL]), - wbCITC, - wbCTDAsCount, - wbInteger(DNAM, 'Flags', itU32, wbSMNodeFlags), - wbUnknown(XNAM) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(SMQN, 'Story Manager Quest Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL]), - wbCITC, - wbCTDAsCount, - wbStruct(DNAM, 'Flags', [ - wbInteger('Node Flags', itU16, wbSMNodeFlags), - wbInteger('Quest Flags', itU16, wbFlags([ - 'Do all before repeating', - 'Shares event', - 'Num quests to run' - ])) - ]), - wbInteger(XNAM, 'Max concurrent quests', itU32), - wbInteger(MNAM, 'Num quests to run', itU32), - wbInteger(QNAM, 'Quest Count', itU32, nil, cpBenign), - wbRArray('Quests', wbRStructSK([0], 'Quest', [ - wbFormIDCk(NNAM, 'Quest', [QUST]), - wbUnknown(FNAM), - wbFloat(RNAM, 'Hours until reset', cpNormal, False, 1/24) - ], []), cpNormal, False, nil, wbSMQNQuestsAfterSet) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(SMEN, 'Story Manager Event Node', [ - wbEDID, - wbFormIDCk(PNAM, 'Parent ', [SMQN, SMBN, SMEN, NULL]), - wbFormIDCk(SNAM, 'Child ', [SMQN, SMBN, SMEN, NULL]), - wbCITC, - wbCTDAsCount, - wbInteger(DNAM, 'Flags', itU32, wbSMNodeFlags), - wbUnknown(XNAM), - wbString(ENAM, 'Type', 4) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); -end; - -procedure DefineTES5j; -begin - wbRecord(DLBR, 'Dialog Branch', [ - wbEDID, - wbFormIDCk(QNAM, 'Quest', [QUST], False, cpNormal, True), - wbInteger(TNAM, 'Unknown', itU32), - wbInteger(DNAM, 'Flags', itU32, wbFlags([ - {0x01} 'Top-Level', - {0x02} 'Blocking', - {0x04} 'Exclusive' - ])), - wbFormIDCk(SNAM, 'Starting Topic', [DIAL], False, cpNormal, True) - ]); - - wbRecord(MUST, 'Music Track', [ - wbEDID, - wbInteger(CNAM, 'Track Type', itU32, wbEnum([], [ - Int64($23F678C3), 'Palette', - Int64($6ED7E048), 'Single Track', - Int64($A1A9C4D5), 'Silent Track' - ]), cpNormal, True), - wbFloat(FLTV, 'Duration'), - wbFloat(DNAM, 'Fade-Out'), - wbString(ANAM, 'Track Filename'), - wbString(BNAM, 'Finale Filename'), - wbArray(FNAM, 'Cue Points', wbFloat('Point')), - wbStruct(LNAM, 'Loop Data', [ - wbFloat('Loop Begins'), - wbFloat('Loop Ends'), - wbInteger('Loop Count', itU32) - ]), - wbCITC, - wbCTDAsCount, - wbArray(SNAM, 'Tracks', wbFormIDCk('Track', [MUST, NULL])) - ], False, nil, cpNormal, False, nil, wbConditionsAfterSet); - - wbRecord(DLVW, 'Dialog View', [ - wbEDID, - wbFormIDCk(QNAM, 'Quest', [QUST], False, cpNormal, True), - wbRArray('Branches', wbFormIDCk(BNAM, 'Branch', [DLBR])), - wbRArray('Unknown TNAM', wbRStruct('Unknown', [ - wbUnknown(TNAM) - ], [])), - wbUnknown(ENAM), - wbUnknown(DNAM) - ]); - - wbRecord(WOOP, 'Word of Power', [ - wbEDID, - wbFULL, - wbLString(TNAM, 'Translation', 0, cpTranslate, True) - ]); - - wbRecord(SHOU, 'Shout', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000080} 7, 'Treat spells as powers' - ])), [ - wbEDID, - wbFULL, - wbMDOB, - wbDESC, - {>>> Don't sort <<<} - wbRArray('Words of Power', - wbStruct(SNAM, '', [ - wbFormIDCk('Word', [WOOP, NULL]), - wbFormIDCk('Spell', [SPEL, NULL]), - wbFloat('Recovery Time') - ]) - ) - ]); - - wbRecord(EQUP, 'Equip Type', [ - wbEDID, - wbArray(PNAM, 'Slot Parents', wbFormID('Can Be Equipped'), 0, nil, nil, cpNormal, False), - wbInteger(DATA, 'Use All Parents', itU32, wbEnum(['False', 'True'])) - ]); - - wbRecord(RELA, 'Relationship', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Secret' - ])), [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbFormIDCk('Parent', [NPC_, NULL]), - wbFormIDCk('Child', [NPC_, NULL]), - wbInteger('Rank', itU16, wbEnum([ - 'Lover', - 'Ally', - 'Confidant', - 'Friend', - 'Acquaitance', - 'Rival', - 'Foe', - 'Enemy', - 'Archnemesis' - ])), - wbByteArray('Unknown', 1), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Unknown 1', - {0x02} 'Unknown 2', - {0x04} 'Unknown 3', - {0x08} 'Unknown 4', - {0x10} 'Unknown 5', - {0x20} 'Unknown 6', - {0x40} 'Unknown 7', - {0x80} 'Secret' - ])), - wbFormIDCk('Association Type', [ASTP, NULL]) - ]) - ]); - - wbRecord(SCEN, 'Scene', [ - wbEDID, - wbVMADFragmentedSCEN, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - 'Begin on Quest Start', - 'Stop on Quest End', - 'Unknown 3', - 'Repeat Conditions While True', - 'Interruptible' - ])), - wbRArray('Phases', - wbRStruct('Phase', [ - wbEmpty(HNAM, 'Marker Phase Start'), - wbString(NAM0, 'Name'), - // CTDA before or after next - //wbEmpty(NEXT, 'Marker'), - wbRStruct('Start Conditions', [wbCTDAs], []), - wbEmpty(NEXT, 'Marker'), - wbRStruct('Completion Conditions', [wbCTDAs], []), - {>>> BEGIN leftover from earlier CK versions <<<} - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - wbEmpty(NEXT, 'Marker'), - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - {>>> END leftover from earlier CK versions begin <<<} - wbInteger(WNAM, 'Editor Width', itU32), - wbEmpty(HNAM, 'Marker Phase End') - ], []) - ), - wbRArray('Actors', wbRStruct('Actor', [ - wbInteger(ALID, 'Actor ID', itU32), - wbInteger(LNAM, 'Flags', itU32, wbFlags([ - 'No Player Activation', - 'Optional' - ])), - wbInteger(DNAM, 'Behaviour Flags', itU32, wbFlags([ - 'Death Pause (unsused)', - 'Death End', - 'Combat Pause', - 'Combat End', - 'Dialogue Pause', - 'Dialogue End', - 'OBS_COM Pause', - 'OBS_COM End' - ])) - ], [])), - wbRArray('Actions', wbRStruct('Action', [ - wbInteger(ANAM, 'Type', itU16, wbEnum([ - 'Dialogue', - 'Package', - 'Timer' - ])), - wbString(NAM0, 'Name'), - wbInteger(ALID, 'Actor ID', itS32), - wbUnknown(LNAM), - wbInteger(INAM, 'Index', itU32), - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Unknown 1', - {0x00000002} 'Unknown 2', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Unknown 9', - {0x00000200} 'Unknown 10', - {0x00000400} 'Unknown 11', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Unknown 14', - {0x00004000} 'Unknown 15', - {0x00008000} 'Face Target', - {0x00010000} 'Looping', - {0x00020000} 'Headtrack Player' - ])), - wbInteger(SNAM, 'Start Phase', itU32), - wbInteger(ENAM, 'End Phase', itU32), - wbFloat(SNAM, 'Timer Seconds'), - wbRArray('Packages', wbFormIDCk(PNAM, 'Package', [PACK])), - wbFormIDCk(DATA, 'Topic', [DIAL, NULL]), - wbInteger(HTID, 'Headtrack Actor ID', itS32), - wbFloat(DMAX, 'Looping - Max'), - wbFloat(DMIN, 'Looping - Min'), - wbInteger(DEMO, 'Emotion Type', itU32, wbEmotionTypeEnum), - wbInteger(DEVA, 'Emotion Value', itU32), - {>>> BEGIN leftover from earlier CK versions <<<} - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbEmpty(ANAM, 'End Marker') - ], [])), - {>>> BEGIN leftover from earlier CK versions <<<} - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - wbEmpty(NEXT, 'Marker'), - wbRStruct('Unused', [ - wbUnknown(SCHR), - wbUnknown(SCDA), - wbUnknown(SCTX), - wbUnknown(QNAM), - wbUnknown(SCRO) - ], [], cpIgnore, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbFormIDCk(PNAM, 'Quest', [QUST]), - wbInteger(INAM, 'Last Action Index', itU32), - wbUnknown(VNAM), - wbCTDAs - ]); - - wbRecord(ASTP, 'Association Type', [ - wbEDID, - wbString(MPRT, 'Male Parent Title'), - wbString(FPRT, 'Female Parent Title'), - wbString(MCHT, 'Male Child Title'), - wbString(FCHT, 'Female Child Title'), - wbInteger(DATA, 'Flags', itU32, wbFlags([ - 'Family Association' - ])) - ]); -end; - -procedure DefineTES5k; -begin - - wbRecord(OTFT, 'Outfit', [ - wbEDID, - wbArrayS(INAM, 'Items', wbFormIDCk('Item', [ARMO, LVLI])) - ]); - - wbRecord(ARTO, 'Art Object', [ - wbEDID, - wbOBNDReq, - wbMODL, - wbInteger(DNAM, 'Art Type', itU32, wbEnum([ - 'Magic Casting', - 'Magic Hit Effect', - 'Enchantment Effect' - ])) - ]); - - wbRecord(MATO, 'Material Object', [ - wbEDID, - wbMODL, - wbRArray('Property Data', - wbByteArray(DNAM, 'Data', 0, cpIgnore, False, False, wbNeverShow) - ), - IsSSE( - wbStruct(DATA, 'Directional Material Data', [ - wbFloat('Falloff Scale'), - wbFloat('Falloff Bias'), - wbFloat('Noise UV Scale'), - wbFloat('Material UV Scale'), - wbStruct('Projection Vector', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbFloat('Normal Dampener'), - wbFloatColors('Single Pass Color'), - wbInteger('Flags', itU32, wbFlags(['Single Pass'])), - // SSE - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Snow' - ])), - wbByteArray('Unused', 3, cpIgnore) - ], cpNormal, True, nil, 5), - wbStruct(DATA, 'Directional Material Data', [ - wbFloat('Falloff Scale'), - wbFloat('Falloff Bias'), - wbFloat('Noise UV Scale'), - wbFloat('Material UV Scale'), - wbStruct('Projection Vector', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbFloat('Normal Dampener'), - wbFloatColors('Single Pass Color'), - wbInteger('Flags', itU32, wbFlags(['Single Pass'])) - ], cpNormal, True, nil, 5) - ) - ]); - - wbRecord(MOVT, 'Movement Type', [ - wbEDID, - wbString(MNAM, 'Name'), - wbStruct(SPED, 'Default Data', [ - wbFloat('Left Walk'), - wbFloat('Left Run'), - wbFloat('Right Walk'), - wbFloat('Right Run'), - wbFloat('Forward Walk'), - wbFloat('Forward Run'), - wbFloat('Back Walk'), - wbFloat('Back Run'), - wbFloat('Rotate in Place Walk', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Rotate in Place Run', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize), - wbFloat('Rotate while Moving Run', cpNormal, True, wbRotationFactor, wbRotationScale, nil, RadiansNormalize) - ], cpNormal, True, nil, 10), - wbStruct(INAM, 'Anim Change Thresholds', [ - wbFloat('Directional', cpNormal, True, 180/Pi), - wbFloat('Movement Speed'), - wbFloat('Rotation Speed', cpNormal, True, 180/Pi) - ]) - ]); - - wbRecord(SNDR, 'Sound Descriptor', [ - wbEDID, - wbUnknown(CNAM), - wbFormID(GNAM, 'Category'), - wbFormIDCk(SNAM, 'Alternate Sound For', [SNDR, NULL]), - wbRArray('Sounds', - wbRStruct('Sound Files', [ - wbString(ANAM, 'File Name') - ],[]) - ), - wbFormIDCk(ONAM, 'Output Model', [SOPM, NULL]), - wbLString(FNAM, 'String', 0, cpIgnore), - wbCTDAs, - wbStruct(LNAM, 'Values', [ - wbByteArray('Unknown', 1), - wbInteger('Looping', itU8, wbEnum([], [ - $00 , 'None', - $08 , 'Loop', - $10 , 'Envelope Fast', - $20 , 'Envelope Slow' - ])), - wbByteArray('Unknown', 1), - wbInteger('Rumble Send Value = (Small / 7) + ((Big / 7) * 16)', itU8) - ]), - wbStruct(BNAM, 'Values', [ - wbInteger('% Frequency Shift', itS8), - wbInteger('% Frequency Variance', itS8), - wbInteger('Priority', itU8), - wbInteger('db Variance', itU8), - wbInteger('Static Attenuation (db)', itU16, wbDiv(100)) - ]) - ]); - - wbRecord(DUAL, 'Dual Cast Data', [ - wbEDID, - wbOBNDReq, - wbStruct(DATA, 'Data', [ - wbFormIDCk('Projectile', [PROJ, NULL]), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbFormIDCk('Effect Shader', [EFSH, NULL]), - wbFormIDCk('Hit Effect Art', [ARTO, NULL]), - wbFormIDCk('Impact Data Set', [IPDS, NULL]), - wbInteger('Inherit Scale', itU32, wbFlags([ - 'Hit Effect Art', - 'Projectile', - 'Explosion' - ])) - ], cpNormal, True) - ]); - - wbRecord(SNCT, 'Sound Category', [ - wbEDID, - wbFULL, - wbInteger(FNAM, 'Flags', itU32, wbFlags([ - 'Mute When Submerged', - 'Should Appear on Menu' - ]), cpNormal, True), - wbFormIDCk(PNAM, 'Parent', [SNCT]), - wbInteger(VNAM, 'Static Volume Multiplier', itU16, wbDiv(65535)), - wbInteger(UNAM, 'Default Menu Value', itU16, wbDiv(65535)) - ]); - - wbRecord(SOPM, 'Sound Output Model', [ - wbEDID, - wbStruct(NAM1, 'Data', [ - wbInteger('Flags', itU8, wbFlags([ - 'Attenuates With Distance', - 'Allows Rumble' - ])), - wbByteArray('Unknown', 2), - wbInteger('Reverb Send %', itU8) - ]), - wbUnknown(FNAM), // leftover, unused - wbInteger(MNAM, 'Type', itU32, wbEnum([ - 'Uses HRTF', - 'Defined Speaker Output' - ])), - wbUnknown(CNAM), // leftover, unused - wbUnknown(SNAM), // leftover, unused - wbStruct(ONAM, 'Output Values', [ - wbArray('Channels', wbStruct('', [ - wbInteger('L', itU8), - wbInteger('R', itU8), - wbInteger('C', itU8), - wbInteger('LFE', itU8), - wbInteger('RL', itU8), - wbInteger('RR', itU8), - wbInteger('BL', itU8), - wbInteger('BR', itU8) - ]), [ - 'Channel 0', - 'Channel 1', - 'Channel 2? (unused)' - ]) - ]), - wbStruct(ANAM, 'Attenuation Values', [ - wbByteArray('Unknown', 4), - wbFloat('Min Distance'), - wbFloat('Max Distance'), - wbArray('Curve', wbInteger('Value', itU8), 5), - wbByteArray('Unknown') - ]) - ]); - - wbRecord(COLL, 'Collision Layer', [ - wbEDID, - wbDESCReq, - wbInteger(BNAM, 'Index', itU32, nil, cpNormal, True), - wbStruct(FNAM, 'Debug Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Unused', itU8) - ], cpNormal, True), - wbInteger(GNAM, 'Flags', itU32, wbFlags([ - {0x00000001} 'Trigger Volume', - {0x00000002} 'Sensor', - {0x00000004} 'Navmesh Obstacle' - ]), cpNormal, True), - wbString(MNAM, 'Name', 0, cpNormal, True), - wbInteger(INTV, 'Interactables Count', itU32, nil, cpNormal, True), - wbArrayS(CNAM, 'Collides With', wbFormIDCk('Forms', [COLL]), 0, cpNormal, False) - ]); - - wbRecord(CLFM, 'Color', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbFULL, - wbCNAMReq, - wbInteger(FNAM, 'Playable', itU32, wbEnum(['False', 'True']), cpNormal, True) - ]); -end; - -procedure DefineTES5l; -begin - wbRecord(REVB, 'Reverb Parameters', [ - wbEDID, - wbStruct(DATA, 'Data', [ - wbInteger('Decay Time (ms)', itU16), - wbInteger('HF Reference (Hz)', itU16), - wbInteger('Room Filter', itS8), - wbInteger('Room HF Filter', itS8), - wbInteger('Reflections', itS8), - wbInteger('Reverb Amp', itS8), - wbInteger('Decay HF Ratio', itU8, wbDiv(100)), - wbInteger('Reflect Delay (ms), scaled', itU8), - wbInteger('Reverb Delay (ms)', itU8), - wbInteger('Diffusion %', itU8), - wbInteger('Density %', itU8), - wbInteger('Unknown', itU8) - ], cpNormal, True) - ]); - - wbRecord(GRAS, 'Grass', [ - wbEDID, - wbOBNDReq, - wbMODL, - wbStruct(DATA, '', [ - wbInteger('Density', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbByteArray('Unknown', 1), - wbInteger('Units From Water', itU16), - wbByteArray('Unknown', 2), - wbInteger('Units From Water Type', itU32, wbEnum([ - 'Above - At Least', - 'Above - At Most', - 'Below - At Least', - 'Below - At Most', - 'Either - At Least', - 'Either - At Most', - 'Either - At Most Above', - 'Either - At Most Below' - ])), - wbFloat('Position Range'), - wbFloat('Height Range'), - wbFloat('Color Range'), - wbFloat('Wave Period'), - wbInteger('Flags', itU8, wbFlags([ - 'Vertex Lighting', - 'Uniform Scaling', - 'Fit to Slope' - ])), - wbByteArray('Unknown', 3) - ], cpNormal, True) - ]); - - wbRecord(IDLE, 'Idle Animation', [ - wbEDID, - wbCTDAs, - wbString(DNAM, 'Filename'), - wbString(ENAM, 'Animation Event'), - wbArray(ANAM, 'Related Idle Animations', wbFormIDCk('Related Idle Animation', [AACT, IDLE, NULL]), - ['Parent', 'Previous Sibling'], cpNormal, True), - wbStruct(DATA, 'Data (unused)', [ - wbStruct('Looping seconds (both 255 forever)', [ - wbInteger('Min', itU8), - wbInteger('Max', itU8) - ]), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Parent', - {0x02} 'Sequence', - {0x04} 'No Attacking', - {0x04} 'Blocking' - ], True)), - wbInteger('Animation Group Section', itU8{, wbIdleAnam}), - wbInteger('Replay Delay', itU16) - ], cpIgnore, True) - ]); - - wbRecord(INFO, 'Dialog response', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00002000} 13, 'Actor Changed' - ])), [ - wbEDID, - wbVMADFragmentedINFO, - wbUnknown(DATA), - wbStruct(ENAM, 'Response flags', [ - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Goodbye', - {0x0002} 'Random', - {0x0004} 'Say once', - {0x0008} 'Unknown 4', - {0x0010} 'Unknown 5', - {0x0020} 'Random end', - {0x0040} 'Invisible continue', - {0x0080} 'Walk Away', - {0x0100} 'Walk Away Invisible in Menu', - {0x0200} 'Force subtitle', - {0x0400} 'Can move while greeting', - {0x0800} 'No LIP File', - {0x1000} 'Requires post-processing', - {0x2000} 'Audio Output Override', - {0x4000} 'Spends favor points', - {0x8000} 'Unknown 16' - ])), - wbInteger('Reset Hours', itU16, wbDiv(2730)) - ]), - wbFormIDCk(TPIC, 'Topic', [DIAL]), - wbFormIDCkNoReach(PNAM, 'Previous INFO', [INFO, NULL], False, cpBenign), - wbInteger(CNAM, 'Favor Level', itU8, wbEnum([ - 'None', - 'Small', - 'Medium', - 'Large' - ])), - - wbRArray('Link To', wbFormIDCk(TCLT, 'Response', [DIAL, INFO, NULL])), - wbFormID(DNAM, 'Response Data'), - - wbRArray('Responses', wbRStruct('Response', [ - wbStruct(TRDT, 'Response Data', [ - wbInteger('Emotion Type', itU32, wbEmotionTypeEnum), - wbInteger('Emotion Value', itU32), - wbByteArray('Unused', 4), - wbInteger('Response number', itU8), - wbByteArray('Unused', 3), - wbFormIDCk('Sound', [SNDR, NULL]), - wbInteger('Flags', itU8, wbFlags([ - 'Use Emotion Animation' - ])), - wbByteArray('Unused', 3) - ]), - wbLStringKC(NAM1, 'Response Text', 0, cpTranslate), - wbString(NAM2, 'Script Notes'), - wbString(NAM3, 'Edits'), - wbFormIDCk(SNAM, 'Idle Animations: Speaker', [IDLE]), - wbFormIDCk(LNAM, 'Idle Animations: Listener', [IDLE]) - ], [])), - - wbCTDAs, - - {>>> BEGIN leftover from earlier CK versions <<<} - wbRArray('Unknown', - wbRStruct('Unknown', [ - wbUnknown(SCHR), - wbFormID(QNAM, 'Unknown'), - wbEmpty(NEXT, 'Marker') - ], []), cpIgnore, false, nil, nil, wbNeverShow - ), - {>>> END leftover from earlier CK versions <<<} - - wbLString(RNAM, 'Prompt', 0, cpTranslate), - wbFormIDCk(ANAM, 'Speaker', [NPC_]), - wbFormIDCk(TWAT, 'Walk Away Topic', [DIAL]), - wbFormIDCk(ONAM, 'Audio Output Override', [SOPM]) - ], False, wbINFOAddInfo, cpNormal, False, nil{wbINFOAfterLoad}); - - wbRecord(INGR, 'Ingredient', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbMODL, - wbICON, - wbDEST, - wbETYP, - wbYNAM, - wbZNAM, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True), - wbStruct(ENIT, 'Effect Data', [ - wbInteger('Ingredient Value', itS32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'No auto-calculation', - {0x00000002} 'Food item', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'References Persist' - ])) - ], cpNormal, True), - wbEffectsReq - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(KEYM, 'Key', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, '', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbQuadrantEnum := wbEnum([ - {0} 'Bottom Left', - {1} 'Bottom Right', - {2} 'Top Left', - {3} 'Top Right' - ]); - - if wbSimpleRecords then begin - - wbRecord(LAND, 'Landscape', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed' - ]), [18]), [ - wbByteArray(DATA, 'Unknown'), - wbByteArray(VNML, 'Vertex Normals'), - wbByteArray(VHGT, 'Vertext Height Map'), - wbByteArray(VCLR, 'Vertex Colours'), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]), - wbByteArray(VTXT, 'Alpha Layer Data') - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end else begin - - wbRecord(LAND, 'Landscape', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00040000} 18, 'Compressed' - ]), [18]), [ - wbByteArray(DATA, 'Unknown'), - wbArray(VNML, 'Vertex Normals', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - wbStruct(VHGT, 'Vertext Height Map', [ - wbFloat('Offset'), - wbArray('Rows', wbStruct('Row', [ - wbArray('Columns', wbInteger('Column', itU8), 33) - ]), 33), - wbByteArray('Unknown', 3) - ]), - wbArray(VCLR, 'Vertex Colours', wbStruct('Row', [ - wbArray('Columns', wbStruct('Column', [ - wbInteger('X', itU8), - wbInteger('Y', itU8), - wbInteger('Z', itU8) - ]), 33) - ]), 33), - - wbRArrayS('Layers', wbRUnion('Layer', [ - wbRStructSK([0],'Base Layer', [ - wbStructSK(BTXT, [1, 3], 'Base Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]) - ], []), - wbRStructSK([0],'Alpha Layer', [ - wbStructSK(ATXT, [1, 3], 'Alpha Layer Header', [ - wbFormIDCk('Texture', [LTEX, NULL]), - wbInteger('Quadrant', itU8, wbQuadrantEnum), - wbByteArray('Unknown', 1), - wbInteger('Layer', itS16) - ]), - wbArrayS(VTXT, 'Alpha Layer Data', wbStructSK([0], 'Cell', [ - wbInteger('Position', itU16, wbAtxtPosition), - wbByteArray('Unknown', 2), - wbFloat('Opacity') - ])) - ], []) - ], [])), - - wbArray(VTEX, 'Textures', wbFormIDCk('Texture', [LTEX, NULL])) - ]); - - end; - - wbRecord(LIGH, 'Light', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00010000} 16, 'Random Anim Start', - {0x00020000} 17, 'Portal-strict', - {0x02000000} 25, 'Obstacle' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbMODL, - wbDEST, - wbFULL, - wbICON, - wbStruct(DATA, '', [ - wbInteger('Time', itS32), - wbInteger('Radius', itU32), - wbByteColors, - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Dynamic', - {0x00000002} 'Can be Carried', - {0x00000004} 'Negative', - {0x00000008} 'Flicker', - {0x00000010} 'Unknown', - {0x00000020} 'Off By Default', - {0x00000040} 'Flicker Slow', - {0x00000080} 'Pulse', - {0x00000100} 'Pulse Slow', - {0x00000200} 'Spot Light', - {0x00000400} 'Shadow Spotlight', - {0x00000800} 'Shadow Hemisphere', - {0x00001000} 'Shadow Omnidirectional', - {0x00002000} 'Portal-strict' - ])), - wbFloat('Falloff Exponent'), - wbFloat('FOV'), - wbFloat('Near Clip'), - wbStruct('Flicker Effect', [ - wbFloat('Period', cpNormal, False, 0.01), - wbFloat('Intensity Amplitude'), - wbFloat('Movement Amplitude') - ]), - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbFloat(FNAM, 'Fade value', cpNormal, True), - wbFormIDCk(SNAM, 'Sound', [SNDR]) - ], False, nil, cpNormal, False, wbLIGHAfterLoad); -end; - -procedure DefineTES5m; -begin - - wbRecord(LSCR, 'Load Screen', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Displays In Main Menu' - ])), [ - wbEDID, - wbICON, - wbDESCReq, - wbCTDAs, - wbFormIDCk(NNAM, 'Loading Screen NIF', [STAT, NULL], False, cpNormal, True), - wbFloat(SNAM, 'Initial Scale'), - wbStruct(RNAM, 'Initial Rotation', [ - wbInteger('X', itS16), - wbInteger('Y', itS16), - wbInteger('Z', itS16) - ]), - wbStruct(ONAM, 'Rotation Offset Constraints', [ - wbInteger('Min', itS16), - wbInteger('Max', itS16) - ]), - wbStruct(XNAM, 'Initial Translation Offset', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbString(MOD2, 'Camera Path', 0, cpNormal, False) - ]); - - wbRecord(LTEX, 'Landscape Texture', [ - wbEDID, - wbFormIDCk(TNAM, 'Texture Set', [TXST], False, cpNormal, False), - wbFormIDCk(MNAM, 'Material Type', [MATT, NULL], False, cpNormal, True), - wbStruct(HNAM, 'Havok Data', [ - wbInteger('Friction', itU8), - wbInteger('Restitution', itU8) - ], cpNormal, True), - wbInteger(SNAM, 'Texture Specular Exponent', itU8, nil, cpNormal, True), - wbRArrayS('Grasses', wbFormIDCk(GNAM, 'Grass', [GRAS])), - // SSE - wbInteger(INAM, IsSSE('Flags', 'Unused'), itU32, wbFlags([ - {0x01} 'Is Snow' - ])) - ]); - - wbRecord(LVLN, 'Leveled NPC', [ - wbEDID, - wbOBNDReq, - wbLVLD, - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count' - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Global', [GLOB]), - wbLLCT, - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itS16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow), - wbFormIDCk('Reference', [NPC_, LVLN]), - wbInteger('Count', itS16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow) - ]), - wbCOED - ], []), cpNormal, False, nil, wbLVLOsAfterSet), - wbMODL - ], False, nil, cpNormal, False, nil, wbLLEAfterSet); - - wbRecord(LVLI, 'Leveled Item', [ - wbEDID, - wbOBNDReq, - wbLVLD, - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use All', - {0x08} 'Special Loot' - ]), cpNormal, True), - wbFormIDCk(LVLG, 'Global', [GLOB]), - wbLLCT, - wbRArrayS('Leveled List Entries', - wbRStructExSK([0], [1], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itU16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow), - wbFormIDCk('Reference', [ARMO, AMMO, APPA, MISC, WEAP, BOOK, LVLI, KEYM, ALCH, LIGH, INGR, SLGM, SCRL]), - wbInteger('Count', itU16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow) - ]), - wbCOED - ], []), cpNormal, False, nil, wbLVLOsAfterSet - ) - ], False, nil, cpNormal, False, nil, wbLLEAfterSet); - - wbRecord(LVSP, 'Leveled Spell', [ - wbEDID, - wbOBNDReq, - wbLVLD, - wbInteger(LVLF, 'Flags', itU8, wbFlags([ - {0x01} 'Calculate from all levels <= player''s level', - {0x02} 'Calculate for each item in count', - {0x04} 'Use All Spells' - ]), cpNormal, True), - wbLLCT, - wbRArrayS('Leveled List Entries', - wbRStructSK([0], 'Leveled List Entry', [ - wbStructExSK(LVLO , [0, 2], [3], 'Base Data', [ - wbInteger('Level', itU16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow), - wbFormIDCk('Reference', [SPEL, LVSP]), - wbInteger('Count', itU16), - wbByteArray('Unknown', 2, cpIgnore, false, wbNeverShow) - ]) - ], []), cpNormal, False, nil, wbLVLOsAfterSet - ) - ], False, nil, cpNormal, False, nil, wbLLEAfterSet); - - wbMGEFType := wbInteger('Archtype', itU32, wbEnum([ - {00} 'Value Modifier', - {01} 'Script', - {02} 'Dispel', - {03} 'Cure Disease', - {04} 'Absorb', - {05} 'Dual Value Modifier', - {06} 'Calm', - {07} 'Demoralize', - {08} 'Frenzy', - {09} 'Disarm', - {10} 'Command Summoned', - {11} 'Invisibility', - {12} 'Light', - {13} 'Unknown 13', - {14} 'Unknown 14', - {15} 'Lock', - {16} 'Open', - {17} 'Bound Weapon', - {18} 'Summon Creature', - {19} 'Detect Life', - {20} 'Telekinesis', - {21} 'Paralysis', - {22} 'Reanimate', - {23} 'Soul Trap', - {24} 'Turn Undead', - {25} 'Guide', - {26} 'Werewolf Feed', - {27} 'Cure Paralysis', - {28} 'Cure Addiction', - {29} 'Cure Poison', - {30} 'Concussion', - {31} 'Value and Parts', - {32} 'Accumulate Magnitude', - {33} 'Stagger', - {34} 'Peak Value Modifier', - {35} 'Cloak', - {36} 'Werewolf', - {37} 'Slow Time', - {38} 'Rally', - {39} 'Enhance Weapon', - {40} 'Spawn Hazard', - {41} 'Etherealize', - {42} 'Banish', - {43} 'Spawn Scripted Ref', - {44} 'Disguise', - {45} 'Grab Actor', - {46} 'Vampire Lord' - ]), cpNormal, False, nil, wbMGEFArchtypeAfterSet); - - wbMGEFData := wbRStruct('Magic Effect Data', [ - wbStruct(DATA, 'Data', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Hostile', - {0x00000002} 'Recover', - {0x00000004} 'Detrimental', - {0x00000008} 'Snap to Navmesh', - {0x00000010} 'No Hit Event', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Dispel with Keywords', - {0x00000200} 'No Duration', - {0x00000400} 'No Magnitude', - {0x00000800} 'No Area', - {0x00001000} 'FX Persist', - {0x00002000} 'Unknown 14', - {0x00004000} 'Gory Visuals', - {0x00008000} 'Hide in UI', - {0x00010000} 'Unknown 17', - {0x00020000} 'No Recast', - {0x00040000} 'Unknown 19', - {0x00080000} 'Unknown 20', - {0x00100000} 'Unknown 21', - {0x00200000} 'Power Affects Magnitude', - {0x00400000} 'Power Affects Duration', - {0x00800000} 'Unknown 24', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Painless', - {0x08000000} 'No Hit Effect', - {0x10000000} 'No Death Dispel', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbFloat('Base Cost'), - wbUnion('Assoc. Item', wbMGEFAssocItemDecider, [ - wbFormID('Unused', cpIgnore), - wbFormIDCk('Assoc. Item', [LIGH, NULL]), - wbFormIDCk('Assoc. Item', [WEAP, ARMO, NULL]), - wbFormIDCk('Assoc. Item', [NPC_, NULL]), - wbFormIDCk('Assoc. Item', [HAZD, NULL]), - wbFormIDCk('Assoc. Item', [SPEL, NULL]), - wbFormIDCk('Assoc. Item', [RACE, NULL]), - wbFormIDCk('Assoc. Item', [ENCH, NULL]), - wbFormIDCk('Assoc. Item', [KYWD, NULL]) - ], cpNormal, False, nil, wbMGEFAssocItemAfterSet), - wbInteger('Magic Skill', itS32, wbActorValueEnum), - wbInteger('Resist Value', itS32, wbActorValueEnum), - wbInteger('Counter Effect count', itU16), - wbByteArray('Unused', 2), - wbFormIDCk('Casting Light', [LIGH, NULL]), - wbFloat('Taper Weight'), - wbFormIDCk('Hit Shader', [EFSH, NULL]), - wbFormIDCk('Enchant Shader', [EFSH, NULL]), - wbInteger('Minimum Skill Level', itU32), - wbStruct('Spellmaking', [ - wbInteger('Area', itU32), - wbFloat('Casting Time') - ]), - wbFloat('Taper Curve'), - wbFloat('Taper Duration'), - wbFloat('Second AV Weight', cpNormal, False, nil, wbMGEFAV2WeightAfterSet), - wbMGEFType, - wbActorValue, - wbFormIDCk('Projectile', [PROJ, NULL]), - wbFormIDCk('Explosion', [EXPL, NULL]), - wbInteger('Casting Type', itU32, wbCastEnum), - wbInteger('Delivery', itU32, wbTargetEnum), - wbInteger('Second Actor Value', itS32, wbActorValueEnum), - wbFormIDCk('Casting Art', [ARTO, NULL]), - wbFormIDCk('Hit Effect Art', [ARTO, NULL]), - wbFormIDCk('Impact Data', [IPDS, NULL]), - wbFloat('Skill Usage Multiplier'), - wbStruct('Dual Casting', [ - wbFormIDCk('Art', [DUAL, NULL]), - wbFloat('Scale') - ]), - wbFormIDCk('Enchant Art', [ARTO, NULL]), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbFormIDCk('Equip Ability', [SPEL, NULL]), - wbFormIDCk('Image Space Modifier', [IMAD, NULL]), - wbFormIDCk('Perk to Apply', [PERK, NULL]), - wbInteger('Casting Sound Level', itU32, wbSoundLevelEnum), - wbStruct('Script Effect AI', [ - wbFloat('Score'), - wbFloat('Delay Time') - ]) - ], cpNormal, True) - ], []); - - wbRecord(MGEF, 'Magic Effect', [ - wbEDID, - wbVMAD, - wbFULL, - wbMDOB, - wbKSIZ, - wbKWDAs, - wbMGEFData, - wbRArrayS('Counter Effects', wbFormIDCk(ESCE, 'Effect', [MGEF]), cpNormal, False, nil, wbCounterEffectsAfterSet), - wbArray(SNDD, 'Sounds', wbStruct('', [ - wbInteger('Type', itU32, wbEnum([ - 'Sheathe/Draw', - 'Charge', - 'Ready', - 'Release', - 'Concentration Cast Loop', - 'On Hit' - ])), - wbFormIDCk('Sound', [SNDR]) - ])), - wbLStringKC(DNAM, 'Magic Item Description', 0, cpTranslate), - wbCTDAs - ], False, nil, cpNormal, False, nil {wbMGEFAfterLoad}, wbMGEFAfterSet); - - wbRecord(MISC, 'Misc. Item', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itS32), - wbFloat('Weight') - ], cpNormal, True) - ], False, nil, cpNormal, False, wbRemoveEmptyKWDA, wbKeywordsAfterSet); - - wbRecord(APPA, 'Alchemical Apparatus', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbDEST, - wbYNAM, - wbZNAM, - wbInteger(QUAL, 'Quality', itS32, wbEnum([], [ - 0, 'Novice', - 1, 'Apprentice', - 2, 'Journeyman', - 3, 'Expert', - 4, 'Master' - ])), - wbDESC, - wbStruct(DATA, 'Data', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ]) - ]); - - wbRecord(COBJ, 'Constructible Object', [ - wbEDID, - wbCOCT, - wbCNTOs, - wbCTDAs, - wbFormID(CNAM, 'Created Object'), - wbFormIDCk(BNAM, 'Workbench Keyword', [KYWD]), - wbInteger(NAM1, 'Created Object Count', itU16) - ], False, nil, cpNormal, False, nil, wbContainerAfterSet); - - wbRecord(NPC_, 'Non-Player Character (Actor)', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Unknown 10', - {0x00040000} 18, 'Compressed', - {0x00080000} 19, 'Unknown 19', - {0x20000000} 29, 'Bleedout Override' - ]), [18]), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbStruct(ACBS, 'Configuration', [ - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Female', - {0x00000002} 'Essential', - {0x00000004} 'Is CharGen Face Preset', - {0x00000008} 'Respawn', - {0x00000010} 'Auto-calc stats', - {0x00000020} 'Unique', - {0x00000040} 'Doesn''t affect stealth meter', - {0x00000080} 'PC Level Mult', - {0x00000100} 'Use Template?', - {0x00000200} 'Unknown 9', - {0x00000400} 'Unknown 10', - {0x00000800} 'Protected', - {0x00001000} 'Unknown 12', - {0x00002000} 'Unknown 13', - {0x00004000} 'Summonable', - {0x00008000} 'Unknown 15', - {0x00010000} 'Doesn''t bleed', - {0x00020000} 'Unknown 17', - {0x00040000} 'Bleedout Override', - {0x00080000} 'Opposite Gender Anims', - {0x00100000} 'Simple Actor', - {0x00200000} 'looped script?', - {0x00400000} 'Unknown 22', - {0x00800000} 'Unknown 23', - {0x01000000} 'Unknown 24', - {0x02000000} 'Unknown 25', - {0x04000000} 'Unknown 26', - {0x08000000} 'Unknown 27', - {0x10000000} 'looped audio?', - {0x20000000} 'Is Ghost', - {0x40000000} 'Unknown 30', - {0x80000000} 'Invulnerable' - ])), - wbInteger('Magicka Offset', itS16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Stamina Offset', itS16, nil, cpNormal, False, nil{wbActorTemplateUseAIData}), - wbUnion('Level', wbNPCLevelDecider, [ - wbInteger('Level', itS16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Level Mult', itS16, wbDiv(1000), cpNormal, True, nil{wbActorTemplateUseStats}) - ], cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Calc min level', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Calc max level', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Speed Multiplier', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Disposition Base (unused)', itS16, nil, cpIgnore, True, nil{wbActorTemplateUseTraits}), - wbInteger('Template Flags', itU16, wbFlags([ - {0x0001} 'Use Traits', - {0x0002} 'Use Stats', - {0x0004} 'Use Factions', - {0x0008} 'Use Spell List', - {0x0010} 'Use AI Data', - {0x0020} 'Use AI Packages', - {0x0040} 'Use Model/Animation?', - {0x0080} 'Use Base Data', - {0x0100} 'Use Inventory', - {0x0200} 'Use Script', - {0x0400} 'Use Def Pack List', - {0x0800} 'Use Attack Data', - {0x1000} 'Use Keywords' - ])), - wbInteger('Health Offset', itS16, nil, cpNormal, True, nil{wbActorTemplateUseStats}), - wbInteger('Bleedout Override', itU16, nil, cpNormal, True, nil{wbActorTemplateUseStats}) - ], cpNormal, True), - wbRArrayS('Factions', - wbStructSK(SNAM, [0], 'Faction', [ - wbFormIDCk('Faction', [FACT]), - wbInteger('Rank', itS8), - wbByteArray('Unused', 3, cpIgnore) - ]), cpNormal, False, nil, nil, nil{wbActorTemplateUseFactions} - ), - wbFormIDCk(INAM, 'Death item', [LVLI], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(VTCK, 'Voice', [VTYP], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(TPLT, 'Template', [LVLN, NPC_]), - wbFormIDCk(RNAM, 'Race', [RACE], False, cpNormal, True, nil{wbActorTemplateUseTraits}), - wbSPCT, - wbSPLOs, - wbDEST, - wbFormIDCk(WNAM, 'Worn Armor', [ARMO], False, cpNormal, False), - wbFormIDCk(ANAM, 'Far away model', [ARMO], False, cpNormal, False, nil{wbActorTemplateUseTraits}), - wbFormIDCk(ATKR, 'Attack Race', [RACE], False, cpNormal, False), - wbRArrayS('Attacks', wbAttackData), - wbFormIDCk(SPOR, 'Spectator override package list', [FLST], False, cpNormal, False), - wbFormIDCk(OCOR, 'Observe dead body override package list', [FLST], False, cpNormal, False), - wbFormIDCk(GWOR, 'Guard warn override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ECOR, 'Combat override package list', [FLST], False, cpNormal, False), - wbInteger(PRKZ, 'Perk Count', itU32, nil, cpBenign), - wbRArrayS('Perks', - wbStructSK(PRKR, [0], 'Perk', [ - wbFormIDCk('Perk', [PERK]), - wbInteger('Rank', itU8), - wbByteArray('Unused', 3, cpIgnore) - ]), cpNormal, False, nil, wbPRKRsAfterSet - ), - wbCOCT, - wbCNTOs, - wbAIDT, - wbRArray('Packages', wbFormIDCk(PKID, 'Package', [PACK]), cpNormal, False, nil{wbActorTemplateUseAIPackages}), - wbKSIZ, - wbKWDAs, - wbFormIDCk(CNAM, 'Class', [CLAS], False, cpNormal, True), - wbFULL, - wbLString(SHRT, 'Short Name', 0, cpTranslate), - wbByteArray(DATA, 'Marker'), - wbStruct(DNAM, 'Player Skills', [ - wbArray('Skill Values', wbInteger('Skill', itU8), [ - 'OneHanded', - 'TwoHanded', - 'Marksman', - 'Block', - 'Smithing', - 'HeavyArmor', - 'LightArmor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speechcraft', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ]), - wbArray('Skill Offsets', wbInteger('Skill', itU8), [ - 'OneHanded', - 'TwoHanded', - 'Marksman', - 'Block', - 'Smithing', - 'HeavyArmor', - 'LightArmor', - 'Pickpocket', - 'Lockpicking', - 'Sneak', - 'Alchemy', - 'Speechcraft', - 'Alteration', - 'Conjuration', - 'Destruction', - 'Illusion', - 'Restoration', - 'Enchanting' - ]), - //wbByteArray('Unknown', 4), - wbInteger('Health', itU16), - wbInteger('Magicka', itU16), - wbInteger('Stamina', itU16), - wbByteArray('Unused', 2, cpIgnore), - wbFloat('Far away model distance'), - wbInteger('Geared up weapons', itU8), - wbByteArray('Unused', 3, cpIgnore) - ], cpNormal, False, nil{wbActorTemplateUseStatsAutoCalc}), - wbRArrayS('Head Parts', wbFormIDCk(PNAM, 'Head Part', [HDPT]), cpNormal, False, nil, nil, nil{wbActorTemplateUseModelAnimation}), - wbFormIDCk(HCLF, 'Hair Color', [CLFM], False, cpNormal, False), - wbFormIDCk(ZNAM, 'Combat Style', [CSTY], False, cpNormal, False), - wbFormIDCk(GNAM, 'Gift Filter', [FLST], False, cpNormal, False), - wbUnknown(NAM5, cpNormal, True), - wbFloat(NAM6, 'Height', cpNormal, True), - wbFloat(NAM7, 'Weight', cpNormal, True), - wbInteger(NAM8, 'Sound Level', itU32, wbSoundLevelEnum, cpNormal, True), - wbCSDTs, - // When CSCR exists CSDT, CSDI, CSDC are not present - wbFormIDCk(CSCR, 'Inherits Sounds From', [NPC_], False, cpNormal, False), - wbFormIDCk(DOFT, 'Default outfit', [OTFT], False, cpNormal, False), - wbFormIDCk(SOFT, 'Sleeping outfit', [OTFT], False, cpNormal, False), - wbFormIDCk(DPLT, 'Default Package List', [FLST], False, cpNormal, False), - wbFormIDCk(CRIF, 'Crime faction', [FACT], False, cpNormal, False), - wbFormIDCk(FTST, 'Head texture', [TXST], False, cpNormal, False), - wbStruct(QNAM, 'Texture lighting', [ - wbFloat('Red', cpNormal, True, 255, 0), - wbFloat('Green', cpNormal, True, 255, 0), - wbFloat('Blue', cpNormal, True, 255, 0) - ]), - wbStruct(NAM9, 'Face morph', [ - wbFloat('Nose Long/Short'), - wbFloat('Nose Up/Down'), - wbFloat('Jaw Up/Down'), - wbFloat('Jaw Narrow/Wide'), - wbFloat('Jaw Farward/Back'), - wbFloat('Cheeks Up/Down'), - wbFloat('Cheeks Farward/Back'), - wbFloat('Eyes Up/Down'), - wbFloat('Eyes In/Out'), - wbFloat('Brows Up/Down'), - wbFloat('Brows In/Out'), - wbFloat('Brows Farward/Back'), - wbFloat('Lips Up/Down'), - wbFloat('Lips In/Out'), - wbFloat('Chin Narrow/Wide'), - wbFloat('Chin Up/Down'), - wbFloat('Chin Underbite/Overbite'), - wbFloat('Eyes Farward/Back'), - wbFloat('Unknown') - ], cpNormal, False), - wbStruct(NAMA, 'Face parts', [ - wbInteger('Nose', itU32), - wbInteger('Unknown', itS32), - wbInteger('Eyes', itU32), - wbInteger('Mouth', itU32) - ]), - wbRArrayS('Tint Layers', - wbRStructSK([0], 'Layer', [ - wbInteger(TINI, 'Tint Index', itU16, wbTintLayerToStr, wbStrToInt), - wbStruct(TINC, 'Tint Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbInteger('Alpha', itU8) - ]), - wbInteger(TINV, 'Interpolation Value', itU32, wbDiv(100)), - wbInteger(TIAS, 'Preset', itS16) - ], [])) - ], False, nil, cpNormal, False, wbNPCAfterLoad, wbNPCAfterSet); - - wbObjectTypeEnum := wbEnum([ - ' NONE', - 'Activators', - 'Armor', - 'Books', - 'Clothing', - 'Containers', - 'Doors', - 'Ingredients', - 'Lights', - 'Misc', - 'Flora', - 'Furniture', - 'Weapons: Any', - 'Ammo', - 'NPCs', - 'Creatures', - 'Keys', - 'Alchemy', - 'Food', - ' All: Combat Wearable', - ' All: Wearable', - 'Weapons: Ranged', - 'Weapons: Melee', - 'Weapons: NONE', - 'Actor Effects: Any', - 'Actor Effects: Range Target', - 'Actor Effects: Range Touch', - 'Actor Effects: Range Self', - 'Actors: Any' - ]); - - wbPKDTSpecificFlagsUnused := False; - - wbPKDTFlags := wbFlags([ - {0x00000001} 'Offers Services', - {0x00000002} 'Unknown 2', - {0x00000004} 'Must complete', - {0x00000008} 'Maintain Speed at Goal', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unlock doors at package start', - {0x00000080} 'Unlock doors at package end', - {0x00000100} 'Unknown 9', - {0x00000200} 'Continue if PC Near', - {0x00000400} 'Once per day', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Preferred Speed', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Unknown 17', - {0x00020000} 'Always Sneak', - {0x00040000} 'Allow Swimming', - {0x00080000} 'Unknown 20', - {0x00100000} 'Ignore Combat', - {0x00200000} 'Weapons Unequipped', - {0x00400000} 'Unknown 23', - {0x00800000} 'Weapon Drawn', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Unknown 27', - {0x08000000} 'No Combat Alert', - {0x10000000} 'Unknown 29', - {0x20000000} 'Wear Sleep Outfit (unused)', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ], [29]); - - wbPKDTInterruptFlags := wbFlags([ - {0x0001}'Hellos to player', - {0x0002}'Random conversations', - {0x0004}'Observe combat behavior', - {0x0008}'Greet corpse behavior', - {0x0010}'Reaction to player actions', - {0x0020}'Friendly fire comments', - {0x0040}'Aggro Radius Behavior', - {0x0080}'Allow Idle Chatter', - {0x0100}'Unknown 9', - {0x0200}'World Interactions', - {0x0400}'Unknown 11', - {0x0800}'Unknown 12', - {0x1000}'Unknown 13', - {0x2000}'Unknown 14', - {0x4000}'Unknown 15', - {0x8000}'Unknown 16' - ]); -end; - -procedure DefineTES5n; -begin - - wbUNAMs:= wbRArray('Data Inputs', wbRStruct('Data Input', [ - wbInteger(UNAM, 'Index', itS8), - wbString(BNAM, 'Name'), - wbInteger(PNAM, 'Flags', itU32, wbFlags([ - 'Public' - ])) - ], [])); - - wbRecord(PACK, 'Package', [ - wbEDID, - wbVMADFragmentedPACK, - - wbStruct(PKDT, 'Pack Data', [ - wbInteger('General Flags', itU32, wbPKDTFlags), - wbInteger('Type', itU8, wbEnum ([], [ - 18, 'Package', - 19, 'Package Template' - ])), - wbInteger('Interrupt Override', itU8, wbEnum([ - 'None', - 'Spectator', - 'ObserveDead', - 'GuardWarn', - 'Combat' - ])), - wbInteger('Preferred Speed', itU8, wbEnum([ - 'Walk', - 'Jog', - 'Run', - 'Fast Walk' - ])), - wbByteArray('Unknown', 1), - wbInteger('Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbByteArray('Unknown', 2) - ], cpNormal, True), - - wbStruct(PSDT, 'Schedule', [ - wbInteger('Month', itS8), - wbInteger('Day of week', itS8, wbEnum([ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', - 'Weekdays', - 'Weekends', - 'Monday, Wednesday, Friday', - 'Tuesday, Thursday' - ], [ - -1, 'Any' - ])), - wbInteger('Date', itU8), - wbInteger('Hour', itS8), - wbInteger('Minute', itS8), - wbByteArray('Unused', 3, cpIgnore), - wbInteger('Duration (minutes)', itS32) - ], cpNormal, True), - wbCTDAs, - - wbRStruct('Idle Animations', [ - wbInteger(IDLF, 'Flags', itU8, wbEnum([], [ - 0, 'Unknown', - 8, 'Random', - 9, 'Run in Sequence', - 12, 'Random, Do Once', - 13, 'Run in Sequence, Do Once' - ]), cpNormal, True), - wbStruct(IDLC, '', [ - wbInteger('Animation Count', itU8, nil, cpBenign), - wbByteArray('Unknown', 3) - ], cpNormal, True, nil, 1), - wbFloat(IDLT, 'Idle Timer Setting', cpNormal, True), - wbArray(IDLA, 'Animations', wbFormIDCk('Animation', [IDLE]), 0, nil, wbIDLAsAfterSet, cpNormal, True), - wbByteArray(IDLB, 'Unknown', 4, cpIgnore) - ], [], cpNormal, False, nil, False, nil {cannot be totally removed , wbAnimationsAfterSet}), - - wbFormIDCk(CNAM, 'Combat Style', [CSTY]), - wbFormIDCk(QNAM, 'Owner Quest', [QUST]), - wbStruct(PKCU, 'Counter', [ - wbInteger('Data Input Count', itU32), - wbFormIDCk('Package Template', [PACK, NULL]), - wbInteger('Version Counter (autoincremented)', itU32) - ], cpNormal, True), - - wbRStruct('Package Data', [ - wbRArray('Data Input Values', wbRStruct('Value', [ - wbString(ANAM, 'Type'), - wbUnion(CNAM, 'Value', wbPubPackCNAMDecider, [ - {0} wbByteArray('Unknown'), - {1} wbInteger('Bool', itU8, wbEnum(['False', 'True'])), - {2} wbInteger('Integer', itU32), - {3} wbFloat('Float') - ]), - wbUnknown(BNAM), - wbPDTOs, - wbPLDT, - wbStruct(PTDA, 'Target', [wbTargetData]), - wbUnknown(TPIC) - ], [], cpNormal, False)), - wbUNAMs - ], []), - wbByteArray(XNAM, 'Marker'), - - wbRStruct('Procedure Tree', [ - wbRArray('Branches', wbRStruct('Branch', [ - wbString(ANAM, 'Branch Type'), - wbCITC, - wbCTDAsCount, - wbStruct(PRCB, 'Root', [ - wbInteger('Branch Count', itU32), - wbInteger('Flags', itU32, wbFlags([ - 'Repeat when Complete', - 'Unknown 1' - ])) - ]), - wbString(PNAM, 'Procedure Type'), - wbInteger(FNAM, 'Flags', itU32, wbFlags(['Success Completes Package'])), - wbRArray('Data Input Indexes', wbInteger(PKC2, 'Index', itU8)), - {>>> PFO2 should be single, there is only 1 PACK [00095F46] in Skyrim.esm with 2xPFO2 <<<} - wbRArray('Flags Override', - wbStruct(PFO2, 'Data', [ - wbInteger('Set General Flags', itU32, wbPKDTFlags), - wbInteger('Clear General Flags', itU32, wbPKDTFlags), - wbInteger('Set Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbInteger('Clear Interrupt Flags', itU16, wbPKDTInterruptFlags), - wbInteger('Preferred Speed Override', itU8, wbEnum([ - 'Walk', - 'Jog', - 'Run', - 'Fast Walk' - ])), - wbByteArray('Unknown', 3) - ]) - ), - wbRArray('Unknown', wbUnknown(PFOR), cpIgnore) - ], [], cpNormal, False, nil, False, nil, wbConditionsAfterSet)) - ], []), - wbUNAMs, - wbRStruct('OnBegin', [ - wbEmpty(POBA, 'OnBegin Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - {>>> BEGIN leftover from earlier CK versions <<<} - wbByteArray(SCHR, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCTX, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(QNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(TNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbPDTOs - ], []), - wbRStruct('OnEnd', [ - wbEmpty(POEA, 'OnEnd Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - {>>> BEGIN leftover from earlier CK versions <<<} - wbByteArray(SCHR, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCTX, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(QNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(TNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbPDTOs - ], []), - wbRStruct('OnChange', [ - wbEmpty(POCA, 'OnChange Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - {>>> BEGIN leftover from earlier CK versions <<<} - wbByteArray(SCHR, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCDA, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCTX, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(QNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(TNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - {>>> END leftover from earlier CK versions <<<} - wbPDTOs - ], []) - ], False, nil, cpNormal, False, nil {wbPACKAfterLoad}); - - wbQUSTAliasFlags := - wbStruct(FNAM, 'Alias Flags', [ - wbInteger('Flags', itU16, wbFlags([ - {0x0001}'Reserves Location/Reference', - {0x0002}'Optional', - {0x0004}'Quest Object', - {0x0008}'Allow Reuse in Quest', - {0x0010}'Allow Dead', - {0x0020}'Matching Ref - In Loaded Area', - {0x0040}'Essential', - {0x0080}'Allow Disabled', - {0x0100}'Stores Text', - {0x0200}'Allow Reserved', - {0x0400}'Protected', - {0x0800}'Forced by Aliases?', - {0x1000}'Allow Destroyed', - {0x2000}'Matching Ref - Closest', - {0x4000}'Uses Stored Text', - {0x8000}'Initially Disabled' - ])), - wbInteger('Additional Flags', itU16, wbFlags([ - {0x0001}'Allow Cleared', - {0x0002}'Clear Names When Removed' - ])) - ], cpNormal, False, nil, 1); - - wbRecord(QUST, 'Quest', [ - wbEDID, - wbVMADFragmentedQUST, - wbFULL, - wbStruct(DNAM, 'General', [ - wbInteger('Flags', itU16, wbFlags([ - {0x0001} 'Start Game Enabled', - {0x0002} 'Unknown 2', - {0x0004} 'Unknown 3', - {0x0008} 'Allow repeated stages', - {0x0010} 'Unknown 5', - {0x0020} 'Unknown 6', - {0x0040} 'Unknown 7', - {0x0080} 'Unknown 8', - {0x0100} 'Run Once', - {0x0200} 'Exclude from dialogue export', - {0x0400} 'Warn on alias fill failure', - {0x0800} 'Unknown 12', - {0x1000} 'Unknown 13' - ])), - wbInteger('Priority', itU8), - wbInteger('Form Version', itU8, nil, cpIgnore), - wbByteArray('Unknown', 4), - wbInteger('Type', itU32, wbEnum([ - {0} 'None', - {1} 'Main Quest', - {2} 'Mages'' Guild', - {3} 'Thieves'' Guild', - {4} 'Dark Brotherhood', - {5} 'Companion Quests', - {6} 'Miscellaneous', - {7} 'Daedric', - {8} 'Side Quest', - {9} 'Civil War', - {10} 'DLC01 - Vampire', - {11} 'DLC02 - Dragonborn' - ])) - ]), - wbString(ENAM, 'Event', 4), - wbRArray('Text Display Globals', wbFormIDCk(QTGL, 'Global', [GLOB])), - wbString(FLTR, 'Object Window Filter', 0, cpTranslate), - wbRStruct('Quest Dialogue Conditions', [wbCTDAs], [], cpNormal, False), - wbEmpty(NEXT, 'Marker'), - wbCTDAs, {>>> Unknown, doesn't show up in CK <<<} - wbRArrayS('Stages', wbRStructSK([0], 'Stage', [ - wbStructSK(INDX, [0], 'Stage Index', [ - wbInteger('Stage Index', itU16), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Unknown 1', - {0x02} 'Start Up Stage', - {0x04} 'Shut Down Stage', - {0x08} 'Keep Instance Data From Here On' - ])), - wbInteger('Unknown', itU8) - ]), - wbRArray('Log Entries', wbRStruct('Log Entry', [ - wbInteger(QSDT, 'Stage Flags', itU8, wbFlags([ - {0x01} 'Complete Quest', - {0x02} 'Fail Quest' - ])), - wbCTDAs, - wbLString(CNAM, 'Log Entry', 0, cpTranslate), - wbFormIDCk(NAM0, 'Next Quest', [QUST]), - {>>> BEGIN leftover from earlier CK versions <<<} - wbByteArray(SCHR, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCTX, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(QNAM, 'Unused', 0, cpIgnore, false, false, wbNeverShow) - {>>> END leftover from earlier CK versions <<<} - ], [])) - ], [])), - wbRArray('Objectives', wbRStruct('Objective', [ - wbInteger(QOBJ, 'Objective Index', itU16), - wbInteger(FNAM, 'Flags', itU32, wbFlags(['ORed With Previous'])), - wbLString(NNAM, 'Display Text', 0, cpTranslate, True), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbInteger('Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass Marker Ignores Locks' - ])), - wbByteArray('Unused', 3) - ]), - wbCTDAs - ], [])) - ], [])), - wbByteArray(ANAM, 'Aliases Marker', 4), - wbRArray('Aliases', - wbRUnion('Alias', [ - - // Reference Alias - wbRStruct('Alias', [ - wbInteger(ALST, 'Reference Alias ID', itU32), - wbString(ALID, 'Alias Name'), - wbQUSTAliasFlags, - wbInteger(ALFI, 'Force Into Alias When Filled', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(ALFL, 'Specific Location', [LCTN]), - wbFormID(ALFR, 'Forced Reference'), - wbFormIDCk(ALUA, 'Unique Actor', [NPC_]), - wbRStruct('Location Alias Reference', [ - wbInteger(ALFA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(KNAM, 'Keyword', [KYWD]), - wbFormIDCk(ALRT, 'Ref Type', [LCRT]) - ], []), - wbRStruct('External Alias Reference', [ - wbFormIDCk(ALEQ, 'Quest', [QUST]), - wbInteger(ALEA, 'Alias', itS32, wbQuestExternalAliasToStr, wbStrToAlias) - ], []), - wbRStruct('Create Reference to Object', [ - wbFormID(ALCO, 'Object'), - wbStruct(ALCA, 'Alias', [ - wbInteger('Alias', itS16, wbQuestAliasToStr, wbStrToAlias), - wbInteger('Create', itU16, wbEnum([] ,[ - $0000, 'At', - $8000, 'In' - ])) - ]), - wbInteger(ALCL, 'Level', itU32, wbEnum([ - 'Easy', - 'Medium', - 'Hard', - 'Very Hard', - 'None' - ])) - ], []), - wbRStruct('Find Matching Reference Near Alias', [ - wbInteger(ALNA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbInteger(ALNT, 'Type', itU32, wbEnum([ - 'Linked Ref Child' - ])) - ], []), - wbRStruct('Find Matching Reference From Event', [ - wbString(ALFE, 'From Event', 4), - wbByteArray(ALFD, 'Event Data') - ], []), - wbCTDAs, - wbKSIZ, - wbKWDAs, - wbCOCT, - wbCNTOs, - wbFormIDCk(SPOR, 'Spectator override package list', [FLST], False, cpNormal, False), - wbFormIDCk(OCOR, 'Observe dead body override package list', [FLST], False, cpNormal, False), - wbFormIDCk(GWOR, 'Guard warn override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ECOR, 'Combat override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ALDN, 'Display Name', [MESG]), - wbRArray('Alias Spells', wbFormIDCk(ALSP, 'Spell', [SPEL])), - wbRArray('Alias Factions', wbFormIDCk(ALFC, 'Faction', [FACT])), - wbRArray('Alias Package Data', wbFormIDCk(ALPC, 'Package', [PACK])), - wbFormIDCk(VTCK, 'Voice Types', [NPC_, FLST, NULL]), - wbEmpty(ALED, 'Alias End', cpNormal, True) - ], [], cpNormal, False, nil, False, nil, wbContainerAfterSet), - - // Location Alias - wbRStruct('Alias', [ - wbInteger(ALLS, 'Location Alias ID', itU32), - wbString(ALID, 'Alias Name'), - wbQUSTAliasFlags, - wbInteger(ALFI, 'Force Into Alias When Filled', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(ALFL, 'Specific Location', [LCTN]), - wbFormID(ALFR, 'Forced Reference'), - wbFormIDCk(ALUA, 'Unique Actor', [NPC_]), - wbRStruct('Location Alias Reference', [ - wbInteger(ALFA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbFormIDCk(KNAM, 'Keyword', [KYWD]), - wbFormIDCk(ALRT, 'Ref Type', [LCRT]) - ], []), - wbRStruct('External Alias Reference', [ - wbFormIDCk(ALEQ, 'Quest', [QUST]), - wbInteger(ALEA, 'Alias', itS32, wbQuestExternalAliasToStr, wbStrToAlias) - ], []), - wbRStruct('Create Reference to Object', [ - wbFormID(ALCO, 'Object'), - wbStruct(ALCA, 'Alias', [ - wbInteger('Alias', itS16, wbQuestAliasToStr, wbStrToAlias), - wbInteger('Create', itU16, wbEnum([] ,[ - $0000, 'At', - $8000, 'In' - ])) - ]), - wbInteger(ALCL, 'Level', itU32, wbEnum([ - 'Easy', - 'Medium', - 'Hard', - 'Very Hard', - 'None' - ])) - ], []), - wbRStruct('Find Matching Reference Near Alias', [ - wbInteger(ALNA, 'Alias', itS32, wbQuestAliasToStr, wbStrToAlias), - wbInteger(ALNT, 'Type', itU32, wbEnum([ - 'Linked Ref Child' - ])) - ], []), - wbRStruct('Find Matching Reference From Event', [ - wbString(ALFE, 'From Event', 4), - wbByteArray(ALFD, 'Event Data') - ], []), - wbCTDAs, - wbKSIZ, - wbKWDAs, - wbCOCT, - wbCNTOs, - wbFormIDCk(SPOR, 'Spectator override package list', [FLST], False, cpNormal, False), - wbFormIDCk(OCOR, 'Observe dead body override package list', [FLST], False, cpNormal, False), - wbFormIDCk(GWOR, 'Guard warn override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ECOR, 'Combat override package list', [FLST], False, cpNormal, False), - wbFormIDCk(ALDN, 'Display Name', [MESG]), - wbRArray('Alias Spells', wbFormIDCk(ALSP, 'Spell', [SPEL])), - wbRArray('Alias Factions', wbFormIDCk(ALFC, 'Faction', [FACT])), - wbRArray('Alias Package Data', wbFormIDCk(ALPC, 'Package', [PACK])), - wbFormIDCk(VTCK, 'Voice Types', [NPC_, FLST, NULL]), - wbEmpty(ALED, 'Alias End', cpNormal, True) - ], [], cpNormal, False, nil, False, nil, wbContainerAfterSet) - ], []) - ), - wbString(NNAM, 'Description', 0, cpNormal, False), - wbRArray('Targets', wbRStruct('Target', [ - wbStruct(QSTA, 'Target', [ - wbFormIDCkNoReach('Target', [ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA], True), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Compass Marker Ignores Locks' - ])), - wbByteArray('Unknown', 3) - ]), - wbCTDAs - ], [])) - ]); - - wbBodyPartIndexEnum := wbEnum([ - 'Body Texture' - ]); - - wbNoseMorphFlags := wbInteger('Nose Morph Flags', itU32, wbFlags([ - {0x00000001}'NoseType0', - {0x00000002}'NoseType1', - {0x00000004}'NoseType2', - {0x00000008}'NoseType3', - {0x00000010}'NoseType4', - {0x00000020}'NoseType5', - {0x00000040}'NoseType6', - {0x00000080}'NoseType7', - {0x00000100}'NoseType8', - {0x00000200}'NoseType9', - {0x00000400}'NoseType10', - {0x00000800}'NoseType11', - {0x00001000}'NoseType12', - {0x00002000}'NoseType13', - {0x00004000}'NoseType14', - {0x00008000}'NoseType15', - {0x00010000}'NoseType16', - {0x00020000}'NoseType17', - {0x00040000}'NoseType18', - {0x00080000}'NoseType19', - {0x00100000}'NoseType20', - {0x00200000}'NoseType21', - {0x00400000}'NoseType22', - {0x00800000}'NoseType23', - {0x01000000}'NoseType24', - {0x02000000}'NoseType25', - {0x04000000}'NoseType26', - {0x08000000}'NoseType27', - {0x10000000}'NoseType28', - {0x20000000}'NoseType29', - {0x40000000}'NoseType30', - {0x80000000}'NoseType31' - ])); - - wbBrowMorphFlags := wbInteger('Brow Morph Flags', itU32, wbFlags([ - {0x00000001}'BrowType0', - {0x00000002}'BrowType1', - {0x00000004}'BrowType2', - {0x00000008}'BrowType3', - {0x00000010}'BrowType4', - {0x00000020}'BrowType5', - {0x00000040}'BrowType6', - {0x00000080}'BrowType7', - {0x00000100}'BrowType8', - {0x00000200}'BrowType9', - {0x00000400}'BrowType10', - {0x00000800}'BrowType11', - {0x00001000}'BrowType12', - {0x00002000}'BrowType13', - {0x00004000}'BrowType14', - {0x00008000}'BrowType15', - {0x00010000}'BrowType16', - {0x00020000}'BrowType17', - {0x00040000}'BrowType18', - {0x00080000}'BrowType19', - {0x00100000}'BrowType20' - ], True)); - - wbEyesMorphFlags01 := wbInteger('Eye Morph Flags 1', itU32, wbFlags([ - {0x00000001}'EyesType0', - {0x00000002}'EyesType1', - {0x00000004}'EyesType2', - {0x00000008}'EyesType3', - {0x00000010}'EyesType4', - {0x00000020}'EyesType5', - {0x00000040}'EyesType6', - {0x00000080}'EyesType7', - {0x00000100}'EyesType8', - {0x00000200}'EyesType9', - {0x00000400}'EyesType10', - {0x00000800}'EyesType11', - {0x00001000}'EyesType12', - {0x00002000}'EyesType13', - {0x00004000}'EyesType14', - {0x00008000}'EyesType15', - {0x00010000}'EyesType16', - {0x00020000}'EyesType17', - {0x00040000}'EyesType18', - {0x00080000}'EyesType19', - {0x00100000}'EyesType20', - {0x00200000}'EyesType21', - {0x00400000}'EyesType22', - {0x00800000}'EyesType23', - {0x01000000}'EyesType24', - {0x02000000}'EyesType25', - {0x04000000}'EyesType26', - {0x08000000}'EyesType27', - {0x10000000}'EyesType28', - {0x20000000}'EyesType29', - {0x40000000}'EyesType30', - {0x80000000}'EyesType31' - ])); - - wbEyesMorphFlags02 := wbInteger('Eye Morph Flags 2', itU8, wbFlags([ - {0x00000001}'EyesType32', - {0x00000002}'EyesType33', - {0x00000004}'EyesType34', - {0x00000008}'EyesType35', - {0x00000010}'EyesType36', - {0x00000020}'EyesType37', - {0x00000040}'EyesType38' - ], True)); - - wbLipMorphFlags := wbInteger('Lip Morph Flags', itU32, wbFlags([ - {0x00000001}'LipType0', - {0x00000002}'LipType1', - {0x00000004}'LipType2', - {0x00000008}'LipType3', - {0x00000010}'LipType4', - {0x00000020}'LipType5', - {0x00000040}'LipType6', - {0x00000080}'LipType7', - {0x00000100}'LipType8', - {0x00000200}'LipType9', - {0x00000400}'LipType10', - {0x00000800}'LipType11', - {0x00001000}'LipType12', - {0x00002000}'LipType13', - {0x00004000}'LipType14', - {0x00008000}'LipType15', - {0x00010000}'LipType16', - {0x00020000}'LipType17', - {0x00040000}'LipType18', - {0x00080000}'LipType19', - {0x00100000}'LipType20', - {0x00200000}'LipType21', - {0x00400000}'LipType22', - {0x00800000}'LipType23', - {0x01000000}'LipType24', - {0x02000000}'LipType25', - {0x04000000}'LipType26', - {0x08000000}'LipType27', - {0x10000000}'LipType28', - {0x20000000}'LipType29', - {0x40000000}'LipType30', - {0x80000000}'LipType31' - ])); - - wbTintMaskTypeEnum := wbEnum([ - 'None', - 'Lip Color', - 'Cheek Color', - 'Eyeliner', - 'EyeSocket Upper', - 'EyeSocket Lower', - 'Skin Tone', - 'Paint', - 'Laugh Lines', - 'Cheek Color Lower', - 'Nose', - 'Chin', - 'Neck', - 'Forehead', - 'Dirt', - 'Unknown 16' - ]); - - wbTints := wbRArray('Tint Masks', wbRStruct('Tint Assets', [ - wbRArray('Tint Layer', wbRStruct('Texture', [ - wbInteger(TINI, 'Index', itU16), - wbString(TINT, 'File Name'), - {>>> When set to None TINP does not exist Needs routine to add when - changing the Mask Type <<<} - wbInteger(TINP, 'Mask Type', itU16, wbTintMaskTypeEnum), - wbFormIDCk(TIND, 'Preset Default', [CLFM, NULL]) - ], [])), - wbRArray('Presets', wbRStruct('Preset', [ - wbFormIDCk(TINC, 'Color', [CLFM, NULL]), - wbFloat(TINV, 'Default Value'), - wbInteger(TIRS, 'Index', itU16) - ], [])) - ], [])); - - wbRACE_DATAFlags01 := wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Playable', - {0x00000002}'FaceGen Head', - {0x00000004}'Child', - {0x00000008}'Tilt Front/Back', - {0x00000010}'Tilt Left/Right', - {0x00000020}'No Shadow', - {0x00000040}'Swims', - {0x00000080}'Flies', - {0x00000100}'Walks', - {0x00000200}'Immobile', - {0x00000400}'Not Pushable', - {0x00000800}'No Combat In Water', - {0x00001000}'No Rotating to Head-Track', - {0x00002000}'Don''t Show Blood Spray', - {0x00004000}'Don''t Show Blood Decal', - {0x00008000}'Uses Head Track Anims', - {0x00010000}'Spells Align w/Magic Node', - {0x00020000}'Use World Raycasts For FootIK', - {0x00040000}'Allow Ragdoll Collision', - {0x00080000}'Regen HP In Combat', - {0x00100000}'Can''t Open Doors', - {0x00200000}'Allow PC Dialogue', - {0x00400000}'No Knockdowns', - {0x00800000}'Allow Pickpocket', - {0x01000000}'Always Use Proxy Controller', - {0x02000000}'Don''t Show Weapon Blood', - {0x04000000}'Overlay Head Part List', {>>>Only one can be active<<<} - {0x08000000}'Override Head Part List', {>>>Only one can be active<<<} - {0x10000000}'Can Pickup Items', - {0x20000000}'Allow Multiple Membrane Shaders', - {0x40000000}'Can Dual Wield', - {0x80000000}'Avoids Roads' - ])); - - wbPhonemeTargets := wbStruct(PHWT, 'Phoneme Target Weight', [ - wbFloat('Aah / LipBigAah'), - wbFloat('BigAah / LipDST'), - wbFloat('BMP / LipEee'), - wbFloat('ChJsh / LipFV'), - wbFloat('DST / LipK'), - wbFloat('Eee / LipL'), - wbFloat('Eh / LipR'), - wbFloat('FV / LipTh'), - wbFloat('I'), - wbFloat('K'), - wbFloat('N'), - wbFloat('Oh'), - wbFloat('OohQ'), - wbFloat('R'), - wbFloat('TH'), - wbFloat('W') - ], cpNormal, False, nil, 8); - - wbPHWT := wbRStruct('FaceFX Phonemes', [ - wbRStruct('IY', [wbPhonemeTargets], []), - wbRStruct('IH', [wbPhonemeTargets], []), - wbRStruct('EH', [wbPhonemeTargets], []), - wbRStruct('EY', [wbPhonemeTargets], []), - wbRStruct('AE', [wbPhonemeTargets], []), - wbRStruct('AA', [wbPhonemeTargets], []), - wbRStruct('AW', [wbPhonemeTargets], []), - wbRStruct('AY', [wbPhonemeTargets], []), - wbRStruct('AH', [wbPhonemeTargets], []), - wbRStruct('AO', [wbPhonemeTargets], []), - wbRStruct('OY', [wbPhonemeTargets], []), - wbRStruct('OW', [wbPhonemeTargets], []), - wbRStruct('UH', [wbPhonemeTargets], []), - wbRStruct('UW', [wbPhonemeTargets], []), - wbRStruct('ER', [wbPhonemeTargets], []), - wbRStruct('AX', [wbPhonemeTargets], []), - wbRStruct('S', [wbPhonemeTargets], []), - wbRStruct('SH', [wbPhonemeTargets], []), - wbRStruct('Z', [wbPhonemeTargets], []), - wbRStruct('ZH', [wbPhonemeTargets], []), - wbRStruct('F', [wbPhonemeTargets], []), - wbRStruct('TH', [wbPhonemeTargets], []), - wbRStruct('V', [wbPhonemeTargets], []), - wbRStruct('DH', [wbPhonemeTargets], []), - wbRStruct('M', [wbPhonemeTargets], []), - wbRStruct('N', [wbPhonemeTargets], []), - wbRStruct('NG', [wbPhonemeTargets], []), - wbRStruct('L', [wbPhonemeTargets], []), - wbRStruct('R', [wbPhonemeTargets], []), - wbRStruct('W', [wbPhonemeTargets], []), - wbRStruct('Y', [wbPhonemeTargets], []), - wbRStruct('HH', [wbPhonemeTargets], []), - wbRStruct('B', [wbPhonemeTargets], []), - wbRStruct('D', [wbPhonemeTargets], []), - wbRStruct('JH', [wbPhonemeTargets], []), - wbRStruct('G', [wbPhonemeTargets], []), - wbRStruct('P', [wbPhonemeTargets], []), - wbRStruct('T', [wbPhonemeTargets], []), - wbRStruct('K', [wbPhonemeTargets], []), - wbRStruct('CH', [wbPhonemeTargets], []), - wbRStruct('SIL', [wbPhonemeTargets], []), - wbRStruct('SHOTSIL', [wbPhonemeTargets], []), - wbRStruct('FLAP', [wbPhonemeTargets], []) - ], []); - - wbMorphs := wbRStruct('Available Morphs', [ - wbByteArray(MPAI, 'Unknown', 0), - wbStruct(MPAV, 'Nose Variants', [ - wbNoseMorphFlags, - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4) - ]), - wbByteArray(MPAI, 'Unknown', 0), - wbStruct(MPAV, 'Brow Variants', [ - wbBrowMorphFlags, - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4) - ]), - wbByteArray(MPAI, 'Unknown', 0), - wbStruct(MPAV, 'Eye Variants', [ - wbEyesMorphFlags01, - wbEyesMorphFlags02, - wbByteArray('Unknown', 3), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4) - ]), - wbByteArray(MPAI, 'Unknown', 0), - wbStruct(MPAV, 'Lip Variants', [ - wbLipMorphFlags, - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4), - wbByteArray('Unknown', 4) - ]) - ], []); - - wbHeadPart := wbRStructSK([0],'Head Part', [ - wbInteger(INDX, 'Head Part Number', itU32), - wbFormIDCk(HEAD, 'Head', [HDPT, NULL]) - ], []); - - wbRecord(RACE, 'Race', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Critter?' - ])), [ - wbEDID, - wbFULL, - wbDESCReq, - wbSPCT, - wbSPLOs, - wbFormIDCk(WNAM, 'Skin', [ARMO, NULL]), -// wbBODT, -// wbBOD2, - wbBODTBOD2, - wbKSIZ, - wbKWDAs, - wbStruct(DATA, '', [ - wbArrayS('Skill Boosts', wbStructSK([0], 'Skill Boost', [ - wbInteger('Skill', itS8, wbActorValueEnum), - wbInteger('Boost', itS8) - ]), 7), - wbByteArray('Unknown', 2), - wbFloat('Male Height'), - wbFloat('Female Height'), - wbFloat('Male Weight'), - wbFloat('Female Weight'), - wbRACE_DATAFlags01, - wbFloat('Starting Health'), - wbFloat('Starting Magicka'), - wbFloat('Starting Stamina'), - wbFloat('Base Carry Weight'), - wbFloat('Base Mass'), - wbFloat('Acceleration rate'), - wbFloat('Deceleration rate'), - wbInteger('Size', itU32, wbEnum([ - 'Small', - 'Medium', - 'Large', - 'Extra Large' - ])), - wbInteger('Head Biped Object', itS32, wbBipedObjectEnum), - wbInteger('Hair Biped Object', itS32, wbBipedObjectEnum), - wbFloat('Injured Health Pct'), - wbInteger('Shield Biped Object', itS32, wbBipedObjectEnum), - wbFloat('Health Regen'), - wbFloat('Magicka Regen'), - wbFloat('Stamina Regen'), - wbFloat('Unarmed Damage'), - wbFloat('Unarmed Reach'), - wbInteger('Body Biped Object', itS32, wbBipedObjectEnum), - wbFloat('Aim Angle Tolerance'), - wbFloat('Flight Radius'), - wbFloat('Angular Acceleration Rate'), - wbFloat('Angular Tolerance'), - wbInteger('Flags 2', itU32, wbFlags([ - {0x00000001} 'Use Advanced Avoidance', - {0x00000002} 'Non-Hostile', - {0x00000004} 'Unknown 2', - {0x00000008} 'Unknown 3', - {0x00000010} 'Allow Mounted Combat' - ])), - wbStruct('Mount Data', [ - wbFloat('Offset X', cpNormal, False, 1, -1, nil, nil, -63.479000), - wbFloat('Offset Y'), - wbFloat('Unknown'), - wbFloat('Unknown', cpNormal, False, 1, -1, nil, nil, -50.0), - wbFloat('Unknown'), - wbFloat('Unknown', cpNormal, False, 1, -1, nil, nil, 65.0), - wbFloat('Unknown'), - wbFloat('Unknown', cpNormal, False, 1, -1, nil, nil, -300.0), - wbFloat('Unknown') - ]) - //wbByteArray('Unknown', 4*7) - ], cpNormal, True, nil, 29), - wbEmpty(MNAM, 'Male Marker'), - wbString(ANAM, 'Male Skeletal Model'), - wbMODT, - wbEmpty(FNAM, 'Female Marker'), - wbString(ANAM, 'Female Skeletal Model'), - wbMODT, - wbEmpty(NAM2, 'Marker NAM2 #1'), - wbRArrayS('Movement Type Names', wbString(MTNM, 'Name')), - wbArray(VTCK, 'Voices', wbFormIDCk('Voice', [VTYP]), ['Male', 'Female'], cpNormal, True), - wbArray(DNAM, 'Decapitate Armors', wbFormIDCk('Decapitate Armor', [NULL, ARMO]), ['Male', 'Female'], cpNormal, False), - wbArray(HCLF, 'Default Hair Colors', wbFormIDCk('Default Hair Color', [NULL, CLFM]), ['Male', 'Female'], cpNormal, False), - wbInteger(TINL, 'Total Number of Tints in List', itU16, nil, nil, cpNormal, False), {>>> Needs Count Updated <<<} - wbFloat(PNAM, 'FaceGen - Main clamp', cpNormal, True), - wbFloat(UNAM, 'FaceGen - Face clamp', cpNormal, True), - wbFormIDCk(ATKR, 'Attack Race', [RACE], False, cpNormal, False), - wbRArrayS('Attacks', wbAttackData), - wbRStruct('Body Data', [ - wbEmpty(NAM1, 'Body Data Marker', cpNormal, True), - wbRStruct('Male Body Data', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbMODL - ], []), cpNormal, True) - ], [], cpNormal, True), - wbRStruct('Female Body Data', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Parts', wbRStructSK([0], 'Part', [ - wbInteger(INDX, 'Index', itU32, wbBodyPartIndexEnum), - wbMODL - ], []), cpNormal, True) - ], [], cpNormal, True) - ], [], cpNormal, True), - wbArrayS(HNAM, 'Hairs', wbFormIDCk('Hair', [HDPT, NULL]), 0, cpNormal), - wbArrayS(ENAM, 'Eyes', wbFormIDCk('Eye', [EYES, NULL]), 0, cpNormal), - wbFormIDCk(GNAM, 'Body Part Data', [BPTD, NULL]), - wbEmpty(NAM2, 'Marker NAM2 #2', cpNormal), - wbEmpty(NAM3, 'Marker NAM3 #3', cpNormal, True), - wbRStruct('Male Behavior Graph', [ - wbEmpty(MNAM, 'Male Data Marker'), - wbMODL - ], [], cpNormal, True), - wbRStruct('Female Behavior Graph', [ - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbMODL - ], [], cpNormal, True), - wbFormIDCk(NAM4, 'Material Type', [MATT, NULL]), - wbFormIDCk(NAM5, 'Impact Data Set', [IPDS, NULL]), - wbFormIDCk(NAM7, 'Decapitation FX', [ARTO, NULL]), - wbFormIDCk(ONAM, 'Open Loot Sound', [SNDR, NULL]), - wbFormIDCk(LNAM, 'Close Loot Sound', [SNDR, NULL]), - {>>> When NAME is user defined wbBipedObjectEnum will be incorrect <<<} - wbRArray('Biped Object Names', wbString(NAME, 'Name')), - wbRArrayS('Movement Types', wbRStructSK([0], 'Movement Types', [ - wbFormIDCk(MTYP, 'Movement Type', [MOVT, NULL]), - wbStruct(SPED, 'Override Values', [ - wbFloat('Left - Walk'), - wbFloat('Left - Run'), - wbFloat('Right - Walk'), - wbFloat('Right - Run'), - wbFloat('Forward - Walk'), - wbFloat('Forward - Run'), - wbFloat('Back - Walk'), - wbFloat('Back - Run'), - wbFloat('Rotate - Walk'), - wbFloat('Rotate - Walk'), - wbFloat('Unknown') - ]) - ], [])), - wbInteger(VNAM, 'Equipment Flags', itU32, wbEquipType), - wbRArrayS('Equip Slots', wbFormIDCk(QNAM, 'Equip Slot', [EQUP, NULL])), - wbFormIDCk(UNES, 'Unarmed Equip Slot', [EQUP, NULL]), - wbRArray('Phoneme Target Names', wbString(PHTN, 'Name')), - wbPHWT, - wbFormIDCk(WKMV, 'Base Movement Default - Walk', [MOVT, NULL]), - wbFormIDCk(RNMV, 'Base Movement Default - Run', [MOVT, NULL]), - wbFormIDCk(SWMV, 'Base Movement Default - Swim', [MOVT, NULL]), - wbFormIDCk(FLMV, 'Base Movement Default - Fly', [MOVT, NULL]), - wbFormIDCk(SNMV, 'Base Movement Default - Sneak', [MOVT, NULL]), - wbFormIDCk(SPMV, 'Base Movement Default - Sprint', [MOVT, NULL]), - // Start Head Data - wbRStruct('Head Data', [ - wbEmpty(NAM0, 'Head Data Marker', cpNormal, True), - wbRStruct('Male Head Data', [ - wbEmpty(MNAM, 'Male Data Marker', cpNormal, True), - wbRArrayS('Head Parts', wbHeadPart), - wbMorphs, - wbRArrayS('Race Presets Male', wbFormIDCk(RPRM, 'Preset NPC', [NPC_, NULL])), - wbRArrayS('Available Hair Colors Male', wbFormIDCk(AHCM, 'Hair Color', [CLFM, NULL])), - wbRArrayS('Face Details Texture Set List Male', wbFormIDCk(FTSM, 'Texture Set', [TXST, NULL])), - wbFormIDCk(DFTM, 'Default Face Texture Male', [TXST, NULL]), - wbTints, - wbMODL - ], [], cpNormal, True), - wbRStruct('Female Head Data', [ - wbEmpty(NAM0, 'Head Data Marker', cpNormal, True), - wbEmpty(FNAM, 'Female Data Marker', cpNormal, True), - wbRArrayS('Head Parts', wbHeadPart), - wbMorphs, - wbRArrayS('Race Presets Female', wbFormIDCk(RPRF, 'Preset NPC', [NPC_, NULL])), - wbRArrayS('Available Hair Colors Female', wbFormIDCk(AHCF, 'Hair Color', [CLFM, NULL])), - wbRArrayS('Face Details Texture Set List Female', wbFormIDCk(FTSF, 'Texture Set', [TXST, NULL])), - wbFormIDCk(DFTF, 'Default Face Texture Female', [TXST, NULL]), - wbTints, - wbMODL - ], [], cpNormal, True) - ], [], cpNormal, False), - // End Head Data - wbFormIDCk(NAM8, 'Morph race', [RACE, NULL]), - wbFormIDCk(RNAM, 'Armor race', [RACE, NULL]) - ], False, nil, cpNormal, False, wbRACEAfterLoad, wbRACEAfterSet); - - - wbRecord(REFR, 'Placed Object', wbFormaterUnion(wbREFRRecordFlagsDecider, [ - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x40000000} 30, 'Ground', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ACTI STAT TREE} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Hidden From Local Map', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00008000} 15, 'Visible when distant', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {CONT} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x02000000} 25, 'No AI Acquire', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'Ground', - {0x80000000} 31, 'Multibound' - ], True, True)), - {DOOR} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Hidden From Local Map', - {0x00000100} 8, 'Inaccessible', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {LIGH} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000100} 8, 'Doesn''t Light Water', - {0x00000200} 9, 'Casts Shadows', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Never Fades', - {0x00020000} 17, 'Doesn''t Light Landscape', - {0x02000000} 25, 'No AI Acquire', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {MSTT} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000200} 9, 'Motion Blur', - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x04000000} 26, 'Filter (Collision Geometry)', - {0x08000000} 27, 'Bounding Box (Collision Geometry)', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ADDN} wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)), - {ALCH SCRL AMMO ARMO INGR KEYM MISC SLGM WEAP} - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000400} 10, 'Persistent', - {0x00000800} 11, 'Initially Disabled', - {0x00010000} 16, 'Is Full LOD', - {0x02000000} 25, 'No AI Acquire', - {0x10000000} 28, 'Reflected By Auto Water', - {0x20000000} 29, 'Don''t Havok Settle', - {0x40000000} 30, 'No Respawn', - {0x80000000} 31, 'Multibound' - ], True, True)) - ]), [ - wbEDID, - wbVMAD, - wbFormIDCk(NAME, 'Base', [ - TREE, SNDR, ACTI, DOOR, STAT, FURN, CONT, ARMO, AMMO, LVLN, LVLC, - MISC, WEAP, BOOK, KEYM, ALCH, LIGH, GRAS, ASPC, IDLM, ARMA, INGR, - MSTT, TACT, TXST, FLOR, SLGM, SCRL, SOUN, APPA, SPEL, ARTO, ADDN - ], False, cpNormal, True), - - {--- Bound Contents ---} - {--- Bound Data ---} - wbStruct(XMBO, 'Bound Half Extents', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - - {--- Primitive ---} - wbStruct(XPRM, 'Primitive', [ - wbStruct('Bounds', [ - wbFloat('X', cpNormal, True, 2, 4), - wbFloat('Y', cpNormal, True, 2, 4), - wbFloat('Z', cpNormal, True, 2, 4) - ]), - wbStruct('Color', [ - {84} wbFloat('Red', cpNormal, False, 255, 0), - {88} wbFloat('Green', cpNormal, False, 255, 0), - {92} wbFloat('Blue', cpNormal, False, 255, 0) - ]), - wbFloat('Unknown'), - wbInteger('Type', itU32, wbEnum([ - 'None', - 'Box', - 'Sphere', - 'Portal Box', - 'Unknown 4' - ])) - ]), - wbUnknown(XORD), - wbStruct(XOCP, 'Occlusion Plane Data', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ]), - - wbArray(XPOD, 'Portal Data', wbStruct('References', [ - wbFormIDCk('Origin', [REFR, NULL]), - wbFormIDCk('Destination', [REFR, NULL]) - ])), - wbStruct(XPTL, 'Room Portal (unused)', [ - wbStruct('Size', [ - wbFloat('Width', cpNormal, False, 2), - wbFloat('Height', cpNormal, False, 2) - ]), - wbStruct('Position', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ]), - wbStruct('Rotation (Quaternion?)', [ - wbFloat('q1'), - wbFloat('q2'), - wbFloat('q3'), - wbFloat('q4') - ]) - ], cpIgnore), // removed by CK - - wbRStruct('Bound Data', [ - wbStruct(XRMR, 'Header', [ - wbInteger('Linked Rooms Count', itU8), - wbInteger('Flags', itU8, wbFlags([ - 'Unknown 1', - 'Unknown 2', - 'Unknown 3', - 'Unknown 4', - 'Unknown 5', - 'Unknown 6', - 'Has Image Space', - 'Has Lighting Template' - ])), - wbByteArray('Unknown', 2) - ]), - wbFormIDCk(LNAM, 'Lighting Template', [LGTM]), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbRArrayS('Linked Rooms', - wbFormIDCk(XLRM, 'Linked Room', [REFR]) - ) - ], []), - wbEmpty(XMBP, 'MultiBound Primitive Marker', cpIgnore), - - wbXRGD, - wbXRGB, - wbFloat(XRDS, 'Radius'), - - {--- Reflected By / Refracted By ---} - wbRArrayS('Reflected/Refracted By', - wbStructSK(XPWR, [0], 'Water', [ - wbFormIDCk('Reference', [REFR]), - wbInteger('Type', itU32, wbFlags([ - 'Reflection', - 'Refraction' - ])) - ], cpNormal, False, nil, 1) - ), - - {--- Lit Water ---} - wbRArrayS('Lit Water', - wbFormIDCk(XLTW, 'Water', [REFR]) - ), - - {--- Emittance ---} - wbFormIDCk(XEMI, 'Emittance', [LIGH, REGN]), - wbStruct(XLIG, 'Light Data', [ - wbFloat('FOV 90+/-'), - wbFloat('Fade 1.35+/-'), - wbByteArray('Unknown', 4), - wbFloat('Shadow Depth Bias'), - wbByteArray('Unknown', 4) // optional - ], cpNormal, False, nil, 4), - wbStruct(XALP, 'Alpha', [ - wbInteger('Cutoff', itU8), - wbInteger('Base', itU8) - ]), - - {--- Teleport ---} - wbStruct(XTEL, 'Teleport Destination', [ - wbFormIDCk('Door', [REFR], True), - wbPosRot, - wbInteger('Flags', itU32, wbFlags([ - 'No Alarm' - ])) - ]), - wbFormIDCk(XTNM, 'Teleport Message Box', [MESG]), - - {--- MultiBound ---} - wbFormIDCk(XMBR, 'MultiBound Reference', [REFR]), - - wbByteArray(XWCN, 'Unknown', 0, cpIgnore), // leftover - wbByteArray(XWCS, 'Unknown', 0, cpIgnore), // leftover - wbStruct(XWCU, 'Water Velocity', [ - wbFloat('X Offset'), - wbFloat('Y Offset'), - wbFloat('Z Offset'), - wbByteArray('Unknown', 4), - wbFloat('X Angle'), - wbFloat('Y Angle'), - wbFloat('Z Angle'), - wbByteArray('Unknown', 0) - ]), - - wbStruct(XCVL, 'Unknown', [ - wbByteArray('Unknown', 4), - wbFloat('X Angle'), - wbByteArray('Unknown', 4) - ]), - wbFormIDCk(XCZR, 'Unknown', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbUnknown(XCZA), - wbFormIDCk(XCZC, 'Unknown', [CELL, NULL]), - wbXSCL, - wbFormIDCk(XSPC, 'Spawn Container', [REFR]), - - {--- Activate Parents ---} - wbRStruct('Activate Parents', [ - wbInteger(XAPD, 'Flags', itU8, wbFlags([ - 'Parent Activate Only' - ], True)), - wbRArrayS('Activate Parent Refs', - wbStructSK(XAPR, [0], 'Activate Parent Ref', [ - wbFormIDCk('Reference', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbFloat('Delay') - ]) - ) - ], []), - - wbFormIDCk(XLIB, 'Leveled Item Base Object', [LVLI]), - wbXLCM, - wbFormIDCk(XLCN, 'Persistent Location', [LCTN]), - - {>>> COLL form Index value <<<} - wbInteger(XTRI, 'Collision Layer', itU32), - - {--- Lock ---} - {>>Lock Tab for REFR when 'Locked' is Unchecked this record is not present <<<} - wbStruct(XLOC, 'Lock Data', [ - wbInteger('Level', itU8, wbEnum([], [ - 1, 'Novice', - 25, 'Apprentice', - 50, 'Adept', - 75, 'Expert', - 100, 'Master', - 255, 'Requires Key' - ])), - wbByteArray('Unused', 3, cpIgnore), - wbFormIDCkNoReach('Key', [KEYM, NULL]), - wbInteger('Flags', itU8, wbFlags(['', '', 'Leveled Lock'])), - wbByteArray('Unused', 3, cpIgnore), - wbByteArray('Unused', 8, cpIgnore) - ], cpNormal, False, nil, 4), - - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN]), - - {--- Generated Data ---} - wbStruct(XNDP, 'Navigation Door Link', [ - wbFormIDCk('Navigation Mesh', [NAVM]), - wbInteger('Teleport Marker Triangle', itS16, wbREFRNavmeshTriangleToStr, wbStringToInt), - wbByteArray('Unused', 2, cpIgnore) - ]), - - wbArray(XLRT, 'Location Ref Type', wbFormIDCk('Ref', [LCRT, NULL])), - wbEmpty(XIS2, 'Ignored by Sandbox'), - - {--- Ownership ---} - wbOwnership, - - wbInteger(XCNT, 'Item Count', itS32), - wbFloat(XCHG, 'Charge'), - wbFormIDCk(XLRL, 'Location Reference', [LCRT, LCTN, NULL], False, cpBenignIfAdded), - - wbXESP, - wbRArray('Linked References', wbStruct(XLKR, 'Linked Reference', [ - wbFormIDCk('Keyword/Ref', [KYWD, PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA, NULL]), - wbFormIDCk('Ref', [PLYR, ACHR, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]) - ], cpNormal, False, nil, 1)), - - wbRArray('Patrol', wbRStruct('Data', [ - wbFloat(XPRD, 'Idle Time', cpNormal, True), - wbEmpty(XPPA, 'Patrol Script Marker', cpNormal, True), - wbFormIDCk(INAM, 'Idle', [IDLE, NULL], False, cpNormal, True), - wbByteArray(SCHR, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbByteArray(SCTX, 'Unused', 0, cpIgnore, false, false, wbNeverShow), - wbPDTOs - ], [])), - - {--- Flags ---} - wbInteger(XACT, 'Action Flag', itU32, wbFlags([ - 'Use Default', - 'Activate', - 'Open', - 'Open by Default' - ])), - - wbFloat(XHTW, 'Head-Tracking Weight'), - wbFloat(XFVC, 'Favor Cost'), - - wbEmpty(ONAM, 'Open by Default'), - - {--- Map Data ---} - wbRStruct('Map Marker', [ - wbEmpty(XMRK, 'Map Marker Data'), - wbInteger(FNAM, 'Map Flags', itU8, wbFlags([ - {0x01} 'Visible', - {0x02} 'Can Travel To', - {0x04} '"Show All" Hidden' - ]), cpNormal, True), - wbFULLReq, - wbStruct(TNAM, '', [ - wbInteger('Type', itU8, wbEnum([], [ - 0, 'None', - 1, 'City', - 2, 'Town', - 3, 'Settlement', - 4, 'Cave', - 5, 'Camp', - 6, 'Fort', - 7, 'Nordic Ruins', - 8, 'Dwemer Ruin', - 9, 'Shipwreck', - 10, 'Grove', - 11, 'Landmark', - 12, 'Dragon Lair', - 13, 'Farm', - 14, 'Wood Mill', - 15, 'Mine', - 16, 'Imperial Camp', - 17, 'Stormcloak Camp', - 18, 'Doomstone', - 19, 'Wheat Mill', - 20, 'Smelter', - 21, 'Stable', - 22, 'Imperial Tower', - 23, 'Clearing', - 24, 'Pass', - 25, 'Altar', - 26, 'Rock', - 27, 'Lighthouse', - 28, 'Orc Stronghold', - 29, 'Giant Camp', - 30, 'Shack', - 31, 'Nordic Tower', - 32, 'Nordic Dwelling', - 33, 'Docks', - 34, 'Shrine', - 35, 'Riften Castle', - 36, 'Riften Capitol', - 37, 'Windhelm Castle', - 38, 'Windhelm Capitol', - 39, 'Whiterun Castle', - 40, 'Whiterun Capitol', - 41, 'Solitude Castle', - 42, 'Solitude Capitol', - 43, 'Markarth Castle', - 44, 'Markarth Capitol', - 45, 'Winterhold Castle', - 46, 'Winterhold Capitol', - 47, 'Morthal Castle', - 48, 'Morthal Capitol', - 49, 'Falkreath Castle', - 50, 'Falkreath Capitol', - 51, 'Dawnstar Castle', - 52, 'Dawnstar Capitol', - 53, 'DLC02 - Temple of Miraak', - 54, 'DLC02 - Raven Rock', - 55, 'DLC02 - Beast Stone', - 56, 'DLC02 - Tel Mithryn', - 57, 'DLC02 - To Skyrim', - 58, 'DLC02 - To Solstheim', - 59, 'Custom 59', - 60, 'Custom 60', - 61, 'Custom 61', - 62, 'Custom 62', - 63, 'Custom 63', - 64, 'Custom 64', - 65, 'Custom 65', - 66, 'Custom 66', - 67, 'Custom 67', - 68, 'Custom 68', - 69, 'Custom 69', - 70, 'Custom 70', - 71, 'Custom 71', - 72, 'Custom 72', - 73, 'Custom 73', - 74, 'Custom 74', - 75, 'Custom 75', - 76, 'Custom 76', - 77, 'Custom 77', - 78, 'Custom 78', - 79, 'Custom 79', - 80, 'Custom 80', - 81, 'Custom 81', - 82, 'Custom 82', - 83, 'Custom 83', - 84, 'Custom 84', - 85, 'Custom 85', - 86, 'Custom 86', - 87, 'Custom 87', - 88, 'Custom 88', - 89, 'Custom 89', - 90, 'Custom 90', - 91, 'Custom 91', - 92, 'Custom 92', - 93, 'Custom 93', - 94, 'Custom 94', - 95, 'Custom 95', - 96, 'Custom 96', - 97, 'Custom 97', - 98, 'Custom 98', - 99, 'Custom 99' - ])), - wbByteArray('Unused', 1) - ], cpNormal, True) - ], []), - {--- Attach reference ---} - wbFormIDCk(XATR, 'Attach Ref', [REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - wbXLOD, - wbDataPosRot - ], True, wbPlacedAddInfo, cpNormal, False, wbREFRAfterLoad); - - wbRecord(REGN, 'Region', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000040} 6, 'Border Region' - ])), [ - wbEDID, - wbStruct(RCLR, 'Map Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8), - wbByteArray('Unknown', 1) - ], cpNormal, True), - {>>> Skyrim.esm has some incorrect FormIDs here, probably leftover <<<} - wbFormIDCkNoReach(WNAM, 'Worldspace', [WRLD]), - wbRArray('Region Areas', wbRStruct('Region Area', [ - wbInteger(RPLI, 'Edge Fall-off', itU32), - wbArray(RPLD, 'Region Point List Data', wbStruct('Point', [ - wbFloat('X'), - wbFloat('Y') - ]), 0, wbRPLDAfterLoad) - ], [])), - wbRArrayS('Region Data Entries', wbRStructSK([0], 'Region Data Entry', [ - {always starts with an RDAT} - wbStructSK(RDAT, [0], 'Data Header', [ - wbInteger('Type', itU32, wbEnum([ - {0} 'Unknown 0', - {1} 'Unknown 1', - {2} 'Objects', - {3} 'Weather', - {4} 'Map', - {5} 'Land', - {6} 'Grass', - {7} 'Sound', - {8} 'Imposter', - {9} 'Unknown 10', - {10}'Unknown 11', - {11}'Unknown 12', - {12}'Unknown 13', - {13}'Unknown 14', - {14}'Unknown 15', - {15}'Unknown 16' - ])), - wbInteger('Flags', itU8, wbFlags([ - 'Override' - ])), - wbInteger('Priority', itU8), - wbByteArray('Unknown') - ], cpNormal, True), - - {--- Icon ---} - wbICON, - - {--- Sound ---} - wbFormIDCk(RDMO, 'Music', [MUSC], False, cpNormal, False, wbREGNSoundDontShow), - wbArrayS(RDSA, 'Sounds', wbStructSK([0], 'Sound', [ - wbFormIDCk('Sound', [SNDR, NULL]), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001}'Pleasant', - {0x00000002}'Cloudy', - {0x00000004}'Rainy', - {0x00000008}'Snowy' - ])), - wbFloat('Chance') - ]), 0, cpNormal, False, nil, nil, wbREGNSoundDontShow), - - {--- Map ---} - wbLString(RDMP, 'Map Name', 0, cpTranslate, False, wbREGNMapDontShow), - - {followed by one of these: } - - {--- Objects ---} - wbArray(RDOT, 'Objects', wbStruct('Object', [ - wbFormIDCk('Object', [TREE, FLOR, STAT, LTEX, MSTT]), - wbInteger('Parent Index', itU16, wbHideFFFF), - wbByteArray('Unknown', 2), - wbFloat('Density'), - wbInteger('Clustering', itU8), - wbInteger('Min Slope', itU8), - wbInteger('Max Slope', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0}'Conform to slope', - {1}'Paint Vertices', - {2}'Size Variance +/-', - {3}'X +/-', - {4}'Y +/-', - {5}'Z +/-', - {6}'Tree', - {7}'Huge Rock' - ])), - wbInteger('Radius wrt Parent', itU16), - wbInteger('Radius', itU16), - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Sink'), - wbFloat('Sink Variance'), - wbFloat('Size Variance'), - wbStruct('Angle Variance', [ - wbInteger('X', itU16), - wbInteger('Y', itU16), - wbInteger('Z', itU16) - ]), - wbByteArray('Unknown', 2), - wbByteArray('Unknown', 4) - ]), 0, nil, nil, cpNormal, False, wbREGNObjectsDontShow), - - {--- Grass ---} - wbArrayS(RDGS, 'Grasses', wbStructSK([0], 'Grass', [ - wbFormIDCk('Grass', [GRAS]), - wbByteArray('Unknown',4) - ]), 0, cpNormal, False, nil, nil, wbREGNGrassDontShow), - - {--- Weather ---} - wbArrayS(RDWT, 'Weather Types', wbStructSK([0], 'Weather Type', [ - wbFormIDCk('Weather', [WTHR]), - wbInteger('Chance', itU32), - wbFormIDCk('Global', [GLOB, NULL]) - ]), 0, cpNormal, False, nil, nil, wbREGNWeatherDontShow) - - ], [])) - ], True); - - wbRecord(SOUN, 'Sound Marker', [ - wbEDID, - wbOBNDReq, - wbUnknown(FNAM, cpIgnore), // leftover, unused - wbUnknown(SNDD, cpIgnore), // leftover, unused - wbFormIDCk(SDSC, 'Sound Descriptor', [SNDR, NULL]) - ]); - - wbSPIT := wbStruct(SPIT, 'Data', [ - wbInteger('Base Cost', itU32), - wbInteger('Flags', itU32, wbFlags([ - {0x00000001} 'Manual Cost Calc', - {0x00000002} 'Unknown 2', - {0x00000004} 'Unknown 3', - {0x00000008} 'Unknown 4', - {0x00000010} 'Unknown 5', - {0x00000020} 'Unknown 6', - {0x00000040} 'Unknown 7', - {0x00000080} 'Unknown 8', - {0x00000100} 'Unknown 9', - {0x00000200} 'Unknown 10', - {0x00000400} 'Unknown 11', - {0x00000800} 'Unknown 12', - {0x00001000} 'Unknown 13', - {0x00002000} 'Unknown 14', - {0x00004000} 'Unknown 15', - {0x00008000} 'Unknown 16', - {0x00010000} 'Unknown 17', - {0x00020000} 'PC Start Spell', - {0x00040000} 'Unknown 19', - {0x00080000} 'Area Effect Ignores LOS', - {0x00100000} 'Ignore Resistance', - {0x00200000} 'No Absorb/Reflect', - {0x00400000} 'Unknown 23', - {0x00800000} 'No Dual Cast Modification', - {0x01000000} 'Unknown 25', - {0x02000000} 'Unknown 26', - {0x04000000} 'Unknown 27', - {0x08000000} 'Unknown 28', - {0x10000000} 'Unknown 29', - {0x20000000} 'Unknown 30', - {0x40000000} 'Unknown 31', - {0x80000000} 'Unknown 32' - ])), - wbInteger('Type', itU32, wbEnum([ - {0} 'Spell', - {1} 'Disease', - {2} 'Power', - {3} 'Lesser Power', - {4} 'Ability', - {5} 'Poison', - {6} 'Unknown 6', - {7} 'Unknown 7', - {8} 'Unknown 8', - {9} 'Unknown 9', - {10} 'Addiction', - {11} 'Voice' - ])), - wbFloat('Charge Time'), - wbInteger('Cast Type', itU32, wbCastEnum), - wbInteger('Target Type', itU32, wbTargetEnum), - wbFloat('Cast Duration'), - wbFloat('Range'), - wbFormIDCk('Half-cost Perk', [NULL, PERK]) - ], cpNormal, True); - - wbRecord(SPEL, 'Spell', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbMDOB, - wbETYP, - wbDESCReq, - wbSPIT, - wbEffectsReq - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(SCRL, 'Scroll', [ - wbEDID, - wbOBNDReq, - wbFULL, - wbKSIZ, - wbKWDAs, - wbMDOB, - wbETYP, - wbDESC, - wbMODL, - wbDEST, - wbYNAM, - wbZNAM, - wbStruct(DATA, 'Item', [ - wbInteger('Value', itU32), - wbFloat('Weight') - ], cpNormal, True), - wbSPIT, - wbEffectsReq - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(STAT, 'Static', - wbFlags(wbRecordFlagsFlags, [ - {0x00000001} { 0} '', - {0x00000002} { 1} '', - {0x00000004} { 2} 'Never Fades', - {0x00000008} { 3} '', - {0x00000010} { 4} '', - {0x00000020} { 5} 'Deleted', - {0x00000040} { 6} 'Has Tree LOD', - {0x00000080} { 7} 'Add-On LOD Object', - {0x00000100} { 8} '', - {0x00000200} { 9} 'Hidden From Local Map', - {0x00000400} {10} '', - {0x00000800} {11} 'Unknown 11', // present in Skyrim.esm but can't be set - {0x00001000} {12} '', - {0x00002000} {13} '', - {0x00004000} {14} '', - {0x00008000} {15} 'Has Distant LOD', - {0x00010000} {16} 'Unknown 16', // present in Skyrim.esm but can't be set - {0x00020000} {17} 'Uses HD LOD Texture', - {0x00040000} {18} '', - {0x00080000} {19} 'Has Currents', - {0x00100000} {20} '', - {0x00200000} {21} '', - {0x00400000} {22} '', - {0x00800000} {23} 'Is Marker', - {0x01000000} {24} '', - {0x02000000} {25} 'Obstacle', - {0x04000000} {26} 'NavMesh Generation - Filter', - {0x08000000} {27} 'NavMesh Generation - Bounding Box', - {0x10000000} {28} 'Show In World Map', - {0x20000000} {29} '', - {0x40000000} {30} 'NavMesh Generation - Ground', - {0x80000000} {31} '' - ], [11, 16]), [ - wbEDID, - wbOBNDReq, - wbMODL, - IsSSE( - wbStruct(DNAM, 'Direction Material', [ - wbFloat('Max Angle (30-120)'), - wbFormIDCk('Material', [MATO, NULL]), - // SSE - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Considered Snow' - ])), - wbByteArray('Unused', 3, cpIgnore) - ], cpNormal, True, nil, 2), - wbStruct(DNAM, 'Direction Material', [ - wbFloat('Max Angle (30-120)'), - wbFormIDCk('Material', [MATO, NULL]) - ], cpNormal, True) - ), - wbArray(MNAM, 'Distant LOD', - wbStruct('LOD', [ - {>>> Contains null-terminated mesh filename followed by random data up to 260 bytes <<<} - wbString(True, 'Mesh', 260) - //wbByteArray('Mesh', 260, cpIgnore) - ]), [ - 'Level 0', - 'Level 1', - 'Level 2', - 'Level 3' - ], - cpNormal, False - ) - ]); - - wbRecord(TES4, 'Main File Header', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000001} 0, 'ESM', - {0x00000080} 7, 'Localized' - ], False), True), [ - wbStruct(HEDR, 'Header', [ - wbFloat('Version'), - wbInteger('Number of Records', itU32), - wbInteger('Next Object ID', itU32) - ], cpNormal, True), - wbByteArray(OFST, 'Unknown', 0, cpIgnore), - wbByteArray(DELE, 'Unknown', 0, cpIgnore), - wbString(CNAM, 'Author', 0, cpTranslate, True), - wbString(SNAM, 'Description', 0, cpTranslate), - wbRArray('Master Files', wbRStruct('Master File', [ - wbString(MAST, 'Filename', 0, cpNormal, True), - wbByteArray(DATA, 'Unknown', 8, cpIgnore, True) - ], [ONAM])), - wbArray(ONAM, 'Overridden Forms', - wbFormIDCk('Form', [ACHR, LAND, NAVM, REFR, PGRE, PHZD, PMIS, PARW, PBAR, PBEA, PCON, PFLA]), - 0, nil, nil, cpNormal, False{, wbTES4ONAMDontShow}), - wbByteArray(SCRN, 'Screenshot'), - wbUnknown(INTV), - wbUnknown(INCC) - ], True, nil, cpNormal, True, wbRemoveOFST); -end; - -procedure DefineTES5o; -begin - - wbRecord(TREE, 'Tree', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00008000} 15, 'Has Distant LOD' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbMODL, - wbFormIDCK(PFIG, 'Ingredient', [INGR, ALCH, MISC, LVLI, NULL]), - wbFormIDCK(SNAM, 'Harvest Sound', [SNDR, NULL]), - wbStruct(PFPC, 'Ingredient Production', [ - wbInteger('Spring', itU8), - wbInteger('Summer', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ]), - wbFULL, - wbStruct(CNAM, 'Tree Data', [ - wbFloat('Trunk Flexibility'), - wbFloat('Branch Flexibility'), - //wbByteArray('Unknown', 32), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Leaf Amplitude'), - wbFloat('Leaf Frequency') - ], cpNormal, True) - ]); - - wbRecord(FLOR, 'Flora', [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULLReq, - wbMODL, - wbDEST, - wbKSIZ, - wbKWDAs, - wbUnknown(PNAM), - wbLString(RNAM, 'Activate Text Override', 0, cpTranslate), - wbUnknown(FNAM), - wbFormIDCk(PFIG, 'Ingredient', [INGR, ALCH, LVLI, MISC, NULL]), - wbFormIDCK(SNAM, 'Sound', [SNDR, NULL]), - wbStruct(PFPC, 'Seasonal ingredient production', [ - wbInteger('Spring', itU8), - wbInteger('Summer ', itU8), - wbInteger('Fall', itU8), - wbInteger('Winter', itU8) - ], cpNormal, True) - ], False, nil, cpNormal, False, nil, wbKeywordsAfterSet); - - wbRecord(WATR, 'Water', [ - wbEDID, - wbFULL, - wbRArray('Unused', wbString(NNAM, 'Noise Map', 0, cpIgnore, False)), // leftover - wbInteger(ANAM, 'Opacity', itU8, nil, cpNormal, True), - wbInteger(FNAM, 'Flags', itU8, wbFlags([ - {0x01} 'Causes Damage', - {0x02} 'Unknown 1', - {0x04} 'Unknown 2', - {0x08} IsSSE('Enable Flowmap', 'Unknown 3'), - {0x10} IsSSE('Blend Normals', 'Unknown 4'), - {0x20} 'Unknown 5', - {0x40} 'Unknown 6', - {0x80} 'Unknown 7' - ]), cpNormal, True), - wbByteArray(MNAM, 'Unused', 0, cpIgnore, False), // leftover - wbFormIDCk(TNAM, 'Material', [MATT]), - wbFormIDCk(SNAM, 'Open Sound', [SNDR, NULL]), - wbFormIDCk(XNAM, 'Spell', [SPEL]), - wbFormIDCk(INAM, 'Image Space', [IMGS]), - wbInteger(DATA, 'Damage Per Second', itU16, nil, cpNormal, True, True), - IsSSE( - wbStruct(DNAM, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Specular Properties - Sun Specular Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unknown', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbByteColors('Shallow Color'), - wbByteColors('Deep Color'), - wbByteColors('Reflection Color'), - wbByteArray('Unknown', 4), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Unknown'), - wbFloat('Noise Properties - Noise Falloff'), - wbFloat('Noise Properties - Layer One - Wind Direction'), - wbFloat('Noise Properties - Layer Two - Wind Direction'), - wbFloat('Noise Properties - Layer Three - Wind Direction'), - wbFloat('Noise Properties - Layer One - Wind Speed'), - wbFloat('Noise Properties - Layer Two - Wind Speed'), - wbFloat('Noise Properties - Layer Three - Wind Speed'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Unknown'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Refraction Magnitude'), - wbFloat('Specular Properties - Specular Power'), - wbFloat('Unknown'), - wbFloat('Specular Properties - Specular Radius'), - wbFloat('Specular Properties - Specular Brightness'), - wbFloat('Noise Properties - Layer One - UV Scale'), - wbFloat('Noise Properties - Layer Two - UV Scale'), - wbFloat('Noise Properties - Layer Three - UV Scale'), - wbFloat('Noise Properties - Layer One - Amplitude Scale'), - wbFloat('Noise Properties - Layer Two - Amplitude Scale'), - wbFloat('Noise Properties - Layer Three - Amplitude Scale'), - wbFloat('Water Properties - Reflection Magnitude'), - wbFloat('Specular Properties - Sun Sparkle Magnitude'), - wbFloat('Specular Properties - Sun Specular Magnitude'), - wbFloat('Depth Properties - Reflections'), - wbFloat('Depth Properties - Refraction'), - wbFloat('Depth Properties - Normals'), - wbFloat('Depth Properties - Specular Lighting'), - wbFloat('Specular Properties - Sun Sparkle Power'), - // SSE - wbFloat('Noise Properties - Flowmap Scale') - ], cpNormal, True, nil, 57), - wbStruct(DNAM, 'Visual Data', [ - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Specular Properties - Sun Specular Power'), - wbFloat('Water Properties - Reflectivity Amount'), - wbFloat('Water Properties - Fresnel Amount'), - wbByteArray('Unknown', 4), - wbFloat('Fog Properties - Above Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Above Water - Fog Distance - Far Plane'), - wbByteColors('Shallow Color'), - wbByteColors('Deep Color'), - wbByteColors('Reflection Color'), - wbByteArray('Unknown', 4), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Displacement Simulator - Starting Size'), - wbFloat('Displacement Simulator - Force'), - wbFloat('Displacement Simulator - Velocity'), - wbFloat('Displacement Simulator - Falloff'), - wbFloat('Displacement Simulator - Dampner'), - wbFloat('Unknown'), - wbFloat('Noise Properties - Noise Falloff'), - wbFloat('Noise Properties - Layer One - Wind Direction'), - wbFloat('Noise Properties - Layer Two - Wind Direction'), - wbFloat('Noise Properties - Layer Three - Wind Direction'), - wbFloat('Noise Properties - Layer One - Wind Speed'), - wbFloat('Noise Properties - Layer Two - Wind Speed'), - wbFloat('Noise Properties - Layer Three - Wind Speed'), - wbFloat('Unknown'), - wbFloat('Unknown'), - wbFloat('Fog Properties - Above Water - Fog Amount'), - wbFloat('Unknown'), - wbFloat('Fog Properties - Under Water - Fog Amount'), - wbFloat('Fog Properties - Under Water - Fog Distance - Near Plane'), - wbFloat('Fog Properties - Under Water - Fog Distance - Far Plane'), - wbFloat('Water Properties - Refraction Magnitude'), - wbFloat('Specular Properties - Specular Power'), - wbFloat('Unknown'), - wbFloat('Specular Properties - Specular Radius'), - wbFloat('Specular Properties - Specular Brightness'), - wbFloat('Noise Properties - Layer One - UV Scale'), - wbFloat('Noise Properties - Layer Two - UV Scale'), - wbFloat('Noise Properties - Layer Three - UV Scale'), - wbFloat('Noise Properties - Layer One - Amplitude Scale'), - wbFloat('Noise Properties - Layer Two - Amplitude Scale'), - wbFloat('Noise Properties - Layer Three - Amplitude Scale'), - wbFloat('Water Properties - Reflection Magnitude'), - wbFloat('Specular Properties - Sun Sparkle Magnitude'), - wbFloat('Specular Properties - Sun Specular Magnitude'), - wbFloat('Depth Properties - Reflections'), - wbFloat('Depth Properties - Refraction'), - wbFloat('Depth Properties - Normals'), - wbFloat('Depth Properties - Specular Lighting'), - wbFloat('Specular Properties - Sun Sparkle Power') - ]) - ), - wbByteArray(GNAM, 'Unused', 0, cpNormal, True), // leftover - wbStruct(NAM0, 'Linear Velocity', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, False), - wbStruct(NAM1, 'Angular Velocity', [ - wbFloat('X'), - wbFloat('Y'), - wbFloat('Z') - ], cpNormal, False), - wbString(NAM2, 'Noise Layer One - Noise Texture', 0, cpNormal, False), - wbString(NAM3, 'Noise Layer Two - Noise Texture', 0, cpNormal, False), - wbString(NAM4, 'Noise Layer Three - Noise Texture', 0, cpNormal, False), - // SSE - wbString(NAM5, 'Flow Normals - Noise Texture', 0, cpNormal, False) - ], False, nil, cpNormal, False); - - wbRecord(WEAP, 'Weapon', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00000004} 2, 'Non-Playable' - ])), [ - wbEDID, - wbVMAD, - wbOBNDReq, - wbFULL, - wbMODL, - wbICON, - wbEITM, - wbInteger(EAMT, 'Enchantment Amount', itU16), - wbDEST, - wbETYP, - wbFormIDCk(BIDS, 'Block Bash Impact Data Set', [IPDS, NULL]), - wbFormIDCk(BAMT, 'Alternate Block Material', [MATT, NULL]), - wbYNAM, - wbZNAM, - wbKSIZ, - wbKWDAs, - wbDESC, - wbRStruct('Has Scope', [ - wbString(MOD3, 'Model Filename'), - wbByteArray(MO3T, 'Texture Files Hashes', 0, cpIgnore, false, false, wbNeverShow), - wbMO3S - ], []), - wbByteArray(NNAM, 'Unused', 0, cpIgnore, False), // leftover - wbFormIDCk(INAM, 'Impact Data Set', [IPDS, NULL]), - wbFormIDCk(WNAM, '1st Person Model Object', [STAT, NULL]), - wbFormIDCk(SNAM, 'Attack Sound', [SNDR]), - wbFormIDCk(XNAM, 'Attack Sound 2D', [SNDR]), - wbFormIDCk(NAM7, 'Attack Loop Sound', [SNDR]), - wbFormIDCk(TNAM, 'Attack Fail Sound', [SNDR]), - wbFormIDCk(UNAM, 'Idle Sound', [SNDR]), - wbFormIDCk(NAM9, 'Equip Sound', [SNDR]), - wbFormIDCk(NAM8, 'Unequip Sound', [SNDR]), - wbStruct(DATA, 'Game Data', [ - wbInteger('Value', itU32), - wbFloat('Weight'), - wbInteger('Damage', itU16) - ]), - wbStruct(DNAM, 'Data', [ - wbInteger('Animation Type', itU8, wbWeaponAnimTypeEnum), - wbByteArray('Unused', 3, cpIgnore), - wbFloat('Speed'), - wbFloat('Reach'), - wbInteger('Flags', itU16, wbFlags([ - {0x0001}'Ignores Normal Weapon Resistance', - {0x0002}'Automatic (unused)', - {0x0004}'Has Scope (unused)', - {0x0008}'Can''t Drop', - {0x0010}'Hide Backpack (unused)', - {0x0020}'Embedded Weapon (unused)', - {0x0040}'Don''t Use 1st Person IS Anim (unused)', - {0x0080}'Non-playable' - ], [1, 2, 4, 5, 6])), - wbByteArray('Unused', 2, cpIgnore), - wbFloat('Sight FOV'), - wbByteArray('Unknown', 4), - wbInteger('Base VATS To-Hit Chance', itU8), - wbInteger('Attack Animation', itU8, wbAttackAnimationEnum), - wbInteger('# Projectiles', itU8), - wbInteger('Embedded Weapon AV (unused)', itU8), - wbFloat('Range Min'), - wbFloat('Range Max'), - wbInteger('On Hit', itU32, wbEnum([ - 'No formula behaviour', - 'Dismember only', - 'Explode only', - 'No dismember/explode' - ])), - wbInteger('Flags2', itU32, wbFlags([ - {0x00000001} 'Player Only', - {0x00000002} 'NPCs Use Ammo', - {0x00000004} 'No Jam After Reload (unused)', - {0x00000008} 'Unknown 4', - {0x00000010} 'Minor Crime', - {0x00000020} 'Range Fixed', - {0x00000040} 'Not Used in Normal Combat', - {0x00000080} 'Unknown 8', - {0x00000100} 'Don''t Use 3rd Person IS Anim (unused)', - {0x00000200} 'Burst Shot', - {0x00000400} 'Rumble - Alternate', - {0x00000800} 'Long Bursts', - {0x00001000} 'Non-hostile', - {0x00002000} 'Bound Weapon' - ], [2, 8])), - wbFloat('Animation Attack Mult'), - wbFloat('Unknown'), - wbFloat('Rumble - Left Motor Strength'), - wbFloat('Rumble - Right Motor Strength'), - wbFloat('Rumble - Duration'), - wbByteArray('Unknown', 12), - wbInteger('Skill', itS32, wbSkillEnum), - wbByteArray('Unknown', 8), - wbInteger('Resist', itS32, wbActorValueEnum), - wbByteArray('Unknown', 4), - wbFloat('Stagger') - ]), - IsSSE( - wbStruct(CRDT, 'Critical Data', [ - wbInteger('Damage', itU16), - wbByteArray('Unknown', 2), - wbFloat('% Mult'), - wbInteger('Flags', itU8, wbFlags([ - 'On Death' - ])), - // SSE - wbByteArray('Unused', 3, cpIgnore), - wbByteArray('Unknown', 4), - wbFormIDCk('Effect', [SPEL, NULL]), - wbByteArray('Unknown', 4) - ]), - wbStruct(CRDT, 'Critical Data', [ - wbInteger('Damage', itU16), - wbByteArray('Unknown', 2), - wbFloat('% Mult'), - wbInteger('Flags', itU8, wbFlags([ - 'On Death' - ])), - wbByteArray('Unused', 3, cpIgnore), - wbFormIDCk('Effect', [SPEL, NULL]) - ]) - ), - wbInteger(VNAM, 'Detection Sound Level', itU32, wbSoundlevelEnum), - wbFormIDCk(CNAM, 'Template', [WEAP]) - ], False, nil, cpNormal, False, wbWEAPAfterLoad, wbKeywordsAfterSet); - - wbRecord(WRLD, 'Worldspace', - wbFlags(wbRecordFlagsFlags, wbFlagsList([ - {0x00080000} 19, 'Can''t Wait' - ])), [ - wbEDID, - wbRArray(IsSSE('Large References', 'Unused RNAM'), - wbStruct(RNAM, 'Grid', [ - wbInteger('Y', itS16, nil, cpIgnore), - wbInteger('X', itS16, nil, cpIgnore), - wbArray('References', wbStruct('Reference', [ - wbFormIDCk('Ref', [REFR], False, cpIgnore), - wbInteger('Y', itS16, nil, cpIgnore), - wbInteger('X', itS16, nil, cpIgnore) - ]), -1) - ]), - cpIgnore, False, nil, nil, wbNeverShow - ), - wbMaxHeightDataWRLD, - wbFULL, - wbStruct(WCTR, 'Fixed Dimensions Center Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbFormIDCk(LTMP, 'Interior Lighting', [LGTM]), - wbFormIDCk(XEZN, 'Encounter Zone', [ECZN, NULL]), - wbFormIDCk(XLCN, 'Location', [LCTN, NULL]), - wbRStruct('Parent', [ - wbFormIDCk(WNAM, 'Worldspace', [WRLD]), - wbStruct(PNAM, '', [ - wbInteger('Flags', itU8, wbFlags([ - {0x0001}'Use Land Data', - {0x0002}'Use LOD Data', - {0x0004}'Don''t Use Map Data', - {0x0008}'Use Water Data', - {0x0010}'Use Climate Data', - {0x0020}'Use Image Space Data (unused)', - {0x0040}'Use Sky Cell' - ], [5])), - wbByteArray('Unknown', 1) - ], cpNormal, True) - ], []), - wbFormIDCk(CNAM, 'Climate', [CLMT]), - wbFormIDCk(NAM2, 'Water', [WATR]), - wbFormIDCk(NAM3, 'LOD Water Type', [WATR]), - wbFloat(NAM4, 'LOD Water Height'), - wbStruct(DNAM, 'Land Data', [ - wbFloat('Default Land Height'), - wbFloat('Default Water Height') - ]), - wbString(ICON, 'Map Image'), - wbRStruct('Cloud Model', [wbMODL], []), - wbStruct(MNAM, 'Map Data', [ - wbStruct('Usable Dimensions', [ - wbInteger('X', itS32), - wbInteger('Y', itS32) - ]), - wbStruct('Cell Coordinates', [ - wbStruct('NW Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]), - wbStruct('SE Cell', [ - wbInteger('X', itS16), - wbInteger('Y', itS16) - ]) - ]), - wbStruct('Camera Data', [ - wbFloat('Min Height'), - wbFloat('Max Height'), - wbFloat('Initial Pitch') - ]) - ], cpNormal, False, nil, 2), - wbStruct(ONAM, 'World Map Offset Data', [ - wbFloat('World Map Scale'), - wbFloat('Cell X Offset'), - wbFloat('Cell Y Offset'), - wbFloat('Cell Z Offset') - ], cpNormal, True), - wbFloat(NAMA, 'Distant LOD Multiplier'), - wbInteger(DATA, 'Flags', itU8, wbFlags([ - {0x01} 'Small World', - {0x02} 'Can''t Fast Travel', - {0x04} 'Unknown 3', - {0x08} 'No LOD Water', - {0x10} 'No Landscape', - {0x20} 'No Sky', - {0x40} 'Fixed Dimensions', - {0x80} 'No Grass' - ]), cpNormal, True), - {>>> Object Bounds doesn't show up in CK <<<} - wbRStruct('Object Bounds', [ - wbStruct(NAM0, 'Min', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True), - wbStruct(NAM9, 'Max', [ - wbFloat('X', cpNormal, False, 1/4096), - wbFloat('Y', cpNormal, False, 1/4096) - ], cpIgnore, True) - ], []), - wbFormIDCk(ZNAM, 'Music', [MUSC]), - wbString(NNAM, 'Canopy Shadow (unused)', 0, cpIgnore), - wbString(XNAM, 'Water Noise Texture'), - wbString(TNAM, 'HD LOD Diffuse Texture'), - wbString(UNAM, 'HD LOD Normal Texture'), - wbString(XWEM, 'Water Environment Map (unused)', 0, cpIgnore), - wbOFST - ], False, nil, cpNormal, False, wbWRLDAfterLoad); - - - wbRecord(WTHR, 'Weather', [ - wbEDID, - wbString(_00_0TX, 'Cloud Texture Layer #0'), - wbString(_10_0TX, 'Cloud Texture Layer #1'), - wbString(_20_0TX, 'Cloud Texture Layer #2'), - wbString(_30_0TX, 'Cloud Texture Layer #3'), - wbString(_40_0TX, 'Cloud Texture Layer #4'), - wbString(_50_0TX, 'Cloud Texture Layer #5'), - wbString(_60_0TX, 'Cloud Texture Layer #6'), - wbString(_70_0TX, 'Cloud Texture Layer #7'), - wbString(_80_0TX, 'Cloud Texture Layer #8'), - wbString(_90_0TX, 'Cloud Texture Layer #9'), - wbString(_3A_0TX, 'Cloud Texture Layer #10'), - wbString(_3B_0TX, 'Cloud Texture Layer #11'), - wbString(_3C_0TX, 'Cloud Texture Layer #12'), - wbString(_3D_0TX, 'Cloud Texture Layer #13'), - wbString(_3E_0TX, 'Cloud Texture Layer #14'), - wbString(_3F_0TX, 'Cloud Texture Layer #15'), - wbString(_40h_0TX, 'Cloud Texture Layer #16'), - wbString(A0TX, 'Cloud Texture Layer #17'), - wbString(B0TX, 'Cloud Texture Layer #18'), - wbString(C0TX, 'Cloud Texture Layer #19'), - wbString(D0TX, 'Cloud Texture Layer #20'), - wbString(E0TX, 'Cloud Texture Layer #21'), - wbString(F0TX, 'Cloud Texture Layer #22'), - wbString(G0TX, 'Cloud Texture Layer #23'), - wbString(H0TX, 'Cloud Texture Layer #24'), - wbString(I0TX, 'Cloud Texture Layer #25'), - wbString(J0TX, 'Cloud Texture Layer #26'), - wbString(K0TX, 'Cloud Texture Layer #27'), - wbString(L0TX, 'Cloud Texture Layer #28'), - wbByteArray(DNAM, 'Unused', 0, cpIgnore), - wbByteArray(CNAM, 'Unused', 0, cpIgnore), - wbByteArray(ANAM, 'Unused', 0, cpIgnore), - wbByteArray(BNAM, 'Unused', 0, cpIgnore), - wbUnknown(LNAM), - wbFormIDCK(MNAM, 'Precipitation Type', [SPGD, NULL]), - wbFormIDCK(NNAM, 'Visual Effect', [RFCT, NULL], False, cpNormal, True), - wbByteArray(ONAM, 'Unused', 0, cpIgnore), - wbRStruct('Cloud Speed', [ - wbArray(RNAM, 'Y Speed', wbInteger('Layer', itU8, wbCloudSpeedToStr, wbCloudSpeedToInt)), - wbArray(QNAM, 'X Speed', wbInteger('Layer', itU8, wbCloudSpeedToStr, wbCloudSpeedToInt)) - ], []), - wbArray(PNAM, 'Cloud Colors', wbWeatherColors('Layer')), - wbArray(JNAM, 'Cloud Alphas', wbStruct('Layer', [ - wbFloat('Sunrise'), - wbFloat('Day'), - wbFloat('Sunset'), - wbFloat('Night') - ])), - {>>> not as an array since last entries are omitted in skyrim.esm <<<} - wbStruct(NAM0, 'Weather Colors', [ - wbWeatherColors('Sky-Upper'), - wbWeatherColors('Fog Near'), - wbWeatherColors('Unknown'), - wbWeatherColors('Ambient'), - wbWeatherColors('Sunlight'), - wbWeatherColors('Sun'), - wbWeatherColors('Stars'), - wbWeatherColors('Sky-Lower'), - wbWeatherColors('Horizon'), - wbWeatherColors('Effect Lighting'), - wbWeatherColors('Cloud LOD Diffuse'), - wbWeatherColors('Cloud LOD Ambient'), - wbWeatherColors('Fog Far'), - wbWeatherColors('Sky Statics'), - wbWeatherColors('Water Multiplier'), - wbWeatherColors('Sun Glare'), - wbWeatherColors('Moon Glare') - ], cpNormal, True, nil, 13), - wbStruct(FNAM, 'Fog Distance', [ - wbFloat('Day - Near'), - wbFloat('Day - Far'), - wbFloat('Night - Near'), - wbFloat('Night - Far'), - wbFloat('Day - Power'), - wbFloat('Night - Power'), - wbFloat('Day - Max'), - wbFloat('Night - Max') - ], cpNormal, True), - wbStruct(DATA, 'Data', [ - wbInteger('Wind Speed', itU8), // scaled 0..1 - wbByteArray('Unknown', 2), - wbInteger('Trans Delta', itU8), // scaled 0..0,25 - wbInteger('Sun Glare', itU8), // scaled 0..1 - wbInteger('Sun Damage', itU8), // scaled 0..1 - wbInteger('Precipitation - Begin Fade In', itU8), // scaled 0..1 - wbInteger('Precipitation - End Fade Out', itU8), // scaled 0..1 - wbInteger('Thunder/Lightning - Begin Fade In', itU8), - wbInteger('Thunder/Lightning - End Fade Out', itU8), - wbInteger('Thunder/Lightning - Frequency', itU8), - wbInteger('Flags', itU8, wbFlags([ - {0x01} 'Weather - Pleasant', - {0x02} 'Weather - Cloudy', - {0x04} 'Weather - Rainy', - {0x08} 'Weather - Snow', - {0x10} 'Sky Statics - Always Visible', - {0x20} 'Sky Statics - Follows Sun Position' - ])), - wbStruct('Lightning Color', [ - wbInteger('Red', itU8), - wbInteger('Green', itU8), - wbInteger('Blue', itU8) - ]), - wbInteger('Visual Effect - Begin', itU8), // scaled 0..1 - wbInteger('Visual Effect - End', itU8), // scaled 0..1 - wbInteger('Wind Direction', itU8), // scaled 0..360 - wbInteger('Wind Direction Range', itU8) // scaled 0..180 - ], cpNormal, True), - wbInteger(NAM1, 'Disabled Cloud Layers', itU32, wbFlags(['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31'])), - wbRArray('Sounds', - wbStruct(SNAM, 'Sound', [ - wbFormIDCK('Sound', [SNDR, SOUN, NULL]), - wbInteger('Type', itU32, wbEnum([ - {0x01} 'Default', - {0x02} 'Precipitation', - {0x04} 'Wind', - {0x08} 'Thunder' - ])) - ]) - ), - wbRArrayS('Sky Statics', wbFormIDCk(TNAM, 'Static', [STAT, NULL])), - wbStruct(IMSP, 'Image Spaces', [ - wbFormIDCK('Sunrise', [IMGS, NULL]), - wbFormIDCK('Day', [IMGS, NULL]), - wbFormIDCK('Sunset', [IMGS, NULL]), - wbFormIDCK('Night', [IMGS, NULL]) - ]), - // SSE - wbStruct(HNAM, 'Volumetric Lighting', [ - wbFormIDCK('Sunrise', [VOLI, NULL]), - wbFormIDCK('Day', [VOLI, NULL]), - wbFormIDCK('Sunset', [VOLI, NULL]), - wbFormIDCK('Night', [VOLI, NULL]) - ]), - wbRStruct('Directional Ambient Lighting Colors', [ - wbAmbientColors(DALC, 'Sunrise'), - wbAmbientColors(DALC, 'Day'), - wbAmbientColors(DALC, 'Sunset'), - wbAmbientColors(DALC, 'Night') - ], [], cpNormal, True), - wbByteArray(NAM2, 'Unused', 0, cpIgnore), - wbByteArray(NAM3, 'Unused', 0, cpIgnore), - wbRStruct('Aurora', [wbMODL], []), - wbFormIDCk(GNAM, 'Sun Glare Lens Flare', [LENS]) - ]); - - if IsSSE then begin - wbRecord(VOLI, 'Volumetric Lighting', [ - wbEDID, - wbFloat(CNAM, 'Intensity'), - wbFloat(DNAM, 'Custom Color - Contribution'), - wbFloat(ENAM, 'Red', cpNormal, False, 255, 0), - wbFloat(FNAM, 'Green', cpNormal, False, 255, 0), - wbFloat(GNAM, 'Blue', cpNormal, False, 255, 0), - wbFloat(HNAM, 'Density - Contribution'), - wbFloat(INAM, 'Density - Size'), - wbFloat(JNAM, 'Density - Wind Speed'), - wbFloat(KNAM, 'Density - Falling Speed'), - wbFloat(LNAM, 'Phase Function - Contribution'), - wbFloat(MNAM, 'Phase Function - Scattering'), - wbFloat(NNAM, 'Sampling Repartition - Range Factor') { max 1.0 } - ]); - - wbRecord(LENS, 'Lens Flare', [ - wbEDID, - wbFloat(CNAM, 'Color Influence'), - wbFloat(DNAM, 'Fade Distance Radius Scale'), - wbInteger(LFSP, 'Count', itU32, nil, cpBenign), - wbRArray('Lens Flare Sprites', - wbRStruct('Flare', [ - wbString(DNAM, 'Lens Flare Sprite ID'), - wbString(FNAM, 'Texture'), - wbStruct(LFSD, 'Lens Flare Data', [ - wbFloatColors('Tint'), - wbFloat('Width'), - wbFloat('Height'), - wbFloat('Position'), - wbFloat('Angular Fade'), - wbFloat('Opacity'), - wbInteger('Flags', itU32, wbFlags([ - {0x01} 'Rotates', - {0x02} 'Shrinks When Occluded' - ])) - ]) - ], []), - cpNormal, False, nil, wbLENSAfterSet - ) - ]); - - end; -end; - -{>>> Unused records, they have empty GRUP in skyrim.esm <<<} -procedure DefineTES5p; -begin - wbRecord(CLDC, 'CLDC', [ - wbEDID - ]); - wbRecord(HAIR, 'HAIR', [ - wbEDID - ]); - wbRecord(PWAT, 'PWAT', [ - wbEDID - ]); - wbRecord(RGDL, 'RGDL', [ - wbEDID - ]); - wbRecord(SCOL, 'SCOL', [ - wbEDID - ]); - wbRecord(SCPT, 'SCPT', [ - wbEDID - ]); -end; - -procedure DefineTES5q; -begin - wbAddGroupOrder(GMST); - wbAddGroupOrder(KYWD); - wbAddGroupOrder(LCRT); - wbAddGroupOrder(AACT); - wbAddGroupOrder(TXST); - wbAddGroupOrder(GLOB); - wbAddGroupOrder(CLAS); - wbAddGroupOrder(FACT); - wbAddGroupOrder(HDPT); - wbAddGroupOrder(HAIR);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(EYES); - wbAddGroupOrder(RACE); - wbAddGroupOrder(SOUN); - wbAddGroupOrder(ASPC); - wbAddGroupOrder(MGEF); - wbAddGroupOrder(SCPT);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(LTEX); - wbAddGroupOrder(ENCH); - wbAddGroupOrder(SPEL); - wbAddGroupOrder(SCRL); - wbAddGroupOrder(ACTI); - wbAddGroupOrder(TACT); - wbAddGroupOrder(ARMO); - wbAddGroupOrder(BOOK); - wbAddGroupOrder(CONT); - wbAddGroupOrder(DOOR); - wbAddGroupOrder(INGR); - wbAddGroupOrder(LIGH); - wbAddGroupOrder(MISC); - wbAddGroupOrder(APPA); - wbAddGroupOrder(STAT); - wbAddGroupOrder(SCOL);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(MSTT); - wbAddGroupOrder(PWAT);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(GRAS); - wbAddGroupOrder(TREE); - wbAddGroupOrder(CLDC);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(FLOR); - wbAddGroupOrder(FURN); - wbAddGroupOrder(WEAP); - wbAddGroupOrder(AMMO); - wbAddGroupOrder(NPC_); - wbAddGroupOrder(LVLN); - wbAddGroupOrder(KEYM); - wbAddGroupOrder(ALCH); - wbAddGroupOrder(IDLM); - wbAddGroupOrder(COBJ); - wbAddGroupOrder(PROJ); - wbAddGroupOrder(HAZD); - wbAddGroupOrder(SLGM); - wbAddGroupOrder(LVLI); - wbAddGroupOrder(WTHR); - wbAddGroupOrder(CLMT); - wbAddGroupOrder(SPGD); - wbAddGroupOrder(RFCT); - wbAddGroupOrder(REGN); - wbAddGroupOrder(NAVI); - wbAddGroupOrder(CELL); - wbAddGroupOrder(WRLD); - wbAddGroupOrder(DIAL); - wbAddGroupOrder(QUST); - wbAddGroupOrder(IDLE); - wbAddGroupOrder(PACK); - wbAddGroupOrder(CSTY); - wbAddGroupOrder(LSCR); - wbAddGroupOrder(LVSP); - wbAddGroupOrder(ANIO); - wbAddGroupOrder(WATR); - wbAddGroupOrder(EFSH); - wbAddGroupOrder(EXPL); - wbAddGroupOrder(DEBR); - wbAddGroupOrder(IMGS); - wbAddGroupOrder(IMAD); - wbAddGroupOrder(FLST); - wbAddGroupOrder(PERK); - wbAddGroupOrder(BPTD); - wbAddGroupOrder(ADDN); - wbAddGroupOrder(AVIF); - wbAddGroupOrder(CAMS); - wbAddGroupOrder(CPTH); - wbAddGroupOrder(VTYP); - wbAddGroupOrder(MATT); - wbAddGroupOrder(IPCT); - wbAddGroupOrder(IPDS); - wbAddGroupOrder(ARMA); - wbAddGroupOrder(ECZN); - wbAddGroupOrder(LCTN); - wbAddGroupOrder(MESG); - wbAddGroupOrder(RGDL);{>>> Unused in Skyrim, but contained in Skyrim.esm <<<} - wbAddGroupOrder(DOBJ); - wbAddGroupOrder(LGTM); - wbAddGroupOrder(MUSC); - wbAddGroupOrder(FSTP); - wbAddGroupOrder(FSTS); - wbAddGroupOrder(SMBN); - wbAddGroupOrder(SMQN); - wbAddGroupOrder(SMEN); - wbAddGroupOrder(DLBR); - wbAddGroupOrder(MUST); - wbAddGroupOrder(DLVW); - wbAddGroupOrder(WOOP); - wbAddGroupOrder(SHOU); - wbAddGroupOrder(EQUP); - wbAddGroupOrder(RELA); - wbAddGroupOrder(SCEN); - wbAddGroupOrder(ASTP); - wbAddGroupOrder(OTFT); - wbAddGroupOrder(ARTO); - wbAddGroupOrder(MATO); - if IsSSE then wbAddGroupOrder(VOLI); {New to SSE} - wbAddGroupOrder(MOVT); - wbAddGroupOrder(SNDR); - wbAddGroupOrder(DUAL); - wbAddGroupOrder(SNCT); - wbAddGroupOrder(SOPM); - wbAddGroupOrder(COLL); - wbAddGroupOrder(CLFM); - wbAddGroupOrder(REVB); - if IsSSE then wbAddGroupOrder(LENS); {New to SSE} -end; - -procedure DefineTES5; -begin - DefineTES5a; - DefineTES5b; - DefineTES5c; - DefineTES5d; - DefineTES5e; - DefineTES5f; - DefineTES5g; - DefineTES5h; - DefineTES5i; - DefineTES5j; - DefineTES5k; - DefineTES5l; - DefineTES5m; - DefineTES5n; - DefineTES5o; - DefineTES5p; - DefineTES5q; - - if IsSSE then begin - SetLength(wbOfficialDLC, 3); - wbOfficialDLC[0] := 'Dawnguard.esm'; - wbOfficialDLC[1] := 'HearthFires.esm'; - wbOfficialDLC[2] := 'Dragonborn.esm'; - end; - -end; - -initialization -end. diff --git a/lib/xedit/wbHelpers.pas b/lib/xedit/wbHelpers.pas deleted file mode 100644 index 117a6b6..0000000 --- a/lib/xedit/wbHelpers.pas +++ /dev/null @@ -1,1233 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbHelpers; - -{$I wbDefines.inc} - -interface - -uses - Classes, - Windows, - SysUtils, - Graphics, - ShellAPI, - ShlObj, - IniFiles, - Registry, - wbInterface, - Imaging, - ImagingTypes; - -Const - CRCSeed = $ffffffff; -{$IFDEF WIN64} - CRC32tab : Array[0..255] of DWord = ( - $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, - $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, - $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2, - $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7, - $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9, - $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172, - $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c, - $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59, - $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, - $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924, - $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106, - $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433, - $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d, - $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e, - $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950, - $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65, - $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7, - $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0, - $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa, - $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f, - $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81, - $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a, - $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84, - $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, - $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb, - $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc, - $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e, - $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b, - $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55, - $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236, - $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28, - $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d, - $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f, - $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38, - $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242, - $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777, - $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69, - $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2, - $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc, - $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9, - $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693, - $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94, - $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d ); -{$ENDIF} - -function wbDistance(const a, b: TwbVector): Single; overload -function wbDistance(const a, b: IwbMainRecord): Single; overload; -function wbStringToSignatures(aSignatures: string): TwbSignatures; -function wbGetSiblingREFRsWithin(const aMainRecord: IwbMainRecord; aDistance: Single): TDynMainRecords; -function wbGetSiblingRecords(const aElement: IwbElement; aSignatures: TwbSignatures; aOverrides: Boolean): TDynMainRecords; -function FindMatchText(Strings: TStrings; const Str: string): Integer; -function IsFileESM(const aFileName: string): Boolean; -function IsFileESP(const aFileName: string): Boolean; -function IsFileESL(const aFileName: string): Boolean; -procedure DeleteDirectory(const DirName: string); -function FullPathToFilename(aString: string): string; -procedure wbFlipBitmap(aBitmap: TBitmap; MirrorType: Integer); // MirrorType: 1 - horizontal, 2 - vertical, 0 - both -function wbAlphaBlend(DestDC, X, Y, Width, Height, - SrcDC, SrcX, SrcY, SrcWidth, SrcHeight, Alpha: integer): Boolean; -procedure SaveFont(aIni: TMemIniFile; aSection, aName: string; aFont: TFont); -procedure LoadFont(aIni: TMemIniFile; aSection, aName: string; aFont: TFont); -function wbDDSDataToBitmap(aData: TBytes; Bitmap: TBitmap): Boolean; -function wbDDSStreamToBitmap(aStream: TStream; Bitmap: TBitmap): Boolean; -function wbCRC32Data(aData: TBytes): Cardinal; -function wbCRC32File(aFileName: string): Cardinal; -function wbDecodeCRCList(const aList: string): TDynCardinalArray; -function wbSHA1Data(aData: TBytes): string; -function wbSHA1File(aFileName: string): string; -function wbMD5Data(aData: TBytes): string; -function wbMD5File(aFileName: string): string; -function wbIsAssociatedWithExtension(aExt: string): Boolean; -function wbAssociateWithExtension(aExt, aName, aDescr: string): Boolean; - -type - PnxLeveledListCheckCircularStack = ^TnxLeveledListCheckCircularStack; - TnxLeveledListCheckCircularStack = record - rllcLast : PnxLeveledListCheckCircularStack; - rllcMainRecord : IwbMainRecord; - end; - -procedure wbLeveledListCheckCircular(const aMainRecord: IwbMainRecord; aStack: PnxLeveledListCheckCircularStack); - -type - TnxFastStringList = class(TStringList) - protected - function CompareStrings(const S1, S2: string): Integer; override; - public - constructor CreateSorted(aDups : TDuplicates = dupError); - - procedure Clear(aFreeObjects: Boolean = False); reintroduce; - end; - - TnxFastStringListCS = class(TnxFastStringList) - public - procedure AfterConstruction; override; - end; - - TnxFastStringListIC = class(TnxFastStringList) - end; - -function wbExtractNameFromPath(aPathName: String): String; - -function wbCounterAfterSet(aCounterName: String; const aElement: IwbElement): Boolean; -function wbCounterByPathAfterSet(aCounterName: String; const aElement: IwbElement): Boolean; -function wbCounterContainerAfterSet(aCounterName: String; anArrayName: String; const aElement: IwbElement; DeleteOnEmpty: Boolean = True): Boolean; -function wbCounterContainerByPathAfterSet(aCounterName: String; anArrayName: String; const aElement: IwbElement): Boolean; -function wbFormVerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement; aMinimum: Integer): Integer; -function wbFormVer78Decider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - -// BSA helper - -function MakeDataFileName(FileName, DataPath: String): String; -function FindBSAs(IniName, DataPath: String; var bsaNames: TStringList; var bsaMissing: TStringList): Integer; -function HasBSAs(ModName, DataPath: String; Exact, modini: Boolean; var bsaNames: TStringList; var bsaMissing: TStringList): Integer; - -implementation - -uses - wbSort; - -procedure wbLeveledListCheckCircular(const aMainRecord: IwbMainRecord; aStack: PnxLeveledListCheckCircularStack); -var - Stack : TnxLeveledListCheckCircularStack; - s : string; - CER : IwbContainerElementRef; - LLE : IwbContainerElementRef; - i : Integer; - LVLO : IwbContainerElementRef; - Reference : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - Stack.rllcLast := aStack; - Stack.rllcMainRecord := aMainRecord; - - while Assigned(aStack) do begin - if aStack.rllcMainRecord.LoadOrderFormID = aMainRecord.LoadOrderFormID then begin - s := aMainRecord.Name; - aStack := Stack.rllcLast; - while Assigned(aStack) do begin - s := ' -> ' + s; - s := aStack.rllcMainRecord.Name + s; - if aStack.rllcMainRecord.LoadOrderFormID = aMainRecord.LoadOrderFormID then - Break; - aStack := aStack.rllcLast; - end; - s := 'Circular Leveled List found: ' + s; - raise Exception.Create(s); - end; - aStack := aStack.rllcLast; - end; - - if aMainRecord.IsTagged then - Exit; - aMainRecord.Tag; - - if Supports(aMainRecord, IwbContainerElementRef, CER) then begin - if Supports(CER.ElementByName['Leveled List Entries'], IwbContainerElementRef, LLE) then begin - for i := 0 to Pred(LLE.ElementCount) do - if Supports(LLE.Elements[i], IwbContainerElementRef, LVLO) then begin - if Supports(LVLO.ElementByName['Reference'], IwbContainerElementRef, Reference) then begin - if Supports(Reference.LinksTo, IwbMainRecord, MainRecord) then begin - if (MainRecord.Signature = aMainRecord.Signature) then begin - MainRecord := MainRecord.WinningOverride; - wbLeveledListCheckCircular(MainRecord, @Stack); - end; - end; - end; - end; - end; - end; -end; - -function Vec3Subtract(out vOut: TwbVector; const v1, v2: TwbVector): TwbVector; -begin - with vOut do - begin - x:= v1.x - v2.x; - y:= v1.y - v2.y; - z:= v1.z - v2.z; - end; - Result := vOut; -end; - -function Vec3Length(const v: TwbVector): Single; -begin - with v do Result:= Sqrt(x*x + y*y + z*z); -end; - -function wbDistance(const a, b: TwbVector): Single; -var - t: TwbVector; -begin - Result := Vec3Length(Vec3Subtract(t,a,b)); -end; - -function wbDistance(const a, b: IwbMainRecord): Single; overload; -var - PosA, PosB: TwbVector; -begin - if not a.GetPosition(PosA) then - raise Exception.Create('GetPosition failed'); - if not b.GetPosition(PosB) then - raise Exception.Create('GetPosition failed'); - Result := wbDistance(PosA, PosB); -end; - -function wbStringToSignatures(aSignatures: string): TwbSignatures; -var - i: integer; - s: AnsiString; -begin - with TStringList.Create do try - if Pos(',', aSignatures) <> 0 then Delimiter := ',' else Delimiter := ' '; - StrictDelimiter := True; - DelimitedText := aSignatures; - for i := 0 to Pred(Count) do begin - s := AnsiString(Strings[i]); - if Length(s) >= SizeOf(TwbSignature) then begin - SetLength(Result, Succ(Length(Result))); - System.Move(s[1], Result[Pred(Length(Result))][0], SizeOf(TwbSignature)); - end; - end; - finally - Free; - end; -end; - -function wbGetSiblingREFRsWithin(const aMainRecord: IwbMainRecord; aDistance: Single): TDynMainRecords; -var - Count : Integer; - Position : TwbVector; - MaxLoadOrder: Integer; - - procedure FindREFRs(const aElement: IwbElement); - var - MainRecord : IwbMainRecord; - Container : IwbContainerElementRef; - i : Integer; - Temp : TwbVector; - begin - if Supports(aElement, IwbMainRecord, MainRecord) then begin - if not (aMainRecord.LoadOrderFormID = MainRecord.LoadOrderFormID) and - MainRecord.GetPosition(Temp) and - (wbDistance(Temp,Position) <= aDistance) then begin - - if High(Result) < Count then - SetLength(Result, Length(Result) * 2); - Result[Count] := MainRecord.HighestOverrideOrSelf[MaxLoadOrder]; - Inc(Count); - - end; - end else - if Supports(aElement, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - FindREFRs(Container.Elements[i]); - end; - -var - GroupRecord : IwbGroupRecord; - CellMaster : IwbMainRecord; - i, j : Integer; -begin - Result := nil; - if not aMainRecord.GetPosition(Position) then - Exit; - if not Supports(aMainRecord.Container, IwbGroupRecord, GroupRecord) then - Exit; - if not (GroupRecord.GroupType in [8..10]) then - Exit; - CellMaster := GroupRecord.ChildrenOf; - if not Assigned(CellMaster) then - Exit; - CellMaster := CellMaster.MasterOrSelf; - MaxLoadOrder := aMainRecord._File.LoadOrder; - - Count := 0; - SetLength(Result, 1024); - FindREFRs(CellMaster.ChildGroup); - for i := 0 to Pred(CellMaster.OverrideCount) do - if CellMaster.Overrides[i]._File.LoadOrder <= aMainRecord._File.LoadOrder then - FindREFRs(CellMaster.Overrides[i]) - else - Break; - SetLength(Result, Count); - - - if Length(Result) > 1 then begin - wbMergeSort(@Result[0], Length(Result), CompareElementsFormIDAndLoadOrder); - - j := 0; - for i := Succ(Low(Result)) to High(Result) do begin - if (Result[j].LoadOrderFormID <> Result[i].LoadOrderFormID) and not (Result[j].IsDeleted) then - Inc(j); - if j <> i then - Result[j] := Result[i]; - end; - SetLength(Result, Succ(j)); - end; -end; - -function wbGetSiblingRecords(const aElement: IwbElement; aSignatures: TwbSignatures; aOverrides: Boolean): TDynMainRecords; - - procedure FindRecords(const aElement: IwbElement; var aSignatures: TwbSignatures; var Records: TDynMainRecords; var Count: Integer); - var - MainRecord : IwbMainRecord; - Container : IwbContainerElementRef; - i : Integer; - begin - if Supports(aElement, IwbMainRecord, MainRecord) then begin - for i := Low(aSignatures) to High(aSignatures) do - if MainRecord.Signature = aSignatures[i] then begin - if High(Records) < Count then - SetLength(Records, Length(Records) * 2); - Records[Count] := MainRecord; - Inc(Count); - Break; - end; - end else if Supports(aElement, IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - FindRecords(Container.Elements[i], aSignatures, Records, Count); - end; - -var - MainRecord, Master : IwbMainRecord; - i, j, Count : Integer; -begin - Count := 0; - SetLength(Result, 4096); - if Supports(aElement, IwbMainRecord, MainRecord) then begin - FindRecords(MainRecord.ChildGroup, aSignatures, Result, Count); - // include overrides from plugins loaded later for that record - if aOverrides then begin - Master := MainRecord.MasterOrSelf; - for i := 0 to Pred(Master.OverrideCount) do - if Master.Overrides[i]._File.LoadOrder > MainRecord._File.LoadOrder then - FindRecords(Master.Overrides[i].ChildGroup, aSignatures, Result, Count); - end; - end else - // if Group or File object is passed, no overrides - FindRecords(aElement, aSignatures, Result, Count); - - SetLength(Result, Count); - // removing duplicates (overridden records) - if aOverrides and (Length(Result) > 1) then begin - wbMergeSort(@Result[0], Length(Result), CompareElementsFormIDAndLoadOrder); - j := 0; - for i := Succ(Low(Result)) to High(Result) do begin - if Result[j].LoadOrderFormID <> Result[i].LoadOrderFormID then - Inc(j); - if j <> i then - Result[j] := Result[i]; - end; - SetLength(Result, Succ(j)); - end; -end; - -function FindMatchText(Strings: TStrings; const Str: string): Integer; -begin - for Result := 0 to Strings.Count-1 do - if SameText(Strings[Result], Str) then - Exit; - Result := -1; -end; - -function IsFileESM(const aFileName: string): Boolean; -const - ghostesm = '.esm.ghost'; -begin - Result := SameText(ExtractFileExt(aFileName), '.esm') or - SameText(Copy(aFileName, Length(aFileName) - Length(ghostesm) + 1, Length(ghostesm)), ghostesm) -end; - -function IsFileESP(const aFileName: string): Boolean; -const - ghostesp = '.esp.ghost'; -begin - Result := SameText(ExtractFileExt(aFileName), '.esp') or - SameText(Copy(aFileName, Length(aFileName) - Length(ghostesp) + 1, Length(ghostesp)), ghostesp) -end; - -function IsFileESL(const aFileName: string): Boolean; -const - ghostesp = '.esl.ghost'; -begin - Result := SameText(ExtractFileExt(aFileName), '.esl') or - SameText(Copy(aFileName, Length(aFileName) - Length(ghostesp) + 1, Length(ghostesp)), ghostesp) -end; - -procedure DeleteDirectory(const DirName: string); -var - FileOp: TSHFileOpStruct; -begin - FillChar(FileOp, SizeOf(FileOp), 0); - FileOp.wFunc := FO_DELETE; - FileOp.pFrom := PChar(DirName+#0);//double zero-terminated - FileOp.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION; - SHFileOperation(FileOp); -end; - -function FullPathToFilename(aString: string): string; -var - i: Integer; - s: string; -begin - s := aString; - for i := Length(s) downto 1 do - if Copy(s, i, 3) = ' \ ' then begin - Delete(s, i, 1); - Delete(s, i+1, 1); - end else if Copy(s, i, 2) = ' \' then begin - Delete(s, i, 1); - end else if s[i] = '"' then - s[i] := '''' - else if s[i] = ':' then - s[i] := '-' - else if s[i] = '/' then - s[i] := ' '; - while (Length(s)>0) and (s[Length(s)]=' ') do - Delete(s, Length(s), 1); - Result := s; -end; - -procedure wbFlipBitmap(aBitmap: TBitmap; MirrorType: Integer); -var - MemBmp: TBitmap; - Dest: TRect; -begin - if not Assigned(aBitmap) then - Exit; - - MemBmp := TBitmap.Create; - try - MemBmp.Assign(aBitmap); - case MirrorType of - 1: - begin - Dest.Left := MemBmp.Width; - Dest.Top := 0; - Dest.Right := -MemBmp.Width; - Dest.Bottom := MemBmp.Height - end; - 2: - begin - Dest.Left := 0; - Dest.Top := MemBmp.Height; - Dest.Right := MemBmp.Width; - Dest.Bottom := -MemBmp.Height - end; - 0: - begin - Dest.Left := MemBmp.Width; - Dest.Top := MemBmp.Height; - Dest.Right := -MemBmp.Width; - Dest.Bottom := -MemBmp.Height - end; - end; - StretchBlt(MemBmp.Canvas.Handle, Dest.Left, Dest.Top, Dest.Right, Dest.Bottom, - MemBmp.Canvas.Handle, 0, 0, MemBmp.Width, MemBmp.Height, - SRCCOPY); - aBitmap.Assign(MemBmp); - finally - FreeAndNil(MemBmp); - end; -end; - -function wbAlphaBlend(DestDC, X, Y, Width, Height, - SrcDC, SrcX, SrcY, SrcWidth, SrcHeight, Alpha: integer): Boolean; -var - BlendFunc: TBlendFunction; -begin - BlendFunc.BlendOp := AC_SRC_OVER; - BlendFunc.BlendFlags := 0; - BlendFunc.SourceConstantAlpha := Alpha; - if Alpha = 255 then - BlendFunc.AlphaFormat := AC_SRC_ALPHA - else - BlendFunc.AlphaFormat := 0; - Result := Windows.AlphaBlend(DestDC, X, Y, Width, Height, SrcDC, SrcX, SrcY, SrcWidth, SrcHeight, BlendFunc); -end; - -procedure SaveFont(aIni: TMemIniFile; aSection, aName: string; aFont: TFont); -begin - aIni.WriteString(aSection, aName + 'Name', aFont.Name); - aIni.WriteInteger(aSection, aName + 'CharSet', aFont.CharSet); - aIni.WriteInteger(aSection, aName + 'Color', aFont.Color); - aIni.WriteInteger(aSection, aName + 'Size', aFont.Size); - aIni.WriteInteger(aSection, aName + 'Style', Byte(aFont.Style)); -end; - -procedure LoadFont(aIni: TMemIniFile; aSection, aName: string; aFont: TFont); -begin - aFont.Name := aIni.ReadString(aSection, aName + 'Name', aFont.Name); - aFont.CharSet := TFontCharSet(aIni.ReadInteger(aSection, aName + 'CharSet', aFont.CharSet)); - aFont.Color := TColor(aIni.ReadInteger(aSection, aName + 'Color', aFont.Color)); - aFont.Size := aIni.ReadInteger(aSection, aName + 'Size', aFont.Size); - aFont.Style := TFontStyles(Byte(aIni.ReadInteger(aSection, aName + 'Style', Byte(aFont.Style)))); -end; - -var - crctbl: array[0..7] of array[0..255] of cardinal; - -procedure CRCInit; -var - c: cardinal; - i, j: integer; -begin; - for i:=0 to 255 do begin; - c:=i; - for j:=1 to 8 do if odd(c) - then c:=(c shr 1) xor $EDB88320 - else c:=(c shr 1); - crctbl[0][i]:=c; - end; - - for i:=0 to 255 do begin; - c:=crctbl[0][i]; - for j:=1 to 7 do begin; - c:=(c shr 8) xor crctbl[0][byte(c)]; - crctbl[j][i]:=c; - end; - end; -end; - -{$IFDEF WIN64} -function crc32_update(inbuffer: pointer; buffersize, crc: DWord): DWord; -// crc-32. Processes 4 bytes at a time. -type - PDWord = ^DWord; - PByte = ^Byte; -var - currptr: pointer; - i: byte; -begin - currptr := inbuffer; - Result := crc; - while buffersize > 4 do - begin - Result := Result xor PDWord(currptr)^; - inc(PByte(currptr), 4); - Result := (Result shr 8) xor Crc32Tab[Byte(Result)]; - Result := (Result shr 8) xor Crc32Tab[Byte(Result)]; - Result := (Result shr 8) xor CRC32Tab[Byte(Result)]; - Result := (Result shr 8) xor crc32Tab[Byte(Result)]; - dec(buffersize, 4); - end; - for i := 1 to buffersize do - begin - Result := CRC32tab[Byte(Result xor DWord(PByte(currptr)^))] xor (Result shr 8); - inc(PByte(currptr), 1); - end; -end; -{$ENDIF} - -Function CRCend( crc : DWord ): DWord; -begin - CRCend := (crc xor CRCSeed); -end; - -function ShaCrcRefresh(OldCRC: cardinal; BufPtr: pointer; BufLen: integer): cardinal; -// Fast CRC32 calculator -// (c) Aleksandr Sharahov 2009 -// Free for any use -{$IFDEF WIN64} -begin - Result := crc32_update(BufPtr, BufLen, OldCRC); -{$ENDIF WIN64} -{$IFDEF WIN32} -asm - test edx, edx - jz @ret - neg ecx - jz @ret - push ebx -@head: - test dl, 3 - jz @bodyinit - movzx ebx, byte [edx] - inc edx - xor bl, al - shr eax, 8 - xor eax, [ebx*4 + crctbl] - inc ecx - jnz @head - pop ebx -@ret: - ret -@bodyinit: - sub edx, ecx - add ecx, 8 - jg @bodydone - push esi - push edi - mov edi, edx - mov edx, eax -@bodyloop: - mov ebx, [edi + ecx - 4] - xor edx, [edi + ecx - 8] - movzx esi, bl - mov eax, [esi*4 + crctbl + 1024*3] - movzx esi, bh - xor eax, [esi*4 + crctbl + 1024*2] - shr ebx, 16 - movzx esi, bl - xor eax, [esi*4 + crctbl + 1024*1] - movzx esi, bh - xor eax, [esi*4 + crctbl + 1024*0] - - movzx esi, dl - xor eax, [esi*4 + crctbl + 1024*7] - movzx esi, dh - xor eax, [esi*4 + crctbl + 1024*6] - shr edx, 16 - movzx esi, dl - xor eax, [esi*4 + crctbl + 1024*5] - movzx esi, dh - xor eax, [esi*4 + crctbl + 1024*4] - - add ecx, 8 - jg @done - - mov ebx, [edi + ecx - 4] - xor eax, [edi + ecx - 8] - movzx esi, bl - mov edx, [esi*4 + crctbl + 1024*3] - movzx esi, bh - xor edx, [esi*4 + crctbl + 1024*2] - shr ebx, 16 - movzx esi, bl - xor edx, [esi*4 + crctbl + 1024*1] - movzx esi, bh - xor edx, [esi*4 + crctbl + 1024*0] - - movzx esi, al - xor edx, [esi*4 + crctbl + 1024*7] - movzx esi, ah - xor edx, [esi*4 + crctbl + 1024*6] - shr eax, 16 - movzx esi, al - xor edx, [esi*4 + crctbl + 1024*5] - movzx esi, ah - xor edx, [esi*4 + crctbl + 1024*4] - - add ecx, 8 - jle @bodyloop - mov eax, edx -@done: - mov edx, edi - pop edi - pop esi -@bodydone: - sub ecx, 8 - jl @tail - pop ebx - ret -@tail: - movzx ebx, byte [edx + ecx]; - xor bl,al; - shr eax,8; - xor eax, [ebx*4 + crctbl]; - inc ecx; - jnz @tail; - pop ebx - ret -{$ENDIF WIN32} -end; - -function wbCRC32Data(aData: TBytes): Cardinal; -begin - Result := not ShaCrcRefresh($FFFFFFFF, @aData[0], Length(aData)); -end; - -function wbCRC32File(aFileName: string): Cardinal; -var - Data: TBytes; -begin - Result := 0; - if FileExists(aFileName) then - with TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone) do try - SetLength(Data, Size); - ReadBuffer(Data[0], Length(Data)); - Result := wbCRC32Data(Data); - finally - Free; - end; -end; - -function wbDecodeCRCList(const aList: string): TDynCardinalArray; -var - i: Integer; - s: string; - j: Int64; -begin - Result := nil; - try - with TStringList.Create do try - CommaText := aList; - for i := 0 to Pred(Count) do begin - s := Trim(Strings[i]); - if Length(s) <> 8 then - Abort; - j := StrToInt64('$'+s); - if (j < Low(Cardinal)) or (j > High(Cardinal)) then - Abort; - SetLength(Result, Succ(Length(Result))); - Result[High(Result)] := j; - end; - finally - Free; - end; - except - SetLength(Result, 1); - Result[0] := $FFFFFFFF; - end; -end; - -function CryptAcquireContext(var phProv: DWORD; - pszContainer, pszProvider: LPCSTR; dwProvType, dwFlags: DWORD): BOOL; - stdcall; external advapi32 name 'CryptAcquireContextA'; -function CryptCreateHash(hProv,Algid,hKey,dwFlags: DWORD; - var phHash: DWORD): BOOL; stdcall; external advapi32; -function CryptHashData(hHash: DWORD; pbData: PBYTE; dwDataLen, - dwFlags: DWORD): BOOL; stdcall; external advapi32; -function CryptGetHashParam(hHash, dwParam: DWORD; pbData: PBYTE; - var pdwDataLen: DWORD; dwFlags: DWORD): BOOL; stdcall; external advapi32; -function CryptDestroyHash(hHash: DWORD): BOOL; stdcall; external advapi32; -function CryptReleaseContext(hProv: DWORD; dwFlags: DWORD): BOOL; stdcall; external advapi32; - -function CryptoAPIGetHash(Data: Pointer; nSize: Cardinal; HashType: Cardinal): TBytes; -const - HP_HASHVAL = $0002; {hash value} - PROV_RSA_FULL = 1; - CRYPT_VERIFYCONTEXT = $F0000000; -var - hProv, hHash: Cardinal; -begin - if CryptAcquireContext(hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) then try - if CryptCreateHash(hProv, HashType, 0, 0, hHash) then try - if CryptHashData(hHash, Data, nSize, 0) then begin - if CryptGetHashParam(hHash, HP_HASHVAL, nil, nSize, 0) then begin - SetLength(Result, nSize); - if not CryptGetHashParam(hHash, HP_HASHVAL, @Result[0], nSize, 0) then - SetLength(Result, 0); - end; - end; - finally - CryptDestroyHash(hHash); - end; - finally - CryptReleaseContext(hProv, 0); - end; -end; - -const - ALG_CRC32 = $0001; - ALG_MD2 = $8001; - ALG_MD4 = $8002; - ALG_MD5 = $8003; - ALG_SHA = $8004; - -function wbCryptoApiHashData(aData: TBytes; aALG: Cardinal): string; - function BytesToHexStr(aBytes: TBytes): string; - var - i: Cardinal; - bt: Byte; - const - Hex = '0123456789abcdef'; - begin - Result:= ''; - for i:= Low(aBytes) to High(aBytes) do begin - bt := aBytes[i]; - Result:= Result + Hex[bt shr $4 + 1] + Hex[bt and $0f + 1] - end; - end; -begin - Result := BytesToHexStr(CryptoAPIGetHash(@aData[0], Length(aData), aALG)); -end; - -function wbSHA1Data(aData: TBytes): string; -begin - Result := wbCryptoApiHashData(aData, ALG_SHA); -end; - -function wbSHA1File(aFileName: string): string; -var - Data: TBytes; -begin - Result := ''; - if FileExists(aFileName) then - with TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone) do try - SetLength(Data, Size); - ReadBuffer(Data[0], Length(Data)); - Result := wbSHA1Data(Data); - finally - Free; - end; -end; - -function wbMD5Data(aData: TBytes): string; -begin - Result := wbCryptoApiHashData(aData, ALG_MD5); -end; - -function wbMD5File(aFileName: string): string; -var - Data: TBytes; -begin - Result := ''; - if FileExists(aFileName) then - with TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone) do try - SetLength(Data, Size); - ReadBuffer(Data[0], Length(Data)); - Result := wbMD5Data(Data); - finally - Free; - end; -end; - - -{ TnxFastStringList } - -procedure TnxFastStringList.Clear(aFreeObjects: Boolean); -var - i: Integer; -begin - if aFreeObjects then - for i := 0 to Pred(Count) do - Objects[i].Free; - inherited Clear; -end; - -function TnxFastStringList.CompareStrings(const S1, S2: string): Integer; -begin - {x$IFDEF DCC6OrLater} - if CaseSensitive then - Result := CompareStr(S1, S2) - else - {x$ENDIF} - Result := CompareText(S1, S2); -end; - -constructor TnxFastStringList.CreateSorted(aDups: TDuplicates); -begin - Create; - Duplicates := aDups; - Sorted := True; -end; - -{ TnxFastStringListCS } - -procedure TnxFastStringListCS.AfterConstruction; -begin - inherited; - {x$IFDEF DCC6OrLater} - CaseSensitive := True; - {x$ENDIF} -end; - -function wbExtractNameFromPath(aPathName: String): String; -begin - Result := aPathName; - while Pos('\', Result)>0 do - Delete(Result, 1, Pos('\', Result)) -end; - -function wbCounterAfterSet(aCounterName: String; const aElement: IwbElement): Boolean; -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - Result := False; - if wbBeginInternalEdit then try - if (Length(aCounterName)>=4) and Supports(aElement.Container, IwbContainer, Container) and - Supports(aElement, IwbContainer, SelfAsContainer) then begin - Element := Container.ElementByName[aCounterName]; - if not Assigned(Element) then // Signatures not listed in mrDef cannot be added - Element := Container.Add(Copy(aCounterName, 1, 4)); - if Assigned(Element) and (SameText(Element.Name, aCounterName)) then try - if (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - Result := True; - except - // No exception if the value cannot be set, expected non value - end; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbCounterByPathAfterSet(aCounterName: String; const aElement: IwbElement): Boolean; -var - Element : IwbElement; - Container : IwbContainer; - SelfAsContainer : IwbContainer; -begin - Result := False; - if wbBeginInternalEdit then try - if (Length(aCounterName)>=4) and Supports(aElement.Container, IwbContainer, Container) and - Supports(aElement, IwbContainer, SelfAsContainer) then begin - Element := Container.ElementByPath[aCounterName]; -// if not Assigned(Element) then // Signatures not listed in mrDef cannot be added -// Element := Container.Add(Copy(aCounterName, 1, 4)); - if Assigned(Element) and (SameText(Element.Name, wbExtractNameFromPath(aCounterName))) then try - if (Element.GetNativeValue<>SelfAsContainer.GetElementCount) then - Element.SetNativeValue(SelfAsContainer.GetElementCount); - Result := True; - except - // No exception if the value cannot be set, expected non value - end; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbCounterContainerAfterSet(aCounterName: String; anArrayName: String; const aElement: IwbElement; DeleteOnEmpty: Boolean = True): Boolean; -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - Result := False; // You may need to check alterative counter name - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByName[aCounterName]; - Elems := Container.ElementByName[anArrayName]; - if Assigned(Element) then begin - if not Assigned(Elems) then - if DeleteOnEmpty then - Container.RemoveElement(aCounterName) - else if Element.GetNativeValue <> 0 then - Element.SetNativeValue(0); - Result := True; // Counter member exists - end; - end; - finally - wbEndInternalEdit; - end; -end; - -function wbCounterContainerByPathAfterSet(aCounterName: String; anArrayName: String; const aElement: IwbElement): Boolean; -var - Element : IwbElement; - Elems : IwbElement; - Container : IwbContainer; -begin - Result := False; // You may need to check alterative counter name - if wbBeginInternalEdit then try - if Supports(aElement, IwbContainer, Container) then begin - Element := Container.ElementByPath[aCounterName]; - Elems := Container.ElementByName[anArrayName]; - if Assigned(Element) then begin - if not Assigned(Elems) then - if Element.GetNativeValue <> 0 then - Element.SetNativeValue(0); - Result := True; // Counter member exists - end; - end; - finally - wbEndInternalEdit; - end; -end; - -// BSA helper - -function MakeDataFileName(FileName, DataPath: String): String; -begin - // MO uses 3 chars aliases - if Length(FileName) < 3 then - Result := '' - else if not ((FileName[1] = '\') or (FileName[2] = ':')) then - Result := DataPath + FileName - else - Result := FileName; -end; - -function FindBSAs(IniName, DataPath: String; var bsaNames: TStringList; var bsaMissing: TStringList): Integer; -var - i: Integer; - j: Integer; - s: String; - t: String; -begin - Result := 0; - j := 0; - if Assigned(bsaNames) then - j := bsaNames.Count; - if Assigned(bsaMissing) then - j := j + bsaMissing.Count; - - if Assigned(bsaNames) then - // TIniFile uses GetPrivateProfileString() to read data, it is virtualized by MO - // TMemIniFile reads from string list directly, not supported by MO - with TIniFile.Create(iniName) do try - with TStringList.Create do try - if wbGameMode in [gmTES4, gmFO3, gmFNV] then - Text := StringReplace(ReadString('Archive', 'sArchiveList', ''), ',' ,#10, [rfReplaceAll]) - else if wbGameMode in [ gmTES5, gmSSE ] then - Text := StringReplace( - ReadString('Archive', 'sResourceArchiveList', '') + ',' + - ReadString('Archive', 'sResourceArchiveList2', ''), - ',', #10, [rfReplaceAll] - ) - else if wbGameMode = gmFO4 then - Text := StringReplace( - ReadString('Archive', 'sResourceIndexFileList', '') + ',' + - ReadString('Archive', 'sResourceStartUpArchiveList', '') + ',' + - ReadString('Archive', 'sResourceArchiveList', '') + ',' + - ReadString('Archive', 'sResourceArchiveList2', ''), - ',', #10, [rfReplaceAll] - ); - for i := 0 to Pred(Count) do begin - s := Trim(Strings[i]); - t := MakeDataFileName(s, DataPath); - if (Length(t)>0) then - if FileExists(t) then begin - if wbContainerHandler.ContainerExists(t) then - Continue; - bsaNames.Add(s); - end else - if Assigned(bsaMissing) then - bsaMissing.Add(s); - end; - Result := bsaNames.Count + bsaMissing.Count - j; // How many were added - finally - Free; - end; - finally - Free; - end; -end; - -function HasBSAs(ModName, DataPath: String; Exact, modini: Boolean; var bsaNames: TStringList; var bsaMissing: TStringList): Integer; -var - j: Integer; - t: String; - F: TSearchRec; -begin - Result := 0; - j := 0; - if Assigned(bsaNames) then - j := bsaNames.Count; - if Assigned(bsaMissing) then - j := j + bsaMissing.Count; - // All games prior to Skyrim load BSA files with partial matching, Skyrim requires exact name match and - // can use a private ini to specify the bsa to use. - if not exact then - ModName := ModName + '*'; - if FindFirst(DataPath + ModName + wbArchiveExtension, faAnyFile, F) = 0 then try - repeat - if wbContainerHandler.ContainerExists(DataPath + F.Name) then - Continue; - t := MakeDataFileName(F.Name, DataPath); - if (Length(t)>0) and FileExists(t) then begin - if not wbContainerHandler.ContainerExists(t) then - if Assigned(bsaNames) then - bsaNames.Add(F.Name); - end else - if Assigned(bsaMissing) then - bsaMissing.Add(F.Name); - until FindNext(F) <> 0; - Result := bsaNames.Count + bsaMissing.Count - j; - finally - FindClose(F); - end; - - if modIni then - Result := Result + FindBSAs(DataPath+ChangeFileExt(ModName, '.ini'), DataPath, bsaNames, bsaMissing); -end; - -function wbDDSDataToBitmap(aData: TBytes; Bitmap: TBitmap): Boolean; -var - img: TImageData; - ms: TMemoryStream; -begin - Result := False; - if not LoadImageFromMemory(@aData[0], Length(aData), img) then - Exit; - ms := TMemoryStream.Create; - try - if SaveImageToStream('BMP', ms, img) then begin - ms.Position := 0; - Bitmap.LoadFromStream(ms); - Result := True; - end; - finally - FreeImage(img); - ms.Free; - end; -end; - -function wbDDSStreamToBitmap(aStream: TStream; Bitmap: TBitmap): Boolean; -var - img: TImageData; - ms: TMemoryStream; -begin - Result := False; - if not LoadImageFromStream(aStream, img) then - Exit; - ms := TMemoryStream.Create; - try - if SaveImageToStream('BMP', ms, img) then begin - ms.Position := 0; - Bitmap.LoadFromStream(ms); - Result := True; - end; - finally - FreeImage(img); - ms.Free; - end; -end; - -function wbIsAssociatedWithExtension(aExt: string): Boolean; -var - Name: string; -begin - Result := False; - with TRegistry.Create do try - RootKey := HKEY_CURRENT_USER; - if OpenKey('\Software\Classes\' + LowerCase(aExt), False) then begin - Name := ReadString(''); - if OpenKey('\Software\Classes\' + Name + '\DefaultIcon', False) then - if SameText(ReadString(''), ParamStr(0)) then - Result := True; - end; - finally - Free; - end; -end; - -function wbAssociateWithExtension(aExt, aName, aDescr: string): Boolean; -begin - Result := False; - - if aExt = '' then - Exit - else - aExt := LowerCase(aExt); - - if aExt[1] <> '.' then - aExt := '.' + aExt; - - with TRegistry.Create do try - RootKey := HKEY_CURRENT_USER; - - if OpenKey('\Software\Classes\' + aExt, True) then - WriteString('', aName) - else - raise Exception.Create('Not enough rights to modify the registry'); - - if OpenKey('\Software\Classes\' + aName, True) then - WriteString('', aDescr); - - if OpenKey('\Software\Classes\' + aName + '\DefaultIcon', True) then - WriteString('', ParamStr(0)); - - if OpenKey('\Software\Classes\' + aName + '\shell\open\command', True) then - WriteString('', ParamStr(0) + ' "%1"'); - - Result := True; - finally - Free; - end; - - SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); -end; - -function wbFormVerDecider(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement; aMinimum: Integer): Integer; -var - FormVer : Integer; - MainRecord : IwbMainRecord; - Element : IwbElement; -begin - Result := 1; - if not Assigned(aElement) then Exit; - MainRecord := aElement.GetContainingMainRecord; - if not Assigned(MainRecord) then Exit; - - Element := MainRecord.ElementByPath['Record Header\Form Version']; - if Assigned(Element) then begin - FormVer := Element.NativeValue; - if FormVer 0) and not Assigned(wbKeepAliveRoot) then - wbKeepAliveRoot := wbCreateKeepAliveRoot; -end; - -function wbEndKeepAlive: Integer; -begin - Result := Pred(wbKeepAliveCount); - wbKeepAliveCount := Result; - if Result = 0 then - wbKeepAliveRoot := nil; -end; - -const - TheEmptyPlugin = 'SavesEmptyPlugin.esp'; - -type - TwbMainRecordEntryHeader = record - mrehGeneration : Cardinal; - mrehHead : Pointer; - mrehTail : Pointer; - mrehCount : Cardinal; - mrehInUse : Boolean; - - procedure BeginUse; - procedure EndUse; - end; - -var - mreHeader: TwbMainRecordEntryHeader; - -function wbCopyElementToFile(const aSource: IwbElement; aFile: IwbFile; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - MainRecord : IwbMainRecord; - Container : IwbContainer; - Target : IwbElement; -begin - Inc(wbCopyIsRunning); - try - if (wbCurrentTick>0) and (wbCurrentTick+500 UpCase(t[i]) then - Exit; - Result := True; -end; - -type - IwbElementInternal = interface(IwbElement) - ['{556DF03C-2723-46FC-99C6-F50BB5E66F86}'] - procedure SetContainer(const aContainer: IwbContainer); - procedure SetSortOrder(aIndex: Integer); - procedure SetMemoryOrder(aIndex: Integer); - function GetMemoryOrder: Integer; - procedure SetModified(aValue: Boolean); - procedure SetInternalModified(aValue: Boolean); - function GetCountedRecordCount: Cardinal; - procedure PrepareSave; - procedure MasterCountUpdated(aOld, aNew: Byte); - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); - procedure FindUsedMasters(aMasters: PwbUsedMasters); - procedure InvalidateStorage; - function Reached: Boolean; - - function BeginDecide: Boolean; - procedure EndDecide; - - property Modified: Boolean - read GetModified - write SetModified; - - property MemoryOrder: Integer - read GetMemoryOrder - write SetMemoryOrder; - - property InternalModified: Boolean - write SetInternalModified; - end; - - TwbElement = class(TInterfacedObject, IInterface, IwbElement, IwbElementInternal) - protected - eContainer : Pointer{IwbContainer}; //weak reference - eSortOrder : Integer; - eMemoryOrder : Integer; - eStates : TwbElementStates; - eSortKey : string; - eExtendedSortKey : string; - - eExternalRefs : Integer; - eContainerRef : IwbContainerElementRef; - - eUpdateCount : Integer; - - {---IInterface---} - function _AddRef: Integer; virtual; stdcall; - function _Release: Integer; virtual; stdcall; - - {---IwbElementInternal---} - function InternalAddRef: Integer; stdcall; - function InternalRelease: Integer; stdcall; - function IwbElementInternal._AddRef = InternalAddRef; - function IwbElementInternal._Release = InternalRelease; - function GetCountedRecordCount: Cardinal; virtual; - procedure PrepareSave; virtual; - procedure MasterCountUpdated(aOld, aNew: Byte); virtual; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); virtual; - procedure FindUsedMasters(aMasters: PwbUsedMasters); virtual; - procedure InvalidateStorage; virtual; - procedure InvalidateParentStorage; virtual; - function Reached: Boolean; virtual; - function LinksToParent: Boolean; virtual; - procedure SetMemoryOrder(aIndex: Integer); - function GetMemoryOrder: Integer; - - function BeginDecide: Boolean; - procedure EndDecide; - - procedure NotifyChanged(aContainer: Pointer); - procedure NotifyChangedInternal(aContainer: Pointer); virtual; - - procedure ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); virtual; - - function GetElementID: Cardinal; - function GetElementStates: TwbElementStates; - procedure SetElementState(aState: TwbElementState; Clear: Boolean = false); - function Equals(const aElement: IwbElement): Boolean; reintroduce; - - procedure Hide; - procedure Show; - function GetIsHidden: Boolean; - - function HasErrors: Boolean; virtual; - - function GetValue: string; virtual; - function GetCheck: string; virtual; - function GetSortKey(aExtended: Boolean): string; virtual; - function GetSortKeyInternal(aExtended: Boolean): string; virtual; - function GetSortPriority: Integer; virtual; - function GetName: string; virtual; - function GetBaseName: string; virtual; - function GetDisplayName: string; virtual; - function GetShortName: string; virtual; - function GetPath: string; virtual; - function GetFullPath: string; virtual; - function GetPathName: string; virtual; - function GetSkipped: Boolean; virtual; - function GetDef: IwbNamedDef; virtual; - function GetValueDef: IwbValueDef; virtual; - function GetResolvedValueDef: IwbValueDef; virtual; - function GetElementType: TwbElementType; virtual; - procedure DoReset(aForce: Boolean); virtual; - function GetContainer: IwbContainer; - function GetContainingMainRecord: IwbMainRecord; virtual; - function GetFile: IwbFile; virtual; - function GetReferenceFile: IwbFile; virtual; - function GetSortOrder: Integer; - procedure BuildRef; virtual; - procedure AddReferencedFromID(aFormID: Cardinal); virtual; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; virtual; - function GetIsEditable: Boolean; virtual; - function GetIsRemoveable: Boolean; virtual; - function GetEditValue: string; virtual; - procedure SetEditValue(const aValue: string); virtual; - function GetNativeValue: Variant; virtual; - procedure SetNativeValue(const aValue: Variant); virtual; - procedure RequestStorageChange(var aBasePtr, aEndPtr: Pointer; aNewSize: Cardinal); virtual; - function GetConflictPriority: TwbConflictPriority; virtual; - function GetConflictPriorityCanChange: Boolean; virtual; - function GetModified: Boolean; - procedure MarkModifiedRecursive; virtual; - function GetIsInjected: Boolean; virtual; - function GetReferencesInjected: Boolean; virtual; - function GetInjectionSourceFiles: TDynFiles; virtual; - function GetIsNotReachable: Boolean; virtual; - procedure SetModified(aValue: Boolean); virtual; - procedure SetInternalModified(aValue: Boolean); virtual; - function GetDataSize: Integer; virtual; - procedure SetDataSize(aSize: Integer); virtual; - procedure MergeStorage(var aBasePtr: Pointer; aEndPtr: Pointer); - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); virtual; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); virtual; - procedure Remove; virtual; - function CanContainFormIDs: Boolean; virtual; - function AddIfMissing(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; virtual; - procedure ResetConflict; virtual; - procedure ResetReachable; virtual; - function RemoveInjected(aCanRemove: Boolean): Boolean; virtual; - function GetEditType: TwbEditType; virtual; - function GetEditInfo: string; virtual; - function GetDontShow: Boolean; virtual; - procedure SetToDefault; - procedure SetToDefaultInternal; virtual; - - function CanAssign(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; virtual; - function Assign(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; virtual; - - procedure WriteToStream(aStream: TStream; aResetModified: Boolean); - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); virtual; - function GetLinksTo: IwbElement; virtual; - function GetNoReach: Boolean; - - procedure SetContainer(const aContainer: IwbContainer); virtual; - procedure SetSortOrder(aIndex: Integer); - - procedure DoAfterSet(const aOldValue, aNewValue: Variant); virtual; - - procedure MoveUp; - procedure MoveDown; - function CanMoveUp: Boolean; - function CanMoveDown: Boolean; - - procedure NextMember; - procedure PreviousMember; - function CanChangeMember: Boolean; - - procedure Tag; - procedure ResetTags; virtual; - function IsTagged: Boolean; - - function CopyInto(const aFile: IwbFile; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; - - function BeginUpdate: Integer; - function EndUpdate: Integer; - procedure UpdatedEnded; virtual; - - constructor Create(const aContainer: IwbContainer); - procedure BeforeDestruction; override; - procedure AfterConstruction; override; - class function NewInstance: TObject; override; - procedure FreeInstance; override; - - function GetTreeHead: Boolean; // Is the element expected to be a "header record" in the tree navigator - function GetTreeBranch: Boolean; // Is the element expected to show in the tree navigator - end; - - TDynElementInternals = array of IwbElementInternal; - - IwbContainerInternal = interface(IwbContainer) - ['{8D9AC0D3-3961-4320-A036-EB4771B081CD}'] - - function ReleaseElements: TDynElementInternals; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); - procedure SortBySortOrder; - procedure CreatedEmpty; - - procedure MoveElementUp(const aElement: IwbElement); - procedure MoveElementDown(const aElement: IwbElement); - function CanMoveElementUp(const aElement: IwbElement): Boolean; - function CanMoveElementDown(const aElement: IwbElement): Boolean; - - procedure NextElementMember(const aElement: IwbElement); - procedure PreviousElementMember(const aElement: IwbElement); - function CanChangeElementMember(const aElement: IwbElement): Boolean; - end; - - TwbContainer = class(TwbElement, IwbContainerElementRef, IwbContainer, IwbContainerInternal) - protected - cntElements : TDynElementInternals; - cntElementsMap : TDynCardinalArray; - cntElementRefs : Integer; - cntStates : TwbContainerStates; - cntKeepAliveNext : IwbContainerElementRef; - - function _AddRef: Integer; override; stdcall; - function _Release: Integer; override; stdcall; - - {---IwbContainerElementRef---} - function ElementAddRef: Integer; stdcall; - function ElementRelease: Integer; stdcall; - function IwbContainerElementRef._AddRef = ElementAddRef; - function IwbContainerElementRef._Release = ElementRelease; - function GetCountedRecordCount: Cardinal; override; - procedure PrepareSave; override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - - procedure SortBySortOrder; virtual; - procedure CreatedEmpty; - - function Reached: Boolean; override; - function RemoveInjected(aCanRemove: Boolean): Boolean; override; - - procedure ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); override; - procedure ResetConflict; override; - procedure ResetReachable; override; - - procedure DoReset(aForce: Boolean); override; - procedure DoInit; virtual; - - function HasErrors: Boolean; override; - - function GetSortKeyInternal(aExtended: Boolean): string; override; - function GetDataSize: Integer; override; - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure BuildRef; override; - procedure MarkModifiedRecursive; override; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function GetIsInSK(aIndex: Integer): Boolean; virtual; - - procedure SetToDefaultInternal; override; - - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - - function GetElement(aIndex: Integer): IwbElement; - function GetElementCount: Integer; - function GetElementByName(const aName: string): IwbElement; - function GetRecordBySignature(const aSignature: TwbSignature): IwbRecord; - function GetElementByMemoryOrder(aSortOrder: Integer): IwbElement; - function GetElementBySignature(const aSignature: TwbSignature): IwbElement; - function GetElementBySortOrder(aSortOrder: Integer): IwbElement; - function GetAdditionalElementCount: Integer; virtual; - procedure ReverseElements; - function GetContainerStates: TwbContainerStates; - function GetElementByPath(const aPath: string): IwbElement; - function GetElementValue(const aName: string): string; - function GetElementExists(const aName: string): Boolean; - function GetElementEditValue(const aName: string): string; - procedure SetElementEditValue(const aName, aValue: string); - function GetElementNativeValue(const aName: string): Variant; - procedure SetElementNativeValue(const aName: string; const aValue: Variant); - function GetElementLinksTo(const aName: string): IwbElement; - function GetElementSortKey(const aName: string; aExtended: Boolean): string; - - function ResolveElementName(aName: string; out aRemainingName: string; aCanCreate: Boolean = False): IwbElement; virtual; - - procedure AddElement(const aElement: IwbElement); virtual; - procedure InsertElement(aPosition: Integer; const aElement: IwbElement); - function RemoveElement(aPos: Integer; aMarkModified: Boolean = False): IwbElement; overload; virtual; - function RemoveElement(const aElement: IwbElement; aMarkModified: Boolean = False): IwbElement; overload; virtual; - function RemoveElement(const aName: string): IwbElement; overload; - function LastElement: IwbElement; - - function CanElementReset: Boolean; virtual; - - function GetAddList: TDynStrings; virtual; - function Add(const aName: string; aSilent: Boolean): IwbElement; virtual; - - function IsElementRemoveable(const aElement: IwbElement): Boolean; virtual; - function IsElementEditable(const aElement: IwbElement): Boolean; virtual; - - function IndexOf(const aElement: IwbElement): Integer; virtual; - - function ReleaseElements: TDynElementInternals; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); virtual; - procedure NotifyChangedInternal(aContainer: Pointer); override; - - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - - procedure Init; virtual; - procedure Reset; virtual; - procedure Bar; - function ReleaseKeepAlive: IwbContainerElementRef; - - procedure MoveElementUp(const aElement: IwbElement); - procedure MoveElementDown(const aElement: IwbElement); - function CanMoveElementUp(const aElement: IwbElement): Boolean; - function CanMoveElementDown(const aElement: IwbElement): Boolean; - function CanMoveElement: Boolean; virtual; - - procedure NextElementMember(const aElement: IwbElement); - procedure PreviousElementMember(const aElement: IwbElement); - function CanChangeElementMember(const aElement: IwbElement): Boolean; - - function FindBySortKey(const aSortKey: string; aExtended: Boolean; out aIndex: Integer): Boolean; - - procedure AfterConstruction; override; - procedure BeforeDestruction; override; - class function NewInstance: TObject; override; - destructor Destroy; override; - procedure FreeInstance; override; - - procedure ResetTags; override; - end; - - IwbFileInternal = interface(IwbFile) - ['{E1334034-06D0-4299-BFE0-E0DE97C128E2}'] - procedure AddMainRecord(const aRecord: IwbMainRecord); - procedure RemoveMainRecord(const aRecord: IwbMainRecord); - procedure InjectMainRecord(const aRecord: IwbMainRecord); - procedure RemoveInjectedMainRecord(const aRecord: IwbMainRecord); - procedure ForceClosed; - procedure GetMasters(aMasters: TStrings); - end; - - TwbFile = class(TwbContainer, IwbFile, IwbFileInternal) - protected - flFileName : string; - flLoadOrder : Integer; - flCompareTo : string; - flStates : TwbFileStates; - flUnsavedSince : TDateTime; - - flFileHandle : THandle; - flMapHandle : THandle; - - flView : Pointer; - flEndPtr : Pointer; - - flMasters : array of IwbFile; - - flRecords : array of IwbMainRecord; - flRecordsCount : Integer; {only used during loading} - - flRecordsByEditorID : array of IwbMainRecord; - flRecordsByEditorIDCount : Integer; {only used during loading} - - flLoadFinished : Boolean; - flFormIDsSorted : Boolean; - - flInjectedRecords : array of IwbMainRecord; - - procedure flOpenFile; virtual; - procedure flCloseFile; virtual; - procedure flProgress(const aStatus: string); - - function Reached: Boolean; override; - - function GetElementType: TwbElementType; override; - function GetFile: IwbFile; override; - function GetReferenceFile: IwbFile; override; - function GetName: string; override; - function GetBaseName: string; override; - procedure PrepareSave; override; - procedure SetModified(aValue: Boolean); override; - - procedure BuildRef; override; - - function FindFormID(aFormID: Cardinal; var Index: Integer): Boolean; - function FindInjectedID(aFormID: Cardinal; var Index: Integer): Boolean; - function FindEditorID(const aEditorID: string; var Index: Integer): Boolean; - function GetMasterRecordByFormID(aFormID: Cardinal; aAllowInjected: Boolean): IwbMainRecord; - - function GetAddList: TDynStrings; override; - function Add(const aName: string; aSilent: Boolean): IwbElement; override; - - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - function IsElementEditable(const aElement: IwbElement): Boolean; override; - function GetIsEditable: Boolean; override; - function GetIsRemoveable: Boolean; override; - - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - function NewFormID: Cardinal; - - {---IwbFile---} - function GetFileName: string; - function GetUnsavedSince: TDateTime; - function HasMaster(const aFileName: string): Boolean; - function GetMaster(aIndex: Integer): IwbFile; - function GetMasterCount: Integer; - function GetRecordByFormID(aFormID: Cardinal; aAllowInjected: Boolean): IwbMainRecord; - function GetRecordByEditorID(const aEditorID: string): IwbMainRecord; - function GetGroupBySignature(const aSignature: TwbSignature): IwbGroupRecord; - function HasGroup(const aSignature: TwbSignature): Boolean; - function GetFileStates: TwbFileStates; - function GetRecord(aIndex: Integer): IwbMainRecord; - function GetRecordCount: Integer; - function GetHeader: IwbMainRecord; - - function GetLoadOrder: Integer; - procedure ForceLoadOrder(aValue: Integer); - procedure SetLoadOrder(aValue: Integer); - - function LoadOrderFormIDtoFileFormID(aFormID: Cardinal): Cardinal; - function FileFormIDtoLoadOrderFormID(aFormID: Cardinal): Cardinal; - - function LoadOrderFileIDtoFileFileID(aFileID: Byte): Byte; - function FileFileIDtoLoadOrderFileID(aFileID: Byte): Byte; - - procedure AddMasters(aMasters: TStrings); - procedure AddMasterIfMissing(const aMaster: string); - procedure SortMasters; - procedure CleanMasters; - - procedure BuildReachable; - - function GetIsESM: Boolean; - procedure SetIsESM(Value: Boolean); - - function GetIsLocalized: Boolean; - procedure SetIsLocalized(Value: Boolean); - - function GetNextObjectID: Cardinal; - procedure SetNextObjectID(aObjectID: Cardinal); - - function GetIsNotPlugin: Boolean; - function GetHasNoFormID: Boolean; - procedure SetHasNoFormID(Value: Boolean); - - {---IwbFileInternal---} - procedure AddMainRecord(const aRecord: IwbMainRecord); - procedure RemoveMainRecord(const aRecord: IwbMainRecord); - procedure InjectMainRecord(const aRecord: IwbMainRecord); - procedure RemoveInjectedMainRecord(const aRecord: IwbMainRecord); - procedure ForceClosed; - procedure GetMasters(aMasters: TStrings); virtual; - - procedure Scan; virtual; - procedure SortRecords; - procedure SortRecordsByEditorID; - - procedure AddMaster(const aFileName: string; isTemporary: Boolean = False); overload; - procedure AddMaster(const aFile: IwbFile); overload; - - constructor Create(const aFileName: string; aLoadOrder: Integer; aCompareTo: string; aOnlyHeader: Boolean; IsTemporary: Boolean = False); - constructor CreateNew(const aFileName: string; aLoadOrder: Integer); - public - destructor Destroy; override; - end; - - TwbFileSource = class(TwbFile) - protected - procedure Scan; override; - constructor CreateNew(const aFileName: string; aLoadOrder: Integer); - procedure GetMasters(aMasters: TStrings); override; - end; - - TwbDataContainerFlag = ( - dcfDontCompare, - dcfDontMerge, - dcfDontSave, - dcfStorageInvalid - ); - - TwbDataContainerFlags = set of TwbDataContainerFlag; - - IwbDataContainerInternal = interface(IwbDataContainer) - ['{E13AE2AD-20CB-4429-86C2-0DEC3ECEE38B}'] - procedure UpdateStorageFromElements; - end; - - TwbDataContainer = class(TwbContainer, IwbDataContainer, IwbDataContainerInternal) - protected - dcBasePtr : Pointer; - dcEndPtr : Pointer; - dcDataBasePtr : Pointer; - dcDataEndPtr : Pointer; - dcDataStorage : TBytes; - dcFlags : TwbDataContainerFlags; - - constructor Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aPrevMainRecord : IwbMainRecord); virtual; - procedure InitDataPtr; virtual; abstract; - function GetDataPrefixSize: Integer; virtual; - - function GetResolvedValueDef: IwbValueDef; override; - - procedure InvalidateStorage; override; - procedure SetContainer(const aContainer: IwbContainer); override; - - procedure SetModified(aValue: Boolean); override; - procedure RequestStorageChange(var aBasePtr, aEndPtr: Pointer; aNewSize: Cardinal); override; - - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - function DoCheckSizeAfterWrite: Boolean; virtual; - procedure SetToDefaultInternal; override; - function IsFlags: Boolean; virtual; - - function GetEditType: TwbEditType; override; - function GetEditInfo: string; override; - - function GetConflictPriority: TwbConflictPriority; override; - - {---IwbDataContainer---} - function GetDataBasePtr: Pointer; - function GetDataEndPtr: Pointer; - function GetDataSize: Integer; override; - procedure SetDataSize(aSize: Integer); override; - function GetDontCompare: Boolean; - function GetDontSave: Boolean; - function IsValidOffset(aBasePtr, aEndPtr: Pointer; anOffset: Integer): Boolean; - function IsLocalOffset(anOffset: Integer): Boolean; - - {--- IwbDataContainerInternal ---} - procedure UpdateStorageFromElements; virtual; - end; - - TwbRecordClass = class of TwbRecord; - TwbRecord = class(TwbDataContainer, IwbRecord, IwbHasSignature) - protected - recSkipped : Boolean; - protected - constructor Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aPrevMainRecord : IwbMainRecord); overload; override; - - function GetSignature: TwbSignature; - procedure ScanData; virtual; abstract; - procedure InformPrevMainRecord(const aPrevMainRecord : IwbMainRecord); virtual; - procedure SortBySortOrder; override; - public - class function CreateForPtr(var aPtr : Pointer; - aEndPtr : Pointer; - const aContainer : IwbContainer; - const aPrevMainRecord : IwbMainRecord) - : IwbRecord; - - function GetName: string; override; - function GetSkipped: Boolean; override; - end; - - PwbMainRecordStruct = ^TwbMainRecordStruct; - TwbMainRecordStruct = packed record - mrsSignature : TwbSignature; - mrsDataSize : Cardinal; - mrsFlags : TwbMainRecordStructFlags; - mrsFormID : Cardinal; - mrsVCS1 : Cardinal; - mrsVersion : Word; - mrsVCS2 : Word; - end; - - IwbMainRecordInternal = interface(IwbMainRecord) - ['{405C85E0-2261-4078-B99C-199007D31544}'] - procedure AddOverride(const aMainRecord: IwbMainRecord); - procedure RemoveOverride(const aMainRecord: IwbMainRecord); - procedure SetMaster(const aMaster: IwbMainRecord); - procedure YouAreTheMaster(const aOverrides, aReferencedBy: TDynMainRecords); overload; - procedure YouAreTheMaster(const aOldMaster: IwbMainRecord; const aOverrides, aReferencedBy: TDynMainRecords); overload; - procedure YouGotAMaster(const aMaster: IwbMainRecord); - procedure SetChildGroup(const aGroup: IwbGroupRecord); - procedure RemoveChildGroup(const aGroup: IwbGroupRecord); - procedure SetReferencesInjected(aValue: Boolean); - procedure ClearForRelease; - - procedure MakeHeaderWriteable; - function mrStruct: PwbMainRecordStruct; - end; - - IwbMainRecordEntry = interface(IwbMainRecordInternal) - ['{0C89F580-C95A-4A6C-85EA-BD5E411788A4}'] - procedure RemoveEntry; - procedure RemoveEntryInternal; - - procedure InsertEntryAfter(const aEntry: IwbMainRecordEntry); - procedure InsertEntryHead; - procedure InsertEntryTail; - - function GetPrevEntry: IwbMainRecordEntry; - procedure SetPrevEntry(const aEntry: IwbMainRecordEntry); - - function GetNextEntry: IwbMainRecordEntry; - procedure SetNextEntry(const aEntry: IwbMainRecordEntry); - - function GetIsInList: Boolean; - - property PrevEntry: IwbMainRecordEntry - read GetPrevEntry - write SetPrevEntry; - - property NextEntry: IwbMainRecordEntry - read GetNextEntry - write SetNextEntry; - - property IsInList: Boolean - read GetIsInList; - end; - - TwbMainRecordState = ( - mrsBuildingRef, - mrsReferencedByUnsorted, - mrsIsInjected, - mrsIsInjectedChecked, - mrsReferencesInjected, - mrsReferencesInjectedChecked, - mrsSearchedChildGroup, - mrsHasVWDMeshChecked, - mrsHasVWDMesh, - mrsHasPrecombinedMeshChecked, - mrsHasPrecombinedMesh, - mrsBaseRecordChecked, - mrsQuickInit, - mrsQuickInitDone, - mrsHasMeshChecked, - mrsHasMesh, - mrsNoUpdateRefs, - mrBasePtrAllocated - ); - - TwbMainRecordStates = set of TwbMainRecordState; - - IwbContainedIn = interface - ['{002F064A-81B8-40EB-AA09-E5F7AE061D9E}'] - procedure ContainerChanged; - end; - - TwbMainRecord = class(TwbRecord, IwbMainRecord, IwbMainRecordInternal, IwbMainRecordEntry, IwbContainedIn) - protected - mrDef : IwbRecordDef; - mrLoadOrderFormID : Cardinal; - mrFixedFormID : Cardinal; - mrMaster : Pointer{IwbMainRecord}; - mrOverrides : TDynMainRecords; - mrOverridesSorted : Boolean; - mrEditorID : string; - mrFullName : string; - mrStates : TwbMainRecordStates; - mrBaseRecordID : Cardinal; - mrPrecombinedCellID: Cardinal; - mrPrecombinedID : Cardinal; - mrConflictAll : TConflictAll; - mrConflictThis : TConflictThis; - mrDataStorage : TBytes; - mrGroup : IwbGroupRecord; - - mrReferencedBy : TDynMainRecords; - mrReferences : TDynCardinalArray; - mrTmpRefFormIDs : TDynCardinalArray; - mrTmpRefFormIDHigh : Integer; - - mreGeneration : Integer; - mrePrev : Pointer; - mreNext : Pointer; - - function mrStruct: PwbMainRecordStruct; inline; - - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - function RemoveElement(aPos: Integer; aMarkModified: Boolean = False): IwbElement; overload; override; - function ResolveElementName(aName: string; out aRemainingName: string; aCanCreate: Boolean = False): IwbElement; override; - - function GetIsInjected: Boolean; override; - function GetReferencesInjected: Boolean; override; - function GetInjectionSourceFiles: TDynFiles; override; - function RemoveInjected(aCanRemove: Boolean): Boolean; override; - function GetIsNotReachable: Boolean; override; - function GetCountedRecordCount: Cardinal; override; - procedure InitDataPtr; override; - procedure DecompressIfNeeded; - procedure ScanData; override; - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - function CanContainFormIDs: Boolean; override; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - function CanElementReset: Boolean; override; - procedure Remove; override; - procedure PrepareSave; override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - function GetReferenceFile: IwbFile; override; - procedure ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); override; - function LinksToParent: Boolean; override; - function Reached: Boolean; override; - function GetContainingMainRecord: IwbMainRecord; override; - - procedure DoBuildRef(aRemove: Boolean); - procedure BuildRef; override; - procedure AddReferencedFromID(aFormID: Cardinal); override; - procedure ResetConflict; override; - procedure ResetReachable; override; - - procedure Init; override; - procedure Reset; override; - - function GetPath: string; override; - function GetValue: string; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - function GetSortPriority: Integer; override; - function GetAdditionalElementCount: Integer; override; - function GetIsEditable: Boolean; override; - function GetEditValue: string; override; - procedure SetEditValue(const aValue: string); override; - function GetNativeValue: Variant; override; - procedure SetNativeValue(const aValue: Variant); override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - procedure SetContainer(const aContainer: IwbContainer); override; - - function FindReferencedBy(const aMainRecord: IwbMainRecord; var Index: Integer): Boolean; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - procedure CollapseStorage; - - function GetAddList: TDynStrings; override; - function Add(const aName: string; aSilent: Boolean): IwbElement; override; - - function CheckChildOfCell: Boolean; - procedure UpdateCellChildGroup; - procedure UpdateInteriorCellGroup; - - procedure MarkModifiedRecursive; override; - - {---IwbMainRecord---} - function GetDef: IwbNamedDef; override; - function GetElementType: TwbElementType; override; - function GetFormID: Cardinal; - function GetFixedFormID: Cardinal; - function GetLoadOrderFormID: Cardinal; - procedure SetLoadOrderFormID(aFormID: Cardinal); - function GetEditorID: string; - function GetCanHaveEditorID: Boolean; - procedure SetEditorID(const aValue: string); - function GetFullName: string; - function GetDisplayNameKey: string; - function GetMaster: IwbMainRecord; - function GetIsMaster: Boolean; - function GetMasterOrSelf: IwbMainRecord; - function GetOverride(aIndex: Integer): IwbMainRecord; - function GetOverrideCount: Integer; - procedure AddReferencedBy(aMainRecord: IwbMainRecord); - procedure RemoveReferencedBy(aMainRecord: IwbMainRecord); - procedure SortReferencedBy; - function GetReferencedBy(aIndex: Integer): IwbMainRecord; - function GetReferencedByCount: Integer; - function GetCheck: string; override; - function GetIsWinningOverride: Boolean; - function GetWinningOverride: IwbMainRecord; - function GetHighestOverrideOrSelf(aMaxLoadOrder: Integer): IwbMainRecord; - function GetFlags: TwbMainRecordStructFlags; - function GetFlagsPtr: PwbMainRecordStructFlags; - function GetChildGroup: IwbGroupRecord; - function EnsureChildGroup: IwbGroupRecord; - function GetBaseRecord: IwbMainRecord; - function GetBaseRecordID: Cardinal; - - procedure MakeHeaderWriteable; - - function GetConflictAll: TConflictAll; - procedure SetConflictAll(aValue: TConflictAll); - function GetConflictThis: TConflictThis; - procedure SetConflictThis(aValue: TConflictThis); - - function GetIsESM: Boolean; - procedure SetIsESM(aValue: Boolean); - function GetIsLocalized: Boolean; - procedure SetIsLocalized(aValue: Boolean); - function GetIsPersistent: Boolean; - procedure SetIsPersistent(aValue: Boolean); - function GetIsDeleted: Boolean; - procedure SetIsDeleted(aValue: Boolean); - function GetIsCompressed: Boolean; - procedure SetIsCompressed(aValue: Boolean); - function GetIsVisibleWhenDistant: Boolean; - procedure SetIsVisibleWhenDistant(aValue: Boolean); - function GetHasVisibleWhenDistantMesh: Boolean; - function GetHasMesh: Boolean; - function GetHasPrecombinedMesh: Boolean; - function GetPrecombinedMesh: string; - function GetIsInitiallyDisabled: Boolean; - procedure SetIsInitiallyDisabled(aValue: Boolean); - - procedure UpdateRefs; - - function GetPosition(out aPosition: TwbVector): Boolean; - function SetPosition(const aPosition: TwbVector): Boolean; - function GetRotation(out aRotation: TwbVector): Boolean; - function GetScale(out aScale: Single): Boolean; - function GetGridCell(out aGridCell: TwbGridCell): Boolean; - function GetFormVersion: Cardinal; {>>> Form Version access <<<} - procedure SetFormVersion(aFormVersion: Cardinal); {>>> Form Version access <<<} - procedure ChangeFormSignature(aSignature: TwbSignature); - procedure ClampFormID(aIndex: Cardinal); - - procedure Delete; - procedure DeleteInto(const aFile: IwbFile); - - function MasterRecordsFromMasterFilesAndSelf: TDynMainRecords; - - {---IwbMainRecordInternal---} - procedure AddOverride(const aMainRecord: IwbMainRecord); - procedure RemoveOverride(const aMainRecord: IwbMainRecord); - procedure SetMaster(const aMaster: IwbMainRecord); - procedure YouAreTheMaster(const aOverrides, aReferencedBy: TDynMainRecords); overload; - procedure YouAreTheMaster(const aOldMaster: IwbMainRecord; const aOverrides, aReferencedBy: TDynMainRecords); overload; - procedure YouGotAMaster(const aMaster: IwbMainRecord); - procedure SetChildGroup(const aGroup: IwbGroupRecord); - procedure RemoveChildGroup(const aGroup: IwbGroupRecord); - procedure SetReferencesInjected(aValue: Boolean); - procedure ClearForRelease; - - {---IwbMainRecordEntry---} - procedure RemoveEntry; - procedure RemoveEntryInternal; - - procedure InsertEntryAfter(const aEntry: IwbMainRecordEntry); - procedure InsertEntryHead; - procedure InsertEntryTail; - - function GetPrevEntry: IwbMainRecordEntry; - procedure SetPrevEntry(const aEntry: IwbMainRecordEntry); - - function GetNextEntry: IwbMainRecordEntry; - procedure SetNextEntry(const aEntry: IwbMainRecordEntry); - - function GetIsInList: Boolean; - - {--- IwbContainedIn ---} - procedure ContainerChanged; - public - constructor Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aPrevMainRecord : IwbMainRecord); override; - constructor Create(const aContainer : IwbContainer; - const aSignature : TwbSignature; - aFormID : Cardinal); overload; - destructor Destroy; override; - - function GetName: string; override; - function GetShortName: string; override; - function GetDisplayName: string; override; - end; - - PwbSubRecordHeaderStruct = ^TwbSubRecordHeaderStruct; - TwbSubRecordHeaderStruct = packed record - srsSignature : TwbSignature; - srsDataSize : Word; - end; - - IwbSubRecordInternal = interface(IwbSubRecord) - ['{AB66BAE8-2618-4B85-80CE-A108C3B80808}'] - procedure SetDef(const aDef: IwbSubRecordDef); - end; - - TwbSubRecordState = ( - srsIsArray, - srsIsFlags, - srsIsUnion, - srsSorted, - srsSortInvalid - ); - - TwbSubRecordStates = set of TwbSubRecordState; - - TwbSubRecord = class(TwbRecord, IwbSubRecord, IwbSubRecordInternal, IwbSortableContainer) - protected {private} - srDef : IwbSubRecordDef; - srValueDef : IwbValueDef; - srStates : TwbSubRecordStates; - srArraySizePrefix : Integer; - protected - constructor Create(const aContainer : IwbContainer; - const aSubRecordDef: IwbSubRecordDef); overload; - destructor Destroy; override; - - procedure SetDef(const aDef: IwbSubRecordDef); - function srStruct: PwbSubRecordHeaderStruct; inline; - - procedure InitDataPtr; override; - procedure ScanData; override; - - procedure DoInit; override; - procedure Init; override; - procedure Reset; override; - - function GetDataPrefixSize: Integer; override; - procedure CheckCount; - - function GetName: string; override; - function GetDisplayName: string; override; - - function IsFlags: Boolean; override; - - function GetValue: string; override; - function GetCheck: string; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - function GetIsEditable: Boolean; override; - function GetValueDef: IwbValueDef; override; - function GetEditValue: string; override; - procedure SetEditValue(const aValue: string); override; - function GetNativeValue: Variant; override; - procedure SetNativeValue(const aValue: Variant); override; - procedure BuildRef; override; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - procedure SetModified(aValue: Boolean); override; - function CanContainFormIDs: Boolean; override; - function CanElementReset: Boolean; override; - function GetLinksTo: IwbElement; override; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - procedure PrepareSave; override; - function RemoveInjected(aCanRemove: Boolean): Boolean; override; - - procedure SetToDefaultInternal; override; - - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - function GetIsInSK(aIndex: Integer): Boolean; override; - function DoCheckSizeAfterWrite: Boolean; override; - - function GetDef: IwbNamedDef; override; - function GetElementType: TwbElementType; override; - - function GetDataSize: Integer; override; - - function CanMoveElement: Boolean; override; - - procedure CheckTerminator; - - {--- IwbSubRecord ---} - function GetSubRecordHeaderSize: Integer; - - {--- IwbSortableContainer ---} - function GetSorted: Boolean; - end; - - TwbValueBase = class(TwbDataContainer) - protected - vbValueDef : IwbValueDef; - vbNameSuffix : string; - protected - procedure InitDataPtr; override; - - function GetDef: IwbNamedDef; override; - function GetValueDef: IwbValueDef; override; - - function GetName: string; override; - function GetBaseName: string; override; - function GetDisplayName: string; override; - - function GetCheck: string; override; - function GetValue: string; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - - function GetIsEditable: Boolean; override; - function CanElementReset: Boolean; override; - - function GetEditValue: string; override; - procedure SetEditValue(const aValue: string); override; - - function GetNativeValue: Variant; override; - procedure SetNativeValue(const aValue: Variant); override; - - procedure BuildRef; override; - function CanContainFormIDs: Boolean; override; - function GetLinksTo: IwbElement; override; - function GetDataSize: Integer; override; - function DoCheckSizeAfterWrite: Boolean; override; - - procedure SetToDefaultInternal; override; - - function GetIsInSK(aIndex: Integer): Boolean; override; - public - constructor Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aValueDef : IwbValueDef; - const aNameSuffix : string; - aDontCompare: Boolean = False); reintroduce; overload; - constructor Create(const aContainer : IwbContainer; - const aValueDef : IwbValueDef; - const aSource : IwbElement; - const aOnlySK : Boolean; - const aNameSuffix : string); reintroduce; overload; - end; - - TwbArray = class(TwbValueBase, IwbSortableContainer) - protected {private} - arrSorted : Boolean; - arrSortInvalid : Boolean; - arrSizePrefix : Integer; - protected - procedure DoInit; override; - procedure Init; override; - procedure Reset; override; - - function GetElementType: TwbElementType; override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - procedure SetModified(aValue: Boolean); override; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - procedure PrepareSave; override; - procedure CheckTerminator; - - function GetDataPrefixSize: Integer; override; - procedure CheckCount; - - function CanMoveElement: Boolean; override; - - {--- IwbSortableContainer ---} - function GetSorted: Boolean; - end; - - TwbStruct = class(TwbValueBase) - protected - szCompressedSize : Integer; - szUncompressedSize : Cardinal; - szCompressedType : TwbStructCompression; - procedure Init; override; - procedure Reset; override; - - function GetElementType: TwbElementType; override; - procedure DecompressIfNeeded; - function GetIsCompressed: TwbStructCompression; - property IsCompressed: TwbStructCompression read GetIsCompressed; - end; - - TwbFileHeader = class(TwbStruct, IwbFileHeader) - protected - function GetFileMagic: TwbFileMagic; - end; - - TwbChapter = class(TwbStruct, IwbChapter) - protected - cChapterSkipped : Boolean; - protected - function GetSkipped: Boolean; override; - function GetElementType: TwbElementType; override; - function GetChapterType: Integer; - function GetChapterTypeName: String; - function GetChapterName: String; - public - constructor Create(const aContainer : IwbContainer; - const aValueDef : IwbValueDef; - const aSource : IwbElement; - const aOnlySK : Boolean; - const aNameSuffix : string); reintroduce; overload; - end; - - TwbUnion = class(TwbValueBase) - protected - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - procedure Init; override; - procedure Reset; override; - - function GetElementType: TwbElementType; override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - end; - - TwbRecordHeaderStruct = class(TwbStruct) - protected - function CanContainFormIDs: Boolean; override; - procedure BuildRef; override; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - function IsElementEditable(const aElement: IwbElement): Boolean; override; - function GetIsEditable: Boolean; override; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - end; - - TwbValue = class(TwbValueBase, IwbSortableContainer) - protected {private} - vIsFlags : Boolean; - protected - function GetValue: string; override; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - function IsFlags: Boolean; override; - - procedure Init; override; - procedure Reset; override; - - function GetElementType: TwbElementType; override; - procedure SetEditValue(const aValue: string); override; - procedure SetNativeValue(const aValue: Variant); override; - - {--- IwbSortableContainer ---} - function GetSorted: Boolean; - end; - - TwbContainedInElement = class(TwbValue, IwbContainedIn) - protected {private} - cieLockCount: Integer; - protected - procedure InvalidateParentStorage; override; - function CanContainFormIDs: Boolean; override; - procedure BuildRef; override; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - function IsElementEditable(const aElement: IwbElement): Boolean; override; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - procedure SetModified(aValue: Boolean); override; - procedure DoAfterSet(const aOldValue, aNewValue: Variant); override; - - {--- IwbContainedIn ---} - procedure ContainerChanged; - public - constructor Create(const aMainRecord: IwbMainRecord); - end; - - IwbStringListTerminator = interface - ['{0D8ED4AA-1AFE-4283-87D7-2B66C5496227}'] - end; - - TwbStringListTerminator = class(TwbElement, IwbStringListTerminator) - function GetName: string; override; - function GetElementType: TwbElementType; override; - function GetConflictPriority: TwbConflictPriority; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - procedure SetEditValue(const aValue: string); override; - procedure SetNativeValue(const aValue: Variant); override; - function GetDataSize: Integer; override; - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - procedure MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - end; - - IwbFlag = interface(IwbElement) - ['{EED55516-C6D5-4ADD-B147-36B115E7449D}'] - function GetFlagsDef: IwbFlagsDef; - function GetFlagIndex: Integer; - - property FlagsDef: IwbFlagsDef - read GetFlagsDef; - property FlagIndex: Integer - read GetFlagIndex; - end; - - TwbFlag = class(TwbElement, IwbFlag) - protected {private} - fBasePtr : Pointer; - fEndPtr : Pointer; - fIntegerDef : IwbIntegerDef; - fFlagsDef : IwbFlagsDef; - fLastDefID : Cardinal; - fIndex : Integer; - protected - constructor Create(const aContainer : IwbContainer; - aBasePtr : Pointer; - aEndPtr : Pointer; - const aIntegerDef : IwbIntegerDef; - const aFlagsDef : IwbFlagsDef; - aIndex : Integer); - - function GetName: string; override; - function GetDef: IwbNamedDef; override; - function GetValueDef: IwbValueDef; override; - - function GetValue: string; override; - function GetSortKey(aExtended: Boolean): string; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - function GetConflictPriority: TwbConflictPriority; override; - function GetDontShow: Boolean; override; - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); override; - function GetDataSize: Integer; override; - procedure InvalidateParentStorage; override; - - function GetIsEditable: Boolean; override; - function GetIsRemoveable: Boolean; override; - - procedure Remove; override; - - function GetEditValue: string; override; - procedure SetEditValue(const aValue: string); override; - - function GetNativeValue: Variant; override; - procedure SetNativeValue(const aValue: Variant); override; - - function GetElementType: TwbElementType; override; - - {--- IwbFlag ---} - function GetFlagsDef: IwbFlagsDef; - function GetFlagIndex: Integer; - end; - - PwbGroupRecordStruct = ^TwbGroupRecordStruct; - TwbGroupRecordStruct = packed record - grsSignature : TwbSignature; - grsGroupSize : Cardinal; - grsLabel : Cardinal; - grsGroupType : Integer; - grsStamp : Cardinal; - grsUnknown : Cardinal; - end; - - IwbGroupRecordInternal = interface(IwbGroupRecord) - ['{0BDDCF46-DFF6-4771-8FBB-0BC78828999B}'] - procedure Sort; - procedure SetModified(aValue: Boolean); - end; - - TwbGroupState = ( - gsSorted, - gsSorting, - gsSortPostponed - ); - - TwbGroupStates = set of TwbGroupState; - - TwbGroupRecord = class(TwbRecord, IwbGroupRecord, IwbGroupRecordInternal) - protected {private} - grStates: TwbGroupStates; - protected - constructor Create(const aContainer : IwbContainer; - const aSignature : TwbSignature); overload; - constructor Create(const aContainer : IwbContainer; - aType : Integer; - const aMainRecord : IwbMainRecord); overload; - constructor Create(const aContainer : IwbContainer; - aType : Integer; - aLabel : Cardinal); overload; - destructor Destroy; override; - - function grStruct: PwbGroupRecordStruct; inline; - - function GetCountedRecordCount: Cardinal; override; - procedure InitDataPtr; override; - procedure ScanData; override; - procedure InformPrevMainRecord(const aPrevMainRecord : IwbMainRecord); override; - - function GetName: string; override; - function GetShortName: string; override; - function GetElementType: TwbElementType; override; - function GetSortKeyInternal(aExtended: Boolean): string; override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - procedure Remove; override; - procedure NotifyChangedInternal(aContainer: Pointer); override; - - function GetAddList: TDynStrings; override; - function Add(const aName: string; aSilent: Boolean): IwbElement; override; - procedure Sort; - - procedure UpdatedEnded; override; - - procedure SetModified(aValue: Boolean); override; - - procedure PrepareSave; override; - procedure WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); override; - procedure MasterCountUpdated(aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aMasters: PwbUsedMasters); override; - - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - procedure MakeHeaderWriteable; - - procedure BuildRef; override; - function LinksToParent: Boolean; override; - function Reached: Boolean; override; - - function FindChildGroup(aType: Integer; aMainRecord: IwbMainRecord): IwbGroupRecord; - - function GetMainRecordByEditorID(const aEditorID: string): IwbMainRecord; - function GetMainRecordByFormID(const aFormID: Cardinal): IwbMainRecord; - - function GetGroupType: Integer; - function GetGroupLabel: Cardinal; - procedure SetGroupLabel(aLabel: Cardinal); - function GetChildrenOf: IwbMainRecord; - - procedure AddElement(const aElement: IwbElement); override; - end; - - IwbSubRecordArrayInternal = interface(IwbSubRecordArray) - ['{4400F93F-9D13-43CA-B43D-727725EC73C8}'] - - procedure DoProcess(const aContainer : IwbContainer; - aPos : Integer); - end; - - TwbSubRecordArray = class(TwbContainer, IwbSubRecordArray, IwbSubRecordArrayInternal, IwbSortableContainer, IwbHasSignature) - protected {private} - arcDef : IwbSubRecordArrayDef; - arcSorted : Boolean; - arcSortInvalid : Boolean; - protected - constructor Create(const aOwner : IwbContainer; - const aContainer : IwbContainer; - aPos : Integer; - const aDef : IwbSubRecordArrayDef); - - procedure DoProcess(const aContainer : IwbContainer; - aPos : Integer); - - procedure DoInit; override; - - function GetName: string; override; - function GetDef: IwbNamedDef; override; - function GetElementType: TwbElementType; override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - procedure SetModified(aValue: Boolean); override; - function CanContainFormIDs: Boolean; override; - function CanElementReset: Boolean; override; - procedure ElementChanged(const aElement: IwbElement; aContainer: Pointer); override; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - - function CanMoveElement: Boolean; override; - - {---IwbSortableContainer---} - function GetSorted: Boolean; - - {--- IwbHasSignature ---} - function GetSignature: TwbSignature; - end; - - TwbSubRecordStruct = class(TwbContainer, IwbHasSignature) - protected {private} - srcDef: IwbRecordDef; - protected - constructor Create(const aOwner : IwbContainer; - const aContainer : IwbContainer; - aPos : Integer; - const aDef : IwbSubRecordStructDef); - - procedure AddRequiredElements; - function Add(const aName: string; aSilent: Boolean): IwbElement; override; - - function GetSortKeyInternal(aExtended: Boolean): string; override; - function GetName: string; override; - function GetDef: IwbNamedDef; override; - function GetElementType: TwbElementType; override; - function IsElementRemoveable(const aElement: IwbElement): Boolean; override; - function CanContainFormIDs: Boolean; override; - function CanElementReset: Boolean; override; - function RemoveInjected(aCanRemove: Boolean): Boolean; override; - - function CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; override; - function AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; override; - function AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; override; - function GetIsInSK(aIndex: Integer): Boolean; override; - - {--- IwbHasSignature ---} - function GetSignature: TwbSignature; - end; - -const - NONE : TwbSignature = #0#0#0#0; - -function CompareFormIDs(Item1, Item2: Pointer): Integer; -asm -{$IFDEF WIN32} - xor ecx, ecx - cmp eax, edx - ja @@GT - je @@EQ -@@LT: - dec ecx - dec ecx -@@GT: - inc ecx -@@EQ: - mov eax, ecx -{$ENDIF WIN32} -{$IFDEF WIN64} - xor rax, rax - cmp rcx, rdx - ja @@GT - je @@EQ -@@LT: - dec rax - dec rax -@@GT: - inc rax -@@EQ: -{$ENDIF WIN64} -end; - -function CompareSubRecords(Item1, Item2: Pointer): Integer; -var - SortOrder1: Integer; - SortOrder2: Integer; -begin - if Item1 = Item2 then begin - Result := 0; - Exit; - end; - - SortOrder1 := IwbElement(Item1).SortOrder; - SortOrder2 := IwbElement(Item2).SortOrder; - - Result := CmpI32(SortOrder1, SortOrder2); - - if Result = 0 then begin - Result := CmpW32(Ord(IwbElement(Item1).ElementType), Ord(IwbElement(Item2).ElementType)); - if Result = 0 then begin - if IwbElement(Item1).ElementType = etSubRecord then - Result := CmpW32( - Cardinal((IwbElement(Item1) as IwbSubRecord).DataBasePtr), - Cardinal((IwbElement(Item2) as IwbSubRecord).DataBasePtr) - ); - end; - end; -end; - -function CompareSortKeys(Item1, Item2: Pointer): Integer; -var - SortKey1 : string; - SortKey2 : string; -// Container1 : IwbContainer; -// Container2 : IwbContainer; -begin - if Item1 = Item2 then begin - Result := 0; - Exit; - end; - - SortKey1 := IwbElement(Item1).SortKey[True]; - SortKey2 := IwbElement(Item2).SortKey[True]; - - Result := CompareStr(SortKey1, SortKey2); - - if Result = 0 then begin - SortKey1 := IwbElement(Item1).Value; - SortKey2 := IwbElement(Item1).Value; - - Result := CompareStr(SortKey1, SortKey2); - - if Result = 0 then begin - Result := CmpW32(Ord(IwbElement(Item1).ElementType), Ord(IwbElement(Item2).ElementType)); - if Result = 0 then begin - if IwbElement(Item1).ElementType = etSubRecord then - Result := CmpW32( - Cardinal((IwbElement(Item1) as IwbSubRecord).DataBasePtr), - Cardinal((IwbElement(Item2) as IwbSubRecord).DataBasePtr) - ){ - else try - if Supports(IwbElement(Item1), IwbContainer, Container1) and Supports(IwbElement(Item2), IwbContainer, Container2) then - Result := CmpW32( - Cardinal((Container1 as TwbContainer).cntElements), // Arbitrary value that should not change during the sort - Cardinal((Container2 as TwbContainer).cntElements) - ); - except - // If an Element supporting IwbContainer could NOT be a TwbContainer - end}; - end; - end; - end; -end; - - -function CompareSortOrder(Item1, Item2: Pointer): Integer; -var - SortOrder1: Integer; - SortOrder2: Integer; -begin - if Item1 = Item2 then begin - Result := 0; - Exit; - end; - - SortOrder1 := IwbElement(Item1).SortOrder; - SortOrder2 := IwbElement(Item2).SortOrder; - - Result := CmpI32(SortOrder1, SortOrder2); -end; - -function CompareLoadOrder(Item1, Item2: Pointer): Integer; -var - LoadOrder1: Integer; - LoadOrder2: Integer; -begin - if Item1 = Item2 then begin - Result := 0; - Exit; - end; - - LoadOrder1 := IwbFile(Item1).LoadOrder; - LoadOrder2 := IwbFile(Item2).LoadOrder; - - Result := CmpI32(LoadOrder1, LoadOrder2); - if Result = 0 then - Result := CmpW32(IwbFile(Item1).ElementID, IwbFile(Item2).ElementID); -end; - -{ TwbFile } - -procedure TwbFile.AddMaster(const aFileName: string; IsTemporary: Boolean); -var - _File : IwbFile; - s : string; - t : string; - i : Integer; -begin - if not wbRequireLoadorder and IsTemporary then begin - for i := 0 to Pred(GetMasterCount) do - if SameText(ExtractFileName(aFileName), GetMaster(i).FileName) then - Exit; - end; - - s := ExtractFilePath(aFileName); - t := ExtractFileName(aFileName); - if s = '' then - s := ExtractFilePath(flFileName); - if s <> '' then - s := IncludeTrailingPathDelimiter(s); - - flProgress('Adding master "' + t + '"'); - _File := wbFile(s + t, -1, '', IsTemporary, False); - if not (wbToolMode in [tmDump, tmExport]) and (wbRequireLoadOrder and (_File.LoadOrder < 0)) then - raise Exception.Create('"' + GetFileName + '" requires master "' + aFileName + '" to be loaded before it.') - else - AddMaster(_File); -end; - -function TwbFile.Add(const aName: string; aSilent: Boolean): IwbElement; -var - Signature : TwbSignature; - Dummy : Integer; -begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - - Result := nil; - - if Length(aName) < 4 then - Exit; - - Signature := StrToSignature(aName); - - Result := GetGroupBySignature(Signature); - - if Assigned(Result) then - Exit; - - if not wbGroupOrder.Find(Signature, Dummy) then - Exit; - if GroupToSkip.Find(Signature, Dummy) then - Exit; - if RecordToSkip.Find(Signature, Dummy) then - Exit; - - Result := TwbGroupRecord.Create(Self, Signature); - - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[1], High(cntElements), CompareSortOrder); -end; - -function TwbFile.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - GroupRecord : IwbGroupRecord; - Dummy : Integer; - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - i : Integer; -begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - - SelfRef := Self as IwbContainerElementRef; - if not Supports(aElement, IwbGroupRecord, GroupRecord) then - raise Exception.Create('Only group records can be added to files'); - if GroupRecord.GroupType <> 0 then - raise Exception.Create('Only top level group records can be added to files'); - Signature := TwbSignature(GroupRecord.GroupLabel); - if not wbGroupOrder.Find(Signature, Dummy) then - raise Exception.Create(Signature + 'is not a valid group label'); - Result := GetGroupBySignature(Signature); - if not Assigned(Result) then begin - Result := TwbGroupRecord.Create(Self, Signature); - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[1], High(cntElements), CompareSortOrder); - end; - - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - Result.AddIfMissing(GroupRecord.Elements[i], aAsNew, True, aPrefixRemove, aPrefix, aSuffix); -end; - -procedure TwbFile.AddMainRecord(const aRecord: IwbMainRecord); -const - MGEF : TwbSignature = 'MGEF'; - GMST : TwbSignature = 'GMST'; -var - FormID : Cardinal; - s : string; - i : Integer; - Master : IwbMainRecord; - FileID : Byte; - Signature : TwbSignature; -begin - if not Assigned(aRecord) then - Exit; - FormID := aRecord.FormID; - if FormID <> 0 then begin - - if flFormIDsSorted then begin - - if Length(flRecords) > 0 then begin - if FindFormID(FormID, i) then - raise Exception.Create('Duplicate FormID ['+IntToHex64(FormID, 8)+'] in file ' + GetName); - end else - i := 0; - - SetLength(flRecords, Succ(Length(flRecords))); - if i < High(flRecords) then begin - Move(flRecords[i], flRecords[Succ(i)], SizeOf(Pointer) * (High(flRecords) - i)); - Pointer(flRecords[i]) := nil; - end; - flRecords[i] := aRecord; - - end else begin - - if flRecordsCount >= Length(flRecords) then - SetLength(flRecords, Succ(flRecordsCount)); - - flRecords[flRecordsCount] := aRecord; - Inc(flRecordsCount); - - end; - - FileID := FormID shr 24; - if FileID >= Cardinal(GetMasterCount) then begin - {new record...} - end else try - Master := GetMasterRecordByFormID(FormID, True); - if Assigned(Master) then - (Master as IwbMainRecordInternal).AddOverride(aRecord) - else - (GetMaster(FileID) as IwbFileInternal).InjectMainRecord(aRecord); - except - on E: Exception do - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: <'+e.Message+'> while trying to determine master record for ' + aRecord.Name); - end; - end; - - if flFormIDsSorted then - Exit; - - Signature := aRecord.Signature; - - if (Cardinal(Signature) = Cardinal(MGEF)) or (Cardinal(Signature) = Cardinal(GMST)) or wbTrackAllEditorID then begin - s := aRecord.EditorID; - if s <> '' then begin - if flRecordsByEditorIDCount >= Length(flRecordsByEditorID) then - SetLength(flRecordsByEditorID, Succ(flRecordsByEditorIDCount)); - - flRecordsByEditorID[flRecordsByEditorIDCount] := aRecord; - Inc(flRecordsByEditorIDCount); - end; - end; -end; - -procedure TwbFile.AddMaster(const aFile: IwbFile); -begin - SetLength(flMasters, Succ(Length(flMasters))); - flMasters[High(flMasters)] := aFile; -end; - -procedure TwbFile.AddMasterIfMissing(const aMaster: string); -var - i : Integer; - Masters : TStringList; -begin - for i := 0 to Pred(GetMasterCount) do - if SameText(aMaster, GetMaster(i).FileName) then - Exit; - Masters := TStringList.Create; - try - Masters.Add(aMaster); - AddMasters(Masters); - SortMasters; - finally - Masters.Free; - end; -end; - -procedure TwbFile.AddMasters(aMasters: TStrings); -var - OldMasterCount : Integer; - Header : IwbContainerElementRef; - MasterFiles : IwbContainerElementRef; - IsNew : Boolean; - rec : IwbRecord; - i, j : Integer; -begin - OldMasterCount := GetMasterCount; - - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - - if GetIsNotPlugin then - Exit; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbContainerElementRef, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - IsNew := False; - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - if not Assigned(MasterFiles) then begin - Header.Assign(5, nil, False); - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - Assert(Assigned(MasterFiles)); - IsNew := True; - end; - - for i := 0 to Pred(aMasters.Count) do begin - if IsNew then begin - Assert(MasterFiles.ElementCount = 1); - Rec := (MasterFiles[0] as IwbContainer).RecordBySignature['MAST']; - IsNew := False; - end else begin - j := MasterFiles.ElementCount; - MasterFiles.Assign(High(Integer), nil, False); - Assert(MasterFiles.ElementCount = Succ(j)); - Rec := (MasterFiles[j] as IwbContainer).RecordBySignature['MAST']; - end; - - Assert(Assigned(Rec)); - Assert(Rec.EditValue = ''); - - Rec.EditValue := aMasters[i]; - AddMaster(aMasters[i]); - end; - - MasterCountUpdated(OldMasterCount, GetMasterCount); - SortRecords; -end; - -procedure TwbFile.BuildReachable; -var - Group : IwbGroupRecord; - i : Integer; - Rec : IwbMainRecord; - Cnt : IwbContainerElementRef; - Cnt2 : IwbContainerElementRef; - Flg : IwbElement; - s : string; -begin - Assert(Length(cntElements) > 0); - cntElements[0].Reached; - - for i := Low(flRecords) to High(flRecords) do - if flRecords[i].LoadOrderFormID > $800 then - break - else - if flRecords[i].IsWinningOverride then - (flRecords[i] as IwbElementInternal).Reached; - - Group := GetGroupBySignature('GMST'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('ANIO'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('IDLE'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('LSCR'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - - if wbGameMode = gmTES4 then begin - Group := GetGroupBySignature('SKIL'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('BSGN'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - - Group := GetGroupBySignature('CLAS'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt) then begin - Flg := Cnt.ElementByName['Flags']; - if Assigned(Flg) then begin - s := Flg.EditValue; - if (Length(s) > 0) and (s[1]='1') then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; - end else begin - Group := GetGroupBySignature('AVIF'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('ADDN'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('CAMS'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('CPTH'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('NAVI'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - Group := GetGroupBySignature('RADS'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - (Group.Elements[i] as IwbElementInternal).Reached; - - Group := GetGroupBySignature('PERK'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt) then begin - Flg := Cnt.ElementByName['Playable']; - if Assigned(Flg) then begin - if Flg.NativeValue <> 0 then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; - - Group := GetGroupBySignature('HDPT'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt) then begin - if (Integer(Cnt.NativeValue) and 1) <> 0 then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - - Group := GetGroupBySignature('DIAL'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt2) then begin - Flg := Cnt2.ElementByName['Flags']; - if Assigned(Flg) then begin - s := Flg.SortKey[False]; - if (Length(s)>1) and (s[2] = '1') then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; - - Group := GetGroupBySignature('NPC_'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['ACBS'], IwbContainerElementRef, Cnt) then begin - Flg := Cnt.ElementByName['Flags']; - if Assigned(Flg) then begin - s := Flg.EditValue; - if (Length(s) > 2) and (s[3]='1') then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; - end; - - Group := GetGroupBySignature('RACE'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt) then begin - Flg := Cnt.ElementByName['Flags']; - if Assigned(Flg) then begin - s := Flg.EditValue; - if (Length(s) > 0) and (s[1]='1') then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; - - Group := GetGroupBySignature('QUST'); - if Assigned(Group) then - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Rec) then begin - if Rec.IsWinningOverride then begin - Cnt := Rec as IwbContainerElementRef; - if Supports(Cnt.RecordBySignature['DATA'], IwbContainerElementRef, Cnt) then begin - Flg := Cnt.Elements[0]; - if Assigned(Flg) then begin - s := Flg.EditValue; - if (Length(s) > 0) and (s[1]='1') then - (Rec as IwbElementInternal).Reached; - end; - end; - end; - end; -end; - -procedure TwbFile.BuildRef; -begin - inherited; -end; - -procedure TwbFile.CleanMasters; -var - i, j, k : Integer; - Old,New : TBytes; - Header : IwbContainerElementRef; - MasterFiles : IwbContainerElementRef; - Rec : IwbRecord; - UsedMasters : TwbUsedMasters; -begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - if (GetElementCount < 1) or not Supports(GetElement(0), IwbContainerElementRef, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Length(flMasters) >= 1 then begin - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - Assert(Assigned(MasterFiles)); - Assert(MasterFiles.ElementCount = Length(flMasters)); - - for i := Low(flMasters) to High(flMasters) do begin - Rec := (MasterFiles[i] as IwbContainer).RecordBySignature['MAST']; - Assert(Assigned(Rec)); - Assert(SameText(Rec.Value, flMasters[i].FileName)); - MasterFiles[i].SortOrder := i; - end; - - FillChar(UsedMasters, SizeOf(UsedMasters), 0); - FindUsedMasters(@UsedMasters); - - Old := nil; - New := nil; - j := 0; - for i := Low(flMasters) to High(flMasters) do - if UsedMasters[i] then begin - if i <> j then begin - flMasters[j] := flMasters[i]; - - MasterFiles[i].SortOrder := j; - SetLength(Old, Succ(Length(Old))); - Old[High(Old)] := i; - SetLength(New, Succ(Length(New))); - New[High(New)] := j; - end; - Inc(j); - end else - MasterFiles[i].SortOrder := $100; - - k := Length(flMasters); - if j <> k then begin - SetLength(flMasters, j); - - (MasterFiles as IwbContainerInternal).SortBySortOrder; - for i := Pred(MasterFiles.ElementCount) downto 0 do - if MasterFiles[i].SortOrder = $100 then - MasterFiles.RemoveElement(i); - - Assert(Length(flMasters) = MasterFiles.ElementCount); - - for i := Low(flMasters) to High(flMasters) do begin - Rec := (MasterFiles[i] as IwbContainer).RecordBySignature['MAST']; - Assert(Assigned(Rec)); - Assert(SameText(Rec.Value, flMasters[i].FileName)); - end; - - if Length(Old) > 0 then - MasterIndicesUpdated(Old, New); - MasterCountUpdated(k, j); - SortRecords; - end; - end; -end; - -constructor TwbFile.Create(const aFileName: string; aLoadOrder: Integer; aCompareTo: string; aOnlyHeader: Boolean; IsTemporary: Boolean = False); -begin - if IsTemporary then - Include(flStates, fsIsTemporary); - if aCompareTo <> '' then begin - Include(flStates, fsIsCompareLoad); - if SameText(ExtractFileName(aFileName), wbGameName + wbHardcodedDat) then - Include(flStates, fsIsHardcoded); - end else if SameText(ExtractFileName(aFileName), wbGameName + '.esm') then - Include(flStates, fsIsGameMaster); - if aOnlyHeader then - Include(flStates, fsOnlyHeader); - flCompareTo := aCompareTo; - flLoadOrder := aLoadOrder; - flFileName := aFileName; - flOpenFile; - Scan; -end; - -constructor TwbFile.CreateNew(const aFileName: string; aLoadOrder: Integer); -var - Header : IwbMainRecord; -begin - Include(flStates, fsIsNew); - flLoadOrder := aLoadOrder; - flFileName := aFileName; - Header := TwbMainRecord.Create(Self, wbHeaderSignature, 0); - if wbGameMode = gmFNV then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '1.34' - else if wbGameMode = gmFO3 then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '0.94' - else if wbGameMode = gmTES3 then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '1.30' - else if wbGameMode = gmTES4 then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '1.0' - else if wbGameMode = gmTES5 then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '1.7' - else if wbGameMode = gmSSE then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '1.7' - else if wbGameMode = gmFO4 then - Header.RecordBySignature['HEDR'].Elements[0].EditValue := '0.95'; - Header.RecordBySignature['HEDR'].Elements[2].EditValue := '2048'; - flLoadFinished := True; -end; - -destructor TwbFile.Destroy; -begin - flCloseFile; - inherited; -end; - -function TwbFile.FileFileIDtoLoadOrderFileID(aFileID: Byte): Byte; -var - NewFileID : Integer; -begin - if aFileID >= GetMasterCount then - NewFileID := GetLoadOrder - else - NewFileID := flMasters[aFileID].LoadOrder; - - if NewFileID < 0 then - raise Exception.Create('File FormID ['+IntToHex64(aFileID, 2)+'] can not be mapped to load order FormID for file "'+GetFileName+'"'); - - Result := NewFileID; -end; - -function TwbFile.FileFormIDtoLoadOrderFormID(aFormID: Cardinal): Cardinal; -var - FileID : Integer; - NewFileID : Integer; -begin - if aFormID = 0 then begin - Result := 0; - Exit; - end; - - FileID := aFormID shr 24; - if FileID >= GetMasterCount then - NewFileID := GetLoadOrder - else - NewFileID := flMasters[FileID].LoadOrder; - - if NewFileID < 0 then - raise Exception.Create('File FormID ['+IntToHex64(aFormID, 8)+'] can not be mapped to load order FormID for file "'+GetFileName+'"'); - - Result := (aFormID and $00FFFFFF) or (Cardinal(NewFileID) shl 24); -end; - -function TwbFile.FindEditorID(const aEditorID: string; var Index: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - if not flLoadFinished then - Exit; - - L := Low(flRecordsByEditorID); - H := High(flRecordsByEditorID); - while L <= H do begin - I := (L + H) shr 1; - C := CompareText(flRecordsByEditorID[I].EditorID, aEditorID); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - Index := L; -end; - -function TwbFile.FindFormID(aFormID: Cardinal; var Index: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - if not flFormIDsSorted then begin - Exit; - - for i := 0 to Pred(flRecordsCount) do - if flRecords[I].FixedFormID = aFormID then begin - Index := i; - Result := True; - Exit; - end; - Exit; - end; - - if (aFormID shr 24) > Cardinal(GetMasterCount) then - aFormID := (aFormID and $00FFFFFF) or (Cardinal(GetMasterCount) shl 24); - - L := Low(flRecords); - H := High(flRecords); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(flRecords[I].FixedFormID, aFormID); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - Index := L; -end; - -function TwbFile.FindInjectedID(aFormID: Cardinal; var Index: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - aFormID := aFormID and $00FFFFFF; - - L := Low(flInjectedRecords); - H := High(flInjectedRecords); - while L <= H do begin - I := (L + H) shr 1; - C := CmpW32(flInjectedRecords[I].FormID and $00FFFFFF, aFormID); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - Index := L; -end; - -procedure TwbFile.flCloseFile; -begin - if Assigned(flView) then begin - UnmapViewOfFile(flView); - flView := nil; - end; - - if (flMapHandle <> INVALID_HANDLE_VALUE) and (flMapHandle <> 0) then begin - CloseHandle(flMapHandle); - flMapHandle := INVALID_HANDLE_VALUE; - end; - - if (flFileHandle <> INVALID_HANDLE_VALUE) and (flFileHandle <> 0) then begin - CloseHandle(flFileHandle); - flFileHandle := INVALID_HANDLE_VALUE; - end; - if fsIsTemporary in flStates then - try - DeleteFile(Self.flFileName); - except - wbProgressCallback('Could not delete temporary file '+flFileName); - end; -end; - -procedure TwbFile.flOpenFile; -const - FileAccessMode: array[Boolean] of Cardinal = (GENERIC_READ, GENERIC_READ or GENERIC_WRITE); - FileShareMode: array[Boolean] of Cardinal = (FILE_SHARE_READ, 0); - PageProtection: array[Boolean] of Cardinal = (PAGE_READONLY, PAGE_READWRITE); - ViewAccessMode: array[Boolean] of Cardinal = (FILE_MAP_READ, FILE_MAP_READ or FILE_MAP_WRITE); -begin - flProgress('Loading file'); - - flFileHandle := CreateFile( - PChar(flFileName), - FileAccessMode[False], - FileShareMode[False], - nil, - OPEN_EXISTING, - FILE_FLAG_RANDOM_ACCESS, - 0 - ); - if (flFileHandle = INVALID_HANDLE_VALUE) or (flFileHandle = 0) then - RaiseLastOSError; - - flMapHandle := CreateFileMapping( - flFileHandle, - nil, - PageProtection[False], - 0, - 0, - nil - ); - if (flMapHandle = INVALID_HANDLE_VALUE) or (flMapHandle = 0) then - RaiseLastOSError; - - flView := MapViewOfFileEx( - flMapHandle, - ViewAccessMode[False], - 0, - 0, - 0, - nil - ); - - if not Assigned(flView) then - RaiseLastOSError; - - flEndPtr := Pointer( Cardinal(flView) + GetFileSize(flFileHandle, nil) ); - - flProgress('File loaded'); -end; - -procedure TwbFile.flProgress(const aStatus: string); -begin - if Assigned(wbProgressCallback) then - wbProgressCallback('['+GetFileName+'] ' + aStatus); -end; - -procedure TwbFile.ForceClosed; -var - i: Integer; -begin - for i := High(flRecords) downto Low(flRecords) do - (flRecords[i] as IwbMainRecordInternal).ClearForRelease; - for i := High(flInjectedRecords) downto Low(flInjectedRecords) do - (flInjectedRecords[i] as IwbMainRecordInternal).ClearForRelease; - flMasters := nil; - flRecords := nil; - flRecordsByEditorID := nil; - flInjectedRecords := nil; - ReleaseElements; - flCloseFile; -end; - -procedure TwbFile.ForceLoadOrder(aValue: Integer); -begin - flLoadOrder := aValue; -end; - -function TwbFile.GetAddList: TDynStrings; -var - i, j : Integer; - GroupRecord : IwbGroupRecord; - RecordDef : PwbRecordDef; -begin - Result := nil; - - if not IsElementEditable(nil) then - Exit; - - with TStringList.Create do try - Sorted := True; - Duplicates := dupIgnore; - - AddStrings(wbGroupOrder); - - for i := 0 to Pred(GroupToSkip.Count) do - if Find(GroupToSkip[i], j) then - Delete(j); - for i := 0 to Pred(RecordToSkip.Count) do - if Find(RecordToSkip[i], j) then - Delete(j); - for i := Succ(Low(cntElements)) to High(cntElements) do - if Supports(cntElements[i], IwbGroupRecord, GroupRecord) then - if GroupRecord.GroupType = 0 then - if Find(TwbSignature(GroupRecord.GroupLabel), j) then - Delete(j); - - Sorted := False; - - for i := Pred(Count) downto 0 do - if wbFindRecordDef(AnsiString(Strings[i]), RecordDef) then - Strings[i] := Strings[i] + ' - ' + RecordDef.Name - else - Delete(i); - - SetLength(Result, Count); - for i := 0 to Pred(Count) do - Result[i] := Strings[i]; - finally - Free; - end; -end; - -function TwbFile.GetBaseName: string; -begin - Result := GetFileName; - if fsIsHardcoded in flStates then - Result := wbGameName + '.exe'; -end; - -function TwbFile.GetElementType: TwbElementType; -begin - Result := etFile; -end; - -function TwbFile.GetFile: IwbFile; -begin - Result := Self; -end; - -function TwbFile.GetFileName: string; -begin - Result := ExtractFileName(flFileName); -end; - -function TwbFile.GetFileStates: TwbFileStates; -begin - Result := flStates; -end; - -function TwbFile.GetGroupBySignature(const aSignature: TwbSignature): IwbGroupRecord; -var - SelfRef: IwbContainerElementRef; - i: Integer; -begin - SelfRef := Self; - DoInit; - - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbGroupRecord, Result) and - (Result.GroupType = 0) and - (TwbSignature(Result.GroupLabel) = aSignature) then - Exit; - - Result := nil; -end; - -function TwbFile.GetHasNoFormID: Boolean; -begin - Result := GetIsNotPlugin or (fsHasNoFormID in flStates); -end; - -function TwbFile.GetHeader: IwbMainRecord; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self; - DoInit; - - if (Length(cntElements) > 0) and - (Supports(cntElements[0], IwbMainRecord, Result)) and - (Result.Signature = wbHeaderSignature) then begin - {Result already set} - end else - Result := nil; -end; - -function TwbFile.GetIsEditable: Boolean; -begin - Result := wbIsInternalEdit or ( - wbEditAllowed and - not (fsIsGameMaster in flStates) and - not (fsIsHardcoded in flStates) and - not (fsIsCompareLoad in flStates) - ); -end; - -function TwbFile.GetIsESM: Boolean; -var - Header : IwbMainRecord; -begin - if GetIsNotPlugin then begin - Result := False; - Exit; - end; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - Result := Header.IsESM; -end; - -function TwbFile.GetIsLocalized: Boolean; -var - Header : IwbMainRecord; -begin - if GetIsNotPlugin then begin - Result := False; - Exit; - end; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - Result := Header.IsLocalized; -end; - -function TwbFile.GetNextObjectID: Cardinal; -var - Header : IwbContainerElementRef; -begin - if (GetElementCount > 0) and Supports(GetElement(0), IwbContainerElementRef, Header) then - Result := Cardinal(Header.ElementNativeValues['HEDR\Next Object ID']) - else - Result := 0; -end; - -procedure TwbFile.SetNextObjectID(aObjectID: Cardinal); -var - Header : IwbMainRecord; -begin - if (GetElementCount > 0) and Supports(GetElement(0), IwbContainerElementRef, Header) then - Header.ElementNativeValues['HEDR\Next Object ID'] := aObjectID; -end; - -function TwbFile.GetIsNotPlugin: Boolean; -begin - Result := not wbIsPlugin(flFileName); -end; - -function TwbFile.GetIsRemoveable: Boolean; -begin - Result := False; -end; - -function TwbFile.GetLoadOrder: Integer; -begin - Result := flLoadOrder; -end; - -function TwbFile.GetMaster(aIndex: Integer): IwbFile; -begin - Result := flMasters[aIndex]; -end; - -function TwbFile.GetMasterCount: Integer; -begin - Result := Length(flMasters); -end; - -function TwbFile.GetMasterRecordByFormID(aFormID: Cardinal; aAllowInjected: Boolean): IwbMainRecord; -var - FileID : Byte; - Master : IwbFile; -begin - FileID := aFormID shr 24; - - if FileID >= Cardinal(GetMasterCount) then begin - Result := nil; - end else begin - Master := flMasters[FileID]; - Result := Master.RecordByFormID[(aFormID and $00FFFFFF) or (Cardinal(Master.MasterCount) shl 24), aAllowInjected]; - end; -end; - -procedure TwbFile.GetMasters(aMasters: TStrings); -var - Header : IwbMainRecord; - MasterFiles : IwbContainerElementRef; - Rec : IwbRecord; - i : Integer; -begin - if (GetElementCount <> 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Header.Signature <> wbHeaderSignature then - raise Exception.CreateFmt('Expected header signature '+wbHeaderSignature+', found %s in file "%s"', [String(Header.Signature), flFileName]); - - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - if Assigned(MasterFiles) then - for i := 0 to Pred(MasterFiles.ElementCount) do begin - Rec := (MasterFiles[i] as IwbContainer).RecordBySignature['MAST']; - if not Assigned(Rec) then - raise Exception.CreateFmt('Unexpected error reading master list for file "%s"', [flFileName]); - aMasters.Add(Rec.Value); - end; -end; - -function TwbFile.GetName: string; -begin - Result := GetFileName; - if fsIsHardcoded in flStates then - Result := wbGameName + '.exe'; - if flLoadOrder >= 0 then - Result := '['+IntToHex64(flLoadOrder, 2)+'] ' + Result; -end; - -function TwbFile.GetRecord(aIndex: Integer): IwbMainRecord; -begin - Result := flRecords[aIndex]; -end; - -function TwbFile.GetRecordByEditorID(const aEditorID: string): IwbMainRecord; -var - i: Integer; -begin - Result := nil; - if FindEditorID(aEditorID, i) then - Result := flRecordsByEditorID[i] - else - for i := Pred(GetMasterCount) downto 0 do begin - Result := GetMaster(i).RecordByEditorID[aEditorID]; - if Assigned(Result) then - Exit; - end; -end; - -function TwbFile.GetRecordByFormID(aFormID: Cardinal; aAllowInjected: Boolean): IwbMainRecord; -var - i: Integer; -begin - if FindFormID(aFormID, i) then begin - Result := flRecords[i]; - Exit; - end else if aAllowInjected and ((aFormID shr 24) >= Cardinal(GetMasterCount)) and FindInjectedID(aFormID, i) then begin - Result := flInjectedRecords[i]; - Exit; - end; - - Result := GetMasterRecordByFormID(aFormID, aAllowInjected); -end; - -function TwbFile.GetRecordCount: Integer; -begin - Result := Length(flRecords); -end; - -function TwbFile.GetReferenceFile: IwbFile; -begin - Result := Self; -end; - -function TwbFile.GetUnsavedSince: TDateTime; -begin - Result := flUnsavedSince; -end; - -function TwbFile.HasGroup(const aSignature: TwbSignature): Boolean; -begin - Result := GetGroupBySignature(aSignature) <> nil; -end; - -function TwbFile.HasMaster(const aFileName: string): Boolean; -var - i: Integer; -begin - Result := False; - for i := 0 to Pred(GetMasterCount) do begin - Result := SameText(GetMaster(i).FileName, aFileName); - if Result then - Exit; - end; - -end; - -procedure TwbFile.InjectMainRecord(const aRecord: IwbMainRecord); -var - i: Integer; -begin - if Length(flInjectedRecords) > 0 then begin - if FindInjectedID(aRecord.FormID, i) then begin - if [fsIsHardcoded, fsIsCompareLoad] * flInjectedRecords[i]._File.FileStates = [] then begin - if Assigned(wbProgressCallback) then - wbProgressCallback(''); - end; - (flInjectedRecords[i] as IwbMainRecordInternal).AddOverride(aRecord); - Exit; - end - end else - i := 0; - - if [fsIsHardcoded, fsIsCompareLoad] * aRecord._File.FileStates = [] then begin - if Assigned(wbProgressCallback) then - wbProgressCallback(''); - end; - - SetLength(flInjectedRecords, Succ(Length(flInjectedRecords))); - if i < High(flInjectedRecords) then begin - Move(flInjectedRecords[i], flInjectedRecords[Succ(i)], SizeOf(Pointer) * (High(flInjectedRecords) - i)); - Pointer(flInjectedRecords[i]) := nil; - end; - flInjectedRecords[i] := aRecord; -end; - -function TwbFile.IsElementEditable(const aElement: IwbElement): Boolean; -begin - Result := wbIsInternalEdit or GetIsEditable; -end; - -function TwbFile.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := False; - - if not IsElementEditable(aElement) then - Exit; - - if Assigned(aElement) then - case aElement.ElementType of - etMainRecord: Result := (aElement as IwbMainRecord).Signature <> wbHeaderSignature; {can't remove the file header} - etGroupRecord: Result := True; - else - Assert(False); - end; -end; - -function TwbFile.LoadOrderFileIDtoFileFileID(aFileID: Byte): Byte; -var - NewFileID : Integer; - i : Integer; -begin - NewFileID := -1; - if aFileID = GetLoadOrder then - NewFileID := GetMasterCount - else - for i := 0 to Pred(GetMasterCount) do - if flMasters[i].LoadOrder = aFileID then begin - NewFileID := i; - Break; - end; - if NewFileID < 0 then - raise Exception.Create('Load order FileID ['+IntToHex64(aFileID, 2)+'] can not be mapped to file FileID for file "'+GetFileName+'"'); - Result := NewFileID; -end; - -function TwbFile.LoadOrderFormIDtoFileFormID(aFormID: Cardinal): Cardinal; -var - FileID : Integer; - NewFileID : Integer; - i : Integer; -begin - if aFormID = 0 then begin - Result := 0; - Exit; - end; - - FileID := aFormID shr 24; - NewFileID := -1; - if FileID = GetLoadOrder then - NewFileID := GetMasterCount - else - for i := 0 to Pred(GetMasterCount) do - if flMasters[i].LoadOrder = FileID then begin - NewFileID := i; - Break; - end; - if NewFileID < 0 then - raise Exception.Create('Load order FormID ['+IntToHex64(aFormID, 8)+'] can not be mapped to file FormID for file "'+GetFileName+'"'); - Result := (aFormID and $00FFFFFF) or (Cardinal(NewFileID) shl 24); -end; - -function TwbFile.NewFormID: Cardinal; -var - SelfRef : IwbContainerElementRef; - FileHeader : IwbMainRecord; - HEDR : IwbRecord; - -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if Length(cntElements) < 1 then - raise Exception.Create('File '+GetFileName+' has no file header'); - - if cntElements[0].ElementType <> etMainRecord then - raise Exception.Create('File '+GetFileName+' has invalid record '+cntElements[0].Name+' as file header.'); - - FileHeader := cntElements[0] as IwbMainRecord; - if FileHeader.Signature <> wbHeaderSignature then - raise Exception.Create('File '+GetFileName+' has invalid record '+cntElements[0].Name+' with invalid signature as file header.'); - - HEDR := FileHeader.RecordBySignature['HEDR']; - if not Assigned(HEDR) then - raise Exception.Create('File '+GetFileName+' has a file header with missing HEDR subrecord'); - - Result := StrToInt64Def(HEDR.Elements[2].EditValue, 2048); - Result := Result and $00FFFFFF; - - if (Result = 0) or (Result = $00FFFFFF) then - Result := StrToInt64Def(HEDR.Elements[1].EditValue, 2048); - - if Result < 2048 then - Result := 2048; - - Result := (Result and $00FFFFFF) or (Cardinal(GetMasterCount) shl 24); - while GetRecordByFormID(Result, True) <> nil do begin - Inc(Result); - if Cardinal(Result shr 24) <> Cardinal(Length(flMasters)) then - Result := Cardinal(2048) or (Cardinal(GetMasterCount) shl 24); - end; - HEDR.Elements[2].EditValue := IntToStr(Succ(Result) and $00FFFFFF); -end; - -procedure TwbFile.PrepareSave; -var - SelfRef : IwbContainerElementRef; - i, j, k : Integer; - GroupRecord : IwbGroupRecord; - Groups : array of Boolean; - RecordCount : Cardinal; - - FileHeader: IwbMainRecord; - HEDR: IwbRecord; - MasterFiles : IwbContainerElementRef; - MasterFile : IwbContainerElementRef; - ONAMs: IwbContainerElementRef; - NewONAM: IwbElement; - Current: IwbMainRecord; - FormID: Cardinal; - FileID: Cardinal; - Signature : TwbSignature; - Master : IwbMainRecord; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if Length(cntElements) < 1 then - raise Exception.Create('File '+GetFileName+' has no file header'); - - if not GetIsNotPlugin then begin - if cntElements[0].ElementType <> etMainRecord then - raise Exception.Create('File '+GetFileName+' has invalid record '+cntElements[0].Name+' as file header.'); - - FileHeader := cntElements[0] as IwbMainRecord; - if FileHeader.Signature <> wbHeaderSignature then - raise Exception.Create('File '+GetFileName+' has invalid record '+cntElements[0].Name+' with invalid signature as file header.'); - - HEDR := FileHeader.RecordBySignature['HEDR']; - if not Assigned(HEDR) then - raise Exception.Create('File '+GetFileName+' has a file header with missing HEDR subrecord'); - - inherited; - - SetLength(Groups, wbGroupOrder.Count); - for i := Succ(Low(cntElements)) to High(cntElements) do begin - if not Supports(cntElements[i], IwbGroupRecord, GroupRecord) then - raise Exception.Create('File '+GetFileName+' contains invalid top level record: '+ cntElements[i].Name); - if GroupRecord.GroupType <> 0 then - raise Exception.Create('File '+GetFileName+' contains invalid top level group type '+IntToStr(GroupRecord.GroupType)+' for group: '+ cntElements[i].Name); - if GroupRecord.SortOrder < 0 then - raise Exception.Create('File '+GetFileName+' contains top level group without known sort order: '+ cntElements[i].Name); - if GroupRecord.SortOrder > High(Groups) then - raise Exception.Create('File '+GetFileName+' contains top level group with invalid sort order: '+ cntElements[i].Name); - if Groups[GroupRecord.SortOrder] then - raise Exception.Create('File '+GetFileName+' contains duplicated top level group: '+ cntElements[i].Name); - Groups[GroupRecord.SortOrder] := True; - end; - - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[1], High(cntElements), CompareSortOrder); - - RecordCount := GetCountedRecordCount; - if RecordCount < 1 then - raise Exception.Create('File '+GetFileName+' has an invalid record count'); - - HEDR.Elements[1].EditValue := IntToStr(Pred(RecordCount)); - - j := 0; - ONAMs := nil; - if wbGameMode in [gmFO3, gmFNV, gmTES5, gmSSE, gmFO4] then begin - Include(TwbMainRecord(FileHeader).mrStates, mrsNoUpdateRefs); - while FileHeader.RemoveElement('ONAM') <> nil do - ; - if Supports(FileHeader.ElementByName['Master Files'], IwbContainerElementRef, MasterFiles) then - for i := 0 to Pred(MasterFiles.ElementCount) do begin - if Supports(MasterFiles.Elements[i], IwbContainerElementRef, MasterFile) then begin - // Fallout 4 CK creates ONAMs in ESP too - if FileHeader.IsESM or (wbGameMode = gmFO4) then - while j <= High(flRecords) do begin - Current := flRecords[j]; - FormID := Current.FixedFormID; - FileID := FormID shr 24; - if FileID > i then - Break; - Assert(FileID = i); - Inc(j); - - Signature := Current.Signature; - - if (Signature = 'NAVM') or - (Signature = 'LAND') or - (Signature = 'REFR') or - (Signature = 'PGRE') or - (Signature = 'PMIS') or - (Signature = 'ACHR') or - (Signature = 'ACRE') or - (Signature = 'PARW') or {>>> Skyrim <<<} - (Signature = 'PBEA') or {>>> Skyrim <<<} - (Signature = 'PFLA') or {>>> Skyrim <<<} - (Signature = 'PCON') or {>>> Skyrim <<<} - (Signature = 'PBAR') or {>>> Skyrim <<<} - (Signature = 'PHZD') or {>>> Skyrim <<<} - // Fallout 4 (and later games?) - ((wbGameMode >= gmFO4) and ( - (Signature = 'SCEN') or - (Signature = 'DLBR') or - (Signature = 'DIAL') or - (Signature = 'INFO') - )) - then begin - - if (not wbMasterUpdateFilterONAM) or Current.IsWinningOverride then begin - // ONAMs are for overridden temporary refs only - if Current.IsPersistent then - Continue; - - if not Assigned(ONAMs) then begin - if not Supports(FileHeader.Add('ONAM', True), IwbContainerElementRef, ONAMs) then - Assert(False); - Assert(ONAMs.ElementCount = 1); - NewONAM := ONAMs.Elements[0]; - end else - NewONAM := ONAMs.Assign(High(Integer), nil, True); - - NewONAM.NativeValue := FormID; - - if wbMasterUpdateFixPersistence and not Current.IsPersistent and not Current.IsMaster then begin - Master := Current.Master; - if Assigned(Master) then begin - if Master.IsPersistent then begin - flProgress('Setting Persistent: ' + Current.Name); - Current.IsPersistent := True; - end else - for k := 0 to Pred(Master.OverrideCount) do - if Current.Equals(Master.Overrides[k]) then - Break - else - if Master.Overrides[k].IsPersistent then begin - flProgress('Setting Persistent: ' + Current.Name); - Current.IsPersistent := True; - Break; - end; - end; - end; - - end; - - end; - - end; - end; - if j > High(flRecords) then - Break; - end; - Exclude(TwbMainRecord(FileHeader).mrStates, mrsNoUpdateRefs); - FileHeader.UpdateRefs; - end; - - if wbClampFormID then begin - if Supports(FileHeader.ElementByName['Master Files'], IwbContainerElementRef, MasterFiles) then - k := MasterFiles.ElementCount - else - k := 0; - for i := Low(flRecords) to High(flRecords) do - flRecords[i].ClampFormID(k); - end; - end else - inherited; -end; - -function TwbFile.Reached: Boolean; -begin - Result := False; -end; - -procedure TwbFile.RemoveInjectedMainRecord(const aRecord: IwbMainRecord); -var - i: Integer; -begin - if (Length(flInjectedRecords) > 0) and FindInjectedID(aRecord.FormID, i) then begin - - Assert( (aRecord as IwbElement) = (flInjectedRecords[i] as IwbElement) ); - - flInjectedRecords[i] := nil; - if i < High(flInjectedRecords) then begin - Move(flInjectedRecords[Succ(i)], flInjectedRecords[i], SizeOf(Pointer) * (High(flInjectedRecords) - i)); - Pointer(flInjectedRecords[High(flInjectedRecords)]) := nil; - end; - SetLength(flInjectedRecords, Pred(Length(flInjectedRecords))); - - end; -end; - -procedure TwbFile.RemoveMainRecord(const aRecord: IwbMainRecord); -var - i : Integer; - Master : IwbMainRecord; - FileID : Byte; -begin - if not Assigned(aRecord) then - Exit; - if aRecord.FormID <> 0 then begin - Assert(flLoadFinished); - - if (Length(flRecords) < 1) or not FindFormID(aRecord.FormID, i) then - raise Exception.Create('Can''t remove FormID ['+IntToHex64(aRecord.FormID, 8)+'] from file '+GetName+': FormID not registered'); - - flRecords[i] := nil; - if i < High(flRecords) then begin - Move(flRecords[Succ(i)], flRecords[i], SizeOf(Pointer) * (High(flRecords) - i)); - Pointer(flRecords[High(flRecords)]) := nil; - end; - SetLength(flRecords, Pred(Length(flRecords))); - - FileID := aRecord.FormID shr 24; - if FileID >= Cardinal(GetMasterCount) then begin - {record for this file} - end else try - Master := GetMasterRecordByFormID(aRecord.FormID, True); - if Assigned(Master) and ((Master as IwbElement) <> (aRecord as IwbElement)) then - (Master as IwbMainRecordInternal).RemoveOverride(aRecord) - else - (GetMaster(FileID) as IwbFileInternal).RemoveInjectedMainRecord(aRecord); - except - on E: Exception do - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: <'+e.Message+'> while trying to determine master record for ' + aRecord.Name); - end; - end; -end; - -procedure TwbFile.Scan; -var - CurrentPtr : Pointer; - Header : IwbMainRecord; - HEDR : IwbRecord; - MasterFiles : IwbContainerElementRef; - Rec : IwbRecord; - i, j : Integer; - SelfRef : IwbContainerElementRef; - - Groups : array of IwbGroupRecord; - GroupRecord : IwbGroupRecord; - - IsInternal : Boolean; -begin - SelfRef := Self as IwbContainerElementRef; - flProgress('Start processing'); - - CurrentPtr := flView; - TwbRecord.CreateForPtr(CurrentPtr, flEndPtr, Self, nil); - - if (GetElementCount <> 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Header.Signature <> wbHeaderSignature then - raise Exception.CreateFmt('Expected header signature TES4, found %s in file "%s"', [String(Header.Signature), flFileName]); - - if fsOnlyHeader in flStates then - Exit; - - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - if Assigned(MasterFiles) then - for i := 0 to Pred(MasterFiles.ElementCount) do begin - Rec := (MasterFiles[i] as IwbContainer).RecordBySignature['MAST']; - if not Assigned(Rec) then - raise Exception.CreateFmt('Unexpected error reading master list for file "%s"', [flFileName]); - AddMaster(Rec.Value); - end; - - if flCompareTo <> '' then - AddMaster(flCompareTo); - - flRecordsCount := 0; - HEDR := Header.RecordBySignature['HEDR']; - if Assigned(HEDR) then begin - SetLength(flRecords, StrToInt(HEDR.Elements[1].Value)); - end; - - flProgress('Header processed. Expecting ' + IntToStr(Length(flRecords)) + ' records'); - - while Cardinal(CurrentPtr) < Cardinal(flEndPtr) do begin - Rec := TwbRecord.CreateForPtr(CurrentPtr, flEndPtr, Self, nil); - flProgress(Rec.Name + ' processed'); - end; - - if flRecordsCount < Length(flRecords) then - SetLength(flRecords, flRecordsCount); - - flProgress('Building FormID index'); - if flRecordsCount < Length(flRecords) then - SetLength(flRecords, flRecordsCount); - SortRecords; - flProgress('FormID index built'); - - flProgress('Building EditorID index'); - if flRecordsByEditorIDCount < Length(flRecordsByEditorID) then - SetLength(flRecordsByEditorID, flRecordsByEditorIDCount); - SortRecordsByEditorID; - flProgress('EditorID index built'); - - if wbGameMode in [gmFNV, gmTES5, gmSSE, gmFO4] then begin - IsInternal := not GetIsEditable and wbBeginInternalEdit(True); - try - SetLength(Groups, wbGroupOrder.Count); - for i := High(cntElements) downto Succ(Low(cntElements)) do begin - if not Supports(cntElements[i], IwbGroupRecord, GroupRecord) then begin - flProgress('Error: File contains invalid top level record: '+ cntElements[i].Name); - Continue; - end; - if GroupRecord.GroupType <> 0 then begin - flProgress('Error: File contains invalid top level group type '+IntToStr(GroupRecord.GroupType)+' for group: '+ cntElements[i].Name); - Continue; - end; - if GroupRecord.SortOrder < 0 then begin - flProgress('Error: File contains top level group without known sort order: '+ cntElements[i].Name); - Continue; - end; - if GroupRecord.SortOrder > High(Groups) then begin - flProgress('Error: File contains top level group with invalid sort order: '+ cntElements[i].Name); - Continue; - end; - if Assigned(Groups[GroupRecord.SortOrder]) then begin - flProgress('Warning: File contains duplicated top level group: ' + cntElements[i].Name); - if wbBeginInternalEdit(True) then try - if Groups[GroupRecord.SortOrder].ElementCount = 0 then begin - Groups[GroupRecord.SortOrder].Remove; - Groups[GroupRecord.SortOrder] := nil; - Groups[GroupRecord.SortOrder] := GroupRecord; - end else begin - j := 0; - while GroupRecord.ElementCount > 0 do begin - Groups[GroupRecord.SortOrder].AddElement(GroupRecord.RemoveElement(0, True)); - Inc(j); - end; - (Groups[GroupRecord.SortOrder] as IwbGroupRecordInternal).Sort; - (Groups[GroupRecord.SortOrder] as IwbGroupRecordInternal).SetModified(True); - flProgress('Merged ' + IntToStr(j) + ' record from duplicated group: ' + cntElements[i].Name); - GroupRecord.Remove; - end; - finally - wbEndInternalEdit; - end; - Continue; - end; - Groups[GroupRecord.SortOrder] := GroupRecord; - end; - finally - if IsInternal then - wbEndInternalEdit; - end; - end; - - flProgress('Processing completed'); - flLoadFinished := True; -end; - -procedure TwbFile.SetHasNoFormID(Value: Boolean); -begin - if Value or GetIsNotPlugin then - Include(flStates, fsHasNoFormID) - else - Exclude(flStates, fsHasNoFormID); -end; - -procedure TwbFile.SetIsESM(Value: Boolean); -var - Header : IwbMainRecord; -begin - if GetIsNotPlugin then begin - Exit; - end; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Value <> Header.IsESM then begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - - Header.IsESM := Value; - end; -end; - -procedure TwbFile.SetIsLocalized(Value: Boolean); -var - Header : IwbMainRecord; -begin - if GetIsNotPlugin then begin - Exit; - end; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbMainRecord, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Value <> Header.IsLocalized then begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - - Header.IsLocalized := Value; - end; -end; - -procedure TwbFile.SetLoadOrder(aValue: Integer); -begin - flLoadOrder := aValue; -end; - -procedure TwbFile.SetModified(aValue: Boolean); -begin - if not (esUnsaved in eStates) and not wbIsInternalEdit then - flUnsavedSince := Now; - - inherited; -end; - -function CompareRecords(Item1, Item2: Pointer): Integer; -var - FormID1 : Cardinal; - FormID2 : Cardinal; -begin - FormID1 := IwbMainRecord(Item1).FixedFormID; - FormID2 := IwbMainRecord(Item2).FixedFormID; - - if FormID1 < FormID2 then - Result := -1 - else if FormID1 = FormID2 then - Result := 0 - else - Result := 1; -end; - -function CompareOverrides(Item1, Item2: Pointer): Integer; -var - LoadOrder1 : Cardinal; - LoadOrder2 : Cardinal; -begin - LoadOrder1 := IwbMainRecord(Item1)._File.LoadOrder; - LoadOrder2 := IwbMainRecord(Item2)._File.LoadOrder; - - if LoadOrder1 < LoadOrder2 then - Result := -1 - else if LoadOrder1 = LoadOrder2 then - Result := 0 - else - Result := 1; -end; - -function CompareRecordsByEditorID(Item1, Item2: Pointer): Integer; -begin - Result := CompareText(IwbMainRecord(Item1).EditorID, IwbMainRecord(Item2).EditorID); -end; - -procedure TwbFile.SortMasters; -var - OldList : TStringList; - i, j : Integer; - Old,New : TBytes; - Header : IwbContainerElementRef; - MasterFiles : IwbContainerElementRef; - Rec : IwbRecord; -begin - if not IsElementEditable(nil) then - raise Exception.Create('File "'+GetFileName+'" is not editable'); - if GetIsNotPlugin then - Exit; - - if (GetElementCount < 1) or not Supports(GetElement(0), IwbContainerElementRef, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Length(flMasters) > 1 then begin - MasterFiles := Header.ElementByName['Master Files'] as IwbContainerElementRef; - Assert(Assigned(MasterFiles)); - Assert(MasterFiles.ElementCount = Length(flMasters)); - OldList := TStringList.Create; - OldList.Sorted := True; - OldList.Duplicates := dupError; - try - for i := Low(flMasters) to High(flMasters) do begin - Rec := (MasterFiles[i] as IwbContainer).RecordBySignature['MAST']; - Assert(Assigned(Rec)); - Assert(SameText(Rec.Value, flMasters[i].FileName)); - OldList.AddObject(flMasters[i].FileName, Pointer(i)); - MasterFiles[i].SortOrder := i; - end; - - wbMergeSort(@flMasters[0], Length(flMasters), CompareLoadOrder); - - Old := nil; - New := nil; - for i := Low(flMasters) to High(flMasters) do begin - j := Integer(OldList.Objects[OldList.IndexOf(flMasters[i].FileName)]); - if i <> j then begin - MasterFiles[j].SortOrder := i; - SetLength(Old, Succ(Length(Old))); - Old[High(Old)] := j; - SetLength(New, Succ(Length(New))); - New[High(New)] := i; - end; - end; - if Length(Old) > 0 then begin - (MasterFiles as IwbContainerInternal).SortBySortOrder; - MasterIndicesUpdated(Old, New); - end; - finally - OldList.Free; - end; - SortRecords; - end; -end; - -type - TwbRecordSortEntry = record - rseFormID : Cardinal; - rseMainRecord : Pointer; - end; - TwbRecordSortEntries = array of TwbRecordSortEntry; - - PwbRecordSortEntry = ^TwbRecordSortEntry; - TwbRecordSortEntryPtrs = array of PwbRecordSortEntry; - -function CompareSortEntryPtrs(Item1{eax}, Item2{edx}: Pointer): Integer; -asm - {$IFDEF WIN32} - mov ecx, [eax + TwbRecordSortEntry.rseFormID] - mov edx, [edx + TwbRecordSortEntry.rseFormID] - xor eax, eax - cmp ecx, edx - mov ecx, -1 - cmovb eax, ecx - seta al - {$ENDIF WIN32} - {$IFDEF WIN64} - mov rcx, [rcx + TwbRecordSortEntry.rseFormID] - mov rdx, [rdx + TwbRecordSortEntry.rseFormID] - xor rax, rax - cmp rcx, rdx - mov rcx, -1 - cmovb rax, rcx - seta al - {$ENDIF WIN64} -end; - -procedure TwbFile.SortRecords; -var - SortEntries : TwbRecordSortEntries; - SortEntryPtrs : TwbRecordSortEntryPtrs; - i : Integer; -begin - i := Length(flRecords); - if i > 0 then begin - SetLength(SortEntries, i); - SetLength(SortEntryPtrs, i); - for i := Low(flRecords) to High(flRecords) do begin - SortEntries[i].rseFormID := flRecords[i].FixedFormID; - SortEntries[i].rseMainRecord := Pointer(flRecords[i]); - SortEntryPtrs[i] := @SortEntries[i]; - end; - wbMergeSort(@SortEntryPtrs[0], Length(SortEntryPtrs), CompareSortEntryPtrs); - for i := Low(flRecords) to High(flRecords) do - Pointer(flRecords[i]) := SortEntryPtrs[i].rseMainRecord; - end; - flFormIDsSorted := True; -end; - -procedure TwbFile.SortRecordsByEditorID; -begin - if Length(flRecordsByEditorID) > 0 then - wbMergeSort(@flRecordsByEditorID[0], Length(flRecordsByEditorID), CompareRecordsByEditorID); -end; - -procedure TwbFile.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - PrepareSave; - inherited WriteToStreamInternal(aStream, aResetModified); - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -type - TwbUnionFlags = ( - ufNone, - ufArray, - ufSortedArray, - ufFlags - ); - -function ArrayDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; out SizePrefix: Integer): Boolean; forward; -procedure StructDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer); forward; -function UnionDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer): TwbUnionFlags; forward; -function ValueDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Boolean; forward; - -{ TwbContainer } - -function TwbContainer.Add(const aName: string; aSilent: Boolean): IwbElement; -begin - Result := nil; -end; - -procedure TwbContainer.AddElement(const aElement: IwbElement); -begin - if not Assigned(aElement) then - Exit; - - SetLength(cntElements, Succ(Length(cntElements))); - cntElements[High(cntElements)] := aElement as IwbElementInternal; - cntElements[High(cntElements)].SetContainer(Self); - NotifyChanged(eContainer); -end; - -function TwbContainer.IndexOf(const aElement: IwbElement): Integer; -var - i: Integer; -begin - Result := -1; - if Assigned(aElement) then - for i := Low(cntElements) to High(cntElements) do - if aElement.Equals(cntElements[i]) then begin - Result := i; - Exit; - end; -end; - -procedure TwbContainer.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -var - i: Integer; - j: Integer; - k: Integer; - l: Integer; - m: Integer; - n: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - m := Low(Integer); - for l := Low(cntElements) to High(cntElements) do - if cntElements[l].MemoryOrder > m then - m := cntElements[l].MemoryOrder; - for l := Low(cntElements) to High(cntElements) do - if cntElements[l].MemoryOrder = Low(Integer) then begin - cntElements[l].MemoryOrder := m + 1; - Inc(m); - end; - m := Low(Integer); - k := Low(Integer); - for i := Low(cntElements) to High(cntElements) do begin - n := k; - j := High(Integer); - for l := Low(cntElements) to High(cntElements) do begin - if (m= Low(cntElements)); - Assert(k <> n); - m := cntElements[k].MemoryOrder; - cntElements[k].InformStorage(aBasePtr, aEndPtr); - end; -end; - -procedure TwbContainer.InsertElement(aPosition: Integer; const aElement: IwbElement); -begin - if not Assigned(aElement) then - Exit; - - SetLength(cntElements, Succ(Length(cntElements))); - - if aPosition < Low(cntElements) then - aPosition := Low(cntElements) - else if aPosition > High(cntElements) then - aPosition := High(cntElements); - - if aPosition < High(cntElements) then begin - Move(cntElements[aPosition], cntElements[Succ(aPosition)], (High(cntElements) - aPosition) * SizeOf(Pointer)); - Pointer(cntElements[aPosition]) := nil; - end; - - cntElements[aPosition] := aElement as IwbElementInternal; - cntElements[aPosition].SetContainer(Self); - NotifyChanged(eContainer); -end; - -function TwbContainer.IsElementEditable(const aElement: IwbElement): Boolean; -begin - if Assigned(eContainer) then - Result := IwbContainer(eContainer).IsElementEditable(Self) - else - Result := True; -end; - -function TwbContainer.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := False; -end; - -function LockedInc(var Target: Integer): Integer; register; -asm - {$IFDEF WIN32} - mov ecx, eax - mov eax, 1 - lock xadd [ecx], eax - inc eax - {$ENDIF WIN32} - {$IFDEF WIN64} - mov rax, 1 - lock xadd [rcx], rax - inc rax - {$ENDIF WIN64} -end; - -function LockedDec(var Target: Integer): Integer; register; -asm - {$IFDEF WIN32} - mov ecx, eax - mov eax, -1 - lock xadd [ecx], eax - dec eax - {$ENDIF WIN32} - {$IFDEF WIN64} - mov rax, -1 - lock xadd [rcx], rax - dec rax - {$ENDIF WIN64} -end; - -procedure TwbContainer.AfterConstruction; -begin - inherited; - {$IFDEF WIN64} - LockedDec(cntElementRefs); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock dec dword ptr [eax + cntElementRefs] - end; - {$ENDIF WIN32} -end; - -function TwbContainer.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - Container : IwbContainer; - uContainer : IwbContainerElementRef; - sElement : IwbElement; - BasePtr : Pointer; - i, j : Integer; - SelfRef : IwbContainerElementRef; - ValueDef : IwbValueDef; - UnionDef : IwbUnionDef; - HasMap : Boolean; - StructDef : IwbStructDef; - OurSize : Integer; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - DoInit; - - if inherited CanAssignInternal(aIndex, aElement, False) then - Result := inherited AssignInternal(aIndex, aElement, aOnlySK); - - if (aIndex = Low(Integer)) and (Length(cntElements) > 0) then begin - - if Supports(aElement, IwbContainer, Container) and (Container.ElementCount = GetElementCount) then begin - - ValueDef := GetValueDef; - if (ValueDef = aElement.ValueDef) or - ( Assigned(ValueDef) and - ( - ValueDef.Equals(aElement.ValueDef) or - ValueDef.CanAssign(Self, aIndex, aElement.ValueDef) - ) - ) then begin - HasMap := Length(cntElementsMap) > 0; - if HasMap then begin - Assert(Length(cntElements) = Length(cntElementsMap)); - //if the elements haven't got their space allocated yet, we need - //to make sure they are first written to in the "on disk" order - //before copying in the mapped order below - SetToDefault; - end; - for i := Low(cntElements) to High(cntElements) do begin - if HasMap then - j := cntElementsMap[i] - else - j := i; - - // if we have a union, we cannot progress until the union has been resolved and its cntElements is populated - sElement := Container.Elements[i]; - if (sElement.ElementType = etUnion) and - Supports(cntElements[j], IwbContainerElementRef, uContainer) and - Supports(uContainer.GetValueDef, IwbUnionDef, UnionDef) then begin - if (uContainer.ElementCount = 1) then begin // At this point it is usually the default choice set by default - uContainer.RemoveElement(0); - end; - if (uContainer.ElementCount = 0) then begin - BasePtr := nil; - UnionDoInit(UnionDef, uContainer as IwbContainer, BasePtr, nil); - end; - end; - if (not aOnlySK or GetIsInSK(cntElements[j].SortOrder)) then begin - if cntElements[j].CanAssign(Low(Integer), sElement, False) then - cntElements[j].Assign(Low(Integer), sElement, aOnlySK) - else if Supports(sElement.ValueDef, IwbEmptyDef) then begin - // this might be a case the source begin a struct - // with "OptionalFromElement" empty elements at the end - If Supports(Container.ResolvedValueDef, IwbStructDef, StructDef) then - if StructDef.OptionalFromElement >= 0 then - if StructDef.OptionalFromElement <= j then begin - //yes it is - Assert(not HasMap); //this would be really tricky to handle with mapped elements... - Assert(Self is TwbDataContainer); //if the source is a struct and is assignable to us, this should be guaranteed - OurSize := 0; - for j := Low(cntElements) to Pred(i) do - Inc(OurSize, cntElements[j].DataSize); - if GetDataSize > OurSize then - with TwbDataContainer(Self) do begin - UpdateStorageFromElements; - Assert(Length(dcDataStorage) >= OurSize); - Assert(not (dcfStorageInvalid in dcFlags)); - Reset; - SetLength(dcDataStorage, OurSize); - if OurSize > 0 then begin - dcDataBasePtr := @dcDataStorage[Low(dcDataStorage)]; - dcDataEndPtr := Pointer( Cardinal(dcDataBasePtr) + OurSize ); - end else begin - dcDataBasePtr := @EmptyPtr; - dcDataEndPtr := @EmptyPtr; - end; - Init; - end; - Exit; - end; - end; - end; - end; - end; - end; - - end; -end; - -procedure TwbContainer.Bar; -begin - -end; - -procedure TwbContainer.BeforeDestruction; -begin - Assert(cntElementRefs = 0); - inherited BeforeDestruction; - {$IFDEF WIN64} - LockedInc(cntElementRefs); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock inc dword ptr [eax + cntElementRefs] - end; - {$ENDIF WIN32} -end; - -procedure TwbContainer.BuildRef; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Include(cntStates, csRefsBuild); - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].BuildRef; -end; - -function TwbContainer.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -var - Container : IwbContainer; - i : Integer; - SelfRef : IwbContainerElementRef; - ValueDef : IwbValueDef; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if not Assigned(aElement) then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - SelfRef := Self as IwbContainerElementRef; - - Result := inherited CanAssignInternal(aIndex, aElement, aCheckDontShow); - - DoInit; - - if not Result and (aIndex = Low(Integer)) and (Length(cntElements) > 0) then begin - - if Supports(aElement, IwbContainer, Container) and (Container.ElementCount = GetElementCount) then begin - ValueDef := GetValueDef; - Result := (ValueDef = aElement.ValueDef) or - ( Assigned(ValueDef) and - ( - ValueDef.Equals(aElement.ValueDef) or - ValueDef.CanAssign(Self, aIndex, aElement.ValueDef) - ) - ); - end; - - if Result then - for i := Low(cntElements) to High(cntElements) do begin - Result := - (cntElements[i].ConflictPriority = cpIgnore) or - (Container.Elements[i].ConflictPriority = cpIgnore) or - cntElements[i].CanAssign(Low(Integer), Container.Elements[i], aCheckDontShow); - if not Result then - Exit; - end; - end; -end; - -function TwbContainer.CanChangeElementMember(const aElement: IwbElement): Boolean; -var - SubRecordArrayDef : IwbSubRecordArrayDef; -begin - Result := Supports(GetDef, IwbSubRecordArrayDef, SubRecordArrayDef) and - Supports(SubRecordArrayDef.Element, IwbSubRecordUnionDef) and - IsElementEditable(Self); -end; - -function TwbContainer.CanMoveElement: Boolean; -begin - Result := False; -end; - -function TwbContainer.CanMoveElementDown(const aElement: IwbElement): Boolean; -var - i: Integer; -begin - Result := False; - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanMoveElement then - Exit; - if Length(cntElements) < 2 then - Exit; - if cntElements[High(cntElements)].Equals(aElement) then - Exit; - Result := True; - for i := 0 to Pred(High(cntElements)) do - if cntElements[i].Equals(aElement) then - Exit; - Result := False; -end; - -function TwbContainer.CanMoveElementUp(const aElement: IwbElement): Boolean; -var - i: Integer; -begin - Result := False; - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanMoveElement then - Exit; - if Length(cntElements) < 2 then - Exit; - if cntElements[0].Equals(aElement) then - Exit; - Result := True; - for i := 1 to High(cntElements) do - if cntElements[i].Equals(aElement) then - Exit; - Result := False; -end; - -function TwbContainer.CanElementReset: Boolean; -begin - if Assigned(eContainer) then - Result := IwbContainer(eContainer).CanElementReset - else - Result := True; -end; - -function TwbContainer.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := False; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - Result := cntElements[i].CompareExchangeFormID(aOldFormID, aNewFormID) or Result; -end; - -procedure TwbContainer.CreatedEmpty; -begin - Include(cntStates, csAsCreatedEmpty); -end; - -procedure TwbContainer.Init; -begin - { can be overriden } -end; - -destructor TwbContainer.Destroy; -begin - ReleaseElements; - inherited; -end; - -procedure TwbContainer.DoInit; -var - i : Integer; - ValueDef : IwbValueDef; - KAC : PwbKeepAliveContext; -begin - if esDestroying in eStates then - Exit; - if csInit in cntStates then - Exit; - if [csInitializing, csReseting] * cntStates <> [] then - Exit; - Include(cntStates, csInitializing); - try - cntElementsMap := nil; - Include(cntStates, csInit); - Include(cntStates, csInitOnce); - Init; - Include(cntStates, csInitDone); - for i := Low(cntElements) to High(cntElements) do - cntElements[i].MemoryOrder := i; - ValueDef := GetValueDef; - if Assigned(ValueDef) then - cntElementsMap := ValueDef.GetElementMap; - if not wbSpeedOverMemory then - if not (GetElementType in [etMainRecord, etGroupRecord]) then - if not Assigned(cntKeepAliveNext) and (Length(cntElements) > 0) then begin - KAC := wbKeepAliveContext; - if Assigned(KAC) then begin - cntKeepAliveNext := KAC.kacHead; - KAC.kacHead := Self as IwbContainerElementRef; - end; - end; - finally - Exclude(cntStates, csInitializing); - end; -end; - -procedure TwbContainer.DoReset(aForce: Boolean); -begin - if not aForce then begin - if Length(cntElements) = 0 then - Exit; - if not (csInit in cntStates) then - Exit; - if esModified in eStates then - Exit; - if cntElementRefs > 0 then - Exit; - if not CanElementReset then - Exit; - end; - - if [csInitializing, csReseting] * cntStates <> [] then - Exit; - - {$IFDEF WIN64} - LockedInc(cntElementRefs); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock inc dword ptr [eax + cntElementRefs] - end; - {$ENDIF WIN32} - try - Include(cntStates, csReseting); - Exclude(cntStates, csInitDone); - Reset; - cntElementsMap := nil; - finally - Exclude(cntStates, csReseting); - {$IFDEF WIN64} - LockedDec(cntElementRefs); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock dec dword ptr [eax + cntElementRefs] - end; - {$ENDIF WIN32} - Exclude(cntStates, csInit); - end; -end; - -{$D-} -function TwbContainer.ElementAddRef: Integer; -begin - {$IFDEF WIN64} - LockedInc(cntElementRefs); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock inc dword ptr [eax + cntElementRefs] - end; - {$ENDIF WIN32} - Result := inherited _AddRef; -end; -{$D+} - -procedure TwbContainer.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -begin - NotifyChanged(aContainer); -end; - -{$D-} -function TwbContainer.ElementRelease: Integer; -label - Skip; -begin - {$IFDEF WIN64} - if LockedDec(cntElementRefs) = 0 then - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, -1 - mov ecx, [Self] - lock xadd dword ptr [ecx + cntElementRefs], eax - cmp eax, 1 - jne Skip - end; - {$ENDIF WIN32} - DoReset(False); -Skip: - - Result := inherited _Release; -end; -{$D+} - -function TwbContainer.FindBySortKey(const aSortKey: string; aExtended: Boolean; out aIndex: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - - L := Low(cntElements); - H := High(cntElements); - while L <= H do begin - I := (L + H) shr 1; - C := CompareStr(cntElements[I].SortKey[aExtended], aSortKey); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - aIndex := L; -end; - -procedure TwbContainer.FindUsedMasters(aMasters: PwbUsedMasters); -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - inherited; - SelfRef := Self as IwbContainerElementRef; - DoInit; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].FindUsedMasters(aMasters); -end; - -procedure TwbContainer.FreeInstance; -begin - Assert(cntElementRefs = 1); - inherited; -end; - -function TwbContainer.GetAdditionalElementCount: Integer; -begin - Result := 0; -end; - -function TwbContainer.GetAddList: TDynStrings; -begin - Result := nil; -end; - -function TwbContainer.GetContainerStates: TwbContainerStates; -begin - Result := cntStates; -end; - -function TwbContainer.GetDataSize: Integer; -var - i : Integer; - SelfRef : IwbContainerElementRef; - DataContainer : IwbDataContainer; -begin - SelfRef := Self as IwbContainerElementRef; - Result := 0; - DoInit; - for i := Low(cntElements) to High(cntElements) do begin - if Supports(cntElements[i], IwbDataContainer, DataContainer) and DataContainer.DontSave then - Continue; - - Inc(Result, cntElements[i].DataSize); - end; -end; - -function TwbContainer.GetElement(aIndex: Integer): IwbElement; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - if not Assigned(cntElements) or (aIndex>=Length(cntElements)) then begin // Using the wrong contained array at the time - if wbMoreInfoForIndex and (DebugHook <> 0) and Assigned(wbProgressCallback) then - wbProgressCallback('Debugger: ['+ IwbElement(Self).Path +'] Index ' + IntToStr(aIndex) + ' greater than max '+ - IntToStr(Length(cntElements)-1)); - Result := nil - end else begin - if Length(cntElementsMap) = Length(cntElements) then - aIndex := cntElementsMap[aIndex]; - Result := IInterface(cntElements[aIndex]) as IwbElement; - end; -end; - -function TwbContainer.GetElementByName(const aName: string): IwbElement; -var - i: integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := nil; - for i := Low(cntElements) to High(cntElements) do - if SameText(cntElements[i].Name, aName) then begin - Result := IInterface(cntElements[i]) as IwbElement; - Exit; - end; - for i := Low(cntElements) to High(cntElements) do - if SameText(cntElements[i].DisplayName, aName) then begin - Result := IInterface(cntElements[i]) as IwbElement; - Exit; - end; -end; - -function TwbContainer.GetElementByPath(const aPath: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Path : string; - Container : IwbContainerElementRef; -begin - Result := nil; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aPath, Path); - if not Assigned(Element) then - Exit; - - if Path = '' then - Result := Element - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementByPath[Path]; -end; - -function TwbContainer.GetElementByMemoryOrder(aSortOrder: Integer): IwbElement; -var - i: integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Dec(aSortOrder, GetAdditionalElementCount); - Result := nil; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].MemoryOrder = aSortOrder then begin - Result := IInterface(cntElements[i]) as IwbElement; - Exit; - end; -end; - -function TwbContainer.GetElementBySignature(const aSignature: TwbSignature): IwbElement; -var - i: integer; - HasSignature: IwbHasSignature; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := nil; - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbHasSignature, HasSignature) then - if HasSignature.Signature = aSignature then begin - Result := HasSignature; - Exit; - end; -end; - -function TwbContainer.GetElementBySortOrder(aSortOrder: Integer): IwbElement; -var - i: integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Dec(aSortOrder, GetAdditionalElementCount); - Result := nil; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].SortOrder = aSortOrder then begin - Result := IInterface(cntElements[i]) as IwbElement; - Exit; - end; -end; - -function TwbContainer.GetElementCount: Integer; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := Length(cntElements); -end; - -function TwbContainer.GetElementEditValue(const aName: string): string; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - Result := ''; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := Element.EditValue - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementEditValues[Name]; -end; - -function TwbContainer.GetElementExists(const aName: string): Boolean; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - Result := False; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := True - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementExists[Name]; -end; - -function TwbContainer.GetElementLinksTo(const aName: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - Result := nil; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := Element.LinksTo - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementLinksTo[Name]; -end; - -function TwbContainer.GetElementNativeValue(const aName: string): Variant; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - VarClear(Result); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := Element.NativeValue - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementNativeValues[Name]; -end; - -function TwbContainer.GetElementSortKey(const aName: string; - aExtended: Boolean): string; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - Result := ''; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := Element.SortKey[aExtended] - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementSortKeys[Name, aExtended]; -end; - -function TwbContainer.GetElementValue(const aName: string): string; -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - Result := ''; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name); - if not Assigned(Element) then - Exit; - - if Name = '' then - Result := Element.Value - else if Supports(Element, IwbContainerElementRef, Container) then - Result := Container.ElementValues[Name]; -end; - -function TwbContainer.GetIsInSK(aIndex: Integer): Boolean; -begin - Result := False; -end; - -function TwbContainer.GetRecordBySignature(const aSignature: TwbSignature): IwbRecord; -var - i: integer; - lRecord: IwbRecord; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := nil; - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbRecord, lRecord) then - if lRecord.Signature = aSignature then begin - Result := lRecord; - Exit; - end; -end; - -function TwbContainer.GetCountedRecordCount: Cardinal; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - Result := 0; - DoInit; - for i := Low(cntElements) to High(cntElements) do - Inc(Result, cntElements[i].GetCountedRecordCount); -end; - -function TwbContainer.GetSortKeyInternal(aExtended: Boolean): string; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := ''; - for i := Low(cntElements) to High(cntElements) do begin - Result := Result + cntElements[i].SortKey[aExtended]; - if i < High(cntElements) then - Result := Result + '|'; - end; -end; - -function TwbContainer.HasErrors: Boolean; -var - SelfRef : IwbContainerElementRef; - i : Integer; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := inherited HasErrors; - if Result then - Exit; - - for i := Low(cntElements) to High(cntElements) do begin - Result := cntElements[i].HasErrors; - if Result then - Exit; - end; -end; - -function TwbContainer.LastElement: IwbElement; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - if Length(cntElements) > 0 then - Result := IInterface(cntElements[High(cntElements)]) as IwbElement - else - Result := nil; -end; - -procedure TwbContainer.MarkModifiedRecursive; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - for i := Low(cntElements) to High(cntElements) do - cntElements[i].MarkModifiedRecursive; - inherited; -end; - -procedure TwbContainer.MasterCountUpdated(aOld, aNew: Byte); -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].MasterCountUpdated(aOld, aNew); -end; - -procedure TwbContainer.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - inherited; - SelfRef := Self as IwbContainerElementRef; - DoInit; - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].MasterIndicesUpdated(aOld, aNew); -end; - -procedure TwbContainer.MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); -var - i: Integer; - j: Integer; - k: Integer; - l: Integer; - m: Integer; - n: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - If GetElementType in SortedElementTypes then - begin - m := Low(Integer); - for l := Low(cntElements) to High(cntElements) do - if (cntElements[l].MemoryOrder > m) and not Supports(cntElements[l], IwbStringListTerminator) then - m := cntElements[l].MemoryOrder; - for l := Low(cntElements) to High(cntElements) do - if cntElements[l].MemoryOrder = Low(Integer) then begin - cntElements[l].MemoryOrder := m + 1; - Inc(m); - end; - for l := Low(cntElements) to High(cntElements) do - if Supports(cntElements[l], IwbStringListTerminator) then - cntElements[l].MemoryOrder := m+1; - m := Low(Integer); - k := Low(Integer); - for i := Low(cntElements) to High(cntElements) do begin - n := k; - j := High(Integer); - for l := Low(cntElements) to High(cntElements) do begin - if (m= Low(cntElements)); - if k = n then - Assert(k <> n); - m := cntElements[k].MemoryOrder; - cntElements[k].MergeStorage(aBasePtr, aEndPtr); - end; - end - else - for l := Low(cntElements) to High(cntElements) do - cntElements[l].MergeStorage(aBasePtr, aEndPtr); -end; - -procedure TwbContainer.MoveElementDown(const aElement: IwbElement); -var - i: Integer; -begin - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanMoveElement then - Exit; - if Length(cntElements) < 2 then - Exit; - if cntElements[High(cntElements)].Equals(aElement) then - Exit; - for i := 0 to Pred(High(cntElements)) do - if cntElements[i].Equals(aElement) then begin - SetModified(True); - InvalidateStorage; - cntElements[i] := cntElements[Succ(i)]; - cntElements[Succ(i)] := aElement as IwbElementInternal; - Exit; - end; -end; - -procedure TwbContainer.MoveElementUp(const aElement: IwbElement); -var - i: Integer; -begin - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanMoveElement then - Exit; - if Length(cntElements) < 2 then - Exit; - if cntElements[0].Equals(aElement) then - Exit; - for i := 1 to High(cntElements) do - if cntElements[i].Equals(aElement) then begin - SetModified(True); - InvalidateStorage; - cntElements[i] := cntElements[Pred(i)]; - cntElements[Pred(i)] := aElement as IwbElementInternal; - Exit; - end; -end; - -class function TwbContainer.NewInstance: TObject; -begin - Result := inherited NewInstance; - TwbContainer(Result).cntElementRefs := 1; -end; - -procedure TwbContainer.NextElementMember(const aElement: IwbElement); -var - ElementIndex : Integer; - ElementDef : IwbRecordMemberDef; - Element : IwbElement; - Container : IwbContainer; - SubRecordArrayDef : IwbSubRecordArrayDef; - SubRecordUnionDef : IwbSubRecordUnionDef; - RecordDef : IwbRecordDef; - i : Integer; -begin - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanChangeElementMember(aElement) then - Exit; - if not Supports(GetDef, IwbSubRecordArrayDef, SubRecordArrayDef) or - not Supports(SubRecordArrayDef.Element, IwbSubRecordUnionDef, SubRecordUnionDef) then - Exit; - if not Supports(SubRecordArrayDef.Element, IwbRecordDef, RecordDef) then - Exit; - if Supports(aElement.Container, IwbContainer, Container) then begin - for i := 0 to Pred(RecordDef.MemberCount) do - if RecordDef.Members[i].Equals(aElement.Def) then - break; - if i < RecordDef.MemberCount then begin - RemoveElement(aElement); - ElementIndex := (i + 1) mod RecordDef.MemberCount; - ElementDef := RecordDef.Members[ElementIndex]; - - case ElementDef.DefType of - dtSubRecord: - Element := TwbSubRecord.Create(Self, ElementDef as IwbSubRecordDef); - dtSubRecordArray: - Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordArrayDef); - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordStructDef); - else - Assert(False); - end; - - if Assigned(Element) and Assigned(aElement) then try - Element.Assign(Low(Integer), nil, False); - if csAsCreatedEmpty in cntStates then - Exclude(cntStates, csAsCreatedEmpty); - except - Element.Container.RemoveElement(Element); - raise; - end; - end; - end; -end; - -procedure TwbContainer.NotifyChangedInternal(aContainer: Pointer); -begin - if [csInitializing, csReseting] * cntStates <> [] then - Exit; - if csAsCreatedEmpty in cntStates then - Exclude(cntStates, csAsCreatedEmpty); - - inherited; - - if esModified in eStates then - DoAfterSet(varEmpty, varEmpty); -end; - -procedure TwbContainer.PrepareSave; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - if wbDelayLoadRecords then - if not (esModified in eStates) then - Exit; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - for i := High(cntElements) downto Low(cntElements) do - cntElements[i].PrepareSave; -end; - -procedure TwbContainer.PreviousElementMember(const aElement: IwbElement); -var - ElementIndex : Integer; - ElementDef : IwbRecordMemberDef; - Element : IwbElement; - Container : IwbContainer; - SubRecordArrayDef : IwbSubRecordArrayDef; - SubRecordUnionDef : IwbSubRecordUnionDef; - RecordDef : IwbRecordDef; - i : Integer; -begin - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - if not CanChangeElementMember(aElement) then - Exit; - if not Supports(GetDef, IwbSubRecordArrayDef, SubRecordArrayDef) or - not Supports(SubRecordArrayDef.Element, IwbSubRecordUnionDef, SubRecordUnionDef) then - Exit; - if not Supports(SubRecordArrayDef.Element, IwbRecordDef, RecordDef) then - Exit; - if Supports(aElement.Container, IwbContainer, Container) then begin - for i := 0 to Pred(RecordDef.MemberCount) do - if RecordDef.Members[i].Equals(aElement.Def) then - break; - if i < RecordDef.MemberCount then begin - RemoveElement(aElement); - ElementIndex := (i - 1) mod RecordDef.MemberCount; - ElementDef := RecordDef.Members[ElementIndex]; - - case ElementDef.DefType of - dtSubRecord: - Element := TwbSubRecord.Create(Self, ElementDef as IwbSubRecordDef); - dtSubRecordArray: - Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordArrayDef); - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordStructDef); - else - Assert(False); - end; - - if Assigned(Element) and Assigned(aElement) then try - Element.Assign(Low(Integer), nil, False); - if csAsCreatedEmpty in cntStates then - Exclude(cntStates, csAsCreatedEmpty); - except - Element.Container.RemoveElement(Element); - raise; - end; - end; - end; -end; - -function TwbContainer.Reached: Boolean; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - Result := False; - - if GetDontShow then - Exit; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := inherited Reached; - if not Result then - Exit; - - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].Reached; -end; - -function TwbContainer.ReleaseElements: TDynElementInternals; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - if not (esDestroying in eStates) then - SelfRef := Self as IwbContainerElementRef; - - Result := cntElements; - cntElements := nil; - for i := Low(Result) to High(Result) do - Result[i].SetContainer(nil); - Exclude(cntStates, csAsCreatedEmpty); -end; - -function TwbContainer.ReleaseKeepAlive: IwbContainerElementRef; -begin - Result := cntKeepAliveNext; - cntKeepAliveNext := nil; -end; - -function TwbContainer.RemoveElement(const aElement: IwbElement; aMarkModified: Boolean = False): IwbElement; -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - Result := aElement; - if not Assigned(aElement) then - Exit; - - if Length(cntElements) > 0 then begin - if cntElements[High(cntElements)].Equals(aElement) then begin - Result := RemoveElement(High(cntElements), aMarkModified); - Exit; - end; - - for i := Low(cntElements) to Pred(High(cntElements)) do - if cntElements[i].Equals(aElement) then begin - Result := RemoveElement(i, aMarkModified); - Exit; - end; - end; - - Result := nil; - Exit; -end; - -function TwbContainer.RemoveElement(const aName: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - Name : string; - Container : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := ResolveElementName(aName, Name); - if not Assigned(Result) then - Exit; - - if Name = '' then - Result.Remove - else if Supports(Result, IwbContainerElementRef, Container) then - Result := Container.RemoveElement(Name) - else - Result := nil; -end; - -function TwbContainer.RemoveInjected(aCanRemove: Boolean): Boolean; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := GetReferencesInjected; - if not Result then - for i := High(cntElements) downto Low(cntElements) do - if cntElements[i].CanContainFormIDs then begin - Result := cntElements[i].RemoveInjected(True) or Result; - if Result and aCanRemove then - Break; - end; - if Result and aCanRemove and GetIsRemoveable then begin - Result := False; - Remove; - end; -end; - -procedure TwbContainer.ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - inherited; - if Recursive or (Initial and not Supports(Self, IwbGroupRecord)) then - for i := Low(cntElements) to High(cntElements) do - if cntElements[i].CanContainFormIDs then - cntElements[i].ReportRequiredMasters(aStrings, aAsNew, Recursive); -end; - -function TwbContainer.RemoveElement(aPos: Integer; aMarkModified: Boolean = False): IwbElement; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := nil; - - if aPos < Low(cntElements) then - Exit - else if aPos > High(cntElements) then - Exit; - - if aMarkModified then begin - SetModified(True); - InvalidateStorage; - end; - - Result := IInterface(cntElements[aPos]) as IwbElement; - cntElements[aPos].SetContainer(nil); - cntElements[aPos] := nil; - - if aPos < High(cntElements) then begin - Move(cntElements[Succ(aPos)], cntElements[aPos], (High(cntElements) - aPos) * SizeOf(Pointer)); - Pointer(cntElements[High(cntElements)]) := nil; - end; - - SetLength(cntElements, Pred(Length(cntElements))); - NotifyChanged(eContainer); -end; - -procedure TwbContainer.Reset; -begin - { can be overriden } -end; - -procedure TwbContainer.ResetConflict; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; -// DoInit; elements that don't exist yet don't have anything to reset... - inherited; - for i := Low(cntElements) to High(cntElements) do - cntElements[i].ResetConflict; -end; - -procedure TwbContainer.ResetReachable; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; -// DoInit; elements that don't exist yet don't have anything to reset... - inherited; - for i := Low(cntElements) to High(cntElements) do - cntElements[i].ResetReachable; -end; - -procedure TwbContainer.ResetTags; -var - i: Integer; -begin - inherited; - for i := Low(cntElements) to High(cntElements) do - cntElements[i].ResetTags; -end; - -function TwbContainer.ResolveElementName(aName: string; out aRemainingName: string; aCanCreate: Boolean = False): IwbElement; -var - i : Integer; -begin - aRemainingName := ''; - i := Pos('\', aName); - if i > 0 then begin - aRemainingName := Copy(aName, Succ(i), High(Integer)); - Delete(aName, i, High(Integer)); - end; - if aName = '..' then - Result := GetContainer - else if (Length(aName) > 0) and (aName[1] = '[') and (aName[Length(aName)] = ']') then begin - i := StrToIntDef(Copy(aName, 2, Length(aName) - 2), 0); - Result := GetElement(i); - end - else - Result := GetElementByName(aName); - if not Assigned(Result) and (Length(aName) = 4) then - Result := GetElementBySignature(StrToSignature(aName)); -end; - -procedure TwbContainer.ReverseElements; -var - Temp: TDynElementInternals; - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - SetLength(Temp, Length(cntElements)); - for i := Low(cntElements) to High(cntElements) do - Temp[High(cntElements)-i] := cntElements[i]; - cntElements := Temp; -end; - -procedure TwbContainer.SetElementEditValue(const aName, aValue: string); -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name, True); - if not Assigned(Element) then - Exit; - - if Name = '' then - Element.EditValue := aValue - else if Supports(Element, IwbContainerElementRef, Container) then - Container.ElementEditValues[Name] := aValue; -end; - -procedure TwbContainer.SetElementNativeValue(const aName: string; const aValue: Variant); -var - SelfRef : IwbContainerElementRef; - Element : IwbElement; - Name : string; - Container : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Element := ResolveElementName(aName, Name, True); - if not Assigned(Element) then - Exit; - - if Name = '' then - Element.NativeValue := aValue - else if Supports(Element, IwbContainerElementRef, Container) then - Container.ElementNativeValues[Name] := aValue; -end; - -procedure TwbContainer.SetToDefaultInternal; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - inherited; - - for i := Low(cntElements) to High(cntElements) do - cntElements[i].SetToDefault; -end; - -procedure TwbContainer.SortBySortOrder; -var - i, j: Integer; -begin - SetModified(True); - i := GetAdditionalElementCount; - j := Length(cntElements) - i; - if j > 1 then begin - wbMergeSort(@cntElements[i], j, CompareSortOrder); - InvalidateStorage; - end; -end; - -procedure TwbContainer.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - i: Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - inherited; - for i := Low(cntElements) to High(cntElements) do - cntElements[i].WriteToStream(aStream, aResetModified); - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -{$D-} -function TwbContainer._AddRef: Integer; -begin - if wbSpeedOverMemory then - Result := ElementAddRef - else - Result := inherited _AddRef; -end; - -function TwbContainer._Release: Integer; -begin - if wbSpeedOverMemory then - Result := ElementRelease - else begin - Result := inherited _Release; - if (Result > 0) and (cntElementRefs = 0) and (csInit in cntStates) then - DoReset(False); - end; -end; -{$D+} - -//------------------------------------------------------------------------------ -// TwbRecord -//------------------------------------------------------------------------------ - -constructor TwbRecord.Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aPrevMainRecord : IwbMainRecord); -var - Dummy: Integer; -begin - inherited Create(aContainer, aBasePtr, aEndPtr, aPrevMainRecord); - recSkipped := recSkipped or RecordToSkip.Find(GetSignature, Dummy); - InformPrevMainRecord(aPrevMainRecord); - ScanData; -end; - -class function TwbRecord.CreateForPtr(var aPtr : Pointer; - aEndPtr : Pointer; - const aContainer : IwbContainer; - const aPrevMainRecord : IwbMainRecord) - : IwbRecord; -begin - if aContainer.ElementType = etMainRecord then - Result := TwbSubRecord.Create(aContainer, aPtr, aEndPtr, aPrevMainRecord) - else - if PwbSignature(aPtr)^ = 'GRUP' then - Result := TwbGroupRecord.Create(aContainer, aPtr, aEndPtr, aPrevMainRecord) - else - Result := TwbMainRecord.Create(aContainer, aPtr, aEndPtr, aPrevMainRecord); -end; - -function TwbRecord.GetName: string; -var - Sig : TwbSignature; - i : Integer; -begin - Sig := GetSignature; - for i := Low(Sig) to High(Sig) do - if Ord(Sig[i]) < 32 then - Sig[i] := AnsiChar( Ord('a') + Ord(Sig[i]) ); - - Result := Sig; -end; - -function TwbRecord.GetSkipped: Boolean; -begin - Result := recSkipped; -end; - -procedure TwbRecord.InformPrevMainRecord(const aPrevMainRecord: IwbMainRecord); -begin - {can be overriden} -end; - -procedure TwbRecord.SortBySortOrder; -begin - SetModified(True); - if Length(cntElements) > 1 then begin - wbMergeSort(@cntElements[1], High(cntElements), CompareSortOrder); - InvalidateStorage; - end; -end; - -function TwbRecord.GetSignature: TwbSignature; -begin - if Assigned(dcBasePtr) then - Result := PwbSignature(dcBasePtr)^ - else - Result := NONE; -end; - -{ TwbMainRecord } - -function TwbMainRecord.Add(const aName: string; aSilent: Boolean): IwbElement; -var - s : string; - SelfRef : IwbContainerElementRef; - i : Integer; - Group : IwbGroupRecord; -begin - Result := nil; - - if not wbIsInternalEdit then - if not wbEditAllowed or not GetIsEditable then - raise Exception.Create(GetName + ' can not be edited'); - - if GetIsDeleted then - Exit; - - s := Copy(aName, 1, 4); - - if (GetSignature = 'CELL') and - ( - SameText(s, 'NAVM') or - SameText(s, 'PGRD') or - SameText(s, 'LAND') or - SameText(s, 'REFR') or - SameText(s, 'PGRE') or - SameText(s, 'PMIS') or - SameText(s, 'ACRE') or - SameText(s, 'ACHR') or - SameText(s, 'PARW') or {>>> Skyrim <<<} - SameText(s, 'PBEA') or {>>> Skyrim <<<} - SameText(s, 'PFLA') or {>>> Skyrim <<<} - SameText(s, 'PCON') or {>>> Skyrim <<<} - SameText(s, 'PBAR') or {>>> Skyrim <<<} - SameText(s, 'PHZD') {>>> Skyrim <<<} - ) then begin - - Group := GetChildGroup; - if not Assigned(Group) then begin - Group := TwbGroupRecord.Create(GetContainer, 6, Self); - mrGroup := Group; - end; - - SelfRef := Group as IwbContainerElementRef; - Group := nil; - for i := 0 to Pred(SelfRef.ElementCount) do - if Supports(SelfRef.Elements[i], IwbGroupRecord, Group) then - if (Group.GroupType = 9) and (Group.GroupLabel = Self.GetFormID) then - Break - else - Group := nil; - if not Assigned(Group) then - Group := TwbGroupRecord.Create(SelfRef as IwbContainer, 9, Self); - - Result := Group.Add(aName, aSilent); - - Exit; - end else if (GetSignature = 'DIAL') and - ( - SameText(s, 'INFO') - ) then begin - - Group := GetChildGroup; - if not Assigned(Group) then begin - Group := TwbGroupRecord.Create(GetContainer, 7, Self); - mrGroup := Group; - end; - - Result := Group.Add(aName, aSilent); - - Exit; - end else if (GetSignature = 'WRLD') and - ( - SameText(s, 'ROAD') or - SameText(s, 'CELL') - ) then begin - - Group := GetChildGroup; - if not Assigned(Group) then begin - Group := TwbGroupRecord.Create(GetContainer, 1, Self); - mrGroup := Group; - end; - - Result := Group.Add(aName, aSilent); - - Exit; - end else if wbVWDAsQuestChildren and (GetSignature = 'QUST') and - ( - SameText(s, 'DLBR') or - SameText(s, 'DIAL') or - SameText(s, 'SCEN') - ) then begin - - Group := GetChildGroup; - if not Assigned(Group) then begin - Group := TwbGroupRecord.Create(GetContainer, 10, Self); - mrGroup := Group; - end; - - Result := Group.Add(aName, aSilent); - - Exit; - end; - - if Assigned(mrDef) then begin - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - for i := 0 to Pred(mrDef.MemberCount) do - if SameText(mrDef.Members[i].Name, aName) or SameText(mrDef.Members[i].DefaultSignature, aName) then begin - Result := GetElementBySortOrder(i + GetAdditionalElementCount); - if not Assigned(Result) then begin - Assign(i, nil, False); - Result := GetElementBySortOrder(i + GetAdditionalElementCount); - Assert(Assigned(Result)); - - if wbSortSubRecords and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); - end; - - Exit; - end; - end; -end; - -function TwbMainRecord.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - SelfRef : IwbContainerElementRef; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - if GetIsDeleted then - Exit; - - if Assigned(mrDef) then begin - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Assert(Assigned(aElement.Def)); - if aElement.SortOrder < 0 then begin - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - Assert(Assigned(Result)); - Assert(Assigned(Result.Def)); - Assert(aElement.Def.Equals(Result.Def)); - end else begin - Assert(aElement.SortOrder >= 0); - Assert(aElement.SortOrder < mrDef.MemberCount); - if not aElement.Def.Equals(mrDef.Members[aElement.SortOrder]) then - Assert(Self.CanAssign(aElement.SortOrder, aElement, True)); - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - end; - - if not Assigned(Result) then begin - Assign(aElement.SortOrder, aElement, not aDeepCopy); - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - Assert(Assigned(Result)); - - if wbSortSubRecords and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); - end else - Result.Assign(Low(Integer), aElement, not aDeepCopy); - end; -end; - -procedure TwbMainRecord.AddOverride(const aMainRecord: IwbMainRecord); -begin - if aMainRecord.Signature <> GetSignature then - if Assigned(wbProgressCallback) then - wbProgressCallback(Format('Warning: Record %s in file %s is being overridden by record %s in file %s.', [ - '['+ GetSignature + ':' + IntToHex64(GetFormID, 8)+ ']', - GetFile.FileName, - '['+ aMainRecord.Signature + ':' + IntToHex64(aMainRecord.FormID, 8)+ ']', - aMainRecord._File.FileName - ])); - - SetLength(mrOverrides, Succ(Length(mrOverrides))); - mrOverrides[High(mrOverrides)] := aMainRecord; - (aMainRecord as IwbMainRecordInternal).SetMaster(Self); - mrOverridesSorted := False; -end; - -procedure TwbMainRecord.AddReferencedBy(aMainRecord : IwbMainRecord); -begin - SetLength(mrReferencedBy, Succ(Length(mrReferencedBy))); - mrReferencedBy[High(mrReferencedBy)] := aMainRecord; - Include(mrStates, mrsReferencedByUnsorted); -end; - -procedure TwbMainRecord.AddReferencedFromID(aFormID: Cardinal); -begin - Assert(mrsBuildingRef in mrStates); - - if aFormID = 0 then - Exit; - - Inc(mrTmpRefFormIDHigh); - if High(mrTmpRefFormIDs) < mrTmpRefFormIDHigh then - if mrTmpRefFormIDHigh = 0 then - SetLength(mrTmpRefFormIDs, 64) - else - SetLength(mrTmpRefFormIDs, mrTmpRefFormIDHigh * 2); - - mrTmpRefFormIDs[mrTmpRefFormIDHigh] := aFormID; -end; - -function TwbMainRecord.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - MainRecord : IwbMainRecord; - Member : IwbRecordMemberDef; - Container : IwbContainerElementRef; - Element : IwbElement; - i : Integer; - SelfRef : IwbContainerElementRef; - BasePtr : Pointer; - IsAdd : Boolean; - IsAddChild : Boolean; - GroupRecord : IwbGroupRecord; - DataContainer : IwbDataContainer; - NeedUpdate : Boolean; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - if GetIsDeleted then - Exit; - - if Assigned(mrDef) then begin - - wbBeginKeepAlive; - try - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if aIndex = Low(Integer) then begin - - NeedUpdate := CheckChildOfCell; - - SetModified(True); - InvalidateStorage; - ReleaseElements; - - if Assigned(aElement) then begin - Container := aElement as IwbContainerElementRef; - - if Supports(aElement, IwbMainRecord, MainRecord) then begin - MakeHeaderWriteable; - with TwbMainRecord(MainRecord.ElementID) do begin - Self.mrStruct.mrsFlags := mrStruct.mrsFlags; - Self.mrStruct.mrsVCS1 := DefaultVCS1; - if wbGameMode in [gmFO3, gmFNV, gmTES5, gmSSE, gmFO4] then begin - Self.mrStruct.mrsVersion := mrStruct.mrsVersion; - Self.mrStruct.mrsVCS2 := DefaultVCS2; //mrStruct.mrsVCS2; - end; - end; - end; - end; - - if Supports(Self.GetContainer, IwbGroupRecord, GroupRecord) then - if wbCreateContainedIn and (GroupRecord.GroupType in [1, 4..10]) then - with TwbContainedInElement.Create(Self) do begin - _AddRef; _Release; - end; - GroupRecord := nil; - - BasePtr := dcBasePtr; - with TwbRecordHeaderStruct.Create(Self, BasePtr, Pointer( Cardinal(BasePtr) + wbSizeOfMainRecordStruct), mrDef.RecordHeaderStruct, '') do begin - Include(dcFlags, dcfDontSave); - SetSortOrder(-1); - SetMemoryOrder(Low(Integer)); - _AddRef; _Release; - end; - - if Assigned(aElement) then begin - for i := 0 to Pred(Container.ElementCount) do begin - Element := Container.Elements[i]; - Assign(Element.SortOrder, Element, aOnlySK); - end; - end else begin - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then - Assign(i, nil, False); - end; - - if NeedUpdate then - UpdateCellChildGroup; - - CollapseStorage; - - end else begin - if (aIndex >= 0) and (aIndex < mrDef.MemberCount) then begin - Member := mrDef.Members[aIndex]; - IsAdd := not Assigned(aElement) or Member.CanAssign(Self, Low(Integer), aElement.Def); - IsAddChild := not IsAdd and Assigned(aElement) and Member.CanAssign(Self, High(Integer), aElement.Def); - if IsAdd or IsAddChild then begin - Element := GetElementBySortOrder(aIndex + GetAdditionalElementCount); - if Assigned(Element) then begin - if IsAdd and Assigned(aElement) then - Element.Assign(Low(Integer), aElement, aOnlySK) - else if IsAddChild then - Element.Assign(High(Integer), aElement, aOnlySK); - end else begin - - if Member.DefType = dtSubRecordUnion then begin - if Assigned(aElement) then begin - Supports(aElement, IwbDataContainer, DataContainer); - Member := (Member as IwbRecordDef).GetMemberFor((aElement as IwbHasSignature).Signature, DataContainer); - end else - Member := (Member as IwbRecordDef).Members[0]; - Assert(Assigned(Member)); - end; - - case Member.DefType of - dtSubRecord: - Element := TwbSubRecord.Create(Self, Member as IwbSubRecordDef); - dtSubRecordArray: - Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), Member as IwbSubRecordArrayDef); - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), Member as IwbSubRecordStructDef); - else - Assert(False); - end; - - if Assigned(Element) then try - Element.SortOrder := aIndex; - Element.MemoryOrder := aIndex; - if IsAdd and Assigned(aElement) then - Element.Assign(Low(Integer), aElement, aOnlySK) - else if IsAddChild then - Element.Assign(High(Integer), aElement, aOnlySK); - except - Element.Container.RemoveElement(Element); - raise; - end; - - end; - Result := Element; - end; - end else if (aIndex = -2) then begin - Element := GetElementBySortOrder(aIndex + GetAdditionalElementCount); - if Assigned(Element) then - Element.Assign(Low(Integer), aElement, False); - Result := Element; - end; - end; - finally - wbEndKeepAlive; - end; - - if wbSortSubRecords and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); - - end else - Result := inherited AssignInternal(aIndex, aElement, aOnlySK); -end; - -procedure TwbMainRecord.BuildRef; - - procedure UseKAC; - var - KAR: IwbKeepAliveRoot; - begin - KAR := wbCreateKeepAliveRoot; - DoBuildRef(False); - end; - -begin - if wbSpeedOverMemory then - DoBuildRef(False) - else - UseKAC; - if Assigned(wbProgressCallback) then - wbProgressCallback(''); -end; - -procedure TwbMainRecord.DoBuildRef(aRemove: Boolean); -var - _File : IwbFile; - Files : array of IwbFile; - FilesCount : Integer; - SelfIntf : IwbMainRecord; - - procedure ProcessRef(aFormID: Cardinal; aAdd: Boolean); - var - FileID : Integer; - MainRecord : IwbMainRecord; - begin - if not Assigned(_File) then begin - _File := GetFile; - FilesCount := _File.MasterCount; - SetLength(Files, Succ(FilesCount)); - Files[FilesCount] := _File; - SelfIntf := Self as IwbMainRecord; - end; - - FileID := aFormID shr 24; - if FileID > FilesCount then - FileID := FilesCount; - - if not Assigned(Files[FileID]) then - Files[FileID] := _File.Masters[FileID]; - - aFormID := (aFormID and $00FFFFFF) or (Cardinal(Files[FileID].MasterCount) shl 24); - - MainRecord := Files[FileID].RecordByFormID[aFormID, True]; - if Assigned(MainRecord) then - if aAdd then - MainRecord.AddReferencedBy(SelfIntf) - else - MainRecord.RemoveReferencedBy(SelfIntf); - end; - -var - NewReferences : TDynCardinalArray; - LastFormID : Cardinal; - i, j : Integer; - NewCount : integer; - Cmp : Integer; - SelfRef : IwbContainerElementRef; -begin - if mrsBuildingRef in mrStates then - Exit; - - SelfRef := Self as IwbContainerElementRef; - - Assert(not (mrsBuildingRef in mrStates)); - Include(mrStates, mrsBuildingRef); - try - mrTmpRefFormIDHigh := -1; - mrTmpRefFormIDs := nil; - - if not aRemove then - inherited BuildRef; - - NewCount := 0; - SetLength(NewReferences, Succ(mrTmpRefFormIDHigh)); - if mrTmpRefFormIDHigh >= 0 then begin - wbMergeSort(@mrTmpRefFormIDs[0], Succ(mrTmpRefFormIDHigh), CompareFormIDs); - LastFormID := 0; - for i := 0 to mrTmpRefFormIDHigh do - if mrTmpRefFormIDs[i] <> LastFormID then begin - LastFormID := mrTmpRefFormIDs[i]; - NewReferences[NewCount] := LastFormID; - Inc(NewCount); - end; - end; - SetLength(NewReferences, NewCount); - - i := 0; - j := 0; - while (i < NewCount) and (j < Length(mrReferences)) do begin - Cmp := CmpW32(NewReferences[i], mrReferences[j]); - if Cmp = 0 then begin - Inc(i); - Inc(j); - end else if Cmp < 0 then begin - ProcessRef(NewReferences[i], True); - Inc(i); - end else begin - ProcessRef(mrReferences[j], False); - Inc(j); - end; - end; - while i < NewCount do begin - ProcessRef(NewReferences[i], True); - Inc(i); - end; - while j < Length(mrReferences) do begin - ProcessRef(mrReferences[j], False); - Inc(j); - end; - - mrReferences := NewReferences; - finally - Exclude(mrStates, mrsBuildingRef); - mrTmpRefFormIDs := nil; - end; -end; - -procedure TwbMainRecord.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -const - EDID = $44494445; - FULL = $4C4C5546; - NAME = $454D414E; -var - SubRecord: IwbSubRecord; -begin - if Supports(aElement, IwbSubRecord, SubRecord) then - case Cardinal(SubRecord.Signature) of - EDID: mrEditorID := SubRecord.Value; - FULL: mrFullName := SubRecord.Value; - NAME: Exclude(mrStates, mrsBaseRecordChecked); - end; - inherited; - if not (mrsNoUpdateRefs in mrStates) then - UpdateRefs; -end; - -function TwbMainRecord.EnsureChildGroup: IwbGroupRecord; -const - WRLD = $444C5257; - CELL = $4C4C4543; - DIAL = $4C414944; -var - SearchForGroup : Integer; - ContainingGroup : IwbGroupRecord; -begin - Result := GetChildGroup; - if not Assigned(Result) then begin - case Cardinal(GetSignature) of - WRLD: SearchForGroup := 1; - CELL: SearchForGroup := 6; - DIAL: SearchForGroup := 7; - else - if wbVWDAsQuestChildren and (GetSignature = 'QUST') then - SearchForGroup := 10 - else - SearchForGroup := 0; - end; - if (SearchForGroup > 0) and Supports(GetContainer, IwbGroupRecord, ContainingGroup) then begin - mrGroup := ContainingGroup.FindChildGroup(SearchForGroup, Self); - if not Assigned(mrGroup) and ContainingGroup.IsElementEditable(nil) then begin - mrGroup := TwbGroupRecord.Create(ContainingGroup, SearchForGroup, Self); - Result := mrGroup; - end; - end; - end; - Assert(Assigned(Result)); -end; - -function TwbMainRecord.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if GetIsDeleted then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - if aCheckDontShow then - if GetDontShow then - Exit; - - if not Assigned(aElement) then begin - Result := (aIndex >= 0) and (aIndex < mrDef.MemberCount) and (GetElementBySortOrder(aIndex + GetAdditionalElementCount) = nil); - if Result and aCheckDontShow then - Result := not mrDef.Members[aIndex].DontShow[Self]; - Exit; - end; - - if Assigned(mrDef) then begin - if aIndex = Low(Integer) then - Result := mrDef.Equals(aElement.Def) - else begin - Result := (aIndex >= 0) and (aIndex < mrDef.MemberCount) and - ( - mrDef.Members[aIndex].CanAssign(Self, Low(Integer), aElement.Def) or - mrDef.Members[aIndex].CanAssign(Self, High(Integer), aElement.Def) - ); - if Result and aCheckDontShow then - Result := not mrDef.Members[aIndex].DontShow[Self]; - end; - end else - Result := False; -end; - -function TwbMainRecord.CanContainFormIDs: Boolean; -begin - Result := True; {There is a FormID in the header} -end; - -function TwbMainRecord.CanElementReset: Boolean; -begin - Result := cntElementRefs < 1; -end; - -function TwbMainRecord.CheckChildOfCell: Boolean; -var - Sig : TwbSignature; - Group1 : IwbGroupRecord; - Group2 : IwbGroupRecord; -begin - Sig := GetSignature; - Result := - (Sig = 'REFR') or - (Sig = 'PMIS') or - (Sig = 'PGRE') or - (Sig = 'ACRE') or - (Sig = 'ACHR') or - (Sig = 'PARW') or {>>> Skyrim <<<} - (Sig = 'PBEA') or {>>> Skyrim <<<} - (Sig = 'PFLA') or {>>> Skyrim <<<} - (Sig = 'PCON') or {>>> Skyrim <<<} - (Sig = 'PBAR') or {>>> Skyrim <<<} - (Sig = 'PHZD'); {>>> Skyrim <<<} - if not Result then - Exit; - if not Supports(GetContainer, IwbGroupRecord, Group1) then - raise Exception.Create(GetName + ' is not contained in a group.'); - if not (Group1.GroupType in [8, 9, 10]) then - raise Exception.Create(GetName + ' is not contained in a group of type "Cell Persistent Childen", "Cell Temporary Children" or "Cell Visible Distant Children"'); - if not Supports(Group1.Container, IwbGroupRecord, Group2) then - raise Exception.Create(Group1.GetName + ' is not contained in a group.'); - if not (Group2.GroupType in [6]) then - raise Exception.Create(Group1.GetName + ' is not contained in a group of type "Cell Children"'); -end; - -procedure TwbMainRecord.ClearForRelease; -begin - mrMaster := nil; - mrOverrides := nil; - mrReferencedBy := nil; - mrGroup := nil; - ReleaseElements; -end; - -procedure TwbMainRecord.CollapseStorage; -var - Stream : TMemoryStream; - -begin - if (esModified in eStates) then begin - PrepareSave; - Stream := TMemoryStream.Create; - try - WriteToStream(Stream, True); - DoReset(True); - ReleaseElements; - - if mrBasePtrAllocated in mrStates then - FreeMem(dcBasePtr); - GetMem(dcBasePtr, Stream.Size); - Include(mrStates, mrBasePtrAllocated); - - Move(Stream.Memory^, dcBasePtr^, Stream.Size); - - dcEndPtr := Pointer( Cardinal(dcBasePtr) + Stream.Size); - - Exclude(dcFlags, dcfStorageInvalid); - mrDataStorage := nil; - dcDataStorage := nil; - dcDataBasePtr := nil; - dcDataEndPtr := nil; - - InitDataPtr; - - SetModified(True); - InvalidateParentStorage; - finally - Stream.Free; - end; - end; -end; - -function TwbMainRecord.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - mrBaseRecordID := 0; - Exclude(mrStates, mrsBaseRecordChecked); - - Result := inherited CompareExchangeFormID(aOldFormID, aNewFormID); - if {Result and} (csRefsBuild in cntStates) then // if you changed to an already existing FormID - BuildRef; -end; - -procedure TwbMainRecord.ContainerChanged; -var - ContainedIn: IwbContainedIn; -begin - if csInit in cntStates then - if Supports(GetElementBySortOrder(-2 + GetAdditionalElementCount), IwbContainedIn, ContainedIn) then - ContainedIn.ContainerChanged; -end; - -constructor TwbMainRecord.Create(const aContainer: IwbContainer; const aSignature: TwbSignature; aFormID: Cardinal); -var - BasePtr : PwbMainRecordStruct; - i : Integer; - SelfRef : IwbContainerElementRef; - Group : IwbGroupRecordInternal; - Group2 : IwbGroupRecordInternal; - ContainerRef : IwbContainerElementRef; - s : string; - Block : Cardinal; - SubBlock : Cardinal; - lContainer : IwbContainer; - IsInterior : Boolean; -begin - IsInterior := False; - lContainer := aContainer; - New(BasePtr); - Include(mrStates, mrBasePtrAllocated); - BasePtr.mrsSignature := aSignature; - BasePtr.mrsDataSize := 0; - BasePtr.mrsFlags._Flags := 0; - BasePtr.mrsFormID := aFormID; - BasePtr.mrsVCS1 := DefaultVCS1; - case wbGameMode of - gmFO4 : BasePtr.mrsVersion := 131; - gmTES5: BasePtr.mrsVersion := 43; - gmSSE : BasePtr.mrsVersion := 44; - gmFNV : BasePtr.mrsVersion := 15; - gmFO3 : BasePtr.mrsVersion := 15; - else BasePtr.mrsVersion := 15; - end; - BasePtr.mrsVCS2 := DefaultVCS2; - - Group := nil; - if Supports(lContainer, IwbGroupRecordInternal, Group) then - if Group.GroupType = 8 then - BasePtr.mrsFlags.SetPersistent(True) - else if (Group.GroupType = 10) and not (wbVWDAsQuestChildren - and Supports(Group.Container, IwbGroupRecord, Group2) and (TwbSignature(Group2.GroupLabel) = 'QUST')) then - BasePtr.mrsFlags.SetVisibleWhenDistant(True); - - if Assigned(Group) then - if aSignature = 'CELL' then begin - if Group.GroupType = 3 then - Supports(Group.Container, IwbGroupRecordInternal, Group); - if Assigned(Group) then begin - if Group.GroupType = 2 then - Supports(Group.Container, IwbGroupRecordInternal, Group); - if Assigned(Group) then begin - if (Group.GroupType = 0) and (TwbSignature(Group.GroupLabel) = 'CELL') then begin - s := '00' + IntToStr(aFormID and $00FFFFFF); - Block := StrToInt(s[Length(s)]); - SubBlock := StrToInt(s[Pred(Length(s))]); - - ContainerRef := Group as IwbContainerElementRef; - Group := nil; - for i := 0 to Pred(ContainerRef.ElementCount) do - if Supports(ContainerRef.Elements[i], IwbGroupRecord, Group) then - if (Group.GroupType = 2) and (Group.GroupLabel = Block) then - Break - else - Group := nil; - if not Assigned(Group) then - Group := TwbGroupRecord.Create(ContainerRef as IwbContainer, 2, Block); - - ContainerRef := Group as IwbContainerElementRef; - Group := nil; - for i := 0 to Pred(ContainerRef.ElementCount) do - if Supports(ContainerRef.Elements[i], IwbGroupRecord, Group) then - if (Group.GroupType = 3) and (Group.GroupLabel = SubBlock) then - Break - else - Group := nil; - if not Assigned(Group) then - Group := TwbGroupRecord.Create(ContainerRef as IwbContainer, 3, SubBlock); - - lContainer := Group as IwbContainer; - IsInterior := True; - end; - end; - end; - end; - - Create(lContainer, Pointer(BasePtr), nil, nil); - Assert(Assigned(mrDef)); - SelfRef := Self as IwbContainerElementRef; - DoInit; - SetModified(True); - InvalidateStorage; - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then - Assign(i, nil, False); - if Supports(lContainer, IwbGroupRecordInternal, Group) then - Group.Sort; - - if IsInterior then - if Supports(GetRecordBySignature('DATA'), IwbContainerElementRef, ContainerRef) then - ContainerRef.EditValue := '1'; -end; - -constructor TwbMainRecord.Create(const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; const aPrevMainRecord : IwbMainRecord); -var - _File: IwbFileInternal; -begin - inherited; - try - _File := GetFile as IwbFileInternal; - if Assigned(_File) then - _File.AddMainRecord(Self); - except - if Assigned(aContainer) then - aContainer.RemoveElement(Self); - raise; - end; -end; - -procedure TwbMainRecord.DecompressIfNeeded; -var - UncompressedLength: Cardinal; -begin - InitDataPtr; // reset... - - if mrStruct.mrsFlags.IsCompressed then try - UncompressedLength := PCardinal(dcDataBasePtr)^; - if UncompressedLength > 0 then begin - SetLength(mrDataStorage, UncompressedLength ); - - DecompressToUserBuf( - Pointer( Cardinal(dcDataBasePtr) + SizeOf(Cardinal) ), - mrStruct.mrsDataSize - SizeOf(Cardinal), - @mrDataStorage[0], - UncompressedLength - ); - - dcDataBasePtr := @mrDataStorage[0]; - dcDataEndPtr := Pointer( Cardinal(dcDataBasePtr) + UncompressedLength ); - end else begin - mrDataStorage := nil; - dcDataBasePtr := @EmptyPtr; - dcDataEndPtr := @EmptyPtr; - end; - except - dcDataBasePtr := nil; - dcDataEndPtr := nil; - end; -end; - -procedure TwbMainRecord.Delete; -var - SelfRef : IwbContainerElementRef; - BasePtr : Pointer; - GroupRecord : IwbGroupRecord; -begin - SelfRef := Self; - DoInit; - - SetModified(True); - InvalidateStorage; - ReleaseElements; - - MakeHeaderWriteable; - GetFlagsPtr.SetDeleted(True); - - if Supports(Self.GetContainer, IwbGroupRecord, GroupRecord) then - if wbCreateContainedIn and (GroupRecord.GroupType in [1, 4..10]) then - with TwbContainedInElement.Create(Self) do begin - _AddRef; _Release; - end; - GroupRecord := nil; - - BasePtr := dcBasePtr; - with TwbRecordHeaderStruct.Create(Self, BasePtr, Pointer( Cardinal(BasePtr) + wbSizeOfMainRecordStruct), mrDef.RecordHeaderStruct, '') do begin - Include(dcFlags, dcfDontSave); - SetSortOrder(-1); - SetMemoryOrder(Low(Integer)); - _AddRef; _Release; - end; -end; - -procedure TwbMainRecord.DeleteInto(const aFile: IwbFile); -var - MainRecord: IwbMainRecord; -begin - if Supports(CopyInto(aFile, False, False, '', '', ''), IwbMainRecord, MainRecord) then - MainRecord.Delete; -end; - -destructor TwbMainRecord.Destroy; -begin - if mrBasePtrAllocated in mrStates then - FreeMem(dcBasePtr); - inherited; -end; - -procedure TwbMainRecord.Init; -var - FoundError : Boolean; - CurrentPtr : Pointer; - CurrentDefPos : Integer; - CurrentRecPos : Integer; - Element : IwbElement; - CurrentRec : IwbSubRecord; - CurrentDef : IwbRecordMemberDef; - SubRecordArray : IwbSubRecordArrayInternal; - Dummy : Integer; - LastElementForMember : array of IwbElement; - GroupRecord : IwbGroupRecord; - GroupRecordInternal : IwbGroupRecordInternal; -{$IFDEF DBGSUBREC} -// MainRecord : IwbMainRecord; - s: string; -{$ENDIF} - RequiredRecords : set of byte; - PresentRecords : set of byte; - i : Integer; -begin - RequiredRecords := []; - PresentRecords := []; - - inherited; - - if recSkipped then - Exit; - - if Length(cntElements) > 0 then - Exit; - - DecompressIfNeeded; - - FoundError := False; - - if not (mrsQuickInit in mrStates) then begin - if Supports(Self.GetContainer, IwbGroupRecord, GroupRecord) then - if wbCreateContainedIn and (GroupRecord.GroupType in [1, 4..10]) then - with TwbContainedInElement.Create(Self) do begin - _AddRef; _Release; - end; - GroupRecord := nil; - - CurrentPtr := dcBasePtr; - with TwbRecordHeaderStruct.Create(Self, CurrentPtr, Pointer( Cardinal(CurrentPtr) + wbSizeOfMainRecordStruct), mrDef.RecordHeaderStruct, '') do begin - Include(dcFlags, dcfDontSave); - SetSortOrder(-1); - SetMemoryOrder(Low(Integer)); - _AddRef; _Release; - end; - end; - -{$IFDEF DBGSUBREC} - s := ''; -{$ENDIF} - CurrentPtr := GetDataBasePtr; - while Cardinal(CurrentPtr) < Cardinal(dcDataEndPtr) do begin - Element := TwbRecord.CreateForPtr(CurrentPtr, dcDataEndPtr, Self, nil); -{$IFDEF DBGSUBREC} - if Supports(Element, IwbSubRecord, CurrentRec) then - s := s + CurrentRec.Signature + ' '; -{$ENDIF} - end; - Element := nil; - - if not Assigned(mrDef) then - Exit; - - SetLength(LastElementForMember, mrDef.MemberCount); - - if not Assigned(cntElements) then - Exit; - - CurrentDefPos := 0; - CurrentRecPos := 0; - - while (CurrentRecPos < Length(cntElements)) do begin - if cntElements[CurrentRecPos].ElementType <> etSubRecord then begin - Inc(CurrentRecPos); - Continue; - end; - CurrentRec := cntElements[CurrentRecPos] as IwbSubRecord; - if wbIgnoreRecords.Find(CurrentRec.Signature, Dummy) then begin - Inc(CurrentRecPos); - Continue; - end; - - if mrDef.AllowUnordered then begin - CurrentDefPos := mrDef.GetMemberIndexFor(CurrentRec.Signature, CurrentRec); - if CurrentDefPos < 0 then begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: record '+ String(GetSignature) + ' contains unexpected (or out of order) subrecord ' + String(CurrentRec.Signature) + ' ' + IntToHex(Int64(Cardinal(CurrentRec.Signature)), 8) ); - FoundError := True; - Inc(CurrentRecPos); - Continue; - end; - CurrentDef := mrDef.Members[CurrentDefPos]; - end else begin - if not mrDef.ContainsMemberFor(CurrentRec.Signature, CurrentRec) then begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: record '+ String(GetSignature) + ' contains unexpected (or out of order) subrecord ' + String(CurrentRec.Signature) + ' ' + IntToHex(Int64(Cardinal(CurrentRec.Signature)), 8) ); - FoundError := True; - Inc(CurrentRecPos); - Continue; - end; - - if (CurrentDefPos < mrDef.MemberCount) and not FoundError then begin - CurrentDef := mrDef.Members[CurrentDefPos]; - if not CurrentDef.CanHandle(CurrentRec.Signature, CurrentRec) then begin - Inc(CurrentDefPos); - Continue; - end; - end else begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: record '+ String(GetSignature) + ' contains unexpected (or out of order) subrecord ' + String(CurrentRec.Signature) ); - FoundError := True; - CurrentDefPos := mrDef.GetMemberIndexFor(CurrentRec.Signature, CurrentRec); - if CurrentDefPos < 0 then begin - Inc(CurrentRecPos); - Continue; - end; - CurrentDef := mrDef.Members[CurrentDefPos]; - end; - end; - - if CurrentDefPos > mrDef.QuickInitLimit then begin - Include(mrStates, mrsQuickInitDone); - if mrsQuickInit in mrStates then - Exit; - end; - - if CurrentDef.DefType = dtSubRecordUnion then begin - CurrentDef := (CurrentDef as IwbRecordDef).GetMemberFor(CurrentRec.Signature, CurrentRec); - Assert(Assigned(CurrentDef)); - end; - - case CurrentDef.DefType of - dtSubRecord : begin - (CurrentRec as IwbSubRecordInternal).SetDef(CurrentDef as IwbSubRecordDef); - if CurrentRec.Signature = 'EDID' then - mrEditorID := CurrentRec.Value - else if CurrentRec.Signature = 'FULL' then - mrFullName := CurrentRec.Value - else if (CurrentRec.Signature = 'NAME') and - ( - (mrDef.DefaultSignature = 'REFR') or - (mrDef.DefaultSignature = 'PGRE') or - (mrDef.DefaultSignature = 'PMIS') or - (mrDef.DefaultSignature = 'ACHR') or - (mrDef.DefaultSignature = 'ACRE') or - (mrDef.DefaultSignature = 'PARW') or {>>> Skyrim <<<} - (mrDef.DefaultSignature = 'PBEA') or {>>> Skyrim <<<} - (mrDef.DefaultSignature = 'PFLA') or {>>> Skyrim <<<} - (mrDef.DefaultSignature = 'PCON') or {>>> Skyrim <<<} - (mrDef.DefaultSignature = 'PBAR') or {>>> Skyrim <<<} - (mrDef.DefaultSignature = 'PHZD') {>>> Skyrim <<<} - ) then begin - - mrBaseRecordID := CurrentRec.NativeValue; - Include(mrStates, mrsBaseRecordChecked); - end; - end; - dtSubRecordArray : begin - if Supports(LastElementForMember[CurrentDefPos], IwbSubRecordArrayInternal, SubRecordArray) then begin - SubRecordArray.DoProcess(Self, CurrentRecPos); - Continue; - end else - InsertElement(CurrentRecPos, TwbSubRecordArray.Create(nil, Self, CurrentRecPos, CurrentDef as IwbSubRecordArrayDef)); - end; - dtSubRecordStruct : - InsertElement(CurrentRecPos, TwbSubRecordStruct.Create(nil, Self, CurrentRecPos, CurrentDef as IwbSubRecordStructDef)); - else - raise Exception.CreateFmt('Unexpected def type for SubRecord %s in %s', [String(CurrentRec.Signature), String(GetSignature)]); - end; - - (cntElements[CurrentRecPos] as IwbElementInternal).SetSortOrder(CurrentDefPos); - (cntElements[CurrentRecPos] as IwbElementInternal).SetMemoryOrder(CurrentDefPos); - Include(PresentRecords, CurrentDefPos); - LastElementForMember[CurrentDefPos] := cntElements[CurrentRecPos]; - - Inc(CurrentRecPos); - Inc(CurrentDefPos); - end; - - while CurrentRecPos < Length(cntElements) do begin - if cntElements[CurrentRecPos].ElementType <> etSubRecord then begin - Inc(CurrentRecPos); - Continue; - end; - CurrentRec := cntElements[CurrentRecPos] as IwbSubRecord; - if wbIgnoreRecords.Find(CurrentRec.Signature, Dummy) then begin - Inc(CurrentRecPos); - Continue; - end; - - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: record '+ String(GetSignature) + ' contains unexpected (or out of order) subrecord ' + String(CurrentRec.Signature) ); - FoundError := True; - - Inc(CurrentRecPos); - end; - -// if GetSignature = 'DIAL' then -// FoundError := True; - - if FoundError then - if Assigned(wbProgressCallback) then begin - wbProgressCallback('Errors were found in: ' + GetName); -{$IFDEF DBGSUBREC} - wbProgressCallback('Contained subrecords: ' + s); -{$ENDIF} - end; - - if wbSortSubRecords and (mrDef.AllowUnordered or (esModified in eStates)) and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); - - mrDef.AfterLoad(Self); - - if not mrStruct.mrsFlags.IsDeleted then begin - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then - Include(RequiredRecords, i); - - RequiredRecords := RequiredRecords - PresentRecords; - if RequiredRecords <> [] then begin - if wbBeginInternalEdit then try - for i := 0 to Pred(mrDef.MemberCount) do - if i in RequiredRecords then begin - if wbMoreInfoForRequired then - wbProgressCallback(' ['+IntToHex64(mrFixedFormID, 8)+'] Adding missing record: ' + mrDef.Members[i].GetName); - Assign(i, nil, False); - end; - finally - wbEndInternalEdit; - end; - end; - end; - - if wbReportMode {and mrDef.AllowUnordered} then begin - s := GetSignature + ' -> ' + s; - CurrentRecPos := SubRecordOrderList.Add(s); - SubRecordOrderList.Objects[CurrentRecPos] := Pointer(Succ(Integer(SubRecordOrderList.Objects[CurrentRecPos]))); - end; - -{ - if GetSignature = 'SCPT' then begin -// s := (GetRecordBySignature('DATA') as IwbContainer).Elements[0].EditValue + s; - CurrentRecPos := SubRecordOrderList.Add(s); - SubRecordOrderList.Objects[CurrentRecPos] := Pointer(Succ(Integer(SubRecordOrderList.Objects[CurrentRecPos]))); - end; -} - - Include(cntStates, csInitOnce); - - if not GetIsDeleted and (GetSignature = 'INFO') and not Assigned(GetRecordBySignature('PNAM')) and wbAllowInternalEdit then - if Supports(IwbContainer(eContainer), IwbGroupRecordInternal, GroupRecordInternal) then - GroupRecordInternal.Sort; -end; - -function TwbMainRecord.FindReferencedBy(const aMainRecord: IwbMainRecord; var Index: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - - L := Low(mrReferencedBy); - H := High(mrReferencedBy); - while L <= H do begin - I := (L + H) shr 1; - - C := CmpW32(mrReferencedBy[I].LoadOrderFormID , aMainRecord.LoadOrderFormID); - if C = 0 then - C := CmpW32(mrReferencedBy[I]._File.LoadOrder, aMainRecord._File.LoadOrder); - - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - Index := L; -end; - -procedure TwbMainRecord.FindUsedMasters(aMasters: PwbUsedMasters); -var - FileID : Integer; - i : Integer; - - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if mrStruct.mrsFormID <> 0 then begin - FileID := mrStruct.mrsFormID shr 24; - aMasters[FileID] := True; - end; - - if csRefsBuild in cntStates then begin - - for i := High(mrReferences) downto Low(mrReferences) do begin - FileID := mrReferences[i] shr 24; - aMasters[FileID] := True; - end; - - end else - inherited; -end; - -function TwbMainRecord.GetAdditionalElementCount: Integer; -var - GroupRecord: IwbGroupRecord; -begin - Result := 1; - if wbCreateContainedIn and Supports(Self.GetContainer, IwbGroupRecord, GroupRecord) then - if GroupRecord.GroupType in [1, 4..10] then - Inc(Result); -end; - -function TwbMainRecord.GetAddList: TDynStrings; -var - i, j : Integer; - RecordDef : PwbRecordDef; -begin - Result := nil; - - if GetIsDeleted then - Exit; - - if GetSignature = 'DIAL' then begin - SetLength(Result, 1); - Result[0] := 'INFO'; - end else if GetSignature = 'CELL' then begin - SetLength(Result, 11); - Result[0] := 'ACHR'; - Result[1] := 'ACRE'; - Result[2] := 'REFR'; - Result[3] := 'PGRE'; - Result[4] := 'PMIS'; - Result[5] := 'PARW'; {>>> Skyrim <<<} - Result[6] := 'PBEA'; {>>> Skyrim <<<} - Result[7] := 'PFLA'; {>>> Skyrim <<<} - Result[8] := 'PCON'; {>>> Skyrim <<<} - Result[9] := 'PBAR'; {>>> Skyrim <<<} - Result[10] := 'PHZD'; {>>> Skyrim <<<} - end else if GetSignature = 'WRLD' then begin - end else if wbVWDAsQuestChildren and (GetSignature = 'QUST') then begin - SetLength(Result, 3); - Result[0] := 'DIAL'; - Result[1] := 'DLBR'; - Result[2] := 'SCEN'; - end; - - j := 0; - for i := Low(Result) to High(Result) do - if wbFindRecordDef(AnsiString(Result[i]), RecordDef) then begin - Result[j] := Result[i] + ' - ' + RecordDef.Name; - Inc(j); - end; - SetLength(Result, j); -end; - -function TwbMainRecord.GetBaseRecord: IwbMainRecord; -var - SelfRef: IwbContainerElementRef; - NameRec: IwbContainerElementRef; -begin - Result := nil; - - if not ((mrsQuickInitDone in mrStates) or (csInitOnce in cntStates)) then begin - SelfRef := Self as IwbContainerElementRef; - Assert(not (csInit in cntStates)); - Include(mrStates, mrsQuickInit); - Include(cntStates, csInit); - try - try - Init; - finally - DoReset(True); - end; - finally - Exclude(cntStates, csInit); - Exclude(mrStates, mrsQuickInit); - end; - end; - - if not (mrsBaseRecordChecked in mrStates) then begin - SelfRef := Self as IwbContainerElementRef; - mrBaseRecordID := 0; - Include(mrStates, mrsBaseRecordChecked); - if Supports(GetRecordBySignature('NAME'), IwbContainerElementRef, NameRec) then - if Supports(NameRec.LinksTo, IwbMainRecord, Result) then begin - mrBaseRecordID := NameRec.NativeValue; - end; - Exit; - end; - if mrBaseRecordID <> 0 then - with GetFile do - Result := RecordByFormID[mrBaseRecordID, True]; -end; - -function TwbMainRecord.GetBaseRecordID: Cardinal; -begin - if not (mrsBaseRecordChecked in mrStates) then - GetBaseRecord; - Result := GetFile.FileFormIDtoLoadOrderFormID(mrBaseRecordID); -end; - -function TwbMainRecord.GetCanHaveEditorID: Boolean; -begin - Result := Assigned(mrDef) and mrDef.ContainsEditorID; -end; - -function TwbMainRecord.GetCheck: string; -var - i, j: Integer; - RequiredCount: Integer; - Element: IwbElement; - Def: IwbNamedDef; - FoundIt: Boolean; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - Result := ''; - - if not Assigned(mrDef) then - Exit; - if recSkipped then - Exit; - - if mrStruct.mrsFlags.IsDeleted then begin - Result := ''; - - for i := GetAdditionalElementCount to Pred(GetElementCount) do begin - Element := cntElements[i]; - Def := Element.Def; - if Assigned(Def) then - Result := Result + Def.Name + ', '; - end; - SetLength(Result, Length(Result) - 2); - - if Result <> '' then - Result := 'Record marked as deleted but contains: ' + Result; - - Exit; - end; - - RequiredCount := 0; - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then - Inc(RequiredCount); - - for i := 0 to Pred(GetElementCount) do begin - Element := cntElements[i]; - Def := Element.Def; - if Assigned(Def) then begin - if Def.Required then - Dec(RequiredCount); - end; - end; - - if RequiredCount > 0 then begin - Result := 'Missing required members: '; - - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then begin - Def := mrDef.Members[i]; - FoundIt := False; - for j := 0 to High(cntElements) do begin - Element := cntElements[j]; - if Def.Equals(Element.Def) then begin - FoundIt := True; - Break; - end; - end; - if not FoundIt then - Result := Result + Def.Name + ', '; - end; - SetLength(Result, Length(Result) - 2); - end; -end; - -function TwbMainRecord.GetChildGroup: IwbGroupRecord; -var - SearchForGroup: Integer; - ContainingGroup: IwbGroupRecord; -begin - Result := mrGroup; - if not Assigned(Result) and not (mrsSearchedChildGroup in mrStates) then begin - try - Include(mrStates, mrsSearchedChildGroup); - SearchForGroup := 0; - if GetSignature = 'WRLD' then - SearchForGroup := 1 - else if GetSignature = 'CELL' then - SearchForGroup := 6 - else if GetSignature = 'DIAL' then - SearchForGroup := 7 - else if wbVWDAsQuestChildren and (GetSignature = 'QUST') then - SearchForGroup := 10; - - if (SearchForGroup > 0) and Supports(GetContainer, IwbGroupRecord, ContainingGroup) then - mrGroup := ContainingGroup.FindChildGroup(SearchForGroup, Self); - Result := mrGroup; - finally - Exclude(mrStates, mrsSearchedChildGroup); - end; - end; -end; - -function TwbMainRecord.GetConflictAll: TConflictAll; -begin - Result := mrConflictAll; -end; - -function TwbMainRecord.GetConflictThis: TConflictThis; -begin - Result := mrConflictThis; -end; - -function TwbMainRecord.GetContainingMainRecord: IwbMainRecord; -begin - Result := Self; -end; - -function TwbMainRecord.GetDef: IwbNamedDef; -begin - Result := mrDef; -end; - -function StrRight(const s: String; Len: Integer): string; -begin - Result := s; - while Length(Result)>> Skyrim <<<} - (GetSignature = 'PBEA') or {>>> Skyrim <<<} - (GetSignature = 'PFLA') or {>>> Skyrim <<<} - (GetSignature = 'PCON') or {>>> Skyrim <<<} - (GetSignature = 'PBAR') or {>>> Skyrim <<<} - (GetSignature = 'PHZD') {>>> Skyrim <<<} - then begin - if Supports(GetElementByName('Map Marker'), IwbContainerElementRef, MapMarker) then - Rec := MapMarker.RecordBySignature['FULL'] - else - Rec := GetRecordBySignature('NAME'); - if Assigned(Rec) then - Result := Trim(Rec.Value) - end else if (GetSignature = 'CELL') then begin - if Supports(GetContainer, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1) then - Result := '' - else - if Supports(GetRecordBySignature('XCLC'), IwbContainerElementRef, GridCoords) and - (GridCoords.ElementCount >= 2) then - Result := '<' + StrRight(GridCoords.Elements[0].Value,3) + ', ' + StrRight(GridCoords.Elements[1].Value,3) + '>'; - end else if (GetSignature = 'INFO') then begin - Result := GetElementValue('Responses\Response\NAM1'); - end; -end; - -function TwbMainRecord.GetDisplayNameKey: string; -var - Rec : IwbRecord; - GridCoords : IwbContainerElementRef; - GroupRecord : IwbGroupRecord; - MapMarker : IwbContainerElementRef; -begin - Result := GetFullName; - if Result = '' then - if - (GetSignature = 'REFR') or - (GetSignature = 'PGRE') or - (GetSignature = 'PMIS') or - (GetSignature = 'ACHR') or - (GetSignature = 'ACRE') or - (GetSignature = 'PARW') or {>>> Skyrim <<<} - (GetSignature = 'PBEA') or {>>> Skyrim <<<} - (GetSignature = 'PFLA') or {>>> Skyrim <<<} - (GetSignature = 'PCON') or {>>> Skyrim <<<} - (GetSignature = 'PBAR') or {>>> Skyrim <<<} - (GetSignature = 'PHZD') {>>> Skyrim <<<} - then begin - if Supports(GetElementByName('Map Marker'), IwbContainerElementRef, MapMarker) then - Rec := MapMarker.RecordBySignature['FULL'] - else - Rec := GetRecordBySignature('NAME'); - if Assigned(Rec) then - Result := Trim(Rec.Value) - end else if - (GetSignature = 'CELL') then begin - if Supports(GetContainer, IwbGroupRecord, GroupRecord) and (GroupRecord.GroupType = 1) then - Result := ' ' - else - if Supports(GetRecordBySignature('XCLC'), IwbContainerElementRef, GridCoords) and - (GridCoords.ElementCount >= 2) then - Result := GridCoords.Elements[0].SortKey[True] + '|' + GridCoords.Elements[1].SortKey[True]; - end; -end; - -function TwbMainRecord.GetEditorID: string; -var - SelfRef: IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not ((mrsQuickInitDone in mrStates) or (csInitOnce in cntStates)) then begin - if csInit in cntStates then begin - Result := ''; - Exit; - end; - Include(mrStates, mrsQuickInit); - Include(cntStates, csInit); - try - try - Init; - finally - DoReset(True); - end; - finally - Exclude(cntStates, csInit); - Exclude(mrStates, mrsQuickInit); - end; - end; - - Result := mrEditorID; -end; - -function TwbMainRecord.GetEditValue: string; -begin - if wbDisplayLoadOrderFormID then - Result := IntToHex64(GetLoadOrderFormID, 8) - else - Result := IntToHex64(GetFormID, 8); -end; - -function TwbMainRecord.GetElementType: TwbElementType; -begin - Result := etMainRecord; -end; - -function TwbMainRecord.GetFixedFormID: Cardinal; - - function MovedHereForSpeed: Cardinal; - var - MasterCount: Cardinal; - _File: IwbFile; - begin - Result := PwbMainRecordStruct(dcBasePtr).mrsFormID; - _File := GetFile; - if Assigned(_File) then begin - MasterCount := _File.MasterCount; - if Result shr 24 > MasterCount then begin - Result := (Result and $00FFFFFF) or (MasterCount shl 24); - end; - end; - mrFixedFormID := Result; - end; - -begin - Result := mrFixedFormID; - if Result = 0 then - Result := MovedHereForSpeed; -end; - -function TwbMainRecord.GetFlags: TwbMainRecordStructFlags; -begin - Result := mrStruct.mrsFlags; -end; - -function TwbMainRecord.GetFlagsPtr: PwbMainRecordStructFlags; -begin - Result := @mrStruct.mrsFlags; -end; - - -function TwbMainRecord.GetFormID: Cardinal; -begin - Result := mrStruct.mrsFormID; -end; - -function TwbMainRecord.GetFullName: string; -var - SelfRef: IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not ((mrsQuickInitDone in mrStates) or (csInitOnce in cntStates)) then begin - Include(mrStates, mrsQuickInit); - if csInit in cntStates then begin - Result := ''; - Exit; - end; - Include(cntStates, csInit); - try - try - Init; - finally - DoReset(True); - end; - finally - Exclude(cntStates, csInit); - Exclude(mrStates, mrsQuickInit); - end; - end; - - Result := mrFullName; -end; - -function TwbMainRecord.GetFormVersion: Cardinal; -begin - Result := mrStruct.mrsVersion; -end; - -procedure TwbMainRecord.SetFormVersion(aFormVersion: Cardinal); -begin - MakeHeaderWriteable; - mrStruct.mrsVersion := aFormVersion; -end; - -procedure TwbMainRecord.ChangeFormSignature(aSignature: TwbSignature); -begin - MakeHeaderWriteable; - mrStruct.mrsSignature := aSignature; -end; - -procedure TwbMainRecord.ClampFormID(aIndex: Cardinal); -begin - if mrStruct.mrsFormID shr 24 > aIndex then begin - MakeHeaderWriteable; - mrStruct.mrsFormID := (mrStruct.mrsFormID and $00FFFFFF) or (aIndex shl 24); - if Assigned(mrGroup) then - mrGroup.GroupLabel := mrStruct.mrsFormID; - end; -end; - -function TwbMainRecord.GetGridCell(out aGridCell: TwbGridCell): Boolean; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - XCLCRec : IwbContainerElementRef; -begin - Result := False; - - Signature := GetSignature; - if (Signature <> 'CELL') then - Exit; - - SelfRef := Self; - DoInit; - - if not Supports(GetRecordBySignature('XCLC'), IwbContainerElementRef, XCLCRec) then - Exit; - - if XCLCRec.ElementCount < 2 then - Exit; - - with aGridCell, XCLCRec do begin - X := StrToIntDef(Elements[0].Value, -10000); - Y := StrToIntDef(Elements[1].Value, -10000); - Result := (x <> -10000) and (y <> -10000); - end; -end; - -function TwbMainRecord.GetHasMesh: Boolean; -var - SelfRef : IwbContainerElementRef; - ModelCnt : IwbContainerElementRef; - MODL : IwbContainerElementRef; - s : String; -begin - if not (mrsHasMeshChecked in mrStates) and Assigned(wbContainerHandler) then begin - Include(mrStates, mrsHasMeshChecked); - if GetSignature = 'TREE' then begin - Include(mrStates, mrsHasMesh); - end else begin - SelfRef := Self as IwbContainerElementRef; - if Supports(GetElementByName('Model'), IwbContainerElementRef, ModelCnt) then - if Supports(ModelCnt.RecordBySignature['MODL'], IwbContainerElementRef, MODL) then begin - s := Trim(StringReplace(MODL.Value, '/', '\', [rfReplaceAll])); - if s <> '' then begin - s := 'meshes\'+ s;// - if Length(wbContainerHandler.OpenResource(s)) > 0 then - Include(mrStates, mrsHasMesh); - end; - end; - end; - end; - Result := mrsHasMesh in mrStates; -end; - -function TwbMainRecord.GetHasPrecombinedMesh: Boolean; -begin - if not (mrsHasPrecombinedMeshChecked in mrStates) then - Self.GetPrecombinedMesh; - - Result := mrsHasPrecombinedMesh in mrStates; -end; - -type - TwbPrecombinedInfo = record - Ref, ID: Cardinal; - end; - -var - PrecombinedCacheFileName: string; - PrecombinedCacheCellFormID: Cardinal; - PrecombinedCache: array of TwbPrecombinedInfo; - -function TwbMainRecord.GetPrecombinedMesh: string; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - Group : IwbGroupRecord; - Cell : IwbMainRecord; - CombinedRefs, CombinedRef: IwbContainerElementRef; - cnt, i : Cardinal; - s: string; -begin - Result := ''; - - if not (mrsHasPrecombinedMeshChecked in mrStates) then begin - - // we need file for cache checking - if not Assigned(IwbElement(Self)._File) then - Exit; - - Include(mrStates, mrsHasPrecombinedMeshChecked); - Self.mrPrecombinedCellID := 0; - Self.mrPrecombinedID := 0; - - if wbGameMode <> gmFO4 then - Exit; - - Signature := Self.GetSignature; - - if (Signature <> 'REFR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and - (Signature <> 'PBEA') and - (Signature <> 'PFLA') and - (Signature <> 'PCON') and - (Signature <> 'PBAR') and - (Signature <> 'PHZD') - then - Exit; - - SelfRef := Self as IwbContainerElementRef; - - // markers can't be precombined - if Cardinal(SelfRef.ElementNativeValues['NAME']) < $800 then - Exit; - - if Supports(SelfRef.Container, IwbGroupRecord, Group) then - Cell := Group.ChildrenOf; - - if not Assigned(Cell) then - Exit; - - s := IwbElement(Self)._File.Name; - i := Cell.FormID; - - // store cell's precombined index in cache - if (i <> PrecombinedCacheCellFormID) or (s <> PrecombinedCacheFileName) then begin - PrecombinedCacheCellFormID := i; - PrecombinedCacheFileName := s; - SetLength(PrecombinedCache, 0); - - if Supports(Cell.ElementByPath['XCRI\References'], IwbContainerElementRef, CombinedRefs) then begin - cnt := CombinedRefs.ElementCount; - SetLength(PrecombinedCache, cnt); - for i := 0 to Pred(cnt) do - if Supports(CombinedRefs[i], IwbContainerElementRef, CombinedRef) and (CombinedRef.ElementCount = 2) then begin - PrecombinedCache[i].Ref := CombinedRef.Elements[0].NativeValue; - PrecombinedCache[i].ID := CombinedRef.Elements[1].NativeValue; - end; - end; - end; - - // search for ref in precombined index cache - if Length(PrecombinedCache) > 0 then - for i := Low(PrecombinedCache) to High(PrecombinedCache) do - if PrecombinedCache[i].Ref = Self.GetFormID then begin - Self.mrPrecombinedCellID := Cell.FormID and $00FFFFFF; - Self.mrPrecombinedID := PrecombinedCache[i].ID; - Include(mrStates, mrsHasPrecombinedMesh); - Break; - end; - end; - - if mrsHasPrecombinedMesh in mrStates then - Result := 'Precombined\' + IntToHex(Self.mrPrecombinedCellID, 8) + '_' + IntToHex(Self.mrPrecombinedID, 8) + '_OC.nif'; -end; - -function TwbMainRecord.GetHasVisibleWhenDistantMesh: Boolean; -var - SelfRef : IwbContainerElementRef; - ModelCnt : IwbContainerElementRef; - MODL : IwbContainerElementRef; - s : String; -begin - if not (mrsHasVWDMeshChecked in mrStates) and Assigned(wbContainerHandler) then begin - Include(mrStates, mrsHasVWDMeshChecked); - if GetSignature = 'TREE' then begin - SelfRef := Self as IwbContainerElementRef; - if Supports(GetElementByName('Model'), IwbContainerElementRef, ModelCnt) then - if Supports(ModelCnt.RecordBySignature['MODL'], IwbContainerElementRef, MODL) then begin - s := Trim(StringReplace(MODL.Value, '/', '\', [rfReplaceAll])); - if s <> '' then begin - s := 'textures\trees\billboards'+ChangeFileExt(s, '.dds'); - if Length(wbContainerHandler.OpenResource(s)) > 0 then - Include(mrStates, mrsHasVWDMesh); - end; - end; - end else begin - SelfRef := Self as IwbContainerElementRef; - if Supports(GetElementByName('Model'), IwbContainerElementRef, ModelCnt) then - if Supports(ModelCnt.RecordBySignature['MODL'], IwbContainerElementRef, MODL) then begin - s := Trim(StringReplace(MODL.Value, '/', '\', [rfReplaceAll])); - if s <> '' then begin - s := 'meshes\'+ChangeFileExt(s, '_far.nif'); - if Length(wbContainerHandler.OpenResource(s)) > 0 then - Include(mrStates, mrsHasVWDMesh); - end; - end; - end; - end; - Result := mrsHasVWDMesh in mrStates; -end; - -function TwbMainRecord.GetHighestOverrideOrSelf(aMaxLoadOrder: Integer): IwbMainRecord; -var - Master : IwbMainRecord; - i : Integer; -begin - Result := Self; - Master := GetMasterOrSelf; - for i := Pred(Master.OverrideCount) downto 0 do - if Master.Overrides[i]._File.LoadOrder <= aMaxLoadOrder then begin - Result := Master.Overrides[i]; - Exit; - end; -end; - -function TwbMainRecord.GetInjectionSourceFiles: TDynFiles; -var - i, j, k : Integer; - Rec : IwbMainRecord; - _File : IwbFile; - LastID : Cardinal; -begin - SetLength(Result, Length(mrReferences)); - if Length(Result) > 0 then begin - _File := GetFile; - j := 0; - for i := Low(mrReferences) to High(mrReferences) do begin - Rec := _File.RecordByFormID[mrReferences[i], True]; - if Assigned(Rec) then - if not _File.Equals(Rec._File) then begin - Rec := Rec.MasterOrSelf; - if Rec.IsInjected then begin - Result[j] := Rec._File; - Inc(j); - end; - end; - end; - if j > 1 then begin - wbMergeSort(@Result[0], j, CompareLoadOrder); - k := 1; - LastID := Result[0].ElementID; - for i := 1 to Pred(j) do - if Result[i].ElementID <> LastID then begin - LastID := Result[i].ElementID; - if k <> i then - Result[k] := Result[i]; - Inc(k); - end; - SetLength(Result, k); - end else - SetLength(Result, j); - end; -end; - -function TwbMainRecord.GetIsCompressed: Boolean; -begin - Result := GetFlags.IsCompressed; -end; - -function TwbMainRecord.GetIsDeleted: Boolean; -begin - Result := GetFlags.IsDeleted; -end; - -function TwbMainRecord.GetIsEditable: Boolean; -begin - Result := wbIsInternalEdit; - if Result then - Exit; - - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - Result := True; -end; - -function TwbMainRecord.GetIsESM: Boolean; -begin - Result := GetFlags.IsESM; -end; - -function TwbMainRecord.GetIsLocalized: Boolean; -begin - Result := GetFlags.IsLocalized; -end; - -function TwbMainRecord.GetIsInitiallyDisabled: Boolean; -begin - Result := GetFlags.IsInitiallyDisabled; -end; - -function TwbMainRecord.GetIsInjected: Boolean; -begin - if not (mrsIsInjectedChecked in mrStates) then begin - if not Assigned(mrMaster) and (mrStruct.mrsFormID <> 0) and( (mrStruct.mrsFormID shr 24) < Cardinal(GetFile.MasterCount) ) and not (fsIsHardcoded in GetFile.FileStates) then - Include(mrStates, mrsIsInjected) - else - Exclude(mrStates, mrsIsInjected); - Include(mrStates, mrsIsInjectedChecked); - end; - Result := mrsIsInjected in mrStates; -end; - -function TwbMainRecord.GetIsInList: Boolean; -begin - with mreHeader do - Result := mrehInUse and (mrehGeneration = mreGeneration); -end; - -function TwbMainRecord.GetIsMaster: Boolean; -begin - Result := not Assigned(mrMaster); -end; - -function TwbMainRecord.GetIsNotReachable: Boolean; -var - i: Integer; -begin - if Assigned(mrMaster) then - Result := IwbMainRecord(mrMaster).IsNotReachable - else begin - Result := inherited GetIsNotReachable; - if Result then - for i := Low(mrOverrides) to High(mrOverrides) do - if not (esNotReachable in mrOverrides[i].ElementStates) then begin - Result := False; - Exit; - end; - end; -end; - -function TwbMainRecord.GetIsPersistent: Boolean; -begin - Result := GetFlags.IsPersistent; -end; - -function TwbMainRecord.GetIsVisibleWhenDistant: Boolean; -begin - Result := GetFlags.IsVisibleWhenDistant; -end; - -function TwbMainRecord.GetIsWinningOverride: Boolean; -var - Master: IwbMainRecord; -begin - if Assigned(mrMaster) then begin - Master := IwbMainRecord(mrMaster); - Assert(Master.OverrideCount > 0); - Result := Equals(Master.Overrides[Pred(Master.OverrideCount)]); - end else - Result := Length(mrOverrides) < 1; -end; - -function TwbMainRecord.GetLoadOrderFormID: Cardinal; -var - _File : IwbFile; - _Master : IwbFile; - FileID : Cardinal; -begin - Result := mrLoadOrderFormID; - if Result = 0 then begin - Result := mrStruct.mrsFormID; - if Result = 0 then - Exit; - - _File := GetFile; - Assert(Assigned(_File)); - - FileID := Result shr 24; - - if FileID >= Cardinal(_File.MasterCount) then - _Master := _File - else - _Master := _File.Masters[FileID]; - - if _Master.LoadOrder < 0 then - raise Exception.CreateFmt('FormID [%s] in file %s refers to master file %s which has not been assigned a global load order', [ - IntToHex64(Result, 8), - _File.FileName, - _Master.FileName - ]); - - FileID := _Master.LoadOrder; - - Result := (Result and $00FFFFFF) or (FileID shl 24); - - mrLoadOrderFormID := Result; - end; -end; - -function TwbMainRecord.GetMaster: IwbMainRecord; -begin - Result := IwbMainRecord(mrMaster); -end; - -function TwbMainRecord.GetMasterOrSelf: IwbMainRecord; -begin - Result := GetMaster; - if not Assigned(Result) then - Result := Self; -end; - -function TwbMainRecord.GetShortName: string; -var -// Rec: IwbRecord; - s : string; -begin - if wbDisplayShorterNames then begin - Result := ''; - - s := GetEditorID; - if s <> '' then - Result := Result + {'<' +} s {+'>'}; - - s := GetFullName; - if s <> '' then begin - if Result <> '' then - Result := Result + ' '; - Result := Result + '"' + s +'"'; - end; - - if Result <> '' then - Result := Result + ' '; - - if wbDisplayLoadOrderFormID then - Result := Result + '[' + GetSignature + ':' + IntToHex64(GetLoadOrderFormID, 8) + ']' - else - Result := Result + '[' + GetSignature + ':' + IntToHex64(mrStruct.mrsFormID, 8) + ']'; - - end else begin - Result := inherited GetName; - - if Assigned(mrDef) then - Result := Result + ' - ' + mrDef.GetName; - - if wbDisplayLoadOrderFormID then - Result := Result + ' [' + IntToHex64(GetLoadOrderFormID, 8) + ']' - else - Result := Result + ' [' + IntToHex64(mrStruct.mrsFormID, 8) + ']'; - - s := GetEditorID; - if s <> '' then - Result := Result + ' <' + s +'>'; - - s := GetFullName; - if s <> '' then - Result := Result + ' "' + s +'"'; - - end; -end; - -function TwbMainRecord.GetName: string; -var - s : string; -begin - Result := GetShortName; - if Assigned(mrDef) then begin - s := Trim(mrDef.AdditionalInfoFor(Self)); - if s <> '' then - Result := Result + ' (' + s + ')'; - end; -end; - -function TwbMainRecord.GetNativeValue: Variant; -begin - if wbDisplayLoadOrderFormID then - Result := GetLoadOrderFormID - else - Result := GetFormID; -end; - -function TwbMainRecord.GetNextEntry: IwbMainRecordEntry; -begin - Assert(mreHeader.mrehInUse); - if mreGeneration = mreHeader.mrehGeneration then - Result := IwbMainRecordEntry(mreNext) - else - Result := nil; -end; - -function TwbMainRecord.GetOverride(aIndex: Integer): IwbMainRecord; -begin - if not mrOverridesSorted then begin - wbMergeSort(@mrOverrides[0], Length(mrOverrides), CompareOverrides); - mrOverridesSorted := True; - end; - - Result := mrOverrides[aIndex]; -end; - -function TwbMainRecord.GetOverrideCount: Integer; -begin - Result := Length(mrOverrides); -end; - -function TwbMainRecord.GetPosition(out aPosition: TwbVector): Boolean; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - DataRec : IwbContainerElementRef; -begin - Result := False; - try - Signature := GetSignature; - if (Signature <> 'REFR') and - (Signature <> 'ACRE') and - (Signature <> 'ACHR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') {>>> Skyrim <<<} - then - Exit; - - SelfRef := Self; - DoInit; - - if not Supports(GetRecordBySignature('DATA'), IwbContainerElementRef, DataRec) then - Exit; - - if DataRec.ElementCount <> 2 then - Exit; - - with aPosition, (DataRec.Elements[0] as IwbContainerElementRef) do begin - if ElementCount <> 3 then - Exit; - - X := Elements[0].NativeValue; - Y := Elements[1].NativeValue; - Z := Elements[2].NativeValue; - end; - except - on E: Exception do begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error getting position for "' + GetName + '": ' + E.Message); - Result := False; - Exit; - end; - end; - Result := True; -end; - -function TwbMainRecord.GetPrevEntry: IwbMainRecordEntry; -begin - Assert(mreHeader.mrehInUse); - if mreGeneration = mreHeader.mrehGeneration then - Result := IwbMainRecordEntry(mrePrev) - else - Result := nil; -end; - -function TwbMainRecord.GetPath: string; -begin - Result := mrStruct.mrsSignature; -end; - -function TwbMainRecord.GetCountedRecordCount: Cardinal; -begin - Result := 1; -end; - -function TwbMainRecord.GetReferencedBy(aIndex: Integer): IwbMainRecord; -begin - if mrsReferencedByUnsorted in mrStates then - SortReferencedBy; - Result := mrReferencedBy[aIndex]; -end; - -function TwbMainRecord.GetReferencedByCount: Integer; -begin - Result := Length(mrReferencedBy); -end; - -function TwbMainRecord.GetReferenceFile: IwbFile; -var - FileID: Integer; -begin - Result := GetFile; - FileID := mrStruct.mrsFormID shr 24; - if FileID < Result.MasterCount then - Result := Result.Masters[FileID]; -end; - -function TwbMainRecord.GetReferencesInjected: Boolean; -var - i, j : Integer; - _File : IwbFile; - RecFile : IwbFile; - Rec : IwbMainRecord; - Found : Boolean; -begin - if not (mrsReferencesInjectedChecked in mrStates) and (csRefsBuild in cntStates) then begin - Include(mrStates, mrsReferencesInjectedChecked); - Exclude(mrStates, mrsReferencesInjected); - if Length(mrReferences) > 0 then begin - _File := GetFile; - for i := Low(mrReferences) to High(mrReferences) do begin - Rec := _File.RecordByFormID[mrReferences[i], True]; - if Assigned(Rec) then begin - RecFile := Rec._File; - if not _File.Equals(RecFile) then begin - Rec := Rec.MasterOrSelf; - if Rec.IsInjected then begin - Found := False; - for j := 0 to Pred(_File.MasterCount) do - if _File.Masters[j].Equals(RecFile) then begin - Found := True; - Break; - end; - if not Found then begin - Include(mrStates, mrsReferencesInjected); - Break; - end; - end; - end; - end; - end; - end; - end; - Result := mrsReferencesInjected in mrStates; -end; - -function TwbMainRecord.GetRotation(out aRotation: TwbVector): Boolean; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - DataRec : IwbContainerElementRef; -begin - Result := False; - - Signature := GetSignature; - if (Signature <> 'REFR') and - (Signature <> 'ACRE') and - (Signature <> 'ACHR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') {>>> Skyrim <<<} - then - Exit; - - SelfRef := Self; - DoInit; - - if not Supports(GetRecordBySignature('DATA'), IwbContainerElementRef, DataRec) then - Exit; - - if DataRec.ElementCount <> 2 then - Exit; - - with aRotation, (DataRec.Elements[1] as IwbContainerElementRef) do begin - if ElementCount <> 3 then - Exit; - - X := StrToFloatDef(Elements[0].Value, 0); - Y := StrToFloatDef(Elements[1].Value, 0); - Z := StrToFloatDef(Elements[2].Value, 0); - end; - Result := True; -end; - -function TwbMainRecord.GetScale(out aScale: Single): Boolean; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - XSclRec : IwbContainerElementRef; -begin - Result := False; - aScale := 1; - - Signature := GetSignature; - if (Signature <> 'REFR') and - (Signature <> 'ACRE') and - (Signature <> 'ACHR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') {>>> Skyrim <<<} - then - Exit; - - SelfRef := Self; - DoInit; - - if not Supports(GetRecordBySignature('XSCL'), IwbContainerElementRef, XSclRec) then - Exit; - - aScale := StrToFloatDef(XSclRec.Value, 0); - Result := True; -end; - -function TwbMainRecord.GetSortKeyInternal(aExtended: Boolean): string; -begin - Result := IntToHex64(mrStruct.mrsFormID, 8); -end; - -function TwbMainRecord.GetSortPriority: Integer; -begin - if (GetSignature = 'ROAD') or (GetSignature = 'LAND') then - Result := -2 - else if (GetSignature = 'CELL') or (GetSignature = 'PGRD') or (GetSignature = 'NAVM') then - Result := -1 - else - Result := 0; -end; - -function TwbMainRecord.GetValue: string; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - Result := ''; -end; - -function TwbMainRecord.GetWinningOverride: IwbMainRecord; -begin - if Assigned(mrMaster) then - Result := IwbMainRecord(mrMaster).WinningOverride - else - if Length(mrOverrides) > 0 then - Result := mrOverrides[High(mrOverrides)] - else - Result := Self; -end; - -procedure TwbMainRecord.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -begin - Assert(False); -end; - -procedure TwbMainRecord.InitDataPtr; -var - RecordDef : PwbRecordDef; -begin - if Assigned(dcEndPtr) then begin - dcDataBasePtr := Pointer( Cardinal( dcBasePtr ) + wbSizeOfMainRecordStruct ); - dcDataEndPtr := Pointer( Cardinal( dcDataBasePtr ) + mrStruct.mrsDataSize ); - dcEndPtr := dcDataEndPtr; - end; - - if not Assigned(mrDef) then begin - if wbFindRecordDef(PwbSignature(dcBasePtr)^, RecordDef) then - mrDef := RecordDef^ - else begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: unknown record type '+ String(PwbSignature(dcBasePtr)^)); - end; - end; -end; - -procedure TwbMainRecord.InsertEntryAfter(const aEntry: IwbMainRecordEntry); -var - Entry: IwbMainRecordEntry; -begin - Assert(Assigned(aEntry)); - RemoveEntry; - Assert(mreGeneration = -1); - with mreHeader do begin - Assert(mrehInUse); - mreGeneration := mrehGeneration; - Entry := Self; - mrePrev := Pointer(aEntry); - mreNext := Pointer(aEntry.NextEntry); - aEntry.NextEntry := Entry; - if Assigned(mreNext) then begin - Assert( aEntry.Equals(IwbMainRecordEntry(mreNext).PrevEntry) ); - IwbMainRecordEntry(mreNext).PrevEntry := Entry; - end else begin - Assert( aEntry.Equals(IwbMainRecordEntry(mrehTail)) ); - mrehTail := Pointer(Entry); - end; - Inc(mrehCount); - end; -end; - -procedure TwbMainRecord.InsertEntryHead; -var - Entry: IwbMainRecordEntry; -begin - RemoveEntry; - Assert(mreGeneration = -1); - with mreHeader do begin - Assert(mrehInUse); - mreGeneration := mrehGeneration; - mrePrev := nil; - mreNext := mrehHead; - Entry := Self; - mrehHead := Pointer(Entry); - if Assigned(mreNext) then begin - Assert(not Assigned(IwbMainRecordEntry(mreNext).PrevEntry)); - IwbMainRecordEntry(mreNext).PrevEntry := Entry - end else begin - Assert(not Assigned(mrehTail)); - mrehTail := Pointer(Entry); - end; - Inc(mrehCount); - end; -end; - -procedure TwbMainRecord.InsertEntryTail; -var - Entry: IwbMainRecordEntry; -begin - RemoveEntry; - Assert(mreGeneration = -1); - with mreHeader do begin - Assert(mrehInUse); - mreGeneration := mrehGeneration; - mreNext := nil; - mrePrev := mrehTail; - Entry := Self; - mrehTail := Pointer(Entry); - if Assigned(mrePrev) then begin - Assert(not Assigned(IwbMainRecordEntry(mrePrev).NextEntry)); - IwbMainRecordEntry(mrePrev).NextEntry := Entry - end else begin - Assert(not Assigned(mrehHead)); - mrehHead := Pointer(Entry); - end; - Inc(mrehCount); - end; -end; - -function TwbMainRecord.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement) and not aElement.Def.Required; -end; - -function TwbMainRecord.LinksToParent: Boolean; -var - Signature : TwbSignature; - DATA : IwbRecord; - SelfPtr : IwbContainerElementRef; - s : string; -begin - Signature := GetSignature; - - if (Signature = 'CELL') then begin - Result := True; - SelfPtr := Self as IwbContainerElementRef; - DATA := GetRecordBySignature('DATA'); - if Assigned(DATA) then begin - s := DATA.EditValue; - if (Length(s)>0) and (s[1]='1') then - Result := False; - end; - end else - Result := - (Signature = 'INFO') or - (Signature = 'REFR') or - (Signature = 'PGRE') or - (Signature = 'PMIS') or - (Signature = 'ACHR') or - (Signature = 'ACRE') or - (Signature = 'PGRD') or - (Signature = 'PARW') or {>>> Skyrim <<<} - (Signature = 'PBEA') or {>>> Skyrim <<<} - (Signature = 'PFLA') or {>>> Skyrim <<<} - (Signature = 'PCON') or {>>> Skyrim <<<} - (Signature = 'PBAR') or {>>> Skyrim <<<} - (Signature = 'PHZD') or {>>> Skyrim <<<} - (Signature = 'NAVM') or - (Signature = 'ROAD') or - (Signature = 'LAND') or - (wbVWDAsQuestChildren and ((Signature = 'DLBR') or (Signature = 'DIAL') or (Signature = 'SCEN'))); -end; - -procedure TwbMainRecord.MakeHeaderWriteable; -var - p : PwbMainRecordStruct; - BasePtr : Pointer; - SelfPtr : IwbContainerElementRef; - RecordHeader : IwbElement; -begin - SelfPtr := Self as IwbContainerElementRef; - - DoInit; - - SetModified(True); - InvalidateParentStorage; - - if Assigned(dcEndPtr) then begin - New(p); - Include(mrStates, mrBasePtrAllocated); - p^ := mrStruct^; - dcBasePtr := p; - dcEndPtr := nil; - - RecordHeader := GetElementBySortOrder( (-1) + GetAdditionalElementCount ); - if Assigned(RecordHeader) then begin - BasePtr := p; - RecordHeader.InformStorage(BasePtr, Pointer( Cardinal(BasePtr) + wbSizeOfMainRecordStruct ) ); - end; - end; - -end; - -procedure TwbMainRecord.MarkModifiedRecursive; -var - SelfRef : IwbContainerElementRef; - Group : IwbGroupRecord; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - inherited; - Group := GetChildGroup; - if Assigned(Group) then - Group.MarkModifiedRecursive; -end; - -procedure TwbMainRecord.MasterCountUpdated(aOld, aNew: Byte); -var - FileID : Integer; - i : Integer; - FoundOne : Boolean; - - SelfRef : IwbContainerElementRef; -// EditorID : IwbElement; -begin - mrBaseRecordID := 0; - Exclude(mrStates, mrsBaseRecordChecked); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if mrStruct.mrsFormID <> 0 then begin - //Assert(aNew > aOld); - FileID := mrStruct.mrsFormID shr 24; - if FileID >= aOld then begin - FileID := aNew; - MakeHeaderWriteable; - mrStruct.mrsFormID := (mrStruct.mrsFormID and $00FFFFFF) or (Cardinal(FileID) shl 24); - mrFixedFormID := 0; - mrLoadOrderFormID := 0; - Exclude(mrStates, mrsIsInjectedChecked); - end; - end; - - if csRefsBuild in cntStates then begin - - FoundOne := False; - for i := High(mrReferences) downto Low(mrReferences) do begin - FileID := mrReferences[i] shr 24; - if FileID < aOld then - Break; - FoundOne := True; - - FileID := aNew; - mrReferences[i] := (mrReferences[i] and $00FFFFFF) or (Cardinal(FileID) shl 24); - end; - - if FoundOne then - inherited; - - end else - inherited; -end; - -procedure TwbMainRecord.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - OldFormID: Cardinal; - NewFormID: Cardinal; - i : Integer; - FoundOne : Boolean; - - SelfRef : IwbContainerElementRef; -begin - mrBaseRecordID := 0; - Exclude(mrStates, mrsBaseRecordChecked); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if mrStruct.mrsFormID <> 0 then begin - OldFormID := mrStruct.mrsFormID; - NewFormID := FixupFormID(OldFormID, aOld, aNew); - if OldFormID <> NewFormID then begin - MakeHeaderWriteable; - mrStruct.mrsFormID := NewFormID; - mrFixedFormID := 0; - mrLoadOrderFormID := 0; - Exclude(mrStates, mrsIsInjectedChecked); - end; - end; - - if csRefsBuild in cntStates then begin - - FoundOne := False; - for i := Low(mrReferences) to High(mrReferences) do begin - OldFormID := mrReferences[i]; - NewFormID := FixupFormID(OldFormID, aOld, aNew); - if OldFormID <> NewFormID then begin - FoundOne := True; - mrReferences[i] := NewFormID; - end; - end; - - if FoundOne then begin - wbMergeSort(@mrReferences[0], Length(mrReferences), CompareFormIDs ); - inherited; - end; - - end else - inherited; -end; - -function TwbMainRecord.MasterRecordsFromMasterFilesAndSelf: TDynMainRecords; -var - Res : TDynMainRecords; - _File : IwbFile; - Master : IwbMainRecord; - i, j : Integer; - - function AddRecord(const aRecord: IwbMainRecord): Boolean; - var - k : Integer; - RecFile : IwbFile; - begin - Result := Equals(aRecord); - if not Result then begin - RecFile := aRecord._File; - - Result := _File.Equals(RecFile); - if not Result then - for k := 0 to Pred(_File.MasterCount) do begin - Result := _File.Masters[k].Equals(RecFile); - if Result then - Break; - end; - if Result then - Result := False - else - Exit; - end; - - Res[i] := aRecord; - Inc(i); - end; - -begin - Result := nil; - Res := nil; - if Assigned(mrMaster) then begin - _File := GetFile; - if Assigned(_File) then begin - Master := IwbMainRecord(mrMaster); - SetLength(Res, Succ(Master.OverrideCount)); - i := 0; - if not AddRecord(Master) then - for j := 0 to Pred(Master.OverrideCount) do - if AddRecord(Master.Overrides[j]) then - break; - SetLength(Res, i); - if i> 0 then begin - Result := Res; - Exit; - end; - end; - end; - SetLength(Res, 1); - Res[0] := Self; - Result := Res; -end; - -procedure TwbMainRecord.MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); -begin - Assert(False); -end; - -function TwbMainRecord.mrStruct: PwbMainRecordStruct; -begin - Result := PwbMainRecordStruct(dcBasePtr); -end; - -procedure TwbMainRecord.PrepareSave; -var - _File : IwbFile; - GroupRecord : IwbGroupRecord; -begin - if GetSignature = wbHeaderSignature then begin - if not Supports(GetContainer, IwbFile, _File) then - raise Exception.Create('File Header record '+GetName+' must be contained directly in the file.'); - if GetFormID <> 0 then - raise Exception.Create('File Header record '+GetName+' can not have a FormID.'); - end else begin - if GetFormID = 0 then - raise Exception.Create('Record '+GetName+' must have a FormID.'); - if not Supports(GetContainer, IwbGroupRecord, GroupRecord) then - raise Exception.Create('Record '+GetName+' is not contained in a group.'); - case GroupRecord.GroupType of - 0: begin {top level} - if TwbSignature(GroupRecord.GroupLabel) <> GetSignature then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - end; - 1: begin {World Children} - if (GetSignature <> 'CELL') and (GetSignature <> 'ROAD') then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - end; - 2, 4, 6: begin {interior and exterior block and cell children} - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - end; - 3, 5: begin {interior and exterior sub-block} - if (GetSignature <> 'CELL') then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - end; - 7: begin {topic children} - if (GetSignature <> 'INFO') then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - end; - 8, 10: begin {Persistent and Visible when Distant/Quest Children} - if (GetSignature <> 'REFR') and - (GetSignature <> 'ACHR') and - (GetSignature <> 'ACRE') and - (GetSignature <> 'PGRE') and - (GetSignature <> 'PMIS') and - (GetSignature <> 'PARW') and {>>> Skyrim <<<} - (GetSignature <> 'PBEA') and {>>> Skyrim <<<} - (GetSignature <> 'PFLA') and {>>> Skyrim <<<} - (GetSignature <> 'PCON') and {>>> Skyrim <<<} - (GetSignature <> 'PBAR') and {>>> Skyrim <<<} - (GetSignature <> 'PHZD') {>>> Skyrim <<<} - then - if not (wbVWDAsQuestChildren and ((GetSignature = 'DLBR') or (GetSignature = 'DIAL') or (GetSignature = 'SCEN'))) then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - - case GroupRecord.GroupType of - 8:begin - if not mrStruct.mrsFlags.IsPersistent then - raise Exception.Create('Record ' + GetName + ' needs to have it''s Persistent flag set to be contained in ' + GroupRecord.Name); - end; - 10: if not wbVWDAsQuestChildren then begin - if not mrStruct.mrsFlags.IsVisibleWhenDistant then - raise Exception.Create('Record ' + GetName + ' needs to have it''s Visible when Distant flag set to be contained in ' + GroupRecord.Name); - if mrStruct.mrsFlags.IsPersistent then - raise Exception.Create('Record ' + GetName + ' can not have it''s Persistent flag set to be contained in ' + GroupRecord.Name); - end; - end; - end; - 9: begin {Temporary} - if (GetSignature <> 'REFR') and - (GetSignature <> 'ACHR') and - (GetSignature <> 'ACRE') and - (GetSignature <> 'LAND') and - (GetSignature <> 'PGRD') and - (GetSignature <> 'NAVM') and - (GetSignature <> 'PGRE') and - (GetSignature <> 'PMIS') and - (GetSignature <> 'PARW') and {>>> Skyrim <<<} - (GetSignature <> 'PBEA') and {>>> Skyrim <<<} - (GetSignature <> 'PFLA') and {>>> Skyrim <<<} - (GetSignature <> 'PCON') and {>>> Skyrim <<<} - (GetSignature <> 'PBAR') and {>>> Skyrim <<<} - (GetSignature <> 'PHZD') {>>> Skyrim <<<} - then - raise Exception.Create('Record ' + GetName + ' can not be contained in ' + GroupRecord.Name); - if mrStruct.mrsFlags.IsPersistent then - raise Exception.Create('Record ' + GetName + ' can not have it''s Persistent flag set to be contained in ' + GroupRecord.Name); - if mrStruct.mrsFlags.IsVisibleWhenDistant and not wbVWDInTemporary then - raise Exception.Create('Record ' + GetName + ' can not have it''s Visible when Distant flag set to be contained in ' + GroupRecord.Name); - end; - end; - end; - - if GetIsDeleted and (GetDataSize > 0) then begin - GetDataSize; - Delete; - end; - - //not needed for now - inherited; -end; - -function TwbMainRecord.Reached: Boolean; -var - Signature : TwbSignature; - i : Integer; - IsComplex : Boolean; -{ - _File : IwbFile; - Rec : IwbMainRecord; -} - - SelfRef : IwbContainerElementRef; -begin - if esReachable in eStates then - Exit(False); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Signature := GetSignature; - IsComplex := (Signature = 'DIAL') or (Signature = 'WRLD') or (Signature = 'CELL'); - if GetIsWinningOverride or IsComplex then begin - {if csRefsBuild in cntStates then begin - Result := esNotReachable in eStates; - Exclude(eStates, esNotReachable); - if Result and (Length(mrReferences) > 0) then begin - _File := GetFile; - for i := Low(mrReferences) to High(mrReferences) do begin - Rec := _File.RecordByFormID[mrReferences[i], True]; - if Assigned(Rec) then - (Rec as IwbElementInternal).Reached; - end; - end; - if LinksToParent then begin - if Assigned(eContainer) then - (IwbContainer(eContainer) as IwbElementInternal).Reached; - Exit; - end; - end else} - Result := inherited Reached; - - if Result then begin - if not Assigned(eContainer) then - Exit; - if LinksToParent then - Exit; - if not IsComplex then - Exit; - - if Assigned(mrMaster) then - (IwbMainRecord(mrMaster) as IwbElementInternal).Reached - else - for i := 0 to Pred(GetOverrideCount) do - (GetOverride(i) as IwbElementInternal).Reached; - - if Assigned(mrGroup) then - (mrGroup as IwbElementInternal).Reached; - end; - end else - Result := (GetWinningOverride as IwbElementInternal).Reached; -end; - -procedure TwbMainRecord.Remove; -var - _File: IwbFileInternal; -begin - DoBuildRef(True); - - _File := GetFile as IwbFileInternal; - if Assigned(_File) then - _File.RemoveMainRecord(Self); - - if Assigned(mrMaster) then - (IwbMainRecord(mrMaster) as IwbMainRecordInternal).RemoveOverride(Self) - else - if Length(mrOverrides) > 0 then - (mrOverrides[0] as IwbMainRecordInternal).YouAreTheMaster(mrOverrides, mrReferencedBy); - - mrMaster := nil; - mrOverrides := nil; - mrReferencedBy := nil; - mrFixedFormID := 0; - mrLoadOrderFormID := 0; - Exclude(mrStates, mrsIsInjectedChecked); - mrConflictAll := caUnknown; - mrConflictThis := ctUnknown; - - inherited; -end; - -procedure TwbMainRecord.RemoveChildGroup(const aGroup: IwbGroupRecord); -begin - if Assigned(mrGroup) and mrGroup.Equals(aGroup) then begin - mrGroup := nil; - Exclude(mrStates, mrsSearchedChildGroup); - end; -end; - -function TwbMainRecord.RemoveElement(aPos: Integer; aMarkModified: Boolean = False): IwbElement; -begin - Result := inherited RemoveElement(aPos, aMarkModified); - if Assigned(Result) and (Result.ElementType = etSubRecord) then - with (Result as IwbSubRecord) do begin - if Signature = 'EDID' then - mrEditorID := '' - else if Signature = 'FULL' then begin - if (mrFullName <> '') and (Value = mrFullName) then - mrFullName := ''; - end else if Signature = 'NAME' then - Exclude(mrStates, mrsBaseRecordChecked); - end; -end; - -procedure TwbMainRecord.RemoveEntry; -var - Entry : IwbMainRecordEntry; - i : Integer; -begin - if Supports(IInterface(mrMaster), IwbMainRecordEntry, Entry) then - Entry.RemoveEntry - else begin - RemoveEntryInternal; - for i := Low(mrOverrides) to High(mrOverrides) do - if Supports(mrOverrides[i], IwbMainRecordEntry, Entry) then - Entry.RemoveEntryInternal; - end; -end; - -procedure TwbMainRecord.RemoveEntryInternal; -begin - with mreHeader do begin - Assert(mrehInUse); - if mreGeneration = mrehGeneration then begin - if Assigned(mrePrev) then - IwbMainRecordEntry(mrePrev).NextEntry := IwbMainRecordEntry(mreNext) - else begin - Assert(Equals(IwbMainRecordEntry(mrehHead))); - mrehHead := mreNext; - end; - - if Assigned(mreNext) then - IwbMainRecordEntry(mreNext).PrevEntry := IwbMainRecordEntry(mrePrev) - else begin - Assert(Equals(IwbMainRecordEntry(mrehTail))); - mrehTail := mrePrev; - end; - Dec(mrehCount); - end; - mrePrev := nil; - mreNext := nil; - mreGeneration := -1; - end; -end; - -function TwbMainRecord.RemoveInjected(aCanRemove: Boolean): Boolean; -var - i : Integer; - SelfRef : IwbContainerElementRef; - Element : IwbElement; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := False; - if GetReferencesInjected then begin - if GetSignature = 'SCPT' then begin - Element := GetElementByName('References'); - if Assigned(Element) then - Element.Remove; - Element := GetRecordBySignature('SCDA'); - if Assigned(Element) then - Element.EditValue := '1D 00 00 00'; - Element := GetRecordBySignature('SCHR'); - if Assigned(Element) then with (Element as IwbContainerElementRef) do begin - ElementByName['RefCount'].EditValue := '0'; - ElementByName['CompiledSize'].EditValue := '4'; - end; - Element := GetRecordBySignature('SCTX'); - if Assigned(Element) then - with TStringList.Create do try - Text := Element.EditValue; - for i := 0 to Pred(Count) do - if StartsWith(Trim(Strings[i]), 'begin') then begin - while i <= Count do - Delete(Pred(Count)); - Break; - end; - Element.EditValue := Text; - finally - Free; - end; - end else begin - for i := High(cntElements) downto Low(cntElements) do - if cntElements[i].CanContainFormIDs then begin - Result := cntElements[i].RemoveInjected(True) or Result; - if Result and aCanRemove then - Break; - end; - end; - end; - Exclude(mrStates, mrsReferencesInjectedChecked); - if Result and aCanRemove and GetIsRemoveable then begin - Result := False; - Remove; - end; -end; - -procedure TwbMainRecord.RemoveOverride(const aMainRecord: IwbMainRecord); -var - i,j: Integer; -begin - j := 0; - for i := Low(mrOverrides) to High(mrOverrides) do begin - if (mrOverrides[i] as IwbElement) <> (aMainRecord as IwbElement) then begin - if i <> j then - mrOverrides[j] := mrOverrides[i]; - Inc(j); - end; - end; - SetLength(mrOverrides, j); -end; - -procedure TwbMainRecord.RemoveReferencedBy(aMainRecord: IwbMainRecord); -var - i: Integer; -begin - if mrsReferencedByUnsorted in mrStates then - SortReferencedBy; - - if FindReferencedBy(aMainRecord, i) then begin - mrReferencedBy[i] := nil; - if i < High(mrReferencedBy) then begin - Move(mrReferencedBy[Succ(i)], mrReferencedBy[i], SizeOf(Pointer) * (High(mrReferencedBy) - i)); - Pointer(mrReferencedBy[High(mrReferencedBy)]) := nil; - end; - SetLength(mrReferencedBy, Pred(Length(mrReferencedBy))); - end; -end; - -procedure TwbMainRecord.ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); -var - _File: IwbFile; -begin - if not aAsNew then begin - _File := GetReferenceFile; - aStrings.AddObject(_File.FileName, Pointer(_File)); - end; - inherited; -end; - -procedure TwbMainRecord.Reset; -begin - ReleaseElements; - mrDataStorage := nil; - InitDataPtr; - inherited; -end; - -procedure TwbMainRecord.ResetConflict; -var - i: Integer; -begin - inherited; - if Assigned(mrMaster) then - IwbElement(mrMaster).ResetConflict - else begin - mrConflictAll := caUnknown; - mrConflictThis := ctUnknown; - for i := Low(mrOverrides) to High(mrOverrides) do - with mrOverrides[i] do begin - ConflictAll := caUnknown; - ConflictThis := ctUnknown; - end; - end; -end; - -procedure TwbMainRecord.ResetReachable; -begin - Include(eStates, esNotReachable); - Exclude(eStates, esReachable); -end; - -function TwbMainRecord.ResolveElementName(aName: string; out aRemainingName: string; aCanCreate: Boolean): IwbElement; -var - i: Integer; -begin - Result := inherited ResolveElementName(aName, aRemainingName, aCanCreate); - if not Assigned(Result) and aCanCreate and Assigned(mrDef) and (Length(aName) = 4) then begin - i := mrDef.GetMemberIndexFor(StrToSignature(aName), nil); - if i < 0 then - Exit; - Assign(i, nil, False); - Result := GetElementBySignature(StrToSignature(aName)); - end; -end; - -procedure TwbMainRecord.ScanData; -var - SelfRef : IwbContainerElementRef; -begin - if not wbDelayLoadRecords then begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - end; -end; - -procedure TwbMainRecord.SetChildGroup(const aGroup: IwbGroupRecord); -begin - if Pointer(mrGroup) = Pointer(aGroup) then - Exit; - - if Assigned(aGroup) then begin - if not (not Assigned(mrGroup) or (mrGroup.Equals(aGroup))) then begin - if not (not Assigned(mrGroup) or (mrGroup.Equals(aGroup))) then - Assert(not Assigned(mrGroup) or (mrGroup.Equals(aGroup)), 'Found additional ' + mrGroup.Name + ' for ' + Self.GetName); - end; - if Assigned(eContainer) then - IwbContainer(eContainer).Equals(aGroup.Container); - end else - Assert(Assigned(mrGroup)); - mrGroup := aGroup; -end; - -procedure TwbMainRecord.SetConflictAll(aValue: TConflictAll); -begin - mrConflictAll := aValue; -end; - -procedure TwbMainRecord.SetConflictThis(aValue: TConflictThis); -begin - mrConflictThis := aValue; -end; - -procedure TwbMainRecord.SetContainer(const aContainer: IwbContainer); -var - ContainedIn: IwbContainedIn; -begin - inherited; - if csInit in cntStates then - if Supports(GetElementBySortOrder(-2 + GetAdditionalElementCount), IwbContainedIn, ContainedIn) then - ContainedIn.ContainerChanged; -end; - -procedure TwbMainRecord.SetEditorID(const aValue: string); -var - SelfRef : IwbContainerElementRef; - Rec : IwbRecord; - i : Integer; -begin - if not Assigned(mrDef) then - Exit; - - if aValue = GetEditorID then - Exit; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Rec := GetRecordBySignature('EDID'); - if not Assigned(Rec) then begin - i := mrDef.GetMemberIndexFor('EDID', nil); - if i < 0 then - Exit; - Assign(i, nil, False); - Rec := GetRecordBySignature('EDID'); - Assert(Assigned(Rec)); - end; - - if aValue = '' then - Rec.Remove - else - Rec.EditValue := aValue; - - Assert(mrEditorID = aValue); -end; - -procedure TwbMainRecord.SetEditValue(const aValue: string); -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if wbDisplayLoadOrderFormID then begin - SetLoadOrderFormID(StrToInt64('$'+aValue)); - NotifyChanged(eContainer); - end else - raise Exception.Create('FormID can only be edited if wbDisplayLoadOrderFormID is active'); -end; - -procedure TwbMainRecord.SetIsCompressed(aValue: Boolean); -begin - if aValue <> GetIsCompressed then begin - MakeHeaderWriteable; - GetFlagsPtr.SetCompressed(aValue); - end; -end; - -procedure TwbMainRecord.SetIsDeleted(aValue: Boolean); -var - SelfRef : IwbContainerElementRef; - i, j : Integer; - BasePtr : Pointer; - GroupRecord : IwbGroupRecord; - Master : IwbMainRecord; - MainRecord : IwbMainRecord; - SelfIndex : Integer; - _File : IwbFile; -begin - if aValue <> GetIsDeleted then begin - if aValue then - Delete - else begin - SelfRef := Self; - DoInit; - - SetModified(True); - InvalidateStorage; - ReleaseElements; - - MakeHeaderWriteable; - GetFlagsPtr.SetDeleted(False); - - if Supports(Self.GetContainer, IwbGroupRecord, GroupRecord) then - if wbCreateContainedIn and (GroupRecord.GroupType in [1, 4..10]) then - with TwbContainedInElement.Create(Self) do begin - _AddRef; _Release; - end; - GroupRecord := nil; - - BasePtr := dcBasePtr; - with TwbRecordHeaderStruct.Create(Self, BasePtr, Pointer( Cardinal(BasePtr) + wbSizeOfMainRecordStruct), mrDef.RecordHeaderStruct, '') do begin - Include(dcFlags, dcfDontSave); - SetSortOrder(-1); - SetMemoryOrder(Low(Integer)); - _AddRef; _Release; - end; - - for i := 0 to Pred(mrDef.MemberCount) do - if mrDef.Members[i].Required then - Assign(i, nil, False); - - Master := GetMaster; - - if not Assigned(Master) then - Exit; - - _File := GetFile; - - SelfIndex := -1; - for i := 0 to Pred(Master.OverrideCount) do - if Equals(Master.Overrides[i]) then begin - SelfIndex := i; - Break; - end; - - for i := Pred(SelfIndex) downto 0 do begin - MainRecord := Master.Overrides[i]; - if not MainRecord.IsDeleted then begin - for j := Pred(_File.MasterCount) downto 0 do - if MainRecord._File.Equals(_File.Masters[j]) then begin - Self.Assign(Low(Integer), MainRecord, False); - Exit; - end; - end; - end; - - if not Master.IsDeleted then - Self.Assign(Low(Integer), Master, False); - - end; - end; -end; - -procedure TwbMainRecord.SetIsESM(aValue: Boolean); -begin - if aValue <> GetIsESM then begin - MakeHeaderWriteable; - GetFlagsPtr.SetESM(aValue); - end; -end; - -procedure TwbMainRecord.SetIsLocalized(aValue: Boolean); -begin - if aValue <> GetIsLocalized then begin - MakeHeaderWriteable; - GetFlagsPtr.SetLocalized(aValue); - end; -end; - -procedure TwbMainRecord.SetIsInitiallyDisabled(aValue: Boolean); -begin - if aValue <> GetIsInitiallyDisabled then begin - MakeHeaderWriteable; - GetFlagsPtr.SetInitiallyDisabled(aValue); - end; -end; - -procedure TwbMainRecord.SetIsPersistent(aValue: Boolean); -var - NeedUpdate: Boolean; -begin - if aValue <> GetIsPersistent then begin - NeedUpdate := CheckChildOfCell; - MakeHeaderWriteable; - GetFlagsPtr.SetPersistent(aValue); - if NeedUpdate then - UpdateCellChildGroup; - end; -end; - -procedure TwbMainRecord.SetIsVisibleWhenDistant(aValue: Boolean); -var - NeedUpdate: Boolean; -begin - if aValue <> GetIsVisibleWhenDistant then begin - NeedUpdate := CheckChildOfCell; - MakeHeaderWriteable; - GetFlagsPtr.SetVisibleWhenDistant(aValue); - if NeedUpdate then - UpdateCellChildGroup; - end; -end; - -procedure TwbMainRecord.SetLoadOrderFormID(aFormID: Cardinal); -var - _File: IwbFileInternal; - FileID: Integer; - NewFileID: Integer; - i : Integer; - Master: IwbMainRecord; -begin - if GetLoadOrderFormID = aFormID then - Exit; - - _File := GetFile as IwbFileInternal; - - FileID := aFormID shr 24; - NewFileID := -1; - - if FileID = _File.LoadOrder then - NewFileID := _File.MasterCount - else begin - for i := 0 to Pred(_File.MasterCount) do - if _File.Masters[i].LoadOrder = FileID then begin - NewFileID := i; - Break; - end; - end; - - if NewFileID < 0 then - raise Exception.Create('FormID ['+IntToHex64(aFormID, 8)+'] belongs to a file that is not available as master to records in ' + _File.Name); - - aFormID := (aFormID and $00FFFFFF) or (Cardinal(NewFileID) shl 24); - - if (GetFormID and $00FFFFFF) = (aFormID and $00FFFFFF) then - if ((GetFormID shr 24) >= Cardinal(_File.MasterCount)) and ((aFormID shr 24) >= Cardinal(_File.MasterCount)) then begin - // we can do this relatively quietly and quickly... - - if Assigned(mrGroup) then - Assert(mrGroup.GroupLabel = mrStruct.mrsFormID); - MakeHeaderWriteable; - mrStruct.mrsFormID := aFormID; - if Assigned(mrGroup) then - mrGroup.GroupLabel := aFormID; - UpdateInteriorCellGroup; - Exit; - end; - - Master := _File.RecordByFormID[aFormID, False]; - if Assigned(Master) and ((Master._File as IwbFileInternal) = _File) then - raise Exception.Create('FormID ['+IntToHex64(aFormID, 8)+'] is already present in file ' + _File.Name); - - _File.RemoveMainRecord(Self); - - if Assigned(mrMaster) then - (IwbMainRecord(mrMaster) as IwbMainRecordInternal).RemoveOverride(Self) - else - if Length(mrOverrides) > 0 then - (mrOverrides[0] as IwbMainRecordInternal).YouAreTheMaster(mrOverrides, mrReferencedBy); - - mrMaster := nil; - mrOverrides := nil; - mrReferencedBy := nil; - mrFixedFormID := 0; - mrLoadOrderFormID := 0; - Exclude(mrStates, mrsIsInjectedChecked); - mrConflictAll := caUnknown; - mrConflictThis := ctUnknown; - - if Assigned(mrGroup) then - Assert(mrGroup.GroupLabel = mrStruct.mrsFormID); - MakeHeaderWriteable; - mrStruct.mrsFormID := aFormID; - if Assigned(mrGroup) then - mrGroup.GroupLabel := aFormID; - UpdateInteriorCellGroup; - - _File.AddMainRecord(Self); -end; - -procedure TwbMainRecord.SetMaster(const aMaster: IwbMainRecord); -begin - mrMaster := Pointer(aMaster); - if Assigned(mrMaster) then begin - Include(mrStates, mrsIsInjectedChecked); - Exclude(mrStates, mrsIsInjected); - end else - Exclude(mrStates, mrsIsInjectedChecked); -end; - -procedure TwbMainRecord.SetNativeValue(const aValue: Variant); -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if wbDisplayLoadOrderFormID then begin - SetLoadOrderFormID(aValue); - NotifyChanged(eContainer); - end else - raise Exception.Create('FormID can only be edited if wbDisplayLoadOrderFormID is active'); -end; - -procedure TwbMainRecord.SetNextEntry(const aEntry: IwbMainRecordEntry); -begin - Assert(mreHeader.mrehInUse); - Assert(mreGeneration = mreHeader.mrehGeneration); - mreNext := Pointer(aEntry); -end; - -function TwbMainRecord.SetPosition(const aPosition: TwbVector): Boolean; -var - Signature : TwbSignature; - SelfRef : IwbContainerElementRef; - DataRec : IwbContainerElementRef; -begin - Result := False; - - Signature := GetSignature; - if (Signature <> 'REFR') and - (Signature <> 'ACRE') and - (Signature <> 'ACHR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') {>>> Skyrim <<<} - then - Exit; - - SelfRef := Self; - DoInit; - - if not Supports(GetRecordBySignature('DATA'), IwbContainerElementRef, DataRec) then - Exit; - - if DataRec.ElementCount <> 2 then - Exit; - - with aPosition, (DataRec.Elements[0] as IwbContainerElementRef) do begin - if ElementCount <> 3 then - Exit; - - Elements[0].NativeValue := X; - Elements[1].NativeValue := Y; - Elements[2].NativeValue := Z; - end; - Result := True; -end; - -procedure TwbMainRecord.SetPrevEntry(const aEntry: IwbMainRecordEntry); -begin - Assert(mreHeader.mrehInUse); - Assert(mreGeneration = mreHeader.mrehGeneration); - mrePrev := Pointer(aEntry); -end; - -procedure TwbMainRecord.SetReferencesInjected(aValue: Boolean); -begin - if aValue then begin - Include(mrStates, mrsReferencesInjectedChecked); - Include(mrStates, mrsReferencesInjected); - end else begin - Exclude(mrStates, mrsReferencesInjectedChecked); - Exclude(mrStates, mrsReferencesInjected); - end; -end; - -function CompareReferencedByFile(Item1, Item2: Pointer): Integer; -begin - Result := CmpW32(IwbMainRecord(Item1)._File.LoadOrder, IwbMainRecord(Item2)._File.LoadOrder); -end; - -function CompareReferencedBy(Item1, Item2: Pointer): Integer; -begin - Result := CmpW32(IwbMainRecord(Item1).LoadOrderFormID , IwbMainRecord(Item2).LoadOrderFormID); - if Result = 0 then - Result := CompareReferencedByFile(Item1, Item2); -end; - -procedure TwbMainRecord.SortReferencedBy; -begin - Exclude(mrStates, mrsReferencedByUnsorted); - if Length(mrReferencedBy) > 1 then - wbMergeSort(@mrReferencedBy[0], Length(mrReferencedBy), CompareReferencedBy); -end; - -procedure TwbMainRecord.UpdateCellChildGroup; -var - OldTypeGroup : IwbGroupRecord; - OldChildGroup : IwbGroupRecord; - OldCellOwnerGroup : IwbGroupRecord; - NewTypeGroup : IwbGroupRecord; - TempGroup : IwbGroupRecord; - TempGroup2 : IwbGroupRecord; - NewChildGroup : IwbGroupRecord; - NewCellOwnerGroup : IwbGroupRecord; - CorrectGroupType : Integer; - i : Integer; - OldCell : IwbMainRecord; - NewCell : IwbMainRecord; - Worldspace : IwbMainRecord; - IsExterior : Boolean; - SelfRef : IwbElement; - Position : TwbVector; - GridCell : TwbGridCell; - SubBlock : TwbGridCell; - Block : TwbGridCell; - TempGridCell : TwbGridCell; - SubBlockLabel : Cardinal; - BlockLabel : Cardinal; -begin - SelfRef := Self as IwbElement; - - if not Supports(GetContainer, IwbGroupRecord, OldTypeGroup) then - raise Exception.Create(GetName + ' is not contained in a group.'); - if not (OldTypeGroup.GroupType in [8, 9, 10]) then - raise Exception.Create(GetName + ' is not contained in a group of type "Cell Persistent Childen", "Cell Temporary Children" or "Cell Visible Distant Children"'); - if not Supports(OldTypeGroup.Container, IwbGroupRecord, OldChildGroup) then - raise Exception.Create(OldTypeGroup.GetName + ' is not contained in a group'); - if not (OldChildGroup.GroupType in [6]) then - raise Exception.Create(OldTypeGroup.GetName + ' is not contained in a group of type "Cell Children"'); - - if GetIsPersistent then - CorrectGroupType := 8 - else if GetIsVisibleWhenDistant and not wbVWDInTemporary then - CorrectGroupType := 10 - else - CorrectGroupType := 9; - - if OldTypeGroup.GroupType = CorrectGroupType then - Exit; - - OldCell := OldChildGroup.ChildrenOf; - if not Assigned(OldCell) then - raise Exception.Create(OldChildGroup.GetName + ' can not find its CELL record'); - if not OldCell.ElementExists['DATA'] then - raise Exception.Create(OldCell.GetName + ' is missing its DATA subrecord'); - - i := OldCell.GetElementNativeValue('DATA'); - IsExterior := (i and 1) = 0; - if IsExterior then begin - if not Supports(OldCell.Container, IwbGroupRecord, OldCellOwnerGroup) then - raise Exception.Create(OldCell.GetName + ' is not contained in a group'); - if not (OldCellOwnerGroup.GroupType in [1, 5]) then - raise Exception.Create(OldCell.GetName + ' is not contained in a group of type "World Childen" or "Exterior Cell Sub-Block"'); - if (CorrectGroupType = 8) then begin - if OldCellOwnerGroup.GroupType <> 1 then begin - - if not Supports(OldCellOwnerGroup.Container, IwbGroupRecord, TempGroup) then - raise Exception.Create(OldCellOwnerGroup.GetName + ' is not contained in a group'); - if not (TempGroup.GroupType in [4]) then - raise Exception.Create(OldCellOwnerGroup.GetName + ' is not contained in a group of type "Exterior Cell Block"'); - - if not Supports(TempGroup.Container, IwbGroupRecord, NewCellOwnerGroup) then - raise Exception.Create(TempGroup.GetName + ' is not contained in a group'); - if not (NewCellOwnerGroup.GroupType in [1]) then - raise Exception.Create(TempGroup.GetName + ' is not contained in a group of type "World Childen"'); - - NewCell := nil; - for i := 0 to Pred(NewCellOwnerGroup.ElementCount) do - if Supports(NewCellOwnerGroup.Elements[i], IwbMainRecord, NewCell) then - if NewCell.Signature <> 'CELL' then - NewCell := nil - else - Break; - - if not Assigned(NewCell) then begin - Worldspace := NewCellOwnerGroup.ChildrenOf; - if not Assigned(Worldspace) then - raise Exception.Create(NewCellOwnerGroup.GetName + ' can not find its WRLD record'); - Worldspace := Worldspace.MasterOrSelf; - TempGroup := Worldspace.ChildGroup; - if not Assigned(TempGroup) then - raise Exception.Create(Worldspace.GetName + ' can not find its child group'); - - for i := 0 to Pred(TempGroup.ElementCount) do - if Supports(TempGroup.Elements[i], IwbMainRecord, NewCell) then - if NewCell.Signature <> 'CELL' then - NewCell := nil - else - Break; - - if Assigned(NewCell) then - NewCell := wbCopyElementToFile(NewCell, GetFile, False, True, '', '', '') as IwbMainRecord; - end; - - if not Assigned(NewCell) then - raise Exception.Create('Could not determine CELL for persistent exterior references'); - - NewChildGroup := NewCell.EnsureChildGroup; - end else - NewChildGroup := OldChildGroup; - end else begin - if OldCellOwnerGroup.GroupType <> 5 then begin - - if not GetPosition(Position) then - raise Exception.Create('Could not determine position of ' + GetName); - - GridCell := wbPositionToGridCell(Position); - SubBlock := wbSubBlockFromGridCell(GridCell); - Block := wbBlockFromSubBlock(SubBlock); - - SubBlockLabel := wbGridCellToGroupLabel(SubBlock); - BlockLabel := wbGridCellToGroupLabel(Block); - - NewCell := nil; - TempGroup := nil; - for i := 0 to Pred(OldCellOwnerGroup.ElementCount) do - if Supports(OldCellOwnerGroup.Elements[i], IwbGroupRecord, TempGroup) then - if (TempGroup.GroupType = 4) and (TempGroup.GroupLabel = BlockLabel) then - Break - else - TempGroup := nil; - - if Assigned(TempGroup) then begin - NewCellOwnerGroup := nil; - for i := 0 to Pred(TempGroup.ElementCount) do - if Supports(TempGroup.Elements[i], IwbGroupRecord, NewCellOwnerGroup) then - if (NewCellOwnerGroup.GroupType = 5) and (NewCellOwnerGroup.GroupLabel = SubBlockLabel) then - Break - else - NewCellOwnerGroup := nil; - if Assigned(NewCellOwnerGroup) then - for i := 0 to Pred(NewCellOwnerGroup.ElementCount) do - if Supports(NewCellOwnerGroup.Elements[i], IwbMainRecord, NewCell) then - if NewCell.GetGridCell(TempGridCell) and (GridCell.x = TempGridCell.x) and (GridCell.y = TempGridCell.y) then - Break - else - NewCell := nil; - end; - - if not Assigned(NewCell) then begin - Worldspace := OldCellOwnerGroup.ChildrenOf; - if not Assigned(Worldspace) then - raise Exception.Create(OldCellOwnerGroup.GetName + ' can not find its WRLD record'); - Worldspace := Worldspace.MasterOrSelf; - TempGroup2 := Worldspace.ChildGroup; - if not Assigned(TempGroup2) then - raise Exception.Create(Worldspace.GetName + ' can not find its child group'); - - TempGroup := nil; - for i := 0 to Pred(TempGroup2.ElementCount) do - if Supports(TempGroup2.Elements[i], IwbGroupRecord, TempGroup) then - if (TempGroup.GroupType = 4) and (TempGroup.GroupLabel = BlockLabel) then - Break - else - TempGroup := nil; - - if Assigned(TempGroup) then begin - NewCellOwnerGroup := nil; - for i := 0 to Pred(TempGroup.ElementCount) do - if Supports(TempGroup.Elements[i], IwbGroupRecord, NewCellOwnerGroup) then - if (NewCellOwnerGroup.GroupType = 5) and (NewCellOwnerGroup.GroupLabel = SubBlockLabel) then - Break - else - NewCellOwnerGroup := nil; - if Assigned(NewCellOwnerGroup) then - for i := 0 to Pred(NewCellOwnerGroup.ElementCount) do - if Supports(NewCellOwnerGroup.Elements[i], IwbMainRecord, NewCell) then - if NewCell.GetGridCell(TempGridCell) and (GridCell.x = TempGridCell.x) and (GridCell.y = TempGridCell.y) then - Break - else - NewCell := nil; - end; - - if Assigned(NewCell) then - NewCell := wbCopyElementToFile(NewCell, GetFile, False, True, '', '', '') as IwbMainRecord; - end; - - if not Assigned(NewCell) then - raise Exception.Create('Could not determine CELL for persistent exterior references'); - - NewChildGroup := NewCell.EnsureChildGroup; - end else - NewChildGroup := OldChildGroup; - end; - end else - NewChildGroup := OldChildGroup; - - if not Assigned(NewChildGroup) then - raise Exception.Create('Could not determine new CELL child group'); - - NewTypeGroup := nil; - for i := 0 to Pred(NewChildGroup.ElementCount) do - if Supports(NewChildGroup.Elements[i], IwbGroupRecord, NewTypeGroup) then - if NewTypeGroup.GroupType = CorrectGroupType then - Break - else - NewTypeGroup := nil; - - if not Assigned(NewTypeGroup) then - NewTypeGroup := TwbGroupRecord.Create(NewChildGroup, CorrectGroupType, NewChildGroup.ChildrenOf); - - OldTypeGroup.RemoveElement(SelfRef); - if OldTypeGroup.ElementCount = 0 then - OldTypeGroup.Remove - else - (OldTypeGroup as IwbGroupRecordInternal).SetModified(True); - NewTypeGroup.AddElement(SelfRef); - (NewTypeGroup as IwbGroupRecordInternal).SetModified(True); - (NewTypeGroup as IwbGroupRecordInternal).Sort; - if OldChildGroup.ElementCount = 0 then - OldChildGroup.Remove - else - (OldChildGroup as IwbGroupRecordInternal).SetModified(True); -end; - -procedure TwbMainRecord.UpdateInteriorCellGroup; -var - Container : IwbContainer; - - SubBlockGroup : IwbGroupRecord; - BlockGroup : IwbGroupRecord; - TopGroup : IwbGroupRecord; - - NewSubBlockGroup : IwbGroupRecord; - NewBlockGroup : IwbGroupRecord; - - ChildGroup : IwbGroupRecord; - - i: Integer; - s : string; - - Block : Integer; - SubBlock : Integer; - - SelfRef : IwbElement; -begin - SelfRef := Self as IwbElement; - - if GetSignature <> 'CELL' then - Exit; - if not GetElementExists('DATA') then - Exit; - i := GetElementNativeValue('DATA'); - if (i and 1) <> 1 then - Exit; - - Container := GetContainer; - - if not Supports(Container, IwbGroupRecord, SubBlockGroup) then - raise Exception.Create(GetName + ' is not contained in a group.'); - if not (SubBlockGroup.GroupType in [3]) then begin - if (SubBlockGroup.GroupType in [0]) and (TwbSignature(SubBlockGroup.GroupLabel) = 'CELL') then begin - TopGroup := SubBlockGroup; - SubBlockGroup := nil; - end else - raise Exception.Create(GetName + ' is not contained in a group of type "Interior Cell Sub-Block"'); - end else begin - if not Supports(SubBlockGroup.Container, IwbGroupRecord, BlockGroup) then - raise Exception.Create(SubBlockGroup.GetName + ' is not contained in a group.'); - if not (BlockGroup.GroupType in [2]) then - raise Exception.Create(GetName + ' is not contained in a group of type "Interior Cell Block"'); - - if not Supports(BlockGroup.Container, IwbGroupRecord, TopGroup) then - raise Exception.Create(TopGroup.GetName + ' is not contained in a group.'); - if not (TopGroup.GroupType in [0]) or (TwbSignature(TopGroup.GroupLabel) <> 'CELL') then - raise Exception.Create(GetName + ' is not contained in a group of type "Top CELL"'); - end; - - s := '00' + IntToStr(mrStruct.mrsFormID and Cardinal($00FFFFFF)); - i := Length(s); - if i > 2 then - System.Delete(s, 1, i - 2); - - Block := StrToInt(s[2]); - SubBlock := StrToInt(s[1]); - - NewBlockGroup := BlockGroup; - NewSubBlockGroup := SubBlockGroup; - - if not Assigned(NewBlockGroup) or (NewBlockGroup.GroupLabel <> Block) then begin - NewBlockGroup := nil; - NewSubBlockGroup := nil; - - for i := 0 to Pred(TopGroup.ElementCount) do - if Supports(TopGroup.Elements[i], IwbGroupRecord, NewBlockGroup) then - if NewBlockGroup.GroupLabel = Block then - Break - else - NewBlockGroup := nil; - - if not Assigned(NewBlockGroup) then begin - NewBlockGroup := TwbGroupRecord.Create(TopGroup, 2, Block); - (TopGroup as IwbGroupRecordInternal).SetModified(True); - (TopGroup as IwbGroupRecordInternal).Sort; - end; - end; - - if not Assigned(NewSubBlockGroup) or (NewSubBlockGroup.GroupLabel <> SubBlock) then begin - NewSubBlockGroup := nil; - - for i := 0 to Pred(NewBlockGroup.ElementCount) do - if Supports(NewBlockGroup.Elements[i], IwbGroupRecord, NewSubBlockGroup) then - if NewSubBlockGroup.GroupLabel = SubBlock then - Break - else - NewSubBlockGroup := nil; - - if not Assigned(NewSubBlockGroup) then begin - NewSubBlockGroup := TwbGroupRecord.Create(NewBlockGroup, 3, SubBlock); - (NewBlockGroup as IwbGroupRecordInternal).SetModified(True); - (NewBlockGroup as IwbGroupRecordInternal).Sort; - end; - end; - - if not Container.Equals(NewSubBlockGroup) then begin - - ChildGroup := mrGroup; - - Container.RemoveElement(SelfRef); - if Assigned(ChildGroup) then - Container.RemoveElement(ChildGroup); - - NewSubBlockGroup.AddElement(SelfRef); - if Assigned(ChildGroup) then - NewSubBlockGroup.AddElement(ChildGroup); - (NewSubBlockGroup as IwbGroupRecordInternal).SetModified(True); - (NewSubBlockGroup as IwbGroupRecordInternal).Sort; - - if Assigned(SubBlockGroup) then begin - if SubBlockGroup.ElementCount = 0 then begin - SubBlockGroup.Remove; - if Assigned(BlockGroup) then begin - if BlockGroup.ElementCount = 0 then begin - BlockGroup.Remove; - (TopGroup as IwbGroupRecordInternal).SetModified(True); - end else - (BlockGroup as IwbGroupRecordInternal).SetModified(True); - end; - end else - (SubBlockGroup as IwbGroupRecordInternal).SetModified(True); - end; - end; -end; - -procedure TwbMainRecord.UpdateRefs; -begin - if (csRefsBuild in cntStates) then - BuildRef; -end; - -procedure TwbMainRecord.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - CurrentPosition : Int64; - NewPosition : Int64; - DataSize : Cardinal; - MemoryStream : TMemoryStream; - mrs : TwbMainRecordStruct; -var - SelfRef : IwbContainerElementRef; -begin - if (esModified in eStates) or wbTestWrite then begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - CurrentPosition := aStream.Position; - - mrs := mrStruct^; -// mrs.mrsFlags2 := 0; - - aStream.WriteBuffer(mrs, wbSizeOfMainRecordStruct ); - - if wbForceNewHeader then - aStream.WriteBuffer(wbNewHeaderAddon, SizeOf(wbNewHeaderAddon) ); - - if mrStruct.mrsFlags.IsCompressed then begin - - MemoryStream := TMemoryStream.Create; - try - inherited WriteToStreamInternal(MemoryStream, aResetModified); - DataSize := MemoryStream.Size; - aStream.WriteBuffer(DataSize, SizeOf(DataSize)); - MemoryStream.Position := 0; - ZCompressStream(MemoryStream, aStream); - finally - FreeAndNil(MemoryStream); - end; - - end else - inherited; - - NewPosition := aStream.Position; - if wbForceNewHeader then - DataSize := (NewPosition - CurrentPosition) - wbSizeOfMainRecordStruct - SizeOf(wbNewHeaderAddon) - else - DataSize := (NewPosition - CurrentPosition) - wbSizeOfMainRecordStruct; - aStream.Position := CurrentPosition + 4; - aStream.WriteBuffer(DataSize, SizeOf(DataSize)); - aStream.Position := NewPosition; - - end else begin - CurrentPosition := aStream.Position; - aStream.WriteBuffer(dcBasePtr^, Cardinal(dcEndPtr) - Cardinal(dcBasePtr) ); - if CurrentPosition + wbSizeOfMainRecordStruct + mrStruct.mrsDataSize <> aStream.Position then - Assert(CurrentPosition + wbSizeOfMainRecordStruct + mrStruct.mrsDataSize <> aStream.Position); - end; - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -procedure TwbMainRecord.YouAreTheMaster(const aOverrides, aReferencedBy: TDynMainRecords); -var - i: Integer; - FileID: Integer; - _File: IwbFile; -begin - Assert(Length(aOverrides) > 0); - Assert(Equals(aOverrides[0])); - Assert(Assigned(mrMaster)); - Assert(Length(mrOverrides) = 0); - Assert(Length(mrReferencedBy) = 0); - - mrMaster := nil; - mrOverrides := Copy(aOverrides, 1, High(Integer)); - for i := Low(mrOverrides) to High(mrOverrides) do - (mrOverrides[i] as IwbMainRecordInternal).SetMaster(Self); - mrOverridesSorted := False; - - mrReferencedBy := aReferencedBy; - - for i := Low(mrReferencedBy) to High(mrReferencedBy) do - (mrReferencedBy[i] as IwbMainRecordInternal).SetReferencesInjected(True); - - FileID := GetFormID shr 24; - _File := GetFile; - Assert(FileID < _File.MasterCount); - - (_File.Masters[FileID] as IwbFileInternal).InjectMainRecord(Self); - Include(mrStates, mrsIsInjectedChecked); - Include(mrStates, mrsIsInjected); -end; - -procedure TwbMainRecord.YouAreTheMaster(const aOldMaster: IwbMainRecord; const aOverrides, aReferencedBy: TDynMainRecords); -var - i : Integer; -begin - Assert(not Assigned(mrMaster)); - Assert(Length(mrOverrides) = 0); - Assert(Length(mrReferencedBy) = 0); - - SetLength(mrOverrides, Succ(Length(aOverrides))); - mrOverrides[0] := aOldMaster; - for i := Low(aOverrides) to High(aOverrides) do - mrOverrides[Succ(i)] := aOverrides[i]; - - for i := Low(mrOverrides) to High(mrOverrides) do - (mrOverrides[i] as IwbMainRecordInternal).SetMaster(Self); - mrOverridesSorted := False; - - mrReferencedBy := aReferencedBy; - - for i := Low(mrReferencedBy) to High(mrReferencedBy) do - (mrReferencedBy[i] as IwbMainRecordInternal).SetReferencesInjected(False); - Exclude(mrStates, mrsIsInjectedChecked); -end; - -procedure TwbMainRecord.YouGotAMaster(const aMaster: IwbMainRecord); -begin - Assert(Assigned(aMaster)); - Assert(not Assigned(mrMaster)); - (aMaster as IwbMainRecordInternal).YouAreTheMaster(Self as IwbMainRecord, mrOverrides, mrReferencedBy); - Assert(aMaster.Equals(IwbElement(mrMaster))); - mrOverrides := nil; - mrReferencedBy := nil; - (aMaster._File as IwbFileInternal).RemoveInjectedMainRecord(Self); - Include(mrStates, mrsIsInjectedChecked); - Exclude(mrStates, mrsIsInjected); -end; - -{ TwbSubRecord } - -function TwbSubRecord.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - i : Integer; - s : string; - ArrayDef : IwbArrayDef; - StructDef : IwbStructDef; - IntegerDef : IwbIntegerDef; - FlagsDef : IwbFlagsDef; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be modified.'); - - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - if Assigned(srValueDef) then begin - - case srValueDef.DefType of - dtRecord, dtSubRecord, dtSubRecordArray, dtSubRecordStruct: Assert(False); - dtArray: begin - - ArrayDef := srValueDef as IwbArrayDef; - - if srsSorted in srStates then begin - Assert(not (srsSortInvalid in srStates)); - if FindBySortKey(aElement.SortKey[False], False, i) then begin - Result := cntElements[i]; - if aDeepCopy then - Result.Assign(Low(Integer), aElement, False); - Exit; - end; - end; - - if srsSorted in srStates then - s := '' - else - s := '#' + IntToStr(Length(cntElements)); - - if not Supports(aElement, IwbStringListTerminator) then - if (csAsCreatedEmpty in cntStates) then begin - SetModified(True); - Assert(Length(cntElements)=1); - Result := cntElements[0]; - Exclude(cntStates, csAsCreatedEmpty); - try - Result.Assign(Low(Integer), aElement, not aDeepCopy); - except - Result := nil; - raise; - end; - end else case ArrayDef.Element.DefType of - dtArray: Result := TwbArray.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtStruct: Result := TwbStruct.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtStructChapter: Result := TwbChapter.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtUnion: Result := TwbUnion.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - else - Result := TwbValue.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - end; - - CheckCount; - CheckTerminator; - end; - dtStruct, dtStructChapter: begin - StructDef := srValueDef as IwbStructDef; - - Assert(aElement.SortOrder >= 0); - Assert(aElement.SortOrder < StructDef.MemberCount ); - Assert(Assigned(aElement.ValueDef)); - - Result := GetElementBySortOrder(aElement.SortOrder); - Assert(Assigned(Result)); - - Assert(StructDef.Members[aElement.SortOrder].CanAssign(Result, Low(Integer), aElement.ValueDef)); - - if not aDeepCopy then - if Supports(Result.ValueDef, IwbIntegerDef, IntegerDef) then - if Supports(IntegerDef.Formater[Result], IwbFlagsDef, FlagsDef) then - Exit(Result); - - Result.Assign(Low(Integer), aElement, not aDeepCopy); - end; - dtUnion: begin - inherited AddIfMissingInternal(aElement, aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - end; - else - inherited AddIfMissingInternal(aElement, aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - end; - - end else - inherited AddIfMissingInternal(aElement, aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); -end; - -function TwbSubRecord.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - Element : IwbElement; - ArrayDef : IwbArrayDef; - Container : IwbContainer; - s : string; - i : Integer; - SelfRef : IwbContainerElementRef; - p, q : Pointer; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if Assigned(srValueDef) then begin - - case srValueDef.DefType of - dtRecord, dtSubRecord, dtSubRecordArray, dtSubRecordStruct: Assert(False); - dtArray: begin - - ArrayDef := srValueDef as IwbArrayDef; - - if (aIndex = Low(Integer)) and ArrayDef.CanAssign(Self, aIndex, aElement.ValueDef) then begin - - if aOnlySK then - Exit; - - Container := aElement as IwbContainer; - - if ArrayDef.IsVariableSize then begin - Assert(ArrayDef.ElementCount <= 0); - SetModified(True); - InvalidateStorage; - ReleaseElements; - dcDataStorage := nil; - dcDataBasePtr := @EmptyPtr; - dcDataEndPtr := @EmptyPtr; - Exclude(dcFlags, dcfStorageInvalid); - if ArrayDef.ElementCount < 0 then - RequestStorageChange(p, q, 4); - - for i := 0 to Pred(Container.ElementCount) do - Assign(i, Container.Elements[i], aOnlySK); - end else begin - Assert(Container.ElementCount = ArrayDef.ElementCount); - Assert(GetElementCount = ArrayDef.ElementCount); - - for i := 0 to Pred(Container.ElementCount) do - cntElements[i].Assign(Low(Integer), Container.Elements[i], aOnlySK); - end; - - end else begin - if (aIndex >= 0) and (ArrayDef.ElementCount <= 0) and ((aIndex = High(Integer)) or ArrayDef.Element.CanAssign(Self, Low(Integer), aElement.ValueDef)) then begin - {add one entry} - - if srsSorted in srStates then - s := '' - else - s := '#' + IntToStr(Length(cntElements)); - - if (csAsCreatedEmpty in cntStates) then begin - SetModified(True); - Assert(Length(cntElements)=1); - Result := cntElements[0]; - Exclude(cntStates, csAsCreatedEmpty); - try - Result.Assign(Low(Integer), aElement, aOnlySK); - except - Result := nil; - raise; - end; - end else begin - Element := nil; - if not Supports(aElement, IwbStringListTerminator) then - case ArrayDef.Element.DefType of - dtArray: Element := TwbArray.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtStruct: Element := TwbStruct.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtStructChapter: Element := TwbChapter.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtUnion: Element := TwbUnion.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - else - Element := TwbValue.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - end; - Result := Element; - end; - end; - end; - - CheckCount; - CheckTerminator; - end; - else - Result := inherited AssignInternal(aIndex, aElement, aOnlySK); - end; - - end else - if inherited CanAssignInternal(aIndex, aElement, False) then - Result := inherited AssignInternal(aIndex, aElement, aOnlySK); -end; - -procedure TwbSubRecord.BuildRef; -var - SelfRef: IwbElement; -begin - SelfRef := Self as IwbContainerElementRef; - - if Assigned(srDef) then begin - DoInit; - - if Assigned(srValueDef) then - srValueDef.BuildRef(GetDataBasePtr, dcDataEndPtr, Self); - end; - - inherited; -end; - -function TwbSubRecord.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -var - ArrayDef: IwbArrayDef; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - if aCheckDontShow and GetDontShow then - Exit; - - if srsIsArray in srStates then begin - ArrayDef := srValueDef as IwbArrayDef; - if not Assigned(aElement) then begin - if aIndex = High(Integer) then - Result := ArrayDef.ElementCount <= 0; - Exit; - end; - Result := - ArrayDef.CanAssign(Self, aIndex, aElement.ValueDef) or - ( (ArrayDef.ElementCount <= 0) and ArrayDef.Element.CanAssign(Self, Low(Integer), aElement.ValueDef) ); - end else begin - if not Assigned(aElement) then - Exit; - - Result := inherited CanAssignInternal(aIndex, aElement, aCheckDontShow); - if not Result and Assigned(srDef) then - Result := srDef.CanAssign(Self, aIndex, aElement.Def); - end; -end; - -function TwbSubRecord.CanContainFormIDs: Boolean; -begin - Result := Assigned(srDef) and srDef.CanContainFormIDs; -end; - -function TwbSubRecord.CanMoveElement: Boolean; -begin - Result := srStates * [srsIsArray, srsSorted] = [srsIsArray]; -end; - -function TwbSubRecord.CanElementReset: Boolean; -begin -// Result := inherited CanElementReset; - Result := cntElementRefs < 1; -end; - -procedure TwbSubRecord.CheckCount; -var - Count : Cardinal; - i : Integer; - UpdateCount : Integer; -begin - if not (srArraySizePrefix in [1, 2, 4]) then - Exit; - - if Assigned(dcDataBasePtr) then - case srArraySizePrefix of - 1: Count := PByte(dcDataBasePtr)^; - 2: Count := PWord(dcDataBasePtr)^; - 4: Count := PCardinal(dcDataBasePtr)^; - else - Count := 0; - end - else - Count := 0; - - if Count <> Length(cntElements) then begin - UpdateCount := eUpdateCount; - for i := 1 to UpdateCount do EndUpdate; - case srArraySizePrefix of - 1: PByte(GetDataBasePtr)^ := Length(cntElements); - 2: PWord(GetDataBasePtr)^ := Length(cntElements); - 4: PCardinal(GetDataBasePtr)^ := Length(cntElements); - end; - for i := 1 to UpdateCount do BeginUpdate; - end; -end; - -procedure TwbSubRecord.CheckTerminator; -var - i : Integer; - ArrayDef : IwbArrayDef; - StringDef : IwbStringDef; -begin - if not Supports(srValueDef, IwbArrayDef, ArrayDef) then - Exit; - if not ArrayDef.IsVariableSize then - Exit; - if ArrayDef.Element.DefType <> dtString then - Exit; - if (not Supports(ArrayDef.Element, IwbStringDef, StringDef)) or (StringDef.GetStringSize>0) then - Exit; - - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbStringListTerminator) then - Exit; - - SetModified(True); - InvalidateStorage; - TwbStringListTerminator.Create(Self); - if srsSorted in srStates then - Include(srStates, srsSortInvalid); -end; - -function Resolve(const aValueDef: IwbValueDef; aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): IwbValueDef; -var - Internal : IwbElementInternal; - UnionDef : IwbUnionDef; - CanDecide : Boolean; -begin - Result := aValueDef; - - Supports(aElement, IwbElementInternal, Internal); - CanDecide := False; - try - while Supports(Result, IwbUnionDef, UnionDef) do begin - CanDecide := CanDecide or (Assigned(Internal) and Internal.BeginDecide); - if CanDecide then - Result := UnionDef.Decide(aBasePtr,aEndPtr,aElement) - else - break; - end; - finally - if CanDecide then - Internal.EndDecide; - end; -end; - -function TwbSubRecord.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - Result := False; - if not Assigned(srDef) then - Exit; - - DoInit; - - Result := inherited CompareExchangeFormID(aOldFormID, aNewFormID); - - ResolvedDef := Resolve(srValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - Result := ResolvedDef.CompareExchangeFormID(GetDataBasePtr, dcDataEndPtr, Self, aOldFormID, aNewFormID) or Result; -end; - -constructor TwbSubRecord.Create(const aContainer: IwbContainer; const aSubRecordDef: IwbSubRecordDef); -var - BasePtr : Pointer; - EndPtr : Pointer; - SaveAsCreatedEmpty : Boolean; - -begin - cntStates := []; - srDef := aSubRecordDef; - BasePtr := nil; - Create(aContainer, BasePtr, nil, nil); - - DoInit; - - SaveAsCreatedEmpty := (csAsCreatedEmpty in cntStates); - BasePtr := nil; - EndPtr := nil; - RequestStorageChange(BasePtr, EndPtr, GetDataSize); - SetToDefault; - - if SaveAsCreatedEmpty then - Include(cntStates, csAsCreatedEmpty); -end; - -destructor TwbSubRecord.Destroy; -begin - if not Assigned(dcEndPtr) and Assigned(dcBasePtr) then - FreeMem(dcBasePtr, SizeOf(TwbSubRecordHeaderStruct) ); - inherited; -end; - -function TwbSubRecord.DoCheckSizeAfterWrite: Boolean; -begin - Result := True; -end; - -procedure TwbSubRecord.DoInit; -begin - inherited; - if srStates * [srsSorted, srsSortInvalid] = [srsSorted, srsSortInvalid] then begin - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSortKeys); - Exclude(srStates, srsSortInvalid); - end; -end; - -procedure TwbSubRecord.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -begin - if srsSorted in srStates then - Include(srStates, srsSortInvalid); - inherited; -end; - -procedure TwbSubRecord.FindUsedMasters(aMasters: PwbUsedMasters); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not Assigned(srDef) then - Exit; - - DoInit; - - inherited FindUsedMasters(aMasters); - - ResolvedDef := Resolve(srValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.FindUsedMasters(GetDataBasePtr, dcDataEndPtr, Self, aMasters); -end; - -//var -// y: Integer; - -procedure TwbSubRecord.Init; -var - ValueDef : IwbValueDef; - BasePtr : Pointer; - Element : IwbElement; - HasUnusedData : Boolean; -begin - inherited; - - if GetSkipped then - Exit; - - if not Assigned(srDef) then - Exit; - - BasePtr := GetDataBasePtr; - ValueDef := Resolve(srDef.Value, BasePtr, dcDataEndPtr, Self); - srArraySizePrefix := 0; - - if Assigned(ValueDef) then - if ValueDef.Name = '' then begin - srValueDef := ValueDef; - case ValueDef.DefType of - dtArray: begin - Include(srStates, srsIsArray); - if ArrayDoInit(ValueDef, Self, BasePtr, dcDataEndPtr, srArraySizePrefix) then - Include(srStates, srsSorted); - end; - dtStruct, dtStructChapter: StructDoInit(ValueDef, Self, BasePtr, dcDataEndPtr); - dtUnion: begin - Include(srStates, srsIsUnion); - case UnionDoInit(ValueDef, Self, BasePtr, dcDataEndPtr) of - ufArray: Include(srStates, srsIsArray); - ufSortedArray: begin - Include(srStates, srsIsArray); - Include(srStates, srsSorted); - end; - ufFlags: begin - Include(srStates, srsIsFlags); - Include(srStates, srsSorted); - end; - end; - end; - else - if ValueDoInit(ValueDef, Self, BasePtr, dcDataEndPtr, Self) then begin - Include(srStates, srsIsFlags); - Include(srStates, srsSorted); - end; - end; - // flags are already created in the right sort order - if srStates * [srsSorted, srsIsFlags] = [srsSorted] then - Include(srStates, srsSortInvalid); - end else - case ValueDef.DefType of - dtArray: Element := TwbArray.Create(Self, BasePtr, dcDataEndPtr, ValueDef, ''); - dtStruct: Element := TwbStruct.Create(Self, BasePtr, dcDataEndPtr, ValueDef, ''); - dtStructChapter: Element := TwbChapter.Create(Self, BasePtr, dcDataEndPtr, ValueDef, ''); - dtUnion: Element := TwbUnion.Create(Self, BasePtr, dcDataEndPtr, ValueDef, ''); - else - Element := TwbValue.Create(Self, BasePtr, dcDataEndPtr, ValueDef, ''); - end; - - if Assigned(dcDataEndPtr) and Assigned(BasePtr) and (BasePtr <> dcDataEndPtr) then begin - HasUnusedData := not SameText(ValueDef.Name, 'Unused'); - if HasUnusedData and (ValueDef.DefType = dtString) then begin - HasUnusedData := False; - while Cardinal(BasePtr) < Cardinal(dcDataEndPtr) do begin - if PAnsiChar(BasePtr)^ <> #0 then begin - HasUnusedData := True; - Break; - end; - Inc(PByte(BasePtr)); - end; - end; - if HasUnusedData then begin - if wbReportMode then - srDef.HasUnusedData; - {$IFDEF DBGSUBREC} - if Assigned(wbProgressCallback) then - wbProgressCallback(''); - {$ENDIF} - end; - end; - - srDef.AfterLoad(Self); -end; - -function TwbSubRecord.GetCheck: string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := ''; - - if not Assigned(srDef) then - Exit; - DoInit; - - if Assigned(srValueDef) then - Result := srValueDef.Check(GetDataBasePtr, dcDataEndPtr, Self); -end; - -function TwbSubRecord.GetDataPrefixSize: Integer; -begin - Result := srArraySizePrefix; -end; - -function TwbSubRecord.GetDataSize: Integer; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - if not Assigned(dcDataBasePtr) and Assigned(srValueDef) and not (dcfStorageInvalid in dcFlags) then begin - Result := srValueDef.DefaultSize[nil, nil, Self]; - Assert(Result <> Cardinal(High(Integer))); - end else - Result := inherited GetDataSize; -end; - -function TwbSubRecord.GetDef: IwbNamedDef; -begin - Result := srDef; -end; - -function TwbSubRecord.GetDisplayName: string; -var - s : string; - SelfRef : IwbContainerElementRef; - ValueDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := inherited GetName; - - ValueDef := Resolve(srValueDef, GetDataBasePtr, GetDataEndPtr, Self); - - if Assigned(ValueDef) then begin - s := ValueDef.Name; - if s <> '' then begin - Result := Result + ' - ' + s; - Exit; - end; - end; - - if not Assigned(srDef) then - Exit; - - Result := Result + ' - ' + srDef.GetName; -end; - -function TwbSubRecord.GetEditValue: string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := ''; - - if not Assigned(srDef) then - Exit; - DoInit; - - if Assigned(srValueDef) then - Result := srValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] - else - Result := ''; -end; - -function TwbSubRecord.GetElementType: TwbElementType; -begin - Result := etSubRecord; -end; - -function TwbSubRecord.GetIsEditable: Boolean; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := wbIsInternalEdit; - if Result then - Exit; - - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(SelfRef) then - Exit; - - if not Assigned(srDef) then - Exit; - DoInit; - - Result := Assigned(srValueDef) and - srValueDef.IsEditable[GetDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbSubRecord.GetIsInSK(aIndex: Integer): Boolean; -var - SelfRef : IwbContainerElementRef; - HasSortKey : IwbHasSortKeyDef; -begin - Result := False; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if not Supports(srValueDef, IwbHasSortKeyDef, HasSortKey) then - Exit; - - Result := HasSortKey.IsInSK(aIndex); -end; - -function TwbSubRecord.GetLinksTo: IwbElement; -var - SelfRef: IwbContainerElementRef; -begin - Result := nil; - SelfRef := Self as IwbContainerElementRef; - DoInit; - if not Assigned(srValueDef) then - Exit; - Result := srValueDef.LinksTo[dcDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbSubRecord.GetName: string; -begin - Result := inherited GetName; - - if not Assigned(srDef) then - Exit; - - Result := Result + ' - ' + srDef.GetName; -end; - -function TwbSubRecord.GetNativeValue: Variant; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := ''; - - if not Assigned(srDef) then - Exit; - DoInit; - - if Assigned(srValueDef) then - Result := srValueDef.NativeValue[GetDataBasePtr, dcDataEndPtr, Self] - else - Result := Null; -end; - -function TwbSubRecord.GetSorted: Boolean; -var - EmptyDef : IwbEmptyDef; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not Assigned(srValueDef) then - DoInit; - - Result := (srsSorted in srStates) or - (Supports(Resolve(srValueDef, GetDataBasePtr, GetDataEndPtr, Self), IwbEmptyDef, EmptyDef) and EmptyDef.Sorted); -end; - -function TwbSubRecord.GetSortKeyInternal(aExtended: Boolean): string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := GetSignature; - - if not Assigned(srDef) then - Exit; - DoInit; - - if Assigned(srValueDef) then - Result := srValueDef.ToSortKey(GetDataBasePtr, dcDataEndPtr, Self, aExtended) - else - Result := inherited GetSortKeyInternal(aExtended); -end; - -function TwbSubRecord.GetSubRecordHeaderSize: Integer; -begin - if Assigned(dcBasePtr) then - Result := srStruct.srsDataSize - else - Result := 0; -end; - -function TwbSubRecord.GetValue: string; -var -// i : Integer; -// j : Int64; - SelfRef : IwbContainerElementRef; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - - SelfRef := Self as IwbContainerElementRef; - Result := ''; - - if not Assigned(srDef) then - Exit; - DoInit; - - if Assigned(srValueDef) then - Result := srValueDef.ToString(GetDataBasePtr, dcDataEndPtr, Self); -end; - -function TwbSubRecord.GetValueDef: IwbValueDef; -var - SelfRef : IwbContainerElementRef; -begin - if not Assigned(srValueDef) or ((srsIsUnion in srStates) and not (csInit in cntStates)) then begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - end; - Result := srValueDef; -end; - -procedure TwbSubRecord.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -var - SizeNeeded : Cardinal; - SizeAvailable : Cardinal; - BasePtr : Pointer; -begin - Assert(Assigned(dcBasePtr)); - Assert(Assigned(dcEndPtr)); - - SizeNeeded := SizeOf(TwbSubRecordHeaderStruct); - SizeAvailable := Cardinal( aEndPtr ) - Cardinal( aBasePtr ); - Assert( SizeAvailable >= SizeNeeded ); - - BasePtr := aBasePtr; - Inc(PByte(aBasePtr), SizeNeeded ); - inherited; - - Assert(srStruct.srsDataSize = Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr )); - - dcBasePtr := BasePtr; - dcEndPtr := dcDataEndPtr; -end; - -procedure TwbSubRecord.InitDataPtr; -var - lDataSize : Cardinal; - LastRecord : IwbElement; - Container : IwbContainer; -begin - if Assigned(dcBasePtr) then begin - dcDataBasePtr := Pointer( Cardinal( dcBasePtr ) + SizeOf(TwbSubRecordHeaderStruct) ); - - lDataSize := srStruct.srsDataSize; - - if lDataSize = 0 then begin - Container := GetContainer; - if Assigned(Container) and (Container.ElementCount >= 2) then begin - LastRecord := Container.Elements[Container.ElementCount - 2]; - if Assigned(LastRecord) and (LastRecord.ElementType = etSubRecord) then - with LastRecord as IwbSubRecord do - if Signature = 'XXXX' then begin - lDataSize := PCardinal(DataBasePtr)^; - Container.RemoveElement(Container.ElementCount - 2); - end; - end; - end; - - dcDataEndPtr := Pointer( Cardinal( dcDataBasePtr ) + lDataSize ); - dcEndPtr := dcDataEndPtr; - end else begin - GetMem(dcBasePtr, SizeOf(TwbSubRecordHeaderStruct) ); - if Assigned(srDef) then - srStruct.srsSignature := srDef.DefaultSignature - else - srStruct.srsSignature := NONE; - end; -end; - -function TwbSubRecord.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement) - and (srsIsArray in srStates) - and Assigned(srValueDef) - and ((srValueDef as IwbArrayDef).ElementCount <= 0) and (Length(cntElements)>1); -end; - -function TwbSubRecord.IsFlags: Boolean; -begin - Result := srsIsFlags in srStates; -end; - -procedure TwbSubRecord.MasterCountUpdated(aOld, aNew: Byte); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not Assigned(srDef) then - Exit; - - DoInit; - - inherited MasterCountUpdated(aOld, aNew); - - ResolvedDef := Resolve(srValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterCountUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbSubRecord.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - if not Assigned(srDef) then - Exit; - - DoInit; - - inherited MasterIndicesUpdated(aOld, aNew); - - ResolvedDef := Resolve(srValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterIndicesUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbSubRecord.MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); -var - SizeNeeded : Cardinal; - SizeAvailable : Cardinal; - BasePtr : Pointer; -begin - Assert(Assigned(dcBasePtr)); - SizeNeeded := SizeOf(TwbSubRecordHeaderStruct); - SizeAvailable := Cardinal( aEndPtr ) - Cardinal( aBasePtr ); - Assert( SizeAvailable >= SizeNeeded ); - - BasePtr := aBasePtr; - Move(dcBasePtr^, aBasePtr^, SizeNeeded); - Inc(PByte(aBasePtr), SizeNeeded ); - inherited; - - if not Assigned(dcEndPtr) then - FreeMem(dcBasePtr, SizeNeeded); - - dcBasePtr := BasePtr; - dcEndPtr := dcDataEndPtr; - srStruct.srsDataSize := Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr ); -end; - -procedure TwbSubRecord.PrepareSave; -begin - if wbDelayLoadRecords then - if not (esModified in eStates) then - Exit; - - CheckCount; - CheckTerminator; - inherited; - UpdateStorageFromElements; -end; - -function TwbSubRecord.RemoveInjected(aCanRemove: Boolean): Boolean; -var - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Result := False; - if {(GetSignature = 'PTDT') or} (GetSignature = 'PLDT') then begin - Assert(GetElementCount = 3); - Result := GetElement(1).ReferencesInjected; - if Result then begin - GetElement(0).EditValue := '2'; - GetElement(1).EditValue := '00000000'; - Result := False; - end; - end else begin - for i := High(cntElements) downto Low(cntElements) do - if cntElements[i].CanContainFormIDs then begin - Result := cntElements[i].RemoveInjected(True) or Result; - if Result and aCanRemove then - Break; - end; - end; - if Result and aCanRemove and GetIsRemoveable then begin - Result := False; - Remove; - end; -end; - -procedure TwbSubRecord.Reset; -begin - ReleaseElements; - srValueDef := nil; - srStates := srStates - [srsIsArray, srsIsFlags, srsSorted, srsSortInvalid]; - inherited; -end; - -procedure TwbSubRecord.ScanData; -begin - { nothing } -end; - -procedure TwbSubRecord.SetDef(const aDef: IwbSubRecordDef); -begin - srDef := aDef; - DoReset(True); -end; - -procedure TwbSubRecord.SetEditValue(const aValue: string); -var - SelfRef : IwbContainerElementRef; - OldValue, NewValue: Variant; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - SelfRef := Self as IwbContainerElementRef; - if not Assigned(srDef) then - if aValue <> '' then - raise Exception.Create(GetName + ' can not be edited') - else - Exit; - - DoInit; - - if GetEditValue <> aValue then begin - if Assigned(srValueDef) then begin - OldValue := GetNativeValue; - srValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - end else - raise Exception.Create(GetName + ' can not be edited'); - if (srsIsFlags in srStates) and (csInit in cntStates) then begin - Reset; - Init; - end; - NotifyChanged(eContainer); - end; -end; - -procedure TwbSubRecord.SetModified(aValue: Boolean); -begin - inherited; - if aValue and (srsSorted in srStates) then - Include(srStates, srsSortInvalid); -end; - -procedure TwbSubRecord.SetNativeValue(const aValue: Variant); -var - OldValue, NewValue: Variant; - SelfRef : IwbContainerElementRef; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - SelfRef := Self as IwbContainerElementRef; - if not Assigned(srDef) then - raise Exception.Create(GetName + ' can not be edited'); - - DoInit; - - if Assigned(srValueDef) then begin - OldValue := GetNativeValue; - srValueDef.NativeValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - end else - raise Exception.Create(GetName + ' can not be edited'); - if (srsIsFlags in srStates) and (csInit in cntStates) then begin - Reset; - Init; - end; - NotifyChanged(eContainer); -end; - -procedure TwbSubRecord.SetToDefaultInternal; -var - SelfRef: IwbContainerElementRef; - BasePtr, EndPtr: Pointer; -begin - SelfRef := Self as IwbContainerElementRef; - - if csInit in cntStates then - DoReset(True); - BasePtr := nil; - EndPtr := nil; - dcDataBasePtr := nil; - dcDataEndPtr := nil; - dcDataStorage := nil; - DoInit; - if Assigned(srValueDef) then - RequestStorageChange(BasePtr, EndPtr, srValueDef.DefaultSize[nil, nil, Self]); - inherited; -end; - -function TwbSubRecord.srStruct: PwbSubRecordHeaderStruct; -begin - Result := PwbSubRecordHeaderStruct(dcBasePtr); -end; - -procedure TwbSubRecord.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - CurrentPosition : Int64; - NewPosition : Int64; - BigDataSize : Cardinal; - SubHeader : TwbSubRecordHeaderStruct; - SelfRef : IwbContainerElementRef; -begin - if (esModified in eStates) or wbTestWrite or (srStruct.srsDataSize = 0) then begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - BigDataSize := GetDataSize; - if BigDataSize > High(Word) then begin - SubHeader.srsSignature := 'XXXX'; - SubHeader.srsDataSize := SizeOf(Cardinal); - aStream.WriteBuffer(SubHeader, SizeOf(TwbSubRecordHeaderStruct) ); - aStream.WriteBuffer(BigDataSize, SizeOf(BigDataSize) ); - SubHeader.srsSignature := srStruct.srsSignature; - SubHeader.srsDataSize := 0; - end else begin - SubHeader.srsSignature := srStruct.srsSignature; - SubHeader.srsDataSize := BigDataSize; - end; - - aStream.WriteBuffer(SubHeader, SizeOf(TwbSubRecordHeaderStruct) ); - CurrentPosition := aStream.Position; - inherited; - NewPosition := aStream.Position; - if BigDataSize <> NewPosition - CurrentPosition then - Assert(BigDataSize = NewPosition - CurrentPosition ); - - end else begin - aStream.WriteBuffer(dcBasePtr^, SizeOf(TwbSubRecordHeaderStruct) ); - CurrentPosition := aStream.Position; - inherited; - if CurrentPosition + srStruct.srsDataSize <> aStream.Position then - Assert(CurrentPosition + srStruct.srsDataSize = aStream.Position); - end; - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -{ TwbGroupRecord } - -function TwbGroupRecord.Add(const aName: string; aSilent: Boolean): IwbElement; -var - Signature : TwbSignature; - FormID : Cardinal; - _File : IwbFile; - MainRecord: IwbMainRecord; - IsInjected: Boolean; - Group : IwbGroupRecord; - i : Integer; - - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := nil; - if Length(aName) < 4 then - Exit; - Signature := StrToSignature(aName); - - case grStruct.grsGroupType of - 0: if Signature <> TwbSignature(grStruct.grsLabel) then - Exit; - 1: if (Signature <> 'ROAD') and - (Signature <> 'CELL') then - Exit; - 7: if (Signature <> 'INFO') then - Exit; - 6: begin - Group := nil; - for i := 0 to GetElementCount do - if Supports(GetElement(i), IwbGroupRecord, Group) then - if (Group.GroupType = 9) and (Group.GroupLabel = GetGroupLabel) then - Break - else - Group := nil; - if not Assigned(Group) then - Group := TwbGroupRecord.Create(Self, 9, GetGroupLabel); - - Result := Group.Add(aName, aSilent); - Exit; - end; - 8: if (Signature <> 'REFR') and - (Signature <> 'ACRE') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') and {>>> Skyrim <<<} - (Signature <> 'ACHR') then - Exit; - 9: if (Signature <> 'LAND') and - (Signature <> 'PGRD') and - (Signature <> 'NAVM') and - (Signature <> 'REFR') and - (Signature <> 'PGRE') and - (Signature <> 'PMIS') and - (Signature <> 'PARW') and {>>> Skyrim <<<} - (Signature <> 'PBEA') and {>>> Skyrim <<<} - (Signature <> 'PFLA') and {>>> Skyrim <<<} - (Signature <> 'PCON') and {>>> Skyrim <<<} - (Signature <> 'PBAR') and {>>> Skyrim <<<} - (Signature <> 'PHZD') and {>>> Skyrim <<<} - (Signature <> 'ACRE') and - (Signature <> 'ACHR') then - Exit; - 10: if (not wbVWDAsQuestChildren and (Signature <> 'REFR')) or - (wbVWDAsQuestChildren and - not ((Signature = 'REFR') or (Signature = 'DLBR') or (Signature = 'DIAL') or (Signature = 'SCEN'))) - then - Exit; - else - Exit; - end; - - _File := GetFile; - if not Assigned(_File) then - Exit; - - if aSilent then - FormID := _File.NewFormID - else - FormID := _File.LoadOrderFormIDtoFileFormID(wbGetFormID(Self)); - if FormID = 0 then - Exit; - - IsInjected := False; - MainRecord := _File.RecordByFormID[FormID, True]; - if Assigned(MainRecord) then begin - if _File.Equals(MainRecord._File) then - raise Exception.Create('FormID ['+IntToHex64(FormID, 8)+'] is already defined in file "'+_File.Name+'"'); - - IsInjected := (FormID shr 24) = Cardinal(_File.MasterCount); - - if MainRecord.Signature <> Signature then - raise Exception.Create('Existing record '+MainRecord.Name+' has different signature'); - end; - - Result := TwbMainRecord.Create(Self, Signature, FormID); - if IsInjected then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(Result as IwbMainRecord); - if csRefsBuild in _File.ContainerStates then - Result.BuildRef; -end; - -function RemovePrefix(const s, aPrefix: string): string; -begin - if SameText(Copy(s, 1, Length(aPrefix)), aPrefix) then - Result := Copy(s, Succ(Length(aPrefix)), High(Integer)) - else - Result := s; -end; - -procedure TwbGroupRecord.AddElement(const aElement: IwbElement); -var - DialGroup : IwbGroupRecord; - Container : IwbContainer; - DialRec : IwbMainRecord; - i : Integer; -begin - if esUnsaved in aElement.ElementStates then // Let's not penalised too much loading time. - if ((TwbSignature(grStruct.grsLabel) = 'DIAL') or wbVWDAsQuestChildren) then // Issue 86: https://code.google.com/p/skyrim-plugin-decoding-project/issues/detail?id=86 - if Supports(aElement, IwbGroupRecord, DialGroup) then // The DIAL GRUP must immediatly follow corresponding DIAL MainRecord. - if DialGroup.GroupType = 7 then // Let's hope nobody messes up the groupType - if Supports(Self, IwbContainer, Container) then - if Container.ElementCount > 0 then - for i := 0 to Pred(Container.ElementCount) - 1 do // If we are reading the plugins and at the end don't bother moving data around. - if Supports(Container.Elements[i], IwbMainRecord, DialRec) then - if DialRec.Signature = 'DIAL' then - if DialRec.FormID = DialGroup.GroupLabel then begin - InsertElement(i+1, aElement); - Exit; - end; - inherited; -end; - -function TwbGroupRecord.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - MainRecord : IwbMainRecord; - MainRecord2 : IwbMainRecord; - FormID : Cardinal; - i : Integer; - SelfRef : IwbContainerElementRef; - s : string; - GroupRecord : IwbGroupRecord; - GroupRecord2 : IwbGroupRecord; -begin - Result := nil; - SelfRef := Self as IwbContainerElementRef; - case grStruct.grsGroupType of - 0: begin - if TwbSignature(grStruct.grsLabel) = 'DIAL' then begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 7 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 7, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - end else if TwbSignature(grStruct.grsLabel) = 'CELL' then begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 2 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - if GroupRecord.GroupLabel > 9 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbGroupRecord, GroupRecord2) then begin - if (GroupRecord2.GroupType = 2) and (GroupRecord2.GroupLabel = GroupRecord.GroupLabel) then begin - Result := GroupRecord2; - break; - end; - end; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 2, GroupRecord.GroupLabel); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - end else if TwbSignature(grStruct.grsLabel) = 'WRLD' then begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 1 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 1, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - end else if wbVWDAsQuestChildren and (TwbSignature(grStruct.grsLabel) = 'QUST') then begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 10 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 10, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - end; - if not Supports(aElement, IwbMainRecord, MainRecord) then - raise Exception.Create('Only main records can be added to top level groups'); - if MainRecord.Signature <> TwbSignature(grStruct.grsLabel) then - raise Exception.Create('Can''t add main record with signature '+MainRecord.Signature+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - - if aAsNew then - FormID := GetFile.NewFormID - else begin - FormID := GetFile.LoadOrderFormIDtoFileFormID(MainRecord.LoadOrderFormID); - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, MainRecord2) then - if MainRecord2.FixedFormID = FormID then begin - Result := MainRecord2; - exit; - end; - end; - - Result := TwbMainRecord.Create(Self, MainRecord.Signature, FormID); - if aDeepCopy then begin - Result.Assign(Low(Integer), aElement, False); - if (aPrefix <> '') or (aSuffix <> '') then - with Result as IwbMainRecord do begin - s := EditorID; - s := RemovePrefix(s, aPrefixRemove); - if s <> '' then - EditorID := aPrefix + s + aSuffix; - end; - end; - - if not aAsNew and MainRecord.IsMaster and (Result._File.LoadOrder <= MainRecord._File.LoadOrder) then - if Supports(Result, IwbMainRecord, MainRecord2) then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(MainRecord2); - if Assigned(Result) and (csRefsBuild in Result._File.ContainerStates) then - Result.BuildRef; - end; - 1: begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType = 4 then begin - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbGroupRecord, GroupRecord2) then begin - if (GroupRecord2.GroupType = GroupRecord.GroupType) and (GroupRecord2.GroupLabel = GroupRecord.GroupLabel) then begin - Result := GroupRecord2; - break; - end; - end; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 4, GroupRecord.GroupLabel); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - if GroupRecord.GroupType <> 6 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 6, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - if not Supports(aElement, IwbMainRecord, MainRecord) then - raise Exception.Create('Only main records can be added to ' + GetName); - if (MainRecord.Signature <> 'CELL') and (MainRecord.Signature <> 'ROAD') then - raise Exception.Create('Can''t add main record with signature '+MainRecord.Signature+' to ' + GetName); - - if aAsNew then - raise Exception.Create('Can''t copy record '+MainRecord.Name+' as new record.') - else begin - FormID := GetFile.LoadOrderFormIDtoFileFormID(MainRecord.LoadOrderFormID); - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, MainRecord2) then - if MainRecord2.FixedFormID = FormID then begin - Result := MainRecord2; - exit; - end; - end; - Result := TwbMainRecord.Create(Self, MainRecord.Signature, FormID); - if aDeepCopy then begin - Result.Assign(Low(Integer), aElement, False); - if (aPrefix <> '') or (aSuffix <> '') then - with Result as IwbMainRecord do begin - s := EditorID; - s := RemovePrefix(s, aPrefixRemove); - if s <> '' then - EditorID := aPrefix + s + aSuffix; - end; - end; - if not aAsNew and MainRecord.IsMaster and (Result._File.LoadOrder <= MainRecord._File.LoadOrder) then - if Supports(Result, IwbMainRecord, MainRecord2) then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(MainRecord2); - if Assigned(Result) and (csRefsBuild in Result._File.ContainerStates) then - Result.BuildRef; - end; - 2, 4: begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> grStruct.grsGroupType + 1 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to ' + GetName); - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbGroupRecord, GroupRecord2) then begin - if (GroupRecord2.GroupType = GroupRecord.GroupType) and (GroupRecord2.GroupLabel = GroupRecord.GroupLabel) then begin - Result := GroupRecord2; - break; - end; - end; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, GroupRecord.GroupType, GroupRecord.GroupLabel); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - raise Exception.Create('Can''t add ' + aElement.Name + ' to ' + GetName); - end; - 3, 5: begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 6 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 6, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - if not Supports(aElement, IwbMainRecord, MainRecord) then - raise Exception.Create('Only main records can be added to ' + GetName); - if MainRecord.Signature <> 'CELL' then - raise Exception.Create('Can''t add main record with signature '+MainRecord.Signature+' to ' + GetName); - - if aAsNew then - raise Exception.Create('Can''t copy record '+MainRecord.Name+' as new record.') - else begin - FormID := GetFile.LoadOrderFormIDtoFileFormID(MainRecord.LoadOrderFormID); - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, MainRecord2) then - if MainRecord2.FixedFormID = FormID then begin - Result := MainRecord2; - exit; - end; - end; - Result := TwbMainRecord.Create(Self, MainRecord.Signature, FormID); - if aDeepCopy then begin - Result.Assign(Low(Integer), aElement, False); - if (aPrefix <> '') or (aSuffix <> '') then - with Result as IwbMainRecord do begin - s := EditorID; - s := RemovePrefix(s, aPrefixRemove); - if s <> '' then - EditorID := aPrefix + s + aSuffix; - end; - end; - if not aAsNew and MainRecord.IsMaster and (Result._File.LoadOrder <= MainRecord._File.LoadOrder) then - if Supports(Result, IwbMainRecord, MainRecord2) then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(MainRecord2); - if Assigned(Result) and (csRefsBuild in Result._File.ContainerStates) then - Result.BuildRef; - end; - 6: begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if not (GroupRecord.GroupType in [8, 9, 10]) then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to ' + GetName); - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbGroupRecord, GroupRecord2) then begin - if GroupRecord2.GroupType = GroupRecord.GroupType then begin - Result := GroupRecord2; - break; - end; - end; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, GroupRecord.GroupType, Self.GetChildrenOf); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - raise Exception.Create('Can''t add ' + aElement.Name + ' to ' + GetName); - end; - 7: begin - if not Supports(aElement, IwbMainRecord, MainRecord) then - raise Exception.Create('Only main records can be added to ' + GetName); - if MainRecord.Signature <> 'INFO' then - raise Exception.Create('Can''t add main record with signature '+MainRecord.Signature+' to ' + GetName); - - if aAsNew then - FormID := GetFile.NewFormID - else begin - FormID := GetFile.LoadOrderFormIDtoFileFormID(MainRecord.LoadOrderFormID); - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, MainRecord2) then - if MainRecord2.FixedFormID = FormID then begin - Result := MainRecord2; - exit; - end; - end; - - Result := TwbMainRecord.Create(Self, MainRecord.Signature, FormID); - if aDeepCopy then begin - Result.Assign(Low(Integer), aElement, False); - if (aPrefix <> '') or (aSuffix <> '') then - with Result as IwbMainRecord do begin - s := EditorID; - s := RemovePrefix(s, aPrefixRemove); - if s <> '' then - EditorID := aPrefix + s + aSuffix; - end; - end; - if not aAsNew and MainRecord.IsMaster and (Result._File.LoadOrder <= MainRecord._File.LoadOrder) then - if Supports(Result, IwbMainRecord, MainRecord2) then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(MainRecord2); - if Assigned(Result) and (csRefsBuild in Result._File.ContainerStates) then - Result.BuildRef; - end; - 8, 9, 10: begin - if wbVWDAsQuestChildren and Supports(aElement, IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType <> 7 then - raise Exception.Create('Can''t add '+GroupRecord.Name+' to top level group with signature ' + TwbSignature(grStruct.grsLabel)); - MainRecord := GroupRecord.ChildrenOf; - if not Assigned(MainRecord) then - raise Exception.Create('Can''t find record for '+ GroupRecord.Name); - MainRecord := MainRecord.HighestOverrideOrSelf[GetFile.LoadOrder]; - MainRecord := AddIfMissingInternal(MainRecord, aAsNew, True, aPrefixRemove, aPrefix, aSuffix) as IwbMainRecord; - Assert(Assigned(MainRecord)); - Result := MainRecord.ChildGroup; - if not Assigned(Result) then - Result := TwbGroupRecord.Create(Self, 7, MainRecord); - - GroupRecord2 := Result as IwbGroupRecord; - if aDeepCopy then - for i := 0 to Pred(GroupRecord.ElementCount) do - GroupRecord2.AddIfMissing(GroupRecord.Elements[i], aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix); - - Exit; - end; - if not Supports(aElement, IwbMainRecord, MainRecord) then - raise Exception.Create('Only main records can be added to ' + GetName); - if (MainRecord.Signature <> 'REFR') and - (MainRecord.Signature <> 'ACHR') and - (MainRecord.Signature <> 'ACRE') and - (MainRecord.Signature <> 'PGRE') and - (MainRecord.Signature <> 'PMIS') and - (MainRecord.Signature <> 'PARW') and {>>> Skyrim <<<} - (MainRecord.Signature <> 'PBEA') and {>>> Skyrim <<<} - (MainRecord.Signature <> 'PFLA') and {>>> Skyrim <<<} - (MainRecord.Signature <> 'PCON') and {>>> Skyrim <<<} - (MainRecord.Signature <> 'PBAR') and {>>> Skyrim <<<} - (MainRecord.Signature <> 'PHZD') {>>> Skyrim <<<} - then - // check any non reference record - if not ( - // DIAL, DLBR and SCEN can be added to child group 10 (quest children) - (wbVWDAsQuestChildren and (grStruct.grsGroupType = 10) and ((MainRecord.Signature = 'DLBR') or (MainRecord.Signature = 'DIAL') or (MainRecord.Signature = 'SCEN'))) - or - // PGRD, LAND and NAVM can be added to child group 9 (temporary) - (grStruct.grsGroupType = 9) and ((MainRecord.Signature = 'PGRD') or (MainRecord.Signature = 'LAND') or (MainRecord.Signature = 'NAVM')) - ) then - raise Exception.Create('Can''t add main record with signature '+MainRecord.Signature+' to ' + GetName); - - if aAsNew then - FormID := GetFile.NewFormID - else begin - FormID := GetFile.LoadOrderFormIDtoFileFormID(MainRecord.LoadOrderFormID); - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, MainRecord2) then - if MainRecord2.FixedFormID = FormID then begin - Result := MainRecord2; - exit; - end; - end; - - Result := TwbMainRecord.Create(Self, MainRecord.Signature, FormID); - if aDeepCopy then begin - Result.Assign(Low(Integer), aElement, False); - if (aPrefix <> '') or (aSuffix <> '') then - with Result as IwbMainRecord do begin - s := EditorID; - s := RemovePrefix(s, aPrefixRemove); - if s <> '' then - EditorID := aPrefix + s + aSuffix; - end; - end; - if not aAsNew and MainRecord.IsMaster and (Result._File.LoadOrder <= MainRecord._File.LoadOrder) then - if Supports(Result, IwbMainRecord, MainRecord2) then - (MainRecord as IwbMainRecordInternal).YouGotAMaster(MainRecord2); - if Assigned(Result) and (csRefsBuild in Result._File.ContainerStates) then - Result.BuildRef; - end; - else - raise Exception.Create(ClassName + '.AddIfMissingInternal is not implemented for GroupType ' + IntToStr(grStruct.grsGroupType)); - end; -end; - -procedure TwbGroupRecord.BuildRef; -var - Rec: IwbMainRecord; -begin - inherited; - if GetGroupType in [1, 6, 7] then begin - Rec := (GetFile as IwbFileInternal).RecordByFormID[GetGroupLabel, False]; - if Assigned(Rec) then begin - if Rec._File.Equals(GetFile) then - (Rec as IwbMainRecordInternal).SetChildGroup(Self) - else begin - if Assigned(wbProgressCallback) then - wbProgressCallback(' 0 then begin - FileID := grStruct.grsLabel shr 24; - aMasters[FileID] := True; - end; - end; -end; - -function TwbGroupRecord.GetAddList: TDynStrings; -var - i, j : Integer; - RecordDef : PwbRecordDef; -begin - Result := nil; - case grStruct.grsGroupType of - 0: begin - SetLength(Result, 1); - Result[0] := TwbSignature(grStruct.grsLabel); - end; - 7: begin - SetLength(Result, 1); - Result[0] := 'INFO'; - end; - 8: begin - SetLength(Result, 11); - Result[0] := 'ACHR'; - Result[1] := 'ACRE'; - Result[2] := 'REFR'; - Result[3] := 'PGRE'; - Result[4] := 'PMIS'; - Result[5] := 'PARW'; {>>> Skyrim <<<} - Result[6] := 'PBEA'; {>>> Skyrim <<<} - Result[7] := 'PFLA'; {>>> Skyrim <<<} - Result[8] := 'PCON'; {>>> Skyrim <<<} - Result[9] := 'PBAR'; {>>> Skyrim <<<} - Result[10] := 'PHZD'; {>>> Skyrim <<<} - end; - 6, 9: begin - SetLength(Result, 11); - Result[0] := 'ACHR'; - Result[1] := 'ACRE'; - Result[2] := 'REFR'; - Result[3] := 'PGRE'; - Result[4] := 'PMIS'; - Result[5] := 'PARW'; {>>> Skyrim <<<} - Result[6] := 'PBEA'; {>>> Skyrim <<<} - Result[7] := 'PFLA'; {>>> Skyrim <<<} - Result[8] := 'PCON'; {>>> Skyrim <<<} - Result[9] := 'PBAR'; {>>> Skyrim <<<} - Result[10] := 'PHZD'; {>>> Skyrim <<<} - end; - 10: if wbVWDAsQuestChildren then begin - SetLength(Result, 3); - Result[0] := 'DIAL'; - Result[1] := 'DLBR'; - Result[2] := 'SCEN'; - end - else begin - SetLength(Result, 1); - Result[0] := 'REFR'; - end; - end; - j := 0; - for i := Low(Result) to High(Result) do - if wbFindRecordDef(AnsiString(Result[i]), RecordDef) then begin - Result[j] := Result[i] + ' - ' + RecordDef.Name; - Inc(j); - end; - SetLength(Result, j); -end; - -function TwbGroupRecord.GetChildrenOf: IwbMainRecord; -begin - Result := nil; - if grStruct.grsGroupType in [1, 6..10] then - Result := GetFile.RecordByFormID[grStruct.grsLabel, True]; -end; - -function TwbGroupRecord.GetElementType: TwbElementType; -begin - Result := etGroupRecord; -end; - -function TwbGroupRecord.GetGroupLabel: Cardinal; -begin - Result := grStruct.grsLabel; -end; - -function TwbGroupRecord.GetGroupType: Integer; -begin - Result := grStruct.grsGroupType; -end; - -function TwbGroupRecord.GetMainRecordByEditorID(const aEditorID: string): IwbMainRecord; -var - SelfRef : IwbContainerElementRef; - i : Integer; -begin - Result := nil; - - SelfRef := Self; - DoInit; - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, Result) then - if SameText(Result.EditorID, aEditorID) then - Exit; - Result := nil; -end; - -function TwbGroupRecord.GetMainRecordByFormID(const aFormID: Cardinal): IwbMainRecord; -var - SelfRef : IwbContainerElementRef; - i : Integer; -begin - Result := nil; - - SelfRef := Self; - DoInit; - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbMainRecord, Result) then - if Result.FormID = aFormID then - Exit; - Result := nil; -end; - -function TwbGroupRecord.GetName: string; -begin - Result := inherited GetName; - - case grStruct.grsGroupType of - 0: begin - Result := Result + ' Top "' + PwbSignature(@grStruct.grsLabel)^ + '"'; - Exit; - end; - 1: Result := Result + ' World Children of '; - 2: begin - Result := Result + ' Interior Cell Block ' + IntToStr(grStruct.grsLabel); - Exit; - end; - 3: begin - Result := Result + ' Interior Cell Sub-Block ' + IntToStr(grStruct.grsLabel); - Exit; - end; - 4: begin - Result := Result + ' Exterior Cell Block ' + IntToStr(LongRecSmall(grStruct.grsLabel).Lo) + ', ' + IntToStr(LongRecSmall(grStruct.grsLabel).Hi); - Exit; - end; - 5: begin - Result := Result + ' Exterior Cell Sub-Block ' + IntToStr(LongRecSmall(grStruct.grsLabel).Lo) + ', ' + IntToStr(LongRecSmall(grStruct.grsLabel).Hi); - Exit; - end; - 6: Result := Result + ' Cell Children of '; - 7: Result := Result + ' Topic Children of '; - 8: Result := Result + ' Cell Persistent Children of '; - 9: Result := Result + ' Cell Temporary Children of '; - 10: if wbVWDAsQuestChildren then - Result := Result + ' Quest Children of ' - else - Result := Result + ' Cell Visible Distant Children of '; - else - Result := Result + ' Unknown type: ' + IntToStr(grStruct.grsGroupType); - Exit; - end; - -// if wbDisplayLoadOrderFormID then -// Result := Result + wbFormID.ToString(GetChildrenOf.FixedFormID, Self) -// else - Result := Result + wbFormID.ToString(grStruct.grsLabel, Self); -end; - -function TwbGroupRecord.GetCountedRecordCount: Cardinal; -begin - Result := Succ(inherited GetCountedRecordCount); -end; - -function TwbGroupRecord.GetShortName: string; -var - RecordDef : PwbRecordDef; -begin - case grStruct.grsGroupType of - 0: begin - Result := PwbSignature(@grStruct.grsLabel)^; - if wbFindRecordDef(AnsiString(Result), RecordDef) then - Result := RecordDef.GetName; - end; - 1: Result := 'World Children'; - 2: Result := 'Block ' + IntToStr(grStruct.grsLabel); - 3: Result := 'Sub-Block ' + IntToStr(grStruct.grsLabel); - 4: Result := 'Block ' + IntToStr(LongRecSmall(grStruct.grsLabel).Hi) + ', ' + IntToStr(LongRecSmall(grStruct.grsLabel).Lo); - 5: Result := 'Sub-Block ' + IntToStr(LongRecSmall(grStruct.grsLabel).Hi) + ', ' + IntToStr(LongRecSmall(grStruct.grsLabel).Lo); - 6: Result := 'Children of ' + IntToHex(grStruct.grsLabel, 8); - 7: Result := 'Children of ' + IntToHex(grStruct.grsLabel, 8); - 8: Result := 'Persistent'; - 9: Result := 'Temporary'; - 10: if wbVWDAsQuestChildren then - Result := 'Children of ' + IntToHex(grStruct.grsLabel, 8) - else - Result := 'Visible when Distant'; - else - Result := Result + ' Unknown type: ' + IntToStr(grStruct.grsGroupType); - end; -end; - -function TwbGroupRecord.GetSortKeyInternal(aExtended: Boolean): string; -begin - Result := IntToHex64(GetGroupType, 2); - - case grStruct.grsGroupType of - 0: Result := Result + PwbSignature(@grStruct.grsLabel)^; - 4: Result := Result + - IntToHex64(LongRecSmall(grStruct.grsLabel).Hi + Low(SmallInt), 5) + - IntToHex64(LongRecSmall(grStruct.grsLabel).Lo + Low(SmallInt), 5); - 5: Result := Result + - IntToHex64(LongRecSmall(grStruct.grsLabel).Hi + Low(SmallInt), 5) + - IntToHex64(LongRecSmall(grStruct.grsLabel).Lo + Low(SmallInt), 5); - else - Result := Result + IntToHex64(grStruct.grsLabel, 8); - end; -end; - -function TwbGroupRecord.grStruct: PwbGroupRecordStruct; -begin - Result := PwbGroupRecordStruct(dcBasePtr); -end; - -procedure TwbGroupRecord.InformPrevMainRecord(const aPrevMainRecord: IwbMainRecord); -begin - inherited; - if (grStruct.grsGroupType in [1, 6, 7]) and Assigned(aPrevMainRecord) and (aPrevMainRecord.FormID = grStruct.grsLabel) then - (aPrevMainRecord as IwbMainRecordInternal).SetChildGroup(Self); -end; - -procedure TwbGroupRecord.InitDataPtr; -var - Dummy: Integer; -begin - if Assigned(dcEndPtr) then begin - dcDataBasePtr := Pointer( Cardinal( dcBasePtr ) + wbSizeOfMainRecordStruct ); - dcDataEndPtr := Pointer( Cardinal( dcBasePtr ) + grStruct.grsGroupSize ); - dcEndPtr := dcDataEndPtr; - if not recSkipped then - if grStruct.grsGroupType = 0 then - recSkipped := GroupToSkip.Find(PwbSignature(@grStruct.grsLabel)^, Dummy); - end; -end; - -function TwbGroupRecord.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement); -end; - -function TwbGroupRecord.LinksToParent: Boolean; -begin - Result := GetGroupType in [4, 5, 8..10]; -end; - -procedure TwbGroupRecord.MakeHeaderWriteable; -var - p : PwbGroupRecordStruct; - SelfPtr : IwbContainerElementRef; -begin - SelfPtr := Self as IwbContainerElementRef; - - DoInit; - - SetModified(True); - InvalidateParentStorage; - - if Assigned(dcEndPtr) then begin - New(p); - p^ := grStruct^; - dcBasePtr := p; - dcEndPtr := nil; - end; -end; - -procedure TwbGroupRecord.MasterCountUpdated(aOld, aNew: Byte); -var - FileID: Integer; -begin - if grStruct.grsGroupType in [1, 6..10] then begin - if grStruct.grsLabel <> 0 then begin - FileID := grStruct.grsLabel shr 24; - if FileID >= aOld then begin - FileID := aNew; - MakeHeaderWriteable; - grStruct.grsLabel := (grStruct.grsLabel and $00FFFFFF) or (Cardinal(FileID) shl 24); - end; - end; - end; - - inherited; -end; - -procedure TwbGroupRecord.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - OldFormID: Cardinal; - NewFormID: Cardinal; -begin - inherited; - - if grStruct.grsGroupType in [1, 6..10] then begin - if grStruct.grsLabel <> 0 then begin - OldFormID := grStruct.grsLabel; - NewFormID := FixupFormID(OldFormID, aOld, aNew); - if OldFormID <> NewFormID then begin - MakeHeaderWriteable; - grStruct.grsLabel := NewFormID; - end; - end; - end; -end; - -procedure TwbGroupRecord.NotifyChangedInternal(aContainer: Pointer); -begin - if gsSorting in grStates then - Exit; - inherited; - // Let's try to sort only when the group membership change and not when one of its member change. - if Assigned(aContainer) and (IwbContainerInternal(aContainer).ElementID = GetElementID) then - Exclude(grStates, gsSorted); -end; - -procedure TwbGroupRecord.PrepareSave; -begin - if esModified in eStates then - Sort; - inherited; - if Length(cntElements) = 0 then - Remove - else if esModified in eStates then begin - Exclude(grStates, gsSorted); - Sort; - end; -end; - -function TwbGroupRecord.Reached: Boolean; -var - Rec : IwbMainRecord; - SelfRef : IwbContainerElementRef; -begin - if esReachable in eStates then - Exit(False); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if GetGroupType in [0, 2, 3] then begin - Result := False; - Exit; - end; - Result := inherited Reached; - if Result and (GetGroupType in [1, 6..10]) then begin - Rec := (GetFile as IwbFileInternal).RecordByFormID[GetGroupLabel, False]; - if Assigned(Rec) then - (Rec as IwbElementInternal).Reached; - end; -end; - -procedure TwbGroupRecord.Remove; -var - i : Integer; - SelfRef : IwbContainerElementRef; - MainRecord : IwbMainRecord; -begin - SelfRef := Self as IwbContainerElementRef; - for i := High(cntElements) downto Low(cntElements) do - cntElements[i].Remove; - MainRecord := GetChildrenOf; - if Assigned(MainRecord) and MainRecord._File.Equals(GetFile) then - (MainRecord as IwbMainRecordInternal).RemoveChildGroup(Self); - inherited Remove; -end; - -procedure TwbGroupRecord.ScanData; -var - CurrentPtr : Pointer; - Rec : IwbRecord; - MainRecord : IwbMainRecord; - PrevMainRecord : IwbMainRecord; -begin - case grStruct.grsGroupType of - 0: begin - SetSortOrder(wbGetGroupOrder(PwbSignature(@grStruct.grsLabel)^)); - SetMemoryOrder(wbGetGroupOrder(PwbSignature(@grStruct.grsLabel)^)); - end; - end; - - if recSkipped then - Exit; - - CurrentPtr := GetDataBasePtr; - PrevMainRecord := nil; - while Cardinal(CurrentPtr) < Cardinal(dcDataEndPtr) do begin - Rec := TwbRecord.CreateForPtr(CurrentPtr, dcDataEndPtr, Self, PrevMainRecord); - if Supports(Rec, IwbMainRecord, MainRecord) then - PrevMainRecord := MainRecord; - Rec := nil; - MainRecord := nil; - end; - PrevMainRecord := nil; -end; - -procedure TwbGroupRecord.SetGroupLabel(aLabel: Cardinal); -var - OldLabel : Cardinal; - i : Integer; - GroupRecord : IwbGroupRecord; - - SelfPtr : IwbContainerElementRef; - ContainedIn : IwbContainedIn; -begin - SelfPtr := Self as IwbContainerElementRef; - - OldLabel := grStruct.grsLabel; - if aLabel = OldLabel then - Exit; - - case grStruct.grsGroupType of - 1: ;//Result := Result + ' World Children of '; - 6: ;//Result := Result + ' Cell Children of '; - 7: ;//Result := Result + ' Topic Children of '; - 8: ;//Result := Result + ' Cell Persistent Children of '; - 9: ;//Result := Result + ' Cell Temporary Children of '; - 10: ;//Result := Result + ' Cell Visible Distant Children of '; - else - raise Exception.Create('Can not set Label of ' + GetName); - end; - - MakeHeaderWriteable; - grStruct.grsLabel := aLabel; - -// if grStruct.grsGroupType <> 6 then -// Exit; - - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbGroupRecord, GroupRecord) then begin - if GroupRecord.GroupType in [8..10] then - if GroupRecord.GroupLabel = OldLabel then - GroupRecord.GroupLabel := aLabel; - end else if Supports(GetElement(i), IwbContainedIn, ContainedIn) then - ContainedIn.ContainerChanged; -end; - -procedure TwbGroupRecord.SetModified(aValue: Boolean); -begin - inherited; - InvalidateStorage; -end; - -function FindSortElement(const aElement: IwbElement): IwbElement; -var - GroupRecord : IwbGroupRecord; -begin - if Supports(aElement, IwbGroupRecord, GroupRecord) then begin - Result := GroupRecord.ChildrenOf; - if Assigned(Result) then - Exit; - end; - Result := aElement; -end; - -function CompareGroupContents(Item1, Item2: Pointer): Integer; -var - Element1 : IwbElement; - Element2 : IwbElement; - SortElement1 : IwbElement; - SortElement2 : IwbElement; - GroupRecord1 : IwbGroupRecord; - GroupRecord2 : IwbGroupRecord; - MainRecord1 : IwbMainRecord; - MainRecord2 : IwbMainRecord; -begin - Element1 := IwbElement(Item1); - Element2 := IwbElement(Item2); - - if Element1 = Element2 then begin - Result := 0; - Exit; - end; - - if Assigned(Element1) <> Assigned(Element2) then begin - if Assigned(Element1) then - Result := -1 - else - Result := 1; - Exit; - end - else if not Assigned(Element1) then begin - Result := 0; - Exit; - end; - - {"ChildrenOf" groups always sort like their owner} - SortElement1 := FindSortElement(Element1); - SortElement2 := FindSortElement(Element2); - - if Assigned(SortElement1) <> Assigned(SortElement2) then begin - if Assigned(SortElement1) then - Result := -1 - else - Result := 1; - Exit; - end - else if not Assigned(SortElement1) then begin - Result := 0; - Exit; - end; - - Result := CmpI32(Ord(SortElement1.ElementType), Ord(SortElement2.ElementType)); - if Result = 0 then - case SortElement1.ElementType of - etFile: begin - Assert(False); - Exit; - end; - etGroupRecord: begin - Assert(SortElement2.ElementType = etGroupRecord); - GroupRecord1 := SortElement1 as IwbGroupRecord; - GroupRecord2 := SortElement2 as IwbGroupRecord; - Assert(GroupRecord1.GroupType = GroupRecord2.GroupType); - case GroupRecord1.GroupType of - 0: Result := CompareText( - TwbSignature(GroupRecord1.GroupLabel), - TwbSignature(GroupRecord2.GroupLabel)); - 2, 3: Result := CmpI32( - Integer(GroupRecord1.GroupLabel), - Integer(GroupRecord2.GroupLabel)); - 4, 5: begin - Result := CmpI32( - LongRecSmall(GroupRecord1.GroupLabel).Hi, - LongRecSmall(GroupRecord2.GroupLabel).Hi); - if Result = 0 then - Result := CmpI32( - LongRecSmall(GroupRecord1.GroupLabel).Lo, - LongRecSmall(GroupRecord2.GroupLabel).Lo); - end; - else - Assert(False); - end; - end; - etMainRecord: begin - Assert(SortElement2.ElementType = etMainRecord); - MainRecord1 := SortElement1 as IwbMainRecord; - MainRecord2 := SortElement2 as IwbMainRecord; - Result := 0; - if Result = 0 then begin - Result := CmpI32(MainRecord1.SortPriority, MainRecord2.SortPriority); - if Result = 0 then begin - if wbDisplayLoadOrderFormID then - Result := CmpW32(MainRecord1.LoadOrderFormID, MainRecord2.LoadOrderFormID) - else - Result := CmpW32(MainRecord1.FixedFormID, MainRecord2.FixedFormID); - if Result = 0 then - Result := CmpW32(MainRecord1.ElementID, MainRecord2.ElementID); - end; - end; - end - else - Assert(False); - end; - - if Result = 0 then - if Element1 <> SortElement1 then begin - if Element2 <> SortElement2 then begin - {both are groups of the same element } - GroupRecord1 := Element1 as IwbGroupRecord; - GroupRecord2 := Element2 as IwbGroupRecord; - Result := CmpI32(GroupRecord1.GroupType, GroupRecord2.GroupType); - if Result = 0 then - Result := CmpW32(GroupRecord1.GroupLabel, GroupRecord2.GroupLabel); - end - else begin - {element1 is a group of element2} - Result := 1; - end; - end - else begin - if Element2 <> SortElement2 then begin - {element2 is a group of element1} - Result := -1; - end - else begin - {really seems to be the same} - end; - end; -end; - -var - ElementRefs : array of IwbContainerElementRef; - ElementRefsCount : Integer; - -procedure TwbGroupRecord.Sort; - - procedure DoInserRecord(const InsertRecord: IwbMainRecordEntry); - var - TargetRecord: IwbMainRecordEntry; - begin - SetLength(ElementRefs, Succ(Length(ElementRefs))); - if not Supports(InsertRecord, IwbContainerElementRef, ElementRefs[High(ElementRefs)]) then - Assert(False); - - if Supports(InsertRecord.ElementLinksTo['PNAM'], IwbMainRecordEntry, TargetRecord) then begin - - SetLength(ElementRefs, Succ(Length(ElementRefs))); - if not Supports(TargetRecord, IwbContainerElementRef, ElementRefs[High(ElementRefs)]) then - Assert(False); - - if not TargetRecord.IsInList then - DoInserRecord(TargetRecord); - - InsertRecord.InsertEntryAfter(TargetRecord); - - end else if InsertRecord.ElementExists['PNAM'] then - InsertRecord.InsertEntryHead - else - InsertRecord.InsertEntryTail; - end; - -var - ChildrenOf : IwbMainRecord; - MainRecords : TDynMainRecords; - Groups : TDynGroupRecords; - Group : IwbContainerElementRef; - g : IwbGroupRecord; - i, j, k : Integer; - InsertRecord: IwbMainRecordEntry; - TargetRecord: IwbMainRecordEntry; - PrevRecord : IwbMainRecordEntry; - InfoQuest : Int64; - InfoQuest2 : Int64; - Inserted : Boolean; - NewElements : TDynElementInternals; - -begin - if grStates * [gsSorted, gsSorting] <> [] then - Exit; - - if eUpdateCount > 0 then begin - Include(grStates, gsSortPostponed); - Exit; - end; - - Include(grStates, gsSorting); - try - ChildrenOf := GetChildrenOf; - // there is no PNAM in Fallout 4, looks like INFOs are no longer linked lists - if (wbGameMode <> gmFO4) and Assigned(ChildrenOf) and (ChildrenOf.Signature = 'DIAL') then begin - {>>> Sorting DIAL group doesn't always work, and Skyrim.esm has a plenty of unsorted DIALs <<<} - {>>> Also disabled for FNV, https://code.google.com/p/skyrim-plugin-decoding-project/issues/detail?id=59 <<<} - if not wbSortGroupRecord then - Exit; - - if not wbDisplayLoadOrderFormID then - Exit; - - Inc(ElementRefsCount); - try - MainRecords := ChildrenOf.MasterRecordsFromMasterFilesAndSelf; - SetLength(Groups, Length(MainRecords)); - i := 0; - for j := Low(MainRecords) to High(MainRecords) do begin - Groups[i] := MainRecords[j].ChildGroup; - if Assigned(Groups[i]) and (Groups[i].ElementCount > 0) then - Inc(i); - end; - SetLength(Groups, i); - - for i := Low(Groups) to High(Groups) do - if not Equals(Groups[i]) then - (Groups[i] as IwbGroupRecordInternal).Sort; - - mreHeader.BeginUse; - try - for i := Low(Groups) to High(Groups) do - if Supports(Groups[i], IwbContainerElementRef, Group) then - for j := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[j], IwbMainRecordEntry, InsertRecord) then - DoInserRecord(InsertRecord); - TargetRecord := IwbMainRecordEntry(mreHeader.mrehTail); - while Assigned(TargetRecord) do begin - PrevRecord := TargetRecord.PrevEntry; - if not Equals(TargetRecord.Container) then - TargetRecord.RemoveEntry - else if not TargetRecord.IsDeleted then if wbBeginInternalEdit then try - if not TargetRecord.ElementExists['PNAM'] then begin - {>>> No QSTI in Skyrim, using DIAL\QNAM <<<} - if wbGameMode in [ gmTES5, gmSSE ] then begin - Supports(TargetRecord.Container, IwbGroupRecord, g); - InfoQuest := g.ChildrenOf.ElementNativeValues['QNAM']; - end else - InfoQuest := TargetRecord.ElementNativeValues['QSTI']; - InsertRecord := PrevRecord; - Inserted := False; - while Assigned(InsertRecord) do begin - if wbGameMode in [ gmTES5, gmSSE ] then begin - Supports(InsertRecord.Container, IwbGroupRecord, g); - InfoQuest2 := g.ChildrenOf.ElementNativeValues['QNAM']; - end else - InfoQuest2 := InsertRecord.ElementNativeValues['QSTI']; - if (not InsertRecord.IsDeleted) and (InfoQuest = InfoQuest2) then begin - try - Inserted := True; - TargetRecord.Add('PNAM').NativeValue := InsertRecord.LoadOrderFormID; - except - TargetRecord.RemoveElement('PNAM'); - end; - Break; - end; - InsertRecord := InsertRecord.PrevEntry; - end; - if not Inserted then - TargetRecord.Add('PNAM'); - end; - finally - wbEndInternalEdit; - end; - TargetRecord := PrevRecord; - end; - - Assert(mreHeader.mrehCount = Length(cntElements)); - - SetLength(NewElements, Length(cntElements)); - k := High(NewElements); - TargetRecord := IwbMainRecordEntry(mreHeader.mrehTail); - while Assigned(TargetRecord) do begin - Assert(k >= Low(NewElements)); - if not Supports(TargetRecord, IwbElementInternal, NewElements[k]) then - Assert(False); - TargetRecord := TargetRecord.PrevEntry; - Dec(k); - end; - Assert(k = -1); - - cntElements := NewElements; - Include(grStates, gsSorted); - finally - mreHeader.EndUse; - end; - finally - Dec(ElementRefsCount); - if ElementRefsCount = 0 then - ElementRefs := nil; - end; - Exit; - end; - - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[0], Length(cntElements), CompareGroupContents); - Include(grStates, gsSorted); - finally - Exclude(grStates, gsSorting); - end; -end; - -procedure TwbGroupRecord.UpdatedEnded; -begin - if gsSortPostponed in grStates then begin - Exclude(grStates, gsSortPostponed); - Sort; - end; - inherited; -end; - -procedure TwbGroupRecord.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - CurrentPosition : Int64; - NewPosition : Int64; - DataSize : Cardinal; - grs : TwbGroupRecordStruct; -begin - CurrentPosition := aStream.Position; - grs := grStruct^; - aStream.WriteBuffer(grs, wbSizeOfMainRecordStruct ); - if wbForceNewHeader then - aStream.WriteBuffer(wbNewHeaderAddon, SizeOf(wbNewHeaderAddon) ); - inherited; - if (esModified in eStates) or wbTestWrite then begin - - NewPosition := aStream.Position; - DataSize := (NewPosition - CurrentPosition); - aStream.Position := CurrentPosition + 4; - aStream.WriteBuffer(DataSize, SizeOf(DataSize)); - aStream.Position := NewPosition; - - end else - if wbForceNewHeader then - Assert(CurrentPosition + grStruct.grsGroupSize + SizeOf(wbNewHeaderAddon) = aStream.Position) - else - Assert(CurrentPosition + grStruct.grsGroupSize = aStream.Position); - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -{ TwbElement } - -function TwbElement.AddIfMissing(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -{$IFDEF USE_CODESITE} -var - Log: Boolean; - Group : IwbGroupRecord; -{$ENDIF} -begin - if (wbCurrentTick>0) and (wbCurrentTick+5000) and (wbCurrentTick+500 0 then - Assert(FRefCount = 0); - Include(eStates, esDestroying); - inherited BeforeDestruction; - {$IFDEF WIN64} - LockedInc(eExternalRefs); - LockedInc(FRefCount); - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, [Self] - lock inc dword ptr [eax + eExternalRefs] - lock inc dword ptr [eax + FRefCount] - end; - {$ENDIF WIN64} -end; - -function TwbElement.BeginDecide: Boolean; -begin - Result := not (esDeciding in eStates); - if Result then - Include(eStates, esDeciding); -end; - -function TwbElement.BeginUpdate: Integer; -begin - Result := Succ(eUpdateCount); - eUpdateCount := Result; -end; - -procedure TwbElement.BuildRef; -begin - {nothing} -end; - -function TwbElement.CanAssign(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -{$IFDEF USE_CODESITE} -var - Log: Boolean; -{$ENDIF} -begin - {$IFDEF USE_CODESITE} - Log := (laElementCanAssign in wbLoggingAreas) and wbCodeSiteLoggingEnabled; - if Log then begin - CodeSite.EnterMethod(Self, 'CanAssign'); - CodeSite.Send('Self.Name', Self.GetName); - CodeSite.Send('Self.Path', Self.GetPath); - CodeSite.Send('Self.Value', Self.GetValue); - CodeSite.Send('aIndex', aIndex); - if Assigned(aElement) then begin - CodeSite.Send('aElement.Name', aElement.Name); - CodeSite.Send('aElement.Path', aElement.Path); - CodeSite.Send('aElement.Value', aElement.Value); - end else - CodeSite.Send('aElement', 'nil'); - CodeSite.Send('aCheckDontShow', aCheckDontShow); - end; - Result := False; - try - {$ENDIF} - Result := CanAssignInternal(aIndex, aElement, aCheckDontShow); - {$IFDEF USE_CODESITE} - finally - if Log then begin - CodeSite.Send('Result', Result); - CodeSite.ExitMethod(Self, 'CanAssign'); - end; - end; - {$ENDIF} -end; - -function TwbElement.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -var - TargetValueDef: IwbValueDef; - SourceValueDef: IwbValueDef; -begin - Result := wbIsInternalEdit; - if Result then - Exit; - - if not wbEditAllowed then - Exit; - - if not GetIsEditable then - Exit; - - if not Assigned(aElement) then - Exit; - - TargetValueDef := GetValueDef; - if TargetValueDef = nil then - Exit; - - SourceValueDef := aElement.ValueDef; - if SourceValueDef = nil then - Exit; - - Result := TargetValueDef.CanAssign(Self, aIndex, SourceValueDef); - - if Result and aCheckDontShow and GetDontShow then - Result := False; -end; - -function TwbElement.CanChangeMember: Boolean; -begin - Result := Assigned(eContainer) and - IwbContainerInternal(eContainer).CanChangeElementMember(Self); -end; - -function TwbElement.CanContainFormIDs: Boolean; -begin - Result := True; -end; - -function TwbElement.CanMoveDown: Boolean; -begin - Result := Assigned(eContainer) and - IwbContainerInternal(eContainer).CanMoveElementDown(Self); -end; - -function TwbElement.CanMoveUp: Boolean; -begin - Result := Assigned(eContainer) and - IwbContainerInternal(eContainer).CanMoveElementUp(Self); -end; - -function TwbElement.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -begin - Result := False; -end; - -function CompareLoadOrderSL(List: TStringList; Index1, Index2: Integer): Integer; -begin - if Index1 = Index2 then begin - Result := 0; - Exit; - end; - - Result := CmpI32( - IwbFile(Pointer(List.Objects[Index1])).LoadOrder, - IwbFile(Pointer(List.Objects[Index2])).LoadOrder); -end; - -procedure AddRequiredMasters(aMasters: TStrings; const aTargetFile: IwbFile); -var - sl : TStringList; - i, j : Integer; -begin - sl := TStringList.Create; - try - sl.Sorted := True; - sl.Duplicates := dupIgnore; - sl.AddStrings(aMasters); - - for i := 0 to Pred(aTargetFile.MasterCount) do - if sl.Find(aTargetFile.Masters[i].FileName, j) then - sl.Delete(j); - if sl.Find(aTargetFile.FileName, j) then - sl.Delete(j); - - if sl.Count > 0 then begin - - for i := 0 to Pred(sl.Count) do - if IwbFile(Pointer(sl.Objects[i])).LoadOrder >= aTargetFile.LoadOrder then - raise Exception.Create('The required master "' + sl[i] + '" can not be added to "' + aTargetFile.FileName + '" as it has a higher load order'); - - sl.Sorted := False; - sl.CustomSort(CompareLoadOrderSL); - - aTargetFile.AddMasters(sl); - end; - finally - sl.Free; - end; -end; - -function TwbElement.CopyInto(const aFile: IwbFile; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - sl : TStringList; - MainRecord : IwbMainRecord; - GroupRecord : IwbGroupRecord; -begin - sl := TStringList.Create; - try - sl.Sorted := True; - sl.Duplicates := dupIgnore; - ReportRequiredMasters(sl, aAsNew); - AddRequiredMasters(sl, aFile); - - if aDeepCopy and Supports(Self, IwbMainRecord, MainRecord) and Assigned(MainRecord.ChildGroup) then begin - Result := wbCopyElementToFile(MainRecord.ChildGroup, aFile, aAsNew, True, aPrefixRemove, aPrefix, aSuffix); - if Supports(Result, IwbGroupRecord, GroupRecord) then - Result := GroupRecord.ChildrenOf - else - Result := nil; - end else - Result := wbCopyElementToFile(Self, aFile, aAsNew, True, aPrefixRemove, aPrefix, aSuffix); - finally - sl.Free; - end; -end; - -constructor TwbElement.Create(const aContainer: IwbContainer); -begin - eSortOrder := High(Integer); - eMemoryOrder := Low(Integer); - inherited Create; - if Assigned(aContainer) then - aContainer.AddElement(Self); -end; - -procedure TwbElement.DoAfterSet(const aOldValue, aNewValue: Variant); -var - NamedDef: IwbNamedDef; -begin - NamedDef := GetValueDef; - if Assigned(NamedDef) then - NamedDef.AfterSet(Self, aOldValue, aNewValue); - if Supports(GetDef, IwbNamedDef, NamedDef) then - NamedDef.AfterSet(Self, aOldValue, aNewValue); -end; - -procedure TwbElement.DoReset(aForce: Boolean); -begin - {nothing} -end; - -procedure TwbElement.EndDecide; -begin - Exclude(eStates, esDeciding); -end; - -function TwbElement.EndUpdate: Integer; - -begin - Result := Pred(eUpdateCount); - eUpdateCount := Result; - if Result = 0 then - UpdatedEnded; -end; - -function TwbElement.Equals(const aElement: IwbElement): Boolean; -begin - Result := Assigned(aElement) and (aElement.ElementID = GetElementID); -end; - -procedure TwbElement.FindUsedMasters(aMasters: PwbUsedMasters); -begin - {can be overriden} -end; - -procedure TwbElement.FreeInstance; -begin - if (FRefCount and $7FFFFFFF) <> 1 then - Assert(FRefCount = 1); - Assert(eExternalRefs = 1); - inherited; -end; - -function TwbElement.GetBaseName: string; -begin - Result := GetName; -end; - -function TwbElement.GetCheck: string; -begin - Result := ''; -end; - -function TwbElement.GetConflictPriority: TwbConflictPriority; -var - Def : IwbDef; - MainRecord : IwbMainRecord; -begin - Result := cpNormal; - - Def := GetValueDef; - - if not Assigned(Def) then - Def := GetDef; - - if Assigned(Def) then - Result := Def.ConflictPriority[Self]; - - if wbTranslationMode then begin - if Result <> cpTranslate then - Result := cpIgnore - else - Result := cpNormal; - end else begin - if Result = cpTranslate then - Result := cpNormal; - end; - - if Result = cpFormID then begin - Result := cpCritical; - MainRecord := GetContainingMainRecord; - if Assigned(MainRecord) and (MainRecord.Signature = 'GMST') then - Result := cpBenign; - end; -end; - -function TwbElement.GetConflictPriorityCanChange: Boolean; -var - Def : IwbDef; -begin - Result := False; - - Def := GetValueDef; - - if not Assigned(Def) then - Def := GetDef; - - if Assigned(Def) then - Result := Def.ConflictPriorityCanChange; -end; - -function TwbElement.GetContainer: IwbContainer; -begin - Result := IwbContainer(eContainer); -end; - -function TwbElement.GetContainingMainRecord: IwbMainRecord; -begin - if Assigned(eContainer) then - Result := IwbContainer(eContainer).ContainingMainRecord - else - Result := nil; -end; - -function TwbElement.GetDataSize: Integer; -begin - Result := 0; -end; - -function TwbElement.GetDef: IwbNamedDef; -begin - Result := nil; -end; - -function TwbElement.GetDisplayName: string; -begin - Result := GetName; -end; - -function TwbElement.GetDontShow: Boolean; -var - Def: IwbDef; -begin - Result := False; - Def := GetValueDef; - if Assigned(Def) then - Result := Def.DontShow[Self]; - if not Result then begin - Def := GetDef; - if Assigned(Def) then - Result := Def.DontShow[Self]; - end; -end; - -function TwbElement.GetEditInfo: string; -begin - Result := ''; -end; - -function TwbElement.GetEditType: TwbEditType; -begin - Result := etDefault; -end; - -function TwbElement.GetEditValue: string; -begin - Result := ''; -end; - -function TwbElement.GetElementID: Cardinal; -begin - Result := Cardinal(Self); -end; - -function TwbElement.GetElementStates: TwbElementStates; -begin - Result := eStates; -end; - -function TwbElement.GetElementType: TwbElementType; -begin - Assert(False, 'This method is abstract'); - Result := TwbElementType(-1); -end; - -function TwbElement.GetFile: IwbFile; -begin - if Assigned(eContainer) then - Result := IwbContainerInternal(eContainer)._File - else - Result := nil; -end; - -function TwbElement.GetFullPath: string; -begin - if Assigned(eContainer) then - Result := IwbElement(eContainer).FullPath - else - Result := ''; - Result := Result + ' \ '; - if Assigned(eContainer) then - Result := Result + '['+IntToStr(IwbContainer(eContainer).IndexOf(Self))+'] '; - Result := Result + GetName; -end; - -function TwbElement.GetPathName: string; -begin - if Assigned(eContainer) then - Result := IwbElement(eContainer).PathName - else - Result := ''; - Result := Result + '\'; - if Assigned(eContainer) then - Result := Result + '['+IntToStr(IwbContainer(eContainer).IndexOf(Self))+'] '; - Result := Result + GetShortName; -end; - -function TwbElement.GetInjectionSourceFiles: TDynFiles; -var - Element : IwbElement; - MainRecord : IwbMainRecord; -begin - Result := nil; - Element := GetLinksTo; - if Supports(Element, IwbMainRecord, MainRecord) and not GetFile.Equals(MainRecord._File) and MainRecord.MasterOrSelf.IsInjected then begin - SetLength(Result, 1); - Result[0] := MainRecord.MasterOrSelf._File; - end; -end; - -function TwbElement.GetIsEditable: Boolean; -begin - Result := wbIsInternalEdit; -end; - -function TwbElement.GetIsHidden: Boolean; -begin - if [esHidden, esParentHiddenChecked] * eStates = [] then begin - Include(eStates, esParentHiddenChecked); - if Assigned(eContainer) and IwbContainer(eContainer).IsHidden then - Include(eStates, esParentHidden) - else - Exclude(eStates, esParentHidden); - end; - Result := eStates * [esHidden, esParentHidden] <> []; -end; - -function TwbElement.GetIsInjected: Boolean; -begin - Result := False; -end; - -function TwbElement.GetIsNotReachable: Boolean; -begin - Result := esNotReachable in eStates; -end; - -function TwbElement.GetIsRemoveable: Boolean; -begin - Result := not Assigned(eContainer) or IwbContainer(eContainer).IsElementRemoveable(Self); -end; - -function TwbElement.GetLinksTo: IwbElement; -begin - Result := nil; -end; - -function TwbElement.GetMemoryOrder: Integer; -begin - Result := eMemoryOrder; -end; - -function TwbElement.GetModified: Boolean; -begin - if wbShowInternalEdit then - Result := [esModified] * eStates = [esModified] - else - Result := [esModified, esInternalModified] * eStates = [esModified]; -end; - -function TwbElement.GetName: string; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - Result := ''; -end; - -function TwbElement.GetNativeValue: Variant; -begin - Result := Null; -end; - -function TwbElement.GetNoReach: Boolean; -var - Def : IwbDef; -begin - Def := GetValueDef; - if not Assigned(Def) then - Def := GetDef; - if Assigned(Def) then - Result := Def.NoReach - else - Result := False; -end; - -function TwbElement.GetPath: string; -begin - if Assigned(eContainer) then - Result := IwbElement(eContainer).Path - else - Result := ''; - Result := Result + ' \ ' + GetName; -end; - -function TwbElement.GetCountedRecordCount: Cardinal; -begin - Result := 0; -end; - -function TwbElement.GetReferenceFile: IwbFile; -var - Container: IwbContainer; -begin - Container := GetContainer; - if Assigned(Container) then - Result := Container.ReferenceFile - else - Result := nil; -end; - -function TwbElement.GetReferencesInjected: Boolean; -var - Element : IwbElement; - _File : IwbFile; - ElementFile : IwbFile; - i : Integer; -begin - Element := GetLinksTo; - Result := Assigned(Element) and Element.IsInjected; - - if Result then begin - _File := GetFile; - ElementFile := Element._File; - Result := not _File.Equals(ElementFile); - if Result then begin - for i := 0 to Pred(_File.MasterCount) do - if _File.Masters[i].Equals(ElementFile) then begin - Result := False; - Exit; - end; - end; - end; -end; - -function TwbElement.GetResolvedValueDef: IwbValueDef; -begin - Result := GetValueDef; -end; - -function TwbElement.GetShortName: string; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - Result := GetName; -end; - -function TwbElement.GetSkipped: Boolean; -begin - Result := False; -end; - -function TwbElement.GetSortKey(aExtended: Boolean): string; -begin - if aExtended then begin - if not (esExtendedSortKeyValid in eStates) then begin - if not (esSorting in eStates) then begin - Include(eStates, esSorting); - eExtendedSortKey := GetSortKeyInternal(aExtended); - Exclude(eStates, esSorting); - end - else - eExtendedSortKey := GetSortKeyInternal(aExtended); - Include(eStates, esExtendedSortKeyValid); - end; - Result := eExtendedSortKey; - end else begin - if not (esSortKeyValid in eStates) then begin - if not (esSorting in eStates) then begin - Include(eStates, esSorting); - eSortKey := GetSortKeyInternal(aExtended); - Exclude(eStates, esSorting); - end else - eSortKey := GetSortKeyInternal(aExtended); - Include(eStates, esSortKeyValid); - end; - Result := eSortKey; - end; -end; - -function TwbElement.GetSortKeyInternal(aExtended: Boolean): string; -begin - Result := ''; -end; - -function TwbElement.GetSortOrder: Integer; -begin - Result := eSortOrder; -end; - -function TwbElement.GetSortPriority: Integer; -begin - Result := 0; -end; - -function TwbElement.GetTreeBranch: Boolean; -var - NamedDef: IwbNamedDef; -begin - if Supports(GetDef, IwbNamedDef, NamedDef) then - Result := NamedDef.TreeBranch - else - Result := False; -end; - -function TwbElement.GetTreeHead: Boolean; -var - NamedDef: IwbNamedDef; -begin - if Supports(GetDef, IwbNamedDef, NamedDef) then - Result := NamedDef.TreeHead - else - Result := False; -end; - -function TwbElement.GetValue: string; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - Result := ''; -end; - -function TwbElement.GetValueDef: IwbValueDef; -begin - Result := nil; -end; - -function TwbElement.HasErrors: Boolean; -begin - Result := Trim(GetCheck) <> ''; -end; - -procedure TwbElement.Hide; -begin - if not (esHidden in eStates) then begin - Include(eStates, esHidden); - ResetConflict; - end; -end; - -procedure TwbElement.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -begin - {can be overriden} -end; - -{$D-} -function TwbElement.InternalAddRef: Integer; -begin - Result := inherited _AddRef; -end; - -function TwbElement.InternalRelease: Integer; -begin - Result := inherited _Release; -end; -{$D+} - -procedure TwbElement.InvalidateParentStorage; -begin - if Assigned(eContainer) then - (IwbContainer(eContainer) as IwbElementInternal).InvalidateStorage; -end; - -procedure TwbElement.InvalidateStorage; -begin - InvalidateParentStorage; -end; - -function TwbElement.IsTagged: Boolean; -begin - Result := esTagged in eStates; -end; - -function TwbElement.LinksToParent: Boolean; -begin - Result := False; -end; - -procedure TwbElement.MarkModifiedRecursive; -begin - if not Assigned(eContainer) or IwbContainer(eContainer).IsElementEditable(Self) then begin - SetModified(True); - InvalidateParentStorage; - end; -end; - -procedure TwbElement.MasterCountUpdated(aOld, aNew: Byte); -begin - {can be overriden} -end; - -procedure TwbElement.MasterIndicesUpdated(const aOld, aNew: TBytes); -begin - Assert( Length(aOld) = Length(aNew) ); -end; - -procedure TwbElement.MergeStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -{$IFDEF USE_CODESITE} -var - Log: Boolean; -{$ENDIF} -begin - {$IFDEF USE_CODESITE} - Log := (laElementMergeStorage in wbLoggingAreas) and wbCodeSiteLoggingEnabled; - if Log then begin - CodeSite.EnterMethod(Self, 'MergeStorage'); - CodeSite.Send('Self.Name', Self.GetName); - CodeSite.Send('Self.Path', Self.GetPath); - CodeSite.Send('Self.Value', Self.GetValue); - if StartsWith(Self.GetValue, ' 0 then - Include(eStates, esChangeNotified) - else - NotifyChangedInternal(aContainer); -end; - -procedure TwbElement.NotifyChangedInternal(aContainer: Pointer); -begin - if Assigned(eContainer) then - IwbContainerInternal(eContainer).ElementChanged(Self, aContainer); -end; - -procedure TwbElement.PrepareSave; -begin - {can be overriden} -end; - -procedure TwbElement.PreviousMember; -begin - if not CanChangeMember then - Exit; - IwbContainerInternal(eContainer).PreviousElementMember(Self); -end; - -function TwbElement.Reached: Boolean; -var - MainRecord : IwbMainRecord; -begin - Result := not (esReachable in eStates); - - if GetDontShow then - Exit; - - Exclude(eStates, esNotReachable); - Include(eStates, esReachable); - If Result then begin - if not GetNoReach then - if Supports(GetLinksTo, IwbMainRecord, MainRecord) then begin - MainRecord := MainRecord.WinningOverride; - (MainRecord as IwbElementInternal).Reached; - end; - if LinksToParent and Assigned(eContainer) then - (IwbContainer(eContainer) as IwbElementInternal).Reached; - end; -end; - -procedure TwbElement.Remove; -begin - if Assigned(eContainer) then begin - SetModified(True); - InvalidateParentStorage; - IwbContainer(eContainer).RemoveElement(Self as IwbElement); - end; -end; - -function TwbElement.RemoveInjected(aCanRemove: Boolean): Boolean; -begin - Result := GetReferencesInjected; - if Result and GetIsRemoveable then begin - Result := False; - Remove; - end; -end; - -procedure TwbElement.ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; Recursive: Boolean = True; Initial: Boolean = false); -var - Element : IwbElement; - ReferenceFile : IwbFile; -begin - Element := GetLinksTo; - if Assigned(Element) then begin - ReferenceFile := Element.ReferenceFile; - if Assigned(ReferenceFile) then begin - aStrings.AddObject(ReferenceFile.FileName, Pointer(ReferenceFile)); - end; - end; -end; - -procedure TwbElement.RequestStorageChange(var aBasePtr, aEndPtr: Pointer; aNewSize: Cardinal); -begin - raise Exception.Create(GetName + ' is not editable'); -end; - -procedure TwbElement.ResetConflict; -begin - Exclude(eStates, esParentHiddenChecked); - Exclude(eStates, esParentHidden); -end; - -procedure TwbElement.ResetReachable; -begin - Include(eStates, esNotReachable); - Exclude(eStates, esReachable); -end; - -procedure TwbElement.ResetTags; -begin - Exclude(eStates, esTagged); -end; - -procedure TwbElement.SetContainer(const aContainer: IwbContainer); -begin - if Assigned(aContainer) then begin - Assert(not Assigned(eContainer)); - if esNotReachable in aContainer.ElementStates then - Include(eStates, esNotReachable); - end else - Assert(Assigned(eContainer)); - - if Assigned(aContainer) then - eContainer := Pointer(aContainer as IwbContainerInternal) - else - eContainer := nil; - - if not Assigned(eContainer) then - eContainerRef := nil - else - if eExternalRefs > 0 then - eContainerRef := aContainer as IwbContainerElementRef; -end; - -procedure TwbElement.SetDataSize(aSize: Integer); -begin - Assert(False, 'Can''t SetDataSize on ' + ClassName); -end; - -procedure TwbElement.SetEditValue(const aValue: string); -begin - raise Exception.Create(GetName + ' can not be edited.'); -end; - -procedure TwbElement.SetElementState(aState: TwbElementState; Clear: Boolean); -begin - if Clear then - Exclude(eStates, aState) - else - Include(eStates, aState); -end; - -procedure TwbElement.SetInternalModified(aValue: Boolean); -begin - wbBeginInternalEdit(True); - try - SetModified(aValue); - finally - wbEndInternalEdit; - end; -end; - -procedure TwbElement.SetMemoryOrder(aIndex: Integer); -begin - eMemoryOrder := aIndex; -end; - -procedure TwbElement.SetModified(aValue: Boolean); -begin - if aValue then begin - - if wbIsInternalEdit then begin - if not (esModified in eStates) then - Include(eStates, esInternalModified); - end else begin - Exclude(eStates, esInternalModified); - Include(eStates, esUnsaved); - end; - - Include(eStates, esModified); - Exclude(eStates, esSortKeyValid); - Exclude(eStates, esExtendedSortKeyValid); - eSortKey := ''; - eExtendedSortKey := ''; - -// if wbIsInternalEdit and (Self is TwbMainRecord) then -// Exit; - - if eUpdateCount > 0 then - Include(eStates, esModifiedUpdated) - else - if Assigned(eContainer) then - (IwbContainer(eContainer) as IwbElementInternal).Modified := True; - end; -end; - -procedure TwbElement.SetNativeValue(const aValue: Variant); -begin - raise Exception.Create(GetName + ' can not be edited.'); -end; - -procedure TwbElement.SetSortOrder(aIndex: Integer); -begin - eSortOrder := aIndex; -end; - -procedure TwbElement.SetToDefault; -{$IFDEF USE_CODESITE} -var - Log: Boolean; -{$ENDIF} -begin - {$IFDEF USE_CODESITE} - Log := (laElementSetToDefault in wbLoggingAreas) and wbCodeSiteLoggingEnabled; - if Log then begin - CodeSite.EnterMethod(Self, 'SetToDefault'); - CodeSite.Send('Self.Name', Self.GetName); - CodeSite.Send('Self.Path', Self.GetPath); - CodeSite.Send('Self.DataSize', Self.GetDataSize); - CodeSite.Send('Self.Value', Self.GetValue); - end; - {$ENDIF} - BeginUpdate; - try - SetToDefaultInternal; - finally - EndUpdate; - {$IFDEF USE_CODESITE} - if Log then begin - CodeSite.Send('Self.Value', Self.GetValue); - CodeSite.Send('Self.DataSize', Self.GetDataSize); - CodeSite.ExitMethod(Self, 'SetToDefault'); - end; - {$ENDIF} - end; -end; - -procedure TwbElement.SetToDefaultInternal; -begin - { can be overriden } -end; - -procedure TwbElement.Show; -begin - if esHidden in eStates then begin - Exclude(eStates, esHidden); - ResetConflict; - end; -end; - -procedure TwbElement.Tag; -begin - Include(eStates, esTagged); -end; - -procedure TwbElement.UpdatedEnded; -begin - if esChangeNotified in eStates then begin - Exclude(eStates, esChangeNotified); - NotifyChanged(eContainer); - end; - if esModifiedUpdated in eStates then begin - Exclude(eStates, esModifiedUpdated); - if Assigned(eContainer) and (esModified in eStates) then - (IwbContainer(eContainer) as IwbElementInternal).Modified := True; - end; -end; - -procedure TwbElement.WriteToStream(aStream: TStream; aResetModified: Boolean); -{$IFDEF USE_CODESITE} -var - Log: Boolean; -{$ENDIF} -begin - {$IFDEF USE_CODESITE} - Log := (laElementWriteToStream in wbLoggingAreas) and wbCodeSiteLoggingEnabled; - if Log then begin - CodeSite.EnterMethod(Self, 'WriteToStream'); - CodeSite.Send('Self.Name', Self.GetName); - CodeSite.Send('Self.Path', Self.GetPath); - CodeSite.Send('Self.Value', Self.GetValue); - CodeSite.Send('aStream.Position', aStream.Position); - CodeSite.Send('aResetModified', aResetModified); - end; - try - {$ENDIF} - WriteToStreamInternal(aStream, aResetModified); - {$IFDEF USE_CODESITE} - finally - if Log then begin - CodeSite.Send('aStream.Position', aStream.Position); - CodeSite.Send('Self.Value', Self.GetValue); - CodeSite.ExitMethod(Self, 'WriteToStream'); - end; - end; - {$ENDIF} -end; - -procedure TwbElement.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -begin - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -{$D-} -function TwbElement._AddRef: Integer; -label - Skip; -begin - Assert(not (esDestroying in eStates)); - {$IFDEF WIN64} - if LockedInc(eExternalRefs) = 1 then - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, 1 - mov ecx, [Self] - lock xadd dword ptr [ecx + eExternalRefs], eax - cmp eax, 0 - jne Skip - end; - {$ENDIF WIN32} - eContainerRef := IInterface(eContainer) as IwbContainerElementRef; -Skip: - - Result := inherited _AddRef; -end; - -function TwbElement._Release: Integer; -label - Skip; -begin - {$IFDEF WIN64} - if LockedDec(eExternalRefs) = 0 then - {$ENDIF WIN64} - {$IFDEF WIN32} - asm - mov eax, -1 - mov ecx, [Self] - lock xadd dword ptr [ecx + eExternalRefs], eax - cmp eax, 1 - jne Skip - end; - {$ENDIF WIN32} - eContainerRef := nil; -Skip: - Result := inherited _Release; -end; -{$D+} - -{ TwbSubRecordArray } - -function TwbSubRecordArray.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - i : Integer; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Assert(Assigned(aElement.Def)); - Assert(arcDef.Element.Equals(aElement.Def)); - - if arcSorted and not aAsNew then begin - Assert(not arcSortInvalid); - if FindBySortKey(aElement.SortKey[False], False,i) then begin - Result := cntElements[i]; - if aDeepCopy then - Result.Assign(Low(Integer), aElement, False); - Exit; - end; - end; - - if (csAsCreatedEmpty in cntStates) then begin - SetModified(True); - Assert(Length(cntElements)=1); - Result := cntElements[0]; - Exclude(cntStates, csAsCreatedEmpty); - end else - case arcDef.Element.DefType of - dtSubRecord: - Result := TwbSubRecord.Create(Self, arcDef.Element as IwbSubRecordDef); - dtSubRecordArray: - Result := TwbSubRecordArray.Create(Self, nil, Low(Integer), arcDef.Element as IwbSubRecordArrayDef); - dtSubRecordStruct: - Result := TwbSubRecordStruct.Create(Self, nil, Low(Integer), arcDef.Element as IwbSubRecordStructDef); - else - Assert(False); - end; - - try - Result.Assign(Low(Integer), aElement, not aDeepCopy); - except - Result.Container.RemoveElement(Result); - Result := nil; - raise; - end; -end; - -function TwbSubRecordArray.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - Element : IwbElement; - Container : IwbContainer; - i : Integer; - SelfRef : IwbContainerElementRef; - ElementDef : IwbRecordMemberDef; - DataContainer : IwbDataContainer; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if (aIndex = Low(Integer)) and arcDef.CanAssign(Self, aIndex, aElement.Def) then begin - - if aOnlySK then - Exit; - - Container := aElement as IwbContainer; - - SetModified(True); - InvalidateStorage; - ReleaseElements; - - for i := 0 to Pred(Container.ElementCount) do - Assign(i, Container.Elements[i], aOnlySK); - - end else if (aIndex >= 0) and (not Assigned(aElement) or arcDef.Element.CanAssign(Self, Low(Integer), aElement.Def)) or - ((aIndex = Low(Integer)) and arcDef.Element.CanAssign(Self, aIndex, aElement.Def)) then begin - - Element := nil; - - if (csAsCreatedEmpty in cntStates) and Assigned(aElement) then begin - SetModified(True); - Assert(Length(cntElements)=1); - Element := cntElements[0]; - Exclude(cntStates, csAsCreatedEmpty); - end else begin - - ElementDef := arcDef.Element; - if ElementDef.DefType = dtSubRecordUnion then begin - if Assigned(aElement) then begin - Supports(aElement, IwbDataContainer, DataContainer); - ElementDef := (ElementDef as IwbRecordDef).GetMemberFor((aElement as IwbHasSignature).Signature, DataContainer) - end else - ElementDef := (ElementDef as IwbRecordDef).Members[0]; - Assert(Assigned(ElementDef)); - end; - - case ElementDef.DefType of - dtSubRecord: - Element := TwbSubRecord.Create(Self, ElementDef as IwbSubRecordDef); - dtSubRecordArray: - Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordArrayDef); - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), ElementDef as IwbSubRecordStructDef); - else - Assert(False); - end; - end; - - if Assigned(Element) and Assigned(aElement) then try - Element.Assign(Low(Integer), aElement, aOnlySK); - if csAsCreatedEmpty in cntStates then - Exclude(cntStates, csAsCreatedEmpty); - except - Element.Container.RemoveElement(Element); - raise; - end; - - Result := Element; - end; - - arcSorted := False; - if wbSortSubRecords and arcDef.Sorted[IwbContainer(eContainer)] then begin - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSortKeys); - arcSorted := True; - end; -end; - -function TwbSubRecordArray.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - if aCheckDontShow and GetDontShow then - Exit; - - if not Assigned(aElement) then begin - Result := aIndex >= 0; - Exit; - end; - - Result := arcDef.CanAssign(Self, aIndex, aElement.Def); - if not Result then begin - Result := arcDef.Element.CanAssign(Self, Low(Integer), aElement.Def); - if Result then - if aCheckDontShow and arcDef.Element.DontShow[aElement] then - Result := False; - end; -end; - -function TwbSubRecordArray.CanContainFormIDs: Boolean; -begin - Result := arcDef.CanContainFormIDs; -end; - -function TwbSubRecordArray.CanMoveElement: Boolean; -begin - Result := not arcSorted; -end; - -function TwbSubRecordArray.CanElementReset: Boolean; -begin -// Result := inherited CanElementReset; - Result := cntElementRefs < 1; -end; - -constructor TwbSubRecordArray.Create(const aOwner : IwbContainer; - const aContainer : IwbContainer; - aPos : Integer; - const aDef : IwbSubRecordArrayDef); -begin - arcDef := aDef; - eContainer := Pointer(aOwner); - try - if aPos <> Low(Integer) then begin - DoProcess(aContainer, aPos) - end else begin - Assign(High(Integer), nil, False); - Include(cntStates, csAsCreatedEmpty); - end; - finally - eContainer := nil; - end; - inherited Create(aOwner); - if aPos = Low(Integer) then begin - SetModified(True); - InvalidateStorage; - end; -end; - -procedure TwbSubRecordArray.DoInit; -begin - inherited; - if arcSorted and arcSortInvalid then begin - if Length(cntElements) > 1 then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSortKeys); - arcSortInvalid := False; - end; -end; - -procedure TwbSubRecordArray.DoProcess(const aContainer : IwbContainer; - aPos : Integer); -var - SubRecord : IwbSubRecordInternal; - ElementDef : IwbRecordMemberDef; - Element : IwbElement; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self; - - while (aPos < aContainer.ElementCount) and - (aContainer[aPos].ElementType = etSubRecord) do begin - - SubRecord := aContainer[aPos] as IwbSubRecordInternal; - ElementDef := arcDef.Element; - if ElementDef.DefType = dtSubRecordUnion then begin - ElementDef := (ElementDef as IwbRecordDef).GetMemberFor(SubRecord.Signature, SubRecord); - if not Assigned(ElementDef) then - Break; - end; - - if not ElementDef.CanHandle(SubRecord.Signature, SubRecord) then - Break; - - case ElementDef.DefType of - dtSubRecord: begin - aContainer.RemoveElement(aPos); - SubRecord.SetDef(ElementDef as IwbSubRecordDef); - AddElement(SubRecord); - end; - dtSubRecordArray: begin - Element := TwbSubRecordArray.Create(Self, aContainer, aPos, ElementDef as IwbSubRecordArrayDef); - end; - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, aContainer, aPos, ElementDef as IwbSubRecordStructDef); - else - raise Exception.CreateFmt('Unexpected def type for SubRecord %s in array', [String(SubRecord.Signature)]); - end; - - end; - - arcSorted := False; - if wbSortSubRecords and arcDef.Sorted[aContainer] then begin - arcSorted := True; - arcSortInvalid := True; - end; -end; - -procedure TwbSubRecordArray.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -begin - inherited; - if arcSorted then - arcSortInvalid := True; -end; - -function TwbSubRecordArray.GetDef: IwbNamedDef; -begin - Result := arcDef; -end; - -function TwbSubRecordArray.GetElementType: TwbElementType; -begin - Result := etSubRecordArray; -end; - -function TwbSubRecordArray.GetName: string; -begin - Result := arcDef.GetName; -end; - -function TwbSubRecordArray.GetSignature: TwbSignature; -var - i : Integer; - lRecord : IwbRecord; - - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - if GetElementCount > 0 then begin - Assert(not arcSortInvalid); - Result := NONE; - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbRecord, lRecord) then begin - Result := lRecord.Signature; - Exit; - end; - end; -end; - -function TwbSubRecordArray.GetSorted: Boolean; -begin - Result := arcSorted; -end; - -function TwbSubRecordArray.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement) and (Length(cntElements) > 1); -end; - -procedure TwbSubRecordArray.SetModified(aValue: Boolean); -begin - inherited; - if aValue and arcSorted then - arcSortInvalid := True; -end; - -{ TwbSubRecordStruct } - -function TwbSubRecordStruct.Add(const aName: string; aSilent: Boolean): IwbElement; -var - Signature : TwbSignature; - Index : Integer; -begin - Result := nil; - - if not IsElementEditable(nil) then - raise Exception.Create('"' + GetName + '" is not editable'); - - Result := nil; - - if Length(aName) < 4 then - Exit; - - Signature := StrToSignature(aName); - - Result := GetElementBySignature(Signature); - if Assigned(Result) then - Exit; - - Index := srcDef.GetMemberIndexFor(Signature, nil); - if Index >= 0 then - Assign(Index, nil, False); - - Result := GetElementBySignature(Signature); - Assert(Assigned(Result)); -end; - -function TwbSubRecordStruct.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - SelfRef : IwbContainerElementRef; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - Assert(aElement.SortOrder >= 0); - Assert(aElement.SortOrder < srcDef.MemberCount); - Assert(Assigned(aElement.Def)); - Assert(aElement.Def.Equals(srcDef.Members[aElement.SortOrder])); - - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - if not Assigned(Result) then begin - Assign(aElement.SortOrder, aElement, not aDeepCopy); - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - Assert(Assigned(Result)); - - if wbSortSubRecords and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); - end else - Result.Assign(Low(Integer), aElement, not aDeepCopy); -end; - -procedure TwbSubRecordStruct.AddRequiredElements; -var - CurrentDefPos : Integer; - CurrentDef : IwbRecordMemberDef; - Element : IwbElementInternal; -begin - for CurrentDefPos := 0 to Pred(srcDef.MemberCount) do begin - CurrentDef := srcDef.Members[CurrentDefPos]; - if ((CurrentDefPos = 0) and not srcDef.AllowUnordered) or CurrentDef.Required then begin - - if CurrentDef.DefType = dtSubRecordUnion then begin - CurrentDef := (CurrentDef as IwbRecordDef).Members[0]; - Assert(Assigned(CurrentDef)); - end; - - case CurrentDef.DefType of - dtSubRecord : Element := TwbSubRecord.Create(Self, CurrentDef as IwbSubRecordDef); - dtSubRecordArray : Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), CurrentDef as IwbSubRecordArrayDef); - dtSubRecordStruct : Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), CurrentDef as IwbSubRecordStructDef); - else - Assert(False); - end; - - Element.SetSortOrder(CurrentDefPos); - Element.SetMemoryOrder(CurrentDefPos); - - end; - end; -end; - -function TwbSubRecordStruct.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - Member : IwbRecordMemberDef; - Container : IwbContainer; - Element : IwbElement; - i : Integer; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - if aIndex = Low(Integer) then begin - - Container := aElement as IwbContainer; - - SetModified(True); - InvalidateStorage; - ReleaseElements; - AddRequiredElements; - - if Assigned(Container) then - for i := 0 to Pred(Container.ElementCount) do begin - Element := Container.Elements[i]; - if not aOnlySK or GetIsInSK(Element.SortOrder) then - Assign(Element.SortOrder, Element, aOnlySK); - end; - - end else begin - - if (aIndex >= 0) and (aIndex < srcDef.MemberCount) then begin - Member := srcDef.Members[aIndex]; - if not Assigned(aElement) or Member.CanAssign(Self, Low(Integer), aElement.Def) then begin - Element := GetElementBySortOrder(aIndex + GetAdditionalElementCount); - if Assigned(Element) then begin - if Assigned(aElement) then - Element.Assign(Low(Integer), aElement, aOnlySK) - end else begin - - case Member.DefType of - dtSubRecord: - Element := TwbSubRecord.Create(Self, Member as IwbSubRecordDef); - dtSubRecordArray: - Element := TwbSubRecordArray.Create(Self, nil, Low(Integer), Member as IwbSubRecordArrayDef); - dtSubRecordStruct: - Element := TwbSubRecordStruct.Create(Self, nil, Low(Integer), Member as IwbSubRecordStructDef); - else - Assert(False); - end; - - if Assigned(Element) then try - Element.SortOrder := aIndex; - if Assigned(aElement) then - Element.Assign(Low(Integer), aElement, aOnlySK); - except - Element.Container.RemoveElement(Element); - raise; - end; - - end; - Result := Element; - end; - end; - end; - - if wbSortSubRecords and (Length(cntElements) > 1) then - wbMergeSort(@cntElements[0], Length(cntElements), CompareSubRecords); -end; - -function TwbSubRecordStruct.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - if aCheckDontShow and GetDontShow then - Exit; - - if not Assigned(aElement) then begin - Result := (aIndex >= 0) and (aIndex < srcDef.MemberCount) and (GetElementBySortOrder(aIndex + GetAdditionalElementCount) = nil); - if Result and aCheckDontShow then - if srcDef.Members[aIndex].DontShow[Self] then - Result := False; - Exit; - end; - - if Assigned(srcDef) then begin - if aIndex = Low(Integer) then - Result := srcDef.Equals(aElement.Def) - else begin - Result := (aIndex >= 0) and (aIndex < srcDef.MemberCount) and - srcDef.Members[aIndex].CanAssign(Self, Low(Integer), aElement.Def); - if Result and aCheckDontShow then - if srcDef.Members[aIndex].DontShow[Self] then - Result := False; - end; - end else - Result := False; -end; - -function TwbSubRecordStruct.CanContainFormIDs: Boolean; -begin - Result := srcDef.CanContainFormIDs; -end; - -function TwbSubRecordStruct.CanElementReset: Boolean; -begin -// Result := inherited CanElementReset; - Result := cntElementRefs < 1; -end; - -constructor TwbSubRecordStruct.Create(const aOwner : IwbContainer; - const aContainer : IwbContainer; - aPos : Integer; - const aDef : IwbSubRecordStructDef); -var - CurrentDefPos : Integer; - CurrentRec : IwbSubRecordInternal; - CurrentDef : IwbRecordMemberDef; - Element : IwbElementInternal; -begin - srcDef := aDef as IwbRecordDef; - - if aPos = Low(Integer) then begin - AddRequiredElements; - end else begin - CurrentDefPos := 0; - while (aPos < aContainer.ElementCount) and (CurrentDefPos < srcDef.MemberCount) do begin - - if aContainer[aPos].ElementType <> etSubRecord then - Break; - - CurrentRec := aContainer[aPos] as IwbSubRecordInternal; - - if not srcDef.ContainsMemberFor(CurrentRec.Signature, CurrentRec) then begin - if srcDef.SkipSignature[CurrentRec.Signature] then begin - Inc(aPos); - Continue; - end; - Break; - end; - - if srcDef.AllowUnordered then begin - - CurrentDefPos := srcDef.GetMemberIndexFor(CurrentRec.Signature, CurrentRec); - if CurrentDefPos < 0 then begin - if Assigned(wbProgressCallback) then - wbProgressCallback('Error: record '+ String(GetSignature) + ' contains unexpected (or out of order) subrecord ' + String(CurrentRec.Signature) + ' ' + IntToHex(Int64(Cardinal(CurrentRec.Signature)), 8) ); - //FoundError := True; - Inc(aPos); - Continue; - end; - CurrentDef := srcDef.Members[CurrentDefPos]; - - end; - - CurrentDef := srcDef.Members[CurrentDefPos]; - if not CurrentDef.CanHandle(CurrentRec.Signature, CurrentRec) then begin - Inc(CurrentDefPos); - Continue; - end; - - if CurrentDef.DefType = dtSubRecordUnion then begin - CurrentDef := (CurrentDef as IwbRecordDef).GetMemberFor(CurrentRec.Signature, CurrentRec); - Assert(Assigned(CurrentDef)); - end; - - case CurrentDef.DefType of - dtSubRecord : begin - aContainer.RemoveElement(aPos); - CurrentRec.SetDef(CurrentDef as IwbSubRecordDef); - AddElement(CurrentRec); - Element := CurrentRec as IwbElementInternal; - end; - dtSubRecordArray : Element := TwbSubRecordArray.Create(Self, aContainer, aPos, CurrentDef as IwbSubRecordArrayDef); - dtSubRecordStruct : Element := TwbSubRecordStruct.Create(Self, aContainer, aPos, CurrentDef as IwbSubRecordStructDef); - else - raise Exception.CreateFmt('Unexpected def type for SubRecord %s', [String(CurrentRec.Signature)]); - end; - - Element.SetSortOrder(CurrentDefPos); - Element.SetMemoryOrder(CurrentDefPos); - - Inc(CurrentDefPos); - end; - end; - - srcDef.AfterLoad(Self); - - inherited Create(aOwner); - if aPos = Low(Integer) then begin - SetModified(True); - InvalidateStorage; - end; -end; - -function TwbSubRecordStruct.GetDef: IwbNamedDef; -begin - Result := srcDef; -end; - -function TwbSubRecordStruct.GetElementType: TwbElementType; -begin - Result := etSubRecordStruct; -end; - -function TwbSubRecordStruct.GetIsInSK(aIndex: Integer): Boolean; -var - SelfRef : IwbContainerElementRef; - HasSortKey : IwbHasSortKeyDef; -begin - Result := False; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if not Supports(srcDef, IwbHasSortKeyDef, HasSortKey) then - Exit; - - Result := HasSortKey.IsInSK(aIndex); -end; - -function TwbSubRecordStruct.GetName: string; -begin - Result := srcDef.GetName; -end; - -function TwbSubRecordStruct.GetSignature: TwbSignature; -var - i : Integer; - lRecord : IwbRecord; - - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - - Result := NONE; - for i := 0 to Pred(GetElementCount) do - if Supports(GetElement(i), IwbRecord, lRecord) then begin - Result := lRecord.Signature; - Exit; - end; -end; - -function TwbSubRecordStruct.GetSortKeyInternal(aExtended: Boolean): string; -var - HasSortKey : IwbHasSortKeyDef; - SortMember : Integer; - Element : IwbElement; - i : Integer; - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - Result := ''; - if Supports(srcDef, IwbHasSortKeyDef, HasSortKey) then begin - DoInit; - if HasSortKey.SortKeyCount[False] > 0 then - for i := 0 to Pred(HasSortKey.SortKeyCount[aExtended]) do begin - SortMember := HasSortKey.SortKeys[i, aExtended]; - Element := GetElementBySortOrder(SortMember + GetAdditionalElementCount); - if Assigned(Element) then - Result := Result + Element.SortKey[aExtended]; - - if i < Pred(HasSortKey.SortKeyCount[aExtended]) then - Result := Result + '|'; - end; - end; -end; - -function TwbSubRecordStruct.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement) and (Length(cntElements) > 1) and (srcDef.AllowUnordered or not cntElements[0].Equals(aElement)); - if Result and Assigned(aElement.Def) then - Result := not aElement.Def.Required; -end; - -function TwbSubRecordStruct.RemoveInjected(aCanRemove: Boolean): Boolean; -var - Element : IwbElement; - Container : IwbContainerElementRef; - SelfRef : IwbContainerElementRef; - i : Integer; -begin - if SameText(GetName, 'Result Script') then begin - Result := False; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if Supports(GetElementByName('References'), IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do begin - Result := Container.Elements[i].ReferencesInjected; - if Result then - Break; - end; - - if Result then begin - Result := False; - Container.Remove; - Element := GetRecordBySignature('SCHD'); - if Assigned(Element) then - Element.Remove; - Element := GetRecordBySignature('SCDA'); - if Assigned(Element) then - Element.Remove; - Element := GetRecordBySignature('SCTX'); - if Assigned(Element) then - Element.Remove; - if Supports(GetRecordBySignature('SCHR'), IwbContainerElementRef, Container) then begin - Container.ElementByName['RefCount'].EditValue := '0'; - Container.ElementByName['CompiledSize'].EditValue := '0'; - Container.ElementByName['VariableCount'].EditValue := '0'; - end; - end; - end else - Result := inherited RemoveInjected(aCanRemove); -end; - -function ArrayDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; out SizePrefix: Integer): Boolean; -var - Element : IwbElement; - ArrayDef : IwbArrayDef; - ValueDef : IwbValueDef; - i : Integer; - t : string; - VarSize : Boolean; - ArrSize : Integer; -begin - ArrayDef := aValueDef as IwbArrayDef; - Result := wbSortSubRecords and ArrayDef.Sorted; - if not ArrayDef.CanAddTo then - aContainer.SetElementState(esNotSuitableToAddTo); - - SizePrefix := ArrayDef.PrefixSize[aBasePtr]; - - i := 0; - - ValueDef := ArrayDef.Element; - VarSize := ArrayDef.IsVariableSize; - ArrSize := ArrayDef.ElementCount; - if ArrSize < 0 then begin - ArrSize := ArrayDef.PrefixCount[aBasePtr]; - end else - if (ArrSize < 1) and Assigned(ArrayDef.CountCallback) then - ArrSize := ArrayDef.CountCallback(aBasePtr, aEndPtr, aContainer) - else if VarSize then - ArrSize := High(Integer); - - if Assigned(aBasePtr) then - Inc(PByte(aBasePtr), SizePrefix); - - if ArrSize > 0 then - while not VarSize or ((Cardinal(aBasePtr) < Cardinal(aEndPtr)) or (not Assigned(aBasePtr))) do begin - if Result then - t := '' - else begin - t := ArrayDef.ElementLabel[i]; - if t <> '' then - t := ' (' + t + ')'; - t := '#' + IntToStr(i) + t; - end; - - case ValueDef.DefType of - dtArray: Element := TwbArray.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - dtStruct: Element := TwbStruct.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - dtStructChapter: Element := TwbChapter.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - dtUnion: Element := TwbUnion.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - dtString: begin - if Assigned(aBasePtr) and (PAnsiChar(aBasePtr)^ = #0) and (ValueDef.IsVariableSize) then begin - Inc(PByte(aBasePtr)); - Break; - end; - Element := TwbValue.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - end; - else - Element := TwbValue.Create(aContainer, aBasePtr, aEndPtr, ValueDef, t); - end; - - Inc(i); - if VarSize and not Assigned(aBasePtr) then begin - (aContainer as IwbContainerInternal).CreatedEmpty; - Break; - end; - - Dec(ArrSize); - if ArrSize = 0 then - Break - { else if not (not VarSize or ((Cardinal(aBasePtr) < Cardinal(aEndPtr)) or (not Assigned(aBasePtr)))) then - wbProgressCallback('Error: not enough data for array. Elements remaining are '+IntToStr(ArrSize)) Silently fails = called at an invalid time }; - end; - - if (ValueDef.DefType = dtString) and (ValueDef.IsVariableSize) then - Element := TwbStringListTerminator.Create(aContainer); - - ArrayDef.AfterLoad(aContainer); -end; - -{ TwbArray } - -procedure TwbArray.Init; -var - BasePtr: Pointer; -begin - inherited; - - if GetSkipped then - Exit; - - BasePtr := GetDataBasePtr; - arrSorted := ArrayDoInit(vbValueDef, Self, BasePtr, dcDataEndPtr, arrSizePrefix); - - arrSortInvalid := arrSorted; -end; - -function TwbArray.AddIfMissingInternal(const aElement: IwbElement; aAsNew, aDeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; -var - SelfRef : IwbContainerElementRef; - i : Integer; - s : string; - ArrayDef : IwbArrayDef; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be modified.'); - - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - ArrayDef := vbValueDef as IwbArrayDef; - - if arrSorted then begin - Assert(not arrSortInvalid); - if FindBySortKey(aElement.SortKey[False], False, i) then begin - Result := cntElements[i]; - if aDeepCopy then - Result.Assign(Low(Integer), aElement, False); - Exit; - end; - end; - - if arrSorted then - s := '' - else - s := '#' + IntToStr(Length(cntElements)); - - if not Supports(aElement, IwbStringListTerminator) then - case ArrayDef.Element.DefType of - dtArray: Result := TwbArray.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtStruct: Result := TwbStruct.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtStructChapter: Result := TwbChapter.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - dtUnion: Result := TwbUnion.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - else - Result := TwbValue.Create(Self, ArrayDef.Element, aElement, not aDeepCopy, s); - end; - - CheckCount; - CheckTerminator; -end; - -function TwbArray.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -var - Element : IwbElement; - sElement : IwbElement; - dElement : IwbElement; - ArrayDef : IwbArrayDef; - Container : IwbContainer; - DataContainer : IwbDataContainer; - s : string; - i : Integer; - SelfRef : IwbContainerElementRef; - p, q : Pointer; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - ArrayDef := vbValueDef as IwbArrayDef; - - if (aIndex = Low(Integer)) and ArrayDef.CanAssign(Self, aIndex, aElement.ValueDef) then begin - - if aOnlySK then - Exit; - - Container := aElement as IwbContainer; - - if ArrayDef.IsVariableSize then begin - Assert(ArrayDef.ElementCount <= 0); - SetModified(True); - InvalidateStorage; - ReleaseElements; - dcDataStorage := nil; - dcDataBasePtr := @EmptyPtr; - dcDataEndPtr := @EmptyPtr; - Exclude(dcFlags, dcfStorageInvalid); - if ArrayDef.ElementCount < 0 then - if aElement.DataSize > 0 then begin - RequestStorageChange(p, q, aElement.DataSize); - if Supports(aElement, IwbDataContainer, DataContainer) then begin - q := DataContainer.DataBasePtr; - Move(q^, p^, aElement.DataSize); - end; - end else - RequestStorageChange(p, q, ArrayDef.PrefixSize[nil]); - NotifyChanged(eContainer); - - for i := 0 to Pred(Container.ElementCount) do - Assign(i, Container.Elements[i], aOnlySK); - end else begin - Assert(Container.ElementCount = ArrayDef.ElementCount); - Assert(GetElementCount = ArrayDef.ElementCount); - - for i := 0 to Pred(Container.ElementCount) do begin - sElement := Container.Elements[i]; - dElement := GetElementByMemoryOrder(i); - dElement.Assign(Low(Integer), sElement, aOnlySK); - end; - end; - - end else begin - if (aIndex >= 0) and (ArrayDef.ElementCount <= 0) and ((aIndex = High(Integer)) or ArrayDef.Element.CanAssign(Self, Low(Integer), aElement.ValueDef)) then begin - {add one entry} - - if arrSorted then - s := '' - else - s := '#' + IntToStr(Length(cntElements)); - - Element := nil; - - if not Supports(aElement, IwbStringListTerminator) then - case ArrayDef.Element.DefType of - dtArray: Element := TwbArray.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtStruct: Element := TwbStruct.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtStructChapter: Element := TwbChapter.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - dtUnion: Element := TwbUnion.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - else - Element := TwbValue.Create(Self, ArrayDef.Element, aElement, aOnlySK, s); - end; - - Result := Element; - - end; - end; - - CheckCount; - CheckTerminator; -end; - -function TwbArray.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -var - ArrayDef: IwbArrayDef; -begin - Result := False; - if not wbEditAllowed then - Exit; - - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - if aCheckDontShow and GetDontShow then - Exit; - - ArrayDef := vbValueDef as IwbArrayDef; - if not Assigned(aElement) then begin - if aIndex = High(Integer) then - Result := ArrayDef.ElementCount <= 0; - Exit; - end; - Result := - ArrayDef.CanAssign(Self, aIndex, aElement.ValueDef) or - ( (ArrayDef.ElementCount <= 0) and ArrayDef.Element.CanAssign(Self, Low(Integer), aElement.ValueDef) ); -end; - -function TwbArray.CanMoveElement: Boolean; -begin - Result := not arrSorted; -end; - -procedure TwbArray.CheckCount; -var - Count : Cardinal; - i : Integer; - UpdateCount : Integer; - ArrayDef : IwbArrayDef; -begin - if arrSizePrefix = 0 then - Exit; - - ArrayDef := vbValueDef as IwbArrayDef; - Count := arrayDef.PrefixCount[dcDataBasePtr]; - - DoInit; - - if Count <> Length(cntElements) then begin - UpdateCount := eUpdateCount; - for i := 1 to UpdateCount do EndUpdate; // Stops optimisation - ArrayDef.SetPrefixCount(dcDataBasePtr, Length(cntElements)); - for i := 1 to UpdateCount do BeginUpdate; // Restore optimisation - end; -end; - -procedure TwbArray.CheckTerminator; -var - i : Integer; - ArrayDef : IwbArrayDef; -begin - ArrayDef := vbValueDef as IwbArrayDef; - if not ArrayDef.IsVariableSize then - Exit; - if ArrayDef.Element.DefType <> dtString then - Exit; - - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbStringListTerminator) then - Exit; - - SetModified(True); - InvalidateStorage; - TwbStringListTerminator.Create(Self); - if arrSorted then - arrSortInvalid := True; -end; - -procedure TwbArray.DoInit; -var - i : Integer; - Sorting : Boolean; -begin - inherited; - if arrSorted and arrSortInvalid then - if (Length(cntElements) > 1) then begin - Sorting := False; - for i := 0 to Length(cntElements)-1 do - if (esSorting in (cntElements[i] as IwbElementInternal).ElementStates) then begin - Sorting := TRue; - Break; - end; - if not Sorting then begin - wbMergeSort(@cntElements[0], Length(cntElements), CompareSortKeys); - arrSortInvalid := False; - end; - end; -end; - -procedure TwbArray.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -begin - inherited; - if arrSorted then - arrSortInvalid := True; -end; - -function TwbArray.GetDataPrefixSize: Integer; -begin - Result := arrSizePrefix; -end; - -function TwbArray.GetElementType: TwbElementType; -begin - Result := etArray; -end; - -function TwbArray.GetSorted: Boolean; -begin - Result := arrSorted; -end; - -function TwbArray.IsElementRemoveable(const aElement: IwbElement): Boolean; -begin - Result := IsElementEditable(aElement) and ((vbValueDef as IwbArrayDef).ElementCount <= 0) { and (Length(cntElements)>1)}; -end; - -procedure TwbArray.PrepareSave; -begin - CheckCount; - CheckTerminator; - inherited; -end; - -procedure TwbArray.Reset; -begin - ReleaseElements; - arrSorted := False; - arrSortInvalid := False; - inherited; -end; - -procedure TwbArray.SetModified(aValue: Boolean); -begin - inherited; - if aValue and arrSorted then - arrSortInvalid := True; -end; - -{ TwbStruct } - -procedure StructDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer); -var - StructDef : IwbStructDef; - i : Integer; - ValueDef : IwbValueDef; - Element : IwbElementInternal; - IntegerDef : IwbIntegerDef; - OptionalFromElement : Integer; - Size : Integer; - over : Boolean; -begin - StructDef := aValueDef as IwbStructDef; - - OptionalFromElement := StructDef.OptionalFromElement; - if OptionalFromElement < 0 then - OptionalFromElement := High(Integer); - - for i := 0 to Pred(StructDef.MemberCount) do begin - ValueDef := StructDef.Members[i]; - if Assigned(aBasePtr) and (i >= OptionalFromElement) then begin - over := (Cardinal(aBasePtr) >= Cardinal(aEndPtr)); - if not over then begin - Size := ValueDef.Size[aBasePtr, aEndPtr, aContainer]; - over := (Size Cardinal(aEndPtr)); - end; - if over then begin - aEndPtr := aBasePtr; - ValueDef := Resolve(ValueDef, aBasePtr, aEndPtr, aContainer); - if Supports(ValueDef, IwbIntegerDef, IntegerDef) and Supports(IntegerDef.Formater[aContainer], IwbFlagsDef) then - ValueDef := wbEmpty(ValueDef.Name, cpIgnore, False, nil, True) - else - ValueDef := wbEmpty(ValueDef.Name, cpIgnore); - end; - end; - - case ValueDef.DefType of - dtArray: Element := TwbArray.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - dtStruct: Element := TwbStruct.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - dtStructChapter: Element := TwbChapter.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - dtUnion: Element := TwbUnion.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - else - Element := TwbValue.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - end; - - {if wbHideUnused and not wbEditAllowed and (Element.GetName = 'Unused') then begin - with aContainer do begin - Assert((LastElement as IwbElementInternal) = Element); - RemoveElement(Pred(ElementCount)); - end; - end else} begin - Element.SetSortOrder(i); - Element.SetMemoryOrder(i); - end; - end; - - StructDef.AfterLoad(aContainer); -end; - -procedure TwbStruct.Init; -var - BasePtr: Pointer; -begin - inherited; - - if GetSkipped then - Exit; - - DecompressIfNeeded; - - BasePtr := GetDataBasePtr; - StructDoInit(vbValueDef, Self, BasePtr, dcDataEndPtr); -end; - -function TwbStruct.GetElementType: TwbElementType; -begin - Result := etStruct; -end; - -procedure TwbStruct.Reset; -begin - ReleaseElements; - inherited; -end; - -procedure TwbStruct.DecompressIfNeeded; -var - sc : TwbStructCompression; -begin - sc := IsCompressed; - if sc <> scNone then try - InitDataPtr; // reset... - - SetLength(dcDataStorage, szUncompressedSize ); - - case sc of - scNone: Assert(False); // Getting there would be very funny :) - scZComp: - DecompressToUserBuf( - Pointer(Cardinal(dcDataBasePtr)), - GetDataSize, - @dcDataStorage[0], - PCardinal(dcDataBasePtr)^ - ); - scLZComp: - LZ4_decompress_safe(Pointer(Cardinal(dcDataBasePtr)), @dcDataStorage[0], GetDataSize, szUncompressedSize); - else - Assert(False); // Something hasn't been updated yet. - end; - - dcDataEndPtr := Pointer( Cardinal(@dcDataStorage[0]) + szUncompressedSize ); - dcDataBasePtr := @dcDataStorage[0]; - except - dcDataBasePtr := nil; - dcDataEndPtr := nil; - end; -end; - -function TwbStruct.GetIsCompressed: TwbStructCompression; -var - szDef : IwbStructZDef; - lzDef : IwbStructLZDef; -begin - if (szCompressedSize = 0) then - if Supports(vbValueDef, IwbStructZDef, szDef) then begin - szUncompressedSize := szDef.GetSizing(GetDataBasePtr, GetDataEndPtr, Self, szCompressedSize); - if szUncompressedSize <> 0 then szCompressedType := scZComp; - end else if Supports(vbValueDef, IwbStructLZDef, lzDef) then begin - szUncompressedSize := lzDef.GetSizing(GetDataBasePtr, GetDataEndPtr, Self, szCompressedSize); - if szUncompressedSize <> 0 then szCompressedType := scLZComp; - end else - szCompressedSize := -1; - Result := szCompressedType; -end; - -{ TwbUnion } - -function UnionDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer): TwbUnionFlags; -var - UnionDef : IwbUnionDef; - ValueDef : IwbValueDef; - ArrayDef : IwbArrayDef; - Element : IwbElementInternal; - -begin - Result := ufNone; - UnionDef := aValueDef as IwbUnionDef; - - ValueDef := UnionDef.Decide(aBasePtr, aEndPtr, aContainer); - - if Assigned(ValueDef) then // I had one case. Most likely due to an error in wbXXXXDefinitions - case ValueDef.DefType of - dtArray: begin - if wbSortSubRecords and Supports(ValueDef, IwbArrayDef, ArrayDef) and ArrayDef.Sorted then - Result := ufSortedArray - else - Result := ufArray; - Element := TwbArray.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - end; - dtStruct: Element := TwbStruct.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - dtStructChapter: Element := TwbChapter.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - dtUnion: Element := TwbUnion.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - else - Element := nil; // >>> so that simple union behave as they did <<< TwbValue.Create(aContainer, aBasePtr, aEndPtr, ValueDef, ''); - if ValueDoInit(aValueDef, aContainer, aBasePtr, aEndPtr, aContainer) then Result := ufFlags; - end; - - if Assigned(Element) then begin - Element.SetSortOrder(0); - Element.SetMemoryOrder(0); - end; - - UnionDef.AfterLoad(aContainer); -end; - -function TwbUnion.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - Result := inherited CompareExchangeFormID(aOldFormID, aNewFormID); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - Result := ResolvedDef.CompareExchangeFormID(GetDataBasePtr, dcDataEndPtr, Self, aOldFormID, aNewFormID) or Result; -end; - -function TwbUnion.GetElementType: TwbElementType; -begin - Result := etUnion; -end; - -procedure TwbUnion.Init; -var - BasePtr: Pointer; -begin - inherited; - - if GetSkipped then - Exit; - - BasePtr := GetDataBasePtr; - UnionDoInit(vbValueDef, Self, BasePtr, dcDataEndPtr); -end; - -procedure TwbUnion.MasterCountUpdated(aOld, aNew: Byte); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited MasterCountUpdated(aOld, aNew); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterCountUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbUnion.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited MasterIndicesUpdated(aOld, aNew); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterIndicesUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbUnion.FindUsedMasters(aMasters: PwbUsedMasters); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited FindUsedMasters(aMasters); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.FindUsedMasters(GetDataBasePtr, dcDataEndPtr, Self, aMasters); -end; - -procedure TwbUnion.Reset; -begin - ReleaseElements; - inherited; -end; - -{ TwbValue } - -function TwbValue.AddIfMissingInternal(const aElement : IwbElement; - aAsNew : Boolean; - aDeepCopy : Boolean; - const aPrefixRemove : string; - const aPrefix : string; - const aSuffix : string) - : IwbElement; -var - Flag : IwbFlag; - IntegerDef : IwbIntegerDef; - FlagsDef : IwbFlagsDef; - s : string; -begin - if vIsFlags and Supports(aElement, IwbFlag, Flag) then - if Supports(vbValueDef, IwbIntegerDef, IntegerDef) then - if Supports(IntegerDef.Formater[Self], IwbFlagsDef, FlagsDef) then - if FlagsDef.CanAssign(Self, Low(Integer), Flag.FlagsDef) then begin - s := GetEditValue; - s := s + StringOfChar('0', 64 - Length(s)); - if (Flag.FlagIndex >= 0) and (Flag.FlagIndex < Length(s)) then begin - s[Succ(Flag.FlagIndex)] := '1'; - SetEditValue(s); - Exit(GetElementBySortOrder(Flag.FlagIndex)); - end; - end; - - Result := inherited AddIfMissingInternal(aElement, aAsNew, aDeepCopy, aPrefixRemove, aPrefix, aSuffix) -end; - -function TwbValue.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - Result := inherited CompareExchangeFormID(aOldFormID, aNewFormID); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - Result := ResolvedDef.CompareExchangeFormID(GetDataBasePtr, dcDataEndPtr, Self, aOldFormID, aNewFormID) or Result; -end; - -function ValueDoInit(const aValueDef: IwbValueDef; const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Boolean; -var - IntegerDef : IwbIntegerDef; - FlagsDef : IwbFlagsDef; - i : Cardinal; - j : Cardinal; - t : string; - BasePtr : Pointer; - Element : IwbElement; - ValueDef : IwbValueDef; -begin - Result := False; - - ValueDef := Resolve(aValueDef, aBasePtr, aEndPtr, aElement); - - if Assigned(ValueDef) then - begin - if wbFlagsAsArray then - if Supports(ValueDef, IwbIntegerDef, IntegerDef) then - if Supports(IntegerDef.Formater[aElement], IwbFlagsDef, FlagsDef) then begin - if Assigned(aBasePtr) and (FlagsDef.FlagCount > 0) then begin - j := IntegerDef.ToInt(aBasePtr, aEndPtr, aContainer); - if j <> 0 then - for i := 0 to Pred(FlagsDef.FlagCount) do - if (j and (Cardinal(1) shl i)) <> 0 then begin - t := FlagsDef.Flags[i]; - if (t <> '') and (not wbHideUnused or not SameText(t,'Unused')) then - Element := TwbFlag.Create(aContainer, aBasePtr, aEndPtr, IntegerDef, FlagsDef, i); - j := j and not (Cardinal(1) shl i); - if j = 0 then - Break; - end; - end; - - Result := True; - - end; - - ValueDef.AfterLoad(aContainer); - end; - - if wbMoreInfoForUnknown then begin - if Assigned(ValueDef) then - t := ValueDef.Name - else - t := ''; - if t = '' then - t := aContainer.Def.Name; - if SameText(t, 'Unknown') and (not Assigned(aBasePtr) or (aBasePtr <> aEndPtr)) then - for i := 0 to 3 do begin - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsU8', wbInteger('AsU8', itU8)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsS8', wbInteger('AsS8', itS8)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsU16', wbInteger('AsU16', itU16)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsS16', wbInteger('AsS16', itS16)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsU32', wbInteger('AsU32', itU32)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsS32', wbInteger('AsS32', itS32)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsS64', wbInteger('AsS64', itS64)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsFormID', wbInteger('AsFormID', itU32, wbFormID)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsChar4', wbInteger('AsChar4', itU32, wbChar4)), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsFloat', wbFloat('AsFloat')), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsString', wbString('AsString')), '', True); - if wbToolSource in [tsSaves] then begin - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsRefID', wbRefID('RefID')), '', True); - BasePtr := Pointer( Cardinal(aBasePtr) + i ); - Element := TwbArray.Create(aContainer, BasePtr, aEndPtr, wbArray('Offset '+IntToStr(i)+' AsU6to30', wbInteger('AsU6to30', itU6to30)), '', True); - end; - end; - end; - - if assigned(ValueDef) then - i := ValueDef.Size[aBasePtr, aEndPtr, aContainer] - else - i := High(Integer); - if i = Cardinal(High(Integer)) then - aBasePtr := aEndPtr - else if Assigned(aBasePtr) then - Inc(PByte(aBasePtr), i); -end; - - -procedure TwbValue.Init; -var - BasePtr: Pointer; -begin - inherited; - BasePtr := GetDataBasePtr; - vIsFlags := ValueDoInit(vbValueDef, Self, BasePtr, dcDataEndPtr, Self); -// flags should already have been created in the right order, no need to sort them -// if vIsFlags then -// if Length(cntElements) > 1 then -// wbMergeSort(@cntElements[0], Length(cntElements), CompareSortKeys); -end; - -function TwbValue.IsFlags: Boolean; -begin - Result := vIsFlags; -end; - -procedure TwbValue.MasterCountUpdated(aOld, aNew: Byte); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited MasterCountUpdated(aOld, aNew); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterCountUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbValue.MasterIndicesUpdated(const aOld, aNew: TBytes); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited MasterIndicesUpdated(aOld, aNew); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.MasterIndicesUpdated(GetDataBasePtr, dcDataEndPtr, Self, aOld, aNew); -end; - -procedure TwbValue.FindUsedMasters(aMasters: PwbUsedMasters); -var - SelfRef : IwbContainerElementRef; - ResolvedDef : IwbValueDef; -begin - SelfRef := Self as IwbContainerElementRef; - - DoInit; - - inherited FindUsedMasters(aMasters); - - ResolvedDef := Resolve(vbValueDef, GetDataBasePtr, dcDataEndPtr, Self); - if Assigned(ResolvedDef) then - ResolvedDef.FindUsedMasters(GetDataBasePtr, dcDataEndPtr, Self, aMasters); -end; - -function TwbValue.GetElementType: TwbElementType; -begin - Result := etValue; -end; - -function TwbValue.GetSorted: Boolean; -var - EmptyDef: IwbEmptyDef; -begin - Result := vIsFlags or (Supports(Resolve(vbValueDef, GetDataBasePtr, GetDataEndPtr, Self), IwbEmptyDef, EmptyDef) and EmptyDef.Sorted); -end; - -function TwbValue.GetValue: string; -//var -// i : Integer; -// j : Int64; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - { - if vIsFlags then begin - Result := ''; - with (vbValueDef as IwbIntegerDef), (Formater as IwbFlagsDef) do begin - j := ToInt(GetDataBasePtr, dcDataEndPtr, Self); - for i := 0 to 63 do - if (j and (Int64(1) shl i)) <> 0 then - if (i >= FlagCount) or (Flags[i] = '') then - Result := Result + ', '; - end; - SetLength(Result, Length(Result) - 2); - end else} - Result := inherited GetValue; -end; - -procedure TwbValue.Reset; -begin - vIsFlags := False; - ReleaseElements; - inherited; -end; - -procedure TwbValue.SetEditValue(const aValue: string); -var - OldValue, NewValue: Variant; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if (not Assigned(dcDataBasePtr) or not Assigned(dcDataEndPtr)) or (aValue <> GetEditValue) then begin - OldValue := GetNativeValue; - vbValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - if vIsFlags and (csInit in cntStates) then begin - Reset; - Init; - end; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - NotifyChanged(eContainer); - if vIsFlags and (csInit in cntStates) then begin - if vbValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] <> aValue then begin - Reset; - Init; - end; - end; - end; -end; - -procedure TwbValue.SetNativeValue(const aValue: Variant); -var - OldValue, NewValue: Variant; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - OldValue := GetNativeValue; - vbValueDef.NativeValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - if vIsFlags and (csInit in cntStates) then begin - Reset; - Init; - end; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - NotifyChanged(eContainer); - if vIsFlags and (csInit in cntStates) then begin - Reset; - Init; - end; -end; - -var - Files : array of IwbFile; - FilesMap: TStringList; - -procedure wbFileForceClosed; -var - i: Integer; -begin - for i := Low(Files) to High(Files) do - (Files[i] as IwbFileInternal).ForceClosed; - Files := nil; - FilesMap.Clear; -end; - -function wbExpandFileName(const aFileName: string): string; -begin - if ExtractFilePath(aFileName) = '' then - Result := wbDataPath + ExtractFileName(aFileName) - else - Result := aFileName; -end; - -function wbFile(const aFileName: string; aLoadOrder: Integer = -1; aCompareTo: string = ''; - IsTemporary: Boolean = False; aOnlyHeader: Boolean = False): IwbFile; -var - FileName: string; - i: Integer; -begin - FileName := wbExpandFileName(aFileName); - {if ExtractFilePath(aFileName) = '' then - FileName := ExpandFileName('.\'+aFileName) - else - FileName := ExpandFileName(aFileName);} - - if FilesMap.Find(FileName, i) then - Result := IwbFile(Pointer(FilesMap.Objects[i])) - else begin - if not wbIsPlugin(FileName) then - Result := TwbFileSource.Create(FileName, aLoadOrder, aCompareTo, aOnlyHeader, IsTemporary) - else - Result := TwbFile.Create(FileName, aLoadOrder, aCompareTo, aOnlyHeader, IsTemporary); - SetLength(Files, Succ(Length(Files))); - Files[High(Files)] := Result; - FilesMap.AddObject(FileName, Pointer(Result)); - end; -end; - -procedure wbMastersForFile(const aFileName: string; aMasters: TStrings); -var - FileName : string; - i : Integer; - _File : IwbFileInternal; -begin - FileName := wbExpandFileName(aFileName); - {if ExtractFilePath(aFileName) = '' then - FileName := ExpandFileName('.\'+aFileName) - else - FileName := ExpandFileName(aFileName);} - - try - if FilesMap.Find(FileName, i) then - _File := IwbFile(Pointer(FilesMap.Objects[i])) as IwbFileInternal - else if not wbIsPlugin(FileName) then - _File := TwbFileSource.Create(FileName, -1, '', True) - else - _File := TwbFile.Create(FileName, -1, '', True); - - _File.GetMasters(aMasters); - except - // File neither found nor replaced, ignore if in xDump - if not (wbToolMode in [tmDump, tmExport]) then Raise; - end; -end; - -function wbNewFile(const aFileName: string; aLoadOrder: Integer): IwbFile; -var - FileName: string; - i: Integer; -begin - FileName := wbExpandFileName(aFileName); - {if ExtractFilePath(aFileName) = '' then - FileName := ExpandFileName('.\'+aFileName) - else - FileName := ExpandFileName(aFileName);} - - if FilesMap.Find(FileName, i) then - raise Exception.Create(FileName + ' exists already') - else begin - Result := TwbFile.CreateNew(FileName, aLoadOrder); - SetLength(Files, Succ(Length(Files))); - Files[High(Files)] := Result; - FilesMap.AddObject(FileName, Pointer(Result)); - end; -end; - -function wbFindWinningMainRecordByEditorID(const aSignature: TwbSignature; const aEditorID: string): IwbMainRecord; -var - i : Integer; - Group : IwbGroupRecord; -begin - Result := nil; - for i := High(Files) downto Low(Files) do - if Supports(Files[i].GroupBySignature[aSignature], IwbGroupRecord, Group) then begin - Result := Group.MainRecordByEditorID[aEditorID]; - if Assigned(Result) then begin - Result := Result.WinningOverride; - Exit; - end; - end; -end; - -function wbFormListToArray(const aFormList: IwbMainRecord; const aSignatures: string): TDynMainRecords; -var - Container : IwbContainerElementRef; - Signatures : TStringList; - i, j : Integer; - MainRecord : IwbMainRecord; -begin - Result := nil; - if not Assigned(aFormList) or (aFormList.Signature <> 'FLST') then - Exit; - if not Supports(aFormList.ElementByName['wbFormListToArray FormIDs'], IwbContainerElementRef, Container) then - Exit; - if Container.ElementCount < 1 then - Exit; - Signatures := TStringList.Create; - try - Signatures.CommaText := aSignatures; - Signatures.Sorted := True; - for i := 0 to Pred(Container.ElementCount) do begin - if Supports(Container.Elements[i].LinksTo, IwbMainRecord, MainRecord) then - if Signatures.Find(MainRecord.Signature, j) then begin - SetLength(Result, Succ(Length(Result))); - Result[High(Result)] := MainRecord; - end; - end; - finally - Signatures.Free; - end; -end; - -{ TwbFlag } - -constructor TwbFlag.Create(const aContainer : IwbContainer; - aBasePtr : Pointer; - aEndPtr : Pointer; - const aIntegerDef : IwbIntegerDef; - const aFlagsDef : IwbFlagsDef; - aIndex : Integer); -begin - fBasePtr := aBasePtr; - fEndPtr := aEndPtr; - fIntegerDef := aIntegerDef; - if not fIntegerDef.FormaterCanChange then - fFlagsDef := aFlagsDef; - fIndex := aIndex; - inherited Create(aContainer); - SetSortOrder(aIndex); - SetMemoryOrder(aIndex); -end; - -function TwbFlag.GetConflictPriority: TwbConflictPriority; -var - MainRecord: IwbMainRecord; -begin - if wbTranslationMode then - Result := cpIgnore - else if GetFlagsDef.FlagIgnoreConflict[fIndex] then - Result := cpIgnore - else if Assigned(fIntegerDef) then - Result := fIntegerDef.ConflictPriority[Self] - else - Result := cpNormal; - - if Result = cpFormID then begin - Result := cpCritical; - MainRecord := GetContainingMainRecord; - if Assigned(MainRecord) and (MainRecord.Signature = 'GMST') then - Result := cpBenign; - end; -end; - -function TwbFlag.GetDataSize: Integer; -begin - Result := 0; -end; - -function TwbFlag.GetDef: IwbNamedDef; -begin - Result := GetFlagsDef.FlagDef[fIndex]; -end; - -function TwbFlag.GetDontShow: Boolean; -begin - Result := GetFlagsDef.FlagDontShow[Self, fIndex]; -end; - -function TwbFlag.GetEditValue: string; -var - s: string; -begin - s := GetContainer.EditValue; - if Length(s) >= Succ(fIndex) then - Result := s[Succ(fIndex)] - else - Result := '0'; -end; - -function TwbFlag.GetElementType: TwbElementType; -begin - Result := etFlag; -end; - -function TwbFlag.GetFlagIndex: Integer; -begin - Result := fIndex; -end; - -function TwbFlag.GetFlagsDef: IwbFlagsDef; -begin - if Assigned(fFlagsDef) then - Result := fFlagsDef - else - Result := fIntegerDef.Formater[IwbContainer(eContainer)] as IwbFlagsDef; -end; - -function TwbFlag.GetIsEditable: Boolean; -begin - Result := wbIsInternalEdit or GetContainer.IsEditable; -end; - -function TwbFlag.GetIsRemoveable: Boolean; -begin - Result := wbIsInternalEdit or GetContainer.IsEditable; -end; - -function TwbFlag.GetName: string; -begin - Result := GetFlagsDef.Flags[fIndex]; -end; - -function TwbFlag.GetNativeValue: Variant; -var - s: string; -begin - s := GetContainer.EditValue; - if Length(s) >= Succ(fIndex) then - Result := s[Succ(fIndex)] = '1' - else - Result := False; -end; - -function TwbFlag.GetSortKey(aExtended: Boolean): string; - - procedure CheckFlagsChanged; - var - FlagsDef : IwbFlagsDef; - begin - FlagsDef := GetFlagsDef.Root as IwbFlagsDef; - if FlagsDef.DefID <> fLastDefID then begin - Exclude(eStates, esExtendedSortKeyValid); - Exclude(eStates, esSortKeyValid); - end; - end; - -begin - if not Assigned(fFlagsDef) then - CheckFlagsChanged; - Result := inherited GetSortKey(aExtended); -end; - -function TwbFlag.GetSortKeyInternal(aExtended: Boolean): string; -var - s : string; - FlagsDef : IwbFlagsDef; - BaseFlagsDef : IwbFlagsDef; -begin - FlagsDef := GetFlagsDef.Root as IwbFlagsDef; - BaseFlagsDef := FlagsDef.BaseFlagsDef; - - s := IntToHex64(BaseFlagsDef.DefID, 8); - Result := s + IntToHex64(fIndex, 2); - if not FlagsDef.Equals(BaseFlagsDef) then begin - s := FlagsDef.Flags[fIndex]; - if not SameText(s, BaseFlagsDef.Flags[fIndex]) then - Result := Result + s; - end; - fLastDefID := FlagsDef.DefID; -end; - -function TwbFlag.GetValue: string; -//var -// i: Int64; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - Result := GetFlagsDef.Flags[fIndex]; -{ - i := fIntegerDef.ToInt(fBasePtr, fEndPtr, Self); - if (i and (Int64(1) shl fIndex)) <> 0 then - Result := GetName - else - Result := ''; -} -end; - -function TwbFlag.GetValueDef: IwbValueDef; -begin - Result := GetFlagsDef.FlagDef[fIndex]; -end; - -procedure TwbFlag.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -var - Size: Cardinal; -begin - fBasePtr := aBasePtr; - Size := fIntegerDef.Size[aBasePtr, aEndPtr, GetContainer]; - fEndPtr := Pointer( Cardinal(fBasePtr) + Size ); - if Cardinal(fEndPtr) > Cardinal(aEndPtr) then - fEndPtr := aEndPtr; -end; - -procedure TwbFlag.InvalidateParentStorage; -begin - {not inherited} -end; - -procedure TwbFlag.Remove; -begin - SetEditValue('0'); -end; - -procedure TwbFlag.SetEditValue(const aValue: string); -var - s: string; - c: Char; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if aValue = '1' then - c := '1' - else - c := '0'; - - s := GetContainer.EditValue; - if Length(s) >= Succ(fIndex) then - s[Succ(fIndex)] := c - else - s := s + StringOfChar('0', fIndex - Length(s) ) + c; - GetContainer.EditValue := s; -end; - -procedure TwbFlag.SetNativeValue(const aValue: Variant); -var - s: string; - c: Char; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if aValue = True then - c := '1' - else - c := '0'; - - s := GetContainer.EditValue; - if Length(s) >= Succ(fIndex) then - s[Succ(fIndex)] := c - else - s := s + StringOfChar('0', fIndex - Length(s) ) + c; - GetContainer.EditValue := s; -end; - -{ TwbDataContainer } - -constructor TwbDataContainer.Create(const aContainer: IwbContainer; var aBasePtr: Pointer; aEndPtr: Pointer; const aPrevMainRecord : IwbMainRecord); -begin - dcBasePtr := aBasePtr; - dcEndPtr := aEndPtr; - dcDataBasePtr := aBasePtr; - dcDataEndPtr := aEndPtr; - inherited Create(aContainer); - try - InitDataPtr; - aBasePtr := dcEndPtr; - except - if Assigned(aContainer) then - aContainer.RemoveElement(Self); - raise; - end; -end; - -function TwbDataContainer.DoCheckSizeAfterWrite: Boolean; -begin - Result := False; -end; - -function TwbDataContainer.GetConflictPriority: TwbConflictPriority; -var - Def : IwbDef; - ValueDef : IwbValueDef; - MainRecord : IwbMainRecord; -begin - Result := cpNormal; - - Def := GetValueDef; - - if not Assigned(Def) then - Def := GetDef; - - if Supports(Def, IwbValueDef, ValueDef) then - Def := Resolve(ValueDef, GetDataBasePtr, GetDataEndPtr, Self); - - if Assigned(Def) then - Result := Def.ConflictPriority[Self]; - - if wbTranslationMode then begin - if Result <> cpTranslate then - Result := cpIgnore - else - Result := cpNormal; - end else begin - if Result = cpTranslate then - Result := cpNormal; - end; - - if Result = cpFormID then begin - Result := cpCritical; - MainRecord := GetContainingMainRecord; - if Assigned(MainRecord) and (MainRecord.Signature = 'GMST') then - Result := cpBenign; - end; -end; - -function TwbDataContainer.GetDataBasePtr: Pointer; -begin - if (dcfStorageInvalid in dcFlags) then - UpdateStorageFromElements; - Result := dcDataBasePtr; -end; - -function TwbDataContainer.GetDataEndPtr: Pointer; -begin - if (dcfStorageInvalid in dcFlags) then - UpdateStorageFromElements; - Result := dcDataEndPtr; -end; - -function TwbDataContainer.GetDataSize: Integer; -begin - if (dcfStorageInvalid in dcFlags) or not Assigned(dcDataBasePtr) or not Assigned(dcDataEndPtr) then - Result := inherited GetDataSize + GetDataPrefixSize - else - Result := Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr ); -end; - -function TwbDataContainer.GetDontCompare: Boolean; -begin - Result := (dcfDontCompare in dcFlags); -end; - -function TwbDataContainer.GetDontSave: Boolean; -begin - Result := (dcfDontSave in dcFlags); -end; - -function TwbDataContainer.GetEditInfo: string; -var - ValueDef: IwbValueDef; -begin - Result := ''; - if Supports(GetValueDef, IwbValueDef, ValueDef) then - Result := ValueDef.EditInfo[GetDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbDataContainer.GetEditType: TwbEditType; -var - ValueDef: IwbValueDef; -begin - Result := etDefault; - if Supports(GetValueDef, IwbValueDef, ValueDef) then - Result := ValueDef.EditType[GetDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbDataContainer.GetResolvedValueDef: IwbValueDef; -begin - Result := Resolve(GetValueDef, GetDataBasePtr, dcDataEndPtr, Self); -end; - -function TwbDataContainer.GetDataPrefixSize: Integer; -begin - Result := 0; -end; - -procedure TwbDataContainer.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -var - SizeNeeded : Cardinal; - SizeAvailable : Cardinal; - BasePtr : Pointer; -begin - if [dcfDontMerge, dcfDontCompare] * dcFlags <> [] then - Exit; - - if Length(dcDataStorage) <> 0 then - Assert(Length(dcDataStorage) = 0); - SizeNeeded := GetDataSize; - if SizeNeeded > 0 then begin - SizeAvailable := Cardinal( aEndPtr ) - Cardinal( aBasePtr ); - if (SizeAvailable < SizeNeeded) then - Assert( SizeAvailable >= SizeNeeded ); - - BasePtr := aBasePtr; - Inc(PByte(aBasePtr), GetDataPrefixSize); - inherited; - - if BasePtr = aBasePtr then begin - if not (dcfDontMerge in dcFlags) then - Inc(PByte(aBasePtr), SizeNeeded); - end else - if Cardinal(aBasePtr) - Cardinal(BasePtr) > SizeNeeded then // we overwrote something - Assert( Cardinal(aBasePtr) - Cardinal(BasePtr) = SizeNeeded) - else // Adjust size of data not initialized yet - aBasePtr := PByte(BasePtr) + SizeNeeded; - - dcDataBasePtr := BasePtr; - dcDataEndPtr := aBasePtr; - end; -end; - -procedure TwbDataContainer.InvalidateStorage; -begin - Include(dcFlags, dcfStorageInvalid); - inherited; -end; - -function TwbDataContainer.IsFlags: Boolean; -begin - Result := False; -end; - -function TwbDataContainer.IsValidOffset(aBasePtr, aEndPtr: Pointer; anOffset: Integer): Boolean; -begin - Result := False; - if Cardinal(aBasePtr) >= Cardinal(dcBasePtr) then - if Cardinal(aBasePtr) < Cardinal(dcEndPtr) then - if Cardinal(aEndPtr) > Cardinal(dcBasePtr) then - if Cardinal(aEndPtr) <= Cardinal(dcEndPtr) then - if Cardinal(aBasePtr)+anOffset < Cardinal(dcEndPtr) then - Result := True; -end; - -function TwbDataContainer.IsLocalOffset(anOffset: Integer): Boolean; -begin - if Cardinal(dcDataBasePtr)+anOffset < Cardinal(dcDataEndPtr) then - Result := True - else - Result := False; -end; - -procedure TwbDataContainer.MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); -var - SizeNeeded : Cardinal; - SizeAvailable : Cardinal; - BasePtr : Pointer; - PrefixSize : Integer; -begin - if [dcfDontMerge, dcfDontCompare] * dcFlags <> [] then - Exit; - - if (dcfStorageInvalid in dcFlags) then begin - BasePtr := aBasePtr; - PrefixSize := GetDataPrefixSize; - if (PrefixSize > 0) then begin - Move(dcDataBasePtr^, aBasePtr^, PrefixSize); - Inc(PByte(aBasePtr), PrefixSize); - end; - inherited; - dcDataBasePtr := BasePtr; - dcDataEndPtr := aBasePtr; - end else begin - SizeNeeded := Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr ); - if SizeNeeded > 0 then begin - SizeAvailable := Cardinal( aEndPtr ) - Cardinal( aBasePtr ); - if SizeAvailable < SizeNeeded then - Assert( SizeAvailable >= SizeNeeded ); - - Move(dcDataBasePtr^, aBasePtr^, SizeNeeded); - - dcDataBasePtr := aBasePtr; - Inc(PByte(aBasePtr), SizeNeeded); - dcDataEndPtr := aBasePtr; - - BasePtr := dcDataBasePtr; - Inc(PByte(BasePtr), GetDataPrefixSize); - inherited InformStorage(BasePtr, dcDataEndPtr); - end else begin - dcDataBasePtr := nil; - dcDataEndPtr := nil; - end; - dcDataStorage := nil; - end; -end; - -procedure TwbDataContainer.RequestStorageChange(var aBasePtr, aEndPtr: Pointer; aNewSize: Cardinal); -var - BasePtr : Pointer; - OldSize : Cardinal; - NeedsCopy : Boolean; -begin - if (dcfStorageInvalid in dcFlags) then - UpdateStorageFromElements; - - SetModified(True); - InvalidateParentStorage; - if aNewSize = 0 then begin - dcDataStorage := nil; - dcDataBasePtr := @EmptyPtr; - dcDataEndPtr := @EmptyPtr; - end else if Cardinal(Length(dcDataStorage)) <> aNewSize then begin - OldSize := Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr ); - NeedsCopy := (Length(dcDataStorage) = 0) and (OldSize > 0); - SetLength(dcDataStorage, aNewSize); - if NeedsCopy then - Move(dcDataBasePtr^, dcDataStorage[0], Min(OldSize, aNewSize)); - dcDataBasePtr := @dcDataStorage[0]; - dcDataEndPtr := Pointer( Cardinal(dcDataBasePtr) + aNewSize ); - - BasePtr := dcDataBasePtr; - Inc(PByte(BasePtr), GetDataPrefixSize); - inherited InformStorage(BasePtr, dcDataEndPtr); - end; - Exclude(dcFlags, dcfStorageInvalid); - aBasePtr := dcDataBasePtr; - aEndPtr := dcDataEndPtr; -end; - -procedure TwbDataContainer.SetContainer(const aContainer: IwbContainer); -var - DataContainer: IwbDataContainer; -begin - if not (dcfDontCompare in dcFlags) then - if Supports(aContainer, IwbDataContainer, DataContainer) and DataContainer.DontCompare then - Include(dcFlags, dcfDontCompare); - inherited; -end; - -procedure TwbDataContainer.SetDataSize(aSize: Integer); -var - BasePtr, EndPtr: Pointer; -begin - if aSize = GetDataSize then - Exit; - - BasePtr := nil; - EndPtr := nil; - RequestStorageChange(BasePtr, EndPtr, aSize); - if csInit in cntStates then begin - Reset; - Init; - end; -end; - -procedure TwbDataContainer.SetModified(aValue: Boolean); -begin - inherited SetModified(aValue); -end; - -procedure TwbDataContainer.SetToDefaultInternal; -var - SelfRef : IwbContainerElementRef; - ValueDef : IwbValueDef; - OldValue, NewValue : Variant; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - - ValueDef := GetValueDef; - if Assigned(ValueDef) then begin - OldValue := GetNativeValue; - if ValueDef.SetToDefault(GetDataBasePtr, GetDataEndPtr, Self) then begin - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - NotifyChanged(eContainer); - - if IsFlags and (csInit in cntStates) then begin - Reset; - Init; - end; - end; - end; - - inherited; -end; - -procedure TwbDataContainer.UpdateStorageFromElements; -var - PrefixSize : Integer; - NewStorage : TBytes; - BasePtr : Pointer; - EndPtr : Pointer; - SelfRef : IwbContainerElementRef; - i : Integer; - DataContainerInternal : IwbDataContainerInternal; -begin - if not (dcfStorageInvalid in dcFlags) then - Exit; - - SelfRef := Self as IwbContainerElementRef; - - for i := Low(cntElements) to High(cntElements) do - if Supports(cntElements[i], IwbDataContainerInternal, DataContainerInternal) then - DataContainerInternal.UpdateStorageFromElements; - - SetLength(NewStorage, inherited GetDataSize + GetDataPrefixSize); - if Length(NewStorage) > 0 then begin - BasePtr := @NewStorage[0]; - EndPtr := Pointer( Cardinal(BasePtr) + Cardinal(Length(NewStorage)) ); - PrefixSize := GetDataPrefixSize; - if (PrefixSize > 0) then - Move(dcDataBasePtr^, BasePtr^, PrefixSize); - Inc(PByte(BasePtr), PrefixSize); - inherited MergeStorageInternal(BasePtr, EndPtr); - - dcDataStorage := NewStorage; - dcDataBasePtr := @NewStorage[0]; - dcDataEndPtr := Pointer( Cardinal(dcDataBasePtr) + Cardinal(Length(dcDataStorage)) ); - Assert(dcDataEndPtr = EndPtr); - end else begin - dcDataStorage := nil; - dcDataBasePtr := nil; - dcDataEndPtr := nil; - end; - - Exclude(dcFlags, dcfStorageInvalid); -end; - -procedure TwbDataContainer.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -var - OldPosition : Int64; - Size : Cardinal; - ExpectedSize : Cardinal; -begin - if [dcfDontSave, dcfDontCompare] * dcFlags <> [] then - Exit; - - OldPosition := aStream.Position; - ExpectedSize := GetDataSize; - - if (esModified in eStates) or wbTestWrite then begin - if not (dcfStorageInvalid in dcFlags) and Assigned(dcDataEndPtr) and Assigned(dcDataBasePtr) then - Size := Cardinal( dcDataEndPtr ) - Cardinal( dcDataBasePtr ) - else - Size := 0; - if Size > 0 then begin - if Size <> ExpectedSize then - Assert(Size = ExpectedSize); - aStream.WriteBuffer(dcDataBasePtr^, Size); - end else begin - inherited WriteToStreamInternal(aStream, aResetModified); - if aStream.Position = OldPosition then begin - Size := GetDataSize; - if Size > 0 then - aStream.WriteBuffer(GetDataBasePtr^, Size); - end; - end; - end else begin - Size := ExpectedSize; - if Size > 0 then - aStream.WriteBuffer(GetDataBasePtr^, Size); - end; - - if (aStream.Position - OldPosition) <> ExpectedSize then - if DoCheckSizeAfterWrite then - Assert(not DoCheckSizeAfterWrite); - - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -{ TwbValueBase } - -procedure TwbValueBase.BuildRef; -var - SelfRef: IwbElement; -begin - SelfRef := Self as IwbContainerElementRef; - - inherited; - vbValueDef.BuildRef(GetDataBasePtr, dcDataEndPtr, Self); -end; - -constructor TwbValueBase.Create(const aContainer : IwbContainer; - var aBasePtr : Pointer; - aEndPtr : Pointer; - const aValueDef : IwbValueDef; - const aNameSuffix : string; - aDontCompare: Boolean); -begin - if aDontCompare then - Include(dcFlags, dcfDontCompare); - vbValueDef := aValueDef; - vbNameSuffix := aNameSuffix; - inherited Create(aContainer, aBasePtr, aEndPtr, nil); -end; - -function TwbValueBase.CanContainFormIDs: Boolean; -begin - Result := vbValueDef.CanContainFormIDs; -end; - -function TwbValueBase.CanElementReset: Boolean; -begin -// Result := inherited CanElementReset; - Result := eExternalRefs < 1; -end; - -constructor TwbValueBase.Create(const aContainer : IwbContainer; - const aValueDef : IwbValueDef; - const aSource : IwbElement; - const aOnlySK : Boolean; - const aNameSuffix : string); -var - BasePtr : Pointer; - EndPtr : Pointer; -begin - BasePtr := nil; - Create(aContainer, BasePtr, nil, aValueDef, aNameSuffix); - if Assigned(aSource) then try - RequestStorageChange(BasePtr, EndPtr, GetDataSize); - SetToDefault; - Assign(Low(Integer), aSource, aOnlySK); - SetModified(True); - except - if Assigned(aContainer) then - aContainer.RemoveElement(Self); - raise; - end else begin - BasePtr := nil; - EndPtr := nil; - SetModified(True); - RequestStorageChange(BasePtr, EndPtr, GetDataSize); - SetToDefault; - end; -end; - -function TwbValueBase.DoCheckSizeAfterWrite: Boolean; -begin - Result := True; -end; - -function TwbValueBase.GetBaseName: string; -begin - Result := vbValueDef.Name; -end; - -function TwbValueBase.GetCheck: string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := vbValueDef.Check(GetDataBasePtr, dcDataEndPtr, Self); -end; - -function TwbValueBase.GetDataSize: Integer; -begin - if not Assigned(dcDataBasePtr) and not (dcfStorageInvalid in dcFlags) then - Result := vbValueDef.DefaultSize[nil, nil, Self] - else - Result := inherited GetDataSize; -end; - -function TwbValueBase.GetDef: IwbNamedDef; -begin - Result := vbValueDef; -end; - -function TwbValueBase.GetDisplayName: string; -var - Resolved: IwbValueDef; - Container: IwbDataContainer; -begin - Resolved := Resolve(vbValueDef, GetDataBasePtr, GetDataEndPtr, Self); - if (not Assigned(Resolved)) or (Resolved <> vbValueDef) and (Resolved.DefType in dtNonValues) then - Result := vbValueDef.Name - else - Result := Resolved.Name; - if Assigned(Resolved) then - begin - if (Resolved.DefType in dtNonValues) and (wbDumpOffset=1) then // simply display starting offset. - Result := Result + ' {' + IntToHex64(Cardinal(GetDataBasePtr)-wbBaseOffset, 8) + '}'; - // something for Dump: Displaying the size in {} and the array count in [] - // Triggers a lot of pre calculations - if (Resolved.DefType in dtNonValues) and (wbDumpOffset>2) then - Result := Result + ' {' + IntToHex64(Cardinal(GetDataEndPtr)-wbBaseOffset, 8) + '-' + IntToHex64(Cardinal(GetDataBasePtr)-wbBaseOffset, 8) + - ' = ' +IntToStr(Resolved.Size[GetDataBasePtr, GetDataEndPtr, Self]) + '}'; - if (Resolved.DefType = dtArray) and (wbDumpOffset>1) and Supports(Self, IwbDataContainer, Container) then - Result := Result + ' [' + IntToStr(Container.GetElementCount) + ']'; - end; - if vbNameSuffix <> '' then - Result := Result + ' ' + vbNameSuffix; -end; - -function TwbValueBase.GetEditValue: string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := vbValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] -end; - -function TwbValueBase.GetIsEditable: Boolean; -var - SelfRef : IwbContainerElementRef; -begin - Result := wbIsInternalEdit; - if Result then - Exit; - - SelfRef := Self as IwbContainerElementRef; - - if Assigned(eContainer) and not IwbContainer(eContainer).IsElementEditable(SelfRef) then - Exit; - - DoInit; - Result := vbValueDef.IsEditable[GetDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbValueBase.GetIsInSK(aIndex: Integer): Boolean; -var - SelfRef : IwbContainerElementRef; - HasSortKey : IwbHasSortKeyDef; -begin - Result := False; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if not Supports(vbValueDef, IwbHasSortKeyDef, HasSortKey) then - Exit; - - Result := HasSortKey.IsInSK(aIndex); -end; - -function TwbValueBase.GetLinksTo: IwbElement; -var - SelfRef: IwbContainerElementRef; -begin - Result := nil; - SelfRef := Self as IwbContainerElementRef; - DoInit; - if not Assigned(vbValueDef) then - Exit; - Result := vbValueDef.LinksTo[dcDataBasePtr, dcDataEndPtr, Self]; -end; - -function TwbValueBase.GetName: string; -begin - Result := vbValueDef.Name; - if vbNameSuffix <> '' then - Result := Result + ' ' + vbNameSuffix; -end; - -function TwbValueBase.GetNativeValue: Variant; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := vbValueDef.NativeValue[GetDataBasePtr, dcDataEndPtr, Self] -end; - -function TwbValueBase.GetSortKeyInternal(aExtended: Boolean): string; -var - SelfRef : IwbContainerElementRef; -begin - SelfRef := Self as IwbContainerElementRef; - if (dcfDontCompare in dcFlags) then - Result := '' - else begin - DoInit; - Result := vbValueDef.ToSortKey(GetDataBasePtr, dcDataEndPtr, Self, aExtended); - end; -end; - -function TwbValueBase.GetValue: string; -var - SelfRef : IwbContainerElementRef; -var - Def: IwbDef; -begin - if wbReportMode then begin - Def := GetValueDef; - if Assigned(Def) then - Def.Used; - Def := GetDef; - if Assigned(Def) then - Def.Used; - end; - - SelfRef := Self as IwbContainerElementRef; - DoInit; - Result := vbValueDef.ToString(GetDataBasePtr, dcDataEndPtr, Self); -end; - -function TwbValueBase.GetValueDef: IwbValueDef; -//var -// SelfRef: IwbContainerElementRef; -begin -// SelfRef := Self as IwbContainerElementRef; -// DoInit; - - Result := vbValueDef; -end; - -procedure TwbValueBase.InitDataPtr; -var - Size : Integer; -begin - if (GetDataBasePtr <> nil) and (Cardinal(dcDataEndPtr)>=Cardinal(dcDataBasePtr)) then begin - Size := vbValueDef.Size[dcDataBasePtr, dcDataEndPtr, Self]; - if Size < High(Integer) then begin - dcDataEndPtr := Pointer( Cardinal(dcDataBasePtr) + Cardinal(Size) ); - if Cardinal(dcDataEndPtr) > Cardinal(dcEndPtr) then - dcDataEndPtr := dcEndPtr - else - dcEndPtr := dcDataEndPtr; - end; - end; -end; - -procedure TwbValueBase.SetEditValue(const aValue: string); -var - OldValue, NewValue: Variant; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - if aValue <> GetEditValue then begin - OldValue := GetNativeValue; - vbValueDef.EditValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - NotifyChanged(eContainer); - end; -end; - - -procedure TwbValueBase.SetNativeValue(const aValue: Variant); -var - OldValue, NewValue: Variant; -begin - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be edited.'); - - OldValue := GetNativeValue; - vbValueDef.NativeValue[GetDataBasePtr, dcDataEndPtr, Self] := aValue; - NewValue := GetNativeValue; - DoAfterSet(OldValue, NewValue); - NotifyChanged(eContainer); -end; - -procedure TwbValueBase.SetToDefaultInternal; -var - SelfRef: IwbContainerElementRef; - BasePtr, EndPtr: Pointer; -begin - SelfRef := Self as IwbContainerElementRef; - - if csInit in cntStates then - DoReset(True); - BasePtr := nil; - EndPtr := nil; - dcDataBasePtr := nil; - dcDataEndPtr := nil; - dcDataStorage := nil; - DoInit; - RequestStorageChange(BasePtr, EndPtr, vbValueDef.DefaultSize[nil, nil, Self]); - inherited; -end; - -{ TwbRecordHeaderStruct } - -function TwbRecordHeaderStruct.AddIfMissingInternal(const aElement : IwbElement; - aAsNew : Boolean; - aDeepCopy : Boolean; - const aPrefixRemove : string; - const aPrefix : string; - const aSuffix : string) - : IwbElement; -var - StructDef : IwbStructDef; - SelfRef : IwbContainerElementRef; -begin - Result := nil; - - if not wbEditAllowed then - raise Exception.Create(GetName + ' can not be assigned.'); - - SelfRef := Self as IwbContainerElementRef; - DoInit; - - if not Supports(GetDef, IwbStructDef, StructDef) then - Exit; - - Assert(aElement.SortOrder >= 0); - Assert(aElement.SortOrder < StructDef.MemberCount); - Assert(Assigned(aElement.Def)); - Assert(aElement.Def.Equals(StructDef.Members[aElement.SortOrder])); - - Result := GetElementBySortOrder(aElement.SortOrder + GetAdditionalElementCount); - Assert(Assigned(Result)); - Result.Assign(Low(Integer), aElement, not aDeepCopy); -end; - -procedure TwbRecordHeaderStruct.BuildRef; -begin -end; - -function TwbRecordHeaderStruct.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbRecordHeaderStruct.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -begin - Result := False; -end; - -procedure TwbRecordHeaderStruct.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -var - MainRecordInternal : IwbMainRecordInternal; - DataContainer : IwbDataContainer; - Flags : TwbMainRecordStructFlags; - p : Pointer; - - ToggleDeleted : Boolean; - TogglePersistent : Boolean; - ToggleVisibleWhenDistant : Boolean; -begin - - ToggleDeleted := False; - TogglePersistent := False; - ToggleVisibleWhenDistant := False; - - if Supports(IInterface(eContainer) , IwbMainRecordInternal, MainRecordInternal) then begin - if SameText(aElement.Def.Name, 'Record Flags') then begin - if Supports(aElement, IwbDataContainer, DataContainer) then begin - Flags._Flags := PCardinal(DataContainer.DataBasePtr)^; - UpdateStorageFromElements; - dcDataStorage := nil; - Exclude(dcFlags, dcfStorageInvalid); - MainRecordInternal.MakeHeaderWriteable; - - if Flags.IsESM then - if MainRecordInternal.Signature <> wbHeaderSignature then - Flags.SetESM(False); - - if Flags.IsDeleted <> MainRecordInternal.mrStruct.mrsFlags.IsDeleted then begin - Flags.SetDeleted(MainRecordInternal.mrStruct.mrsFlags.IsDeleted); - ToggleDeleted := True; - end; - - if Flags.IsPersistent <> MainRecordInternal.mrStruct.mrsFlags.IsPersistent then begin - Flags.SetPersistent(MainRecordInternal.mrStruct.mrsFlags.IsPersistent); - TogglePersistent := True; - end; - - if Flags.IsVisibleWhenDistant <> MainRecordInternal.mrStruct.mrsFlags.IsVisibleWhenDistant then begin - Flags.SetVisibleWhenDistant(MainRecordInternal.mrStruct.mrsFlags.IsVisibleWhenDistant); - ToggleVisibleWhenDistant := True; - end; - - MainRecordInternal.mrStruct.mrsFlags := Flags; - end; - end; - p := MainRecordInternal.mrStruct; - InformStorage(p, Pointer(Cardinal(p) + wbSizeOfMainRecordStruct )); - - with MainRecordInternal do begin - if ToggleDeleted then - IsDeleted := not IsDeleted; - - if not IsDeleted then begin - if TogglePersistent then - IsPersistent := not IsPersistent; - if ToggleVisibleWhenDistant then - IsVisibleWhenDistant := not IsVisibleWhenDistant; - end; - end; - end; - - inherited; -end; - -function TwbRecordHeaderStruct.GetIsEditable: Boolean; -begin - Result := wbIsInternalEdit; -end; - -function TwbRecordHeaderStruct.IsElementEditable(const aElement: IwbElement): Boolean; -begin - Result := Assigned(aElement) and Assigned(aElement.ValueDef) and - SameText(aElement.ValueDef.Name, 'Record Flags'); - if Result and Assigned(eContainer) then - Result := IwbContainer(eContainer).IsElementEditable(Self); -end; - -{ TwbStringListTerminator } - -function TwbStringListTerminator.AssignInternal(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; -begin - Result := nil; -end; - -function TwbStringListTerminator.CanAssignInternal(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; -begin - Result := False; - if Assigned(eContainer) then - if not IwbContainer(eContainer).IsElementEditable(Self) then - Exit; - - Result := Supports(aElement, IwbStringListTerminator); -end; - -function TwbStringListTerminator.GetConflictPriority: TwbConflictPriority; -begin - Result := cpIgnore; -end; - -function TwbStringListTerminator.GetDataSize: Integer; -begin - Result := 1; -end; - -function TwbStringListTerminator.GetElementType: TwbElementType; -begin - Result := etStringListTerminator; -end; - -function TwbStringListTerminator.GetName: string; -begin - Result := 'Terminator'; -end; - -function TwbStringListTerminator.GetSortKeyInternal(aExtended: Boolean): string; -begin - Result := #255; -end; - -procedure TwbStringListTerminator.InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); -begin - Assert( Cardinal(aBasePtr) < Cardinal(aEndPtr)); - Inc(PByte(aBasePtr)); -end; - -procedure TwbStringListTerminator.MergeStorageInternal(var aBasePtr: Pointer; aEndPtr: Pointer); -begin - Assert( Cardinal(aBasePtr) < Cardinal(aEndPtr)); - PAnsiChar(aBasePtr)^ := #0; - Inc(PByte(aBasePtr)); -end; - -procedure TwbStringListTerminator.SetEditValue(const aValue: string); -begin -end; - -procedure TwbStringListTerminator.SetNativeValue(const aValue: Variant); -begin -end; - -procedure TwbStringListTerminator.WriteToStreamInternal(aStream: TStream; aResetModified: Boolean); -const - NullChar : AnsiChar = #0; -begin - aStream.Write(NullChar, 1); - Exclude(eStates, esUnsaved); - if aResetModified then begin - Exclude(eStates, esModified); - Exclude(eStates, esInternalModified); - end; -end; - -procedure WriteSubRecordOrderList; -var - i: Integer; -begin - if not wbReportMode then - Exit; - - SubRecordOrderList.Sorted := False; - - for i := 0 to Pred(SubRecordOrderList.Count) do - SubRecordOrderList[i] := SubRecordOrderList[i] + ' (' + IntToStr(Integer(SubRecordOrderList.Objects[i]) )+ ')'; - - SubRecordOrderList.SaveToFile('SubRecordOrderList.txt'); -end; - -var - wbContainedInDef : array[0..10] of IwbIntegerDef; - -{ TwbContainedInElement } - -procedure TwbContainedInElement.BuildRef; -begin -end; - -function TwbContainedInElement.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbContainedInElement.CompareExchangeFormID(aOldFormID, aNewFormID: Cardinal): Boolean; -begin - Result := False; -end; - -procedure TwbContainedInElement.ContainerChanged; -var - MainRecord : IwbMainRecord; - GroupRecord : IwbGroupRecord; - Grp : TwbGroupTypes; -begin - if cieLockCount > 0 then - Exit; - - if not Supports(GetContainer, IwbMainRecord, MainRecord) then - Exit; - if not Supports(MainRecord.Container, IwbGroupRecord, GroupRecord) then - Exit; - if GroupRecord.GroupType = 5 then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Exit; - if GroupRecord.GroupType = 4 then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Exit; - - if wbVWDAsQuestChildren then Grp := [8..9] else Grp := [8..10]; - if GroupRecord.GroupType in Grp then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Exit; - - if wbVWDAsQuestChildren then Grp := [1, 6, 7, 10] else Grp := [1, 6, 7]; - if not (GroupRecord.GroupType in Grp) then - Exit; - - PCardinal(GetDataBasePtr)^ := GroupRecord.GroupLabel; - Exclude(eStates, esSortKeyValid); - Exclude(eStates, esExtendedSortKeyValid); - eSortKey := ''; - eExtendedSortKey := ''; -end; - -constructor TwbContainedInElement.Create(const aMainRecord: IwbMainRecord); -var - BasePtr : Pointer; - EndPtr : Pointer; - GroupRecord : IwbGroupRecord; - Grp : TwbGroupTypes; -begin - // MainRecord must be in a group - if not Supports(aMainRecord.Container, IwbGroupRecord, GroupRecord) then - Assert(False); - // if that group is Exterior Sub-Block, then it must be in a group too, get it - if GroupRecord.GroupType = 5 then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Assert(False); - // if that group is Exterior Block, then it must be in a group too, get it - if GroupRecord.GroupType = 4 then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Assert(False); - // if group is persistent, temporary or vwd cell children, it should be in a group too - // if vwd is treated as quest children, then exclude it from check - if wbVWDAsQuestChildren then Grp := [8..9] else Grp := [8..10]; - if GroupRecord.GroupType in Grp then - if not Supports(GroupRecord.Container, IwbGroupRecord, GroupRecord) then - Assert(False); - - // the final list of parent groups, mainrecords in those will have ContainedIn element - if wbVWDAsQuestChildren then Grp := [1, 6, 7, 10] else Grp := [1, 6, 7]; - Assert(GroupRecord.GroupType in Grp); - - Include(dcFlags, dcfDontMerge); - Include(dcFlags, dcfDontSave); - - BasePtr := nil; - EndPtr := nil; - inherited Create(aMainRecord, BasePtr, EndPtr, wbContainedInDef[GroupRecord.GroupType], '', False); - - SetSortOrder(-2); - - BasePtr := nil; - EndPtr := nil; - - RequestStorageChange(BasePtr, EndPtr, GetDataSize); - Assert(Assigned(BasePtr)); - - PCardinal(BasePtr)^ := GroupRecord.GroupLabel; -end; - -procedure TwbContainedInElement.DoAfterSet(const aOldValue, aNewValue: Variant); -var - OldFormID : Cardinal; - NewFormID : Cardinal; - _File : IwbFile; - MainRecord : IwbMainRecord; - NewOwner : IwbMainRecord; - GroupRecord : IwbGroupRecord; - OldGroup : IwbGroupRecord; - - Group1 : IwbGroupRecord; - Group2 : IwbGroupRecord; - Group3 : IwbGroupRecord; - CorrectGroup : Integer; - i : Integer; -begin - Inc(cieLockCount); - try - inherited; - if aOldValue <> aNewValue then begin - OldFormID := aOldValue; - NewFormID := aNewValue; - _File := GetFile; - MainRecord := GetContainer as IwbMainRecord; - OldGroup := MainRecord.Container as IwbGroupRecord; - NewOwner := _File.RecordByFormID[NewFormID, False]; - if not Assigned(NewOwner) then begin - if Assigned(dcDataBasePtr) then - PCardinal(dcDataBasePtr)^ := OldFormID; - Exit; - end; - if not _File.Equals(NewOwner._File) then - NewOwner := wbCopyElementToFile(NewOwner, _File, False, True, '', '', '') as IwbMainRecord; - GroupRecord := NewOwner.EnsureChildGroup; - - case GroupRecord.GroupType of - 1: begin - Assert(OldGroup.GroupType in [1, 5]); - Group1 := OldGroup; - Group2 := nil; - Group3 := nil; - if OldGroup.GroupType = 5 then begin - if not Supports(Group1.Container, IwbGroupRecord, Group2) then - Assert(False); - Assert(Group2.GroupType = 4); - - Group3 := nil; - for i := 0 to Pred(GroupRecord.ElementCount) do - if Supports(GroupRecord.Elements[i], IwbGroupRecord, Group3) then - if (Group3.GroupType = 4) and (Group3.GroupLabel = Group2.GroupLabel) then - Break - else - Group3 := nil; - if not Assigned(Group3) then - Group3 := TwbGroupRecord.Create(GroupRecord, 4, Group2.GroupLabel); - GroupRecord := Group3; - - Group3 := nil; - for i := 0 to Pred(GroupRecord.ElementCount) do - if Supports(GroupRecord.Elements[i], IwbGroupRecord, Group3) then - if (Group3.GroupType = 5) and (Group3.GroupLabel = Group1.GroupLabel) then - Break - else - Group3 := nil; - if not Assigned(Group3) then - Group3 := TwbGroupRecord.Create(GroupRecord, 5, Group1.GroupLabel); - GroupRecord := Group3; - - if not Supports(Group2.Container, IwbGroupRecord, Group3) then - Assert(False); - Assert(Group3.GroupType = 1); - end; - - Group1.RemoveElement(MainRecord); - if Group1.ElementCount = 0 then begin - (Group1 as IwbGroupRecordInternal).SetModified(True); - Group1.Remove; - if Assigned(Group2) then - if Group2.ElementCount = 0 then begin - (Group2 as IwbGroupRecordInternal).SetModified(True); - Group2.Remove; - if Assigned(Group3) then - if Group3.ElementCount = 0 then begin - (Group3 as IwbGroupRecordInternal).SetModified(True); - Group3.Remove; - end else - (Group3 as IwbGroupRecordInternal).SetModified(True); - end else - (Group2 as IwbGroupRecordInternal).SetModified(True); - end else - (Group1 as IwbGroupRecordInternal).SetModified(True); - - GroupRecord.AddElement(MainRecord); - (GroupRecord as IwbGroupRecordInternal).SetModified(True); - (GroupRecord as IwbGroupRecordInternal).Sort; - end; - 6: begin - if MainRecord.IsPersistent then - CorrectGroup := 8 - else if MainRecord.IsVisibleWhenDistant and not wbVWDInTemporary then - CorrectGroup := 10 - else - CorrectGroup := 9; - - Group3 := nil; - for i := 0 to Pred(GroupRecord.ElementCount) do - if Supports(GroupRecord.Elements[i], IwbGroupRecord, Group3) then - if Group3.GroupType = CorrectGroup then - Break - else - Group3 := nil; - - if not Assigned(Group3) then - Group3 := TwbGroupRecord.Create(GroupRecord, CorrectGroup, GroupRecord.ChildrenOf); - - OldGroup.RemoveElement(MainRecord); - if OldGroup.ElementCount = 0 then - OldGroup.Remove - else - (OldGroup as IwbGroupRecordInternal).SetModified(True); - Group3.AddElement(MainRecord); - (Group3 as IwbGroupRecordInternal).SetModified(True); - (Group3 as IwbGroupRecordInternal).Sort; - end; - 7: begin - OldGroup.RemoveElement(MainRecord); - if OldGroup.ElementCount = 0 then - OldGroup.Remove - else - (OldGroup as IwbGroupRecordInternal).SetModified(True); - GroupRecord.AddElement(MainRecord); - (GroupRecord as IwbGroupRecordInternal).SetModified(True); - (GroupRecord as IwbGroupRecordInternal).Sort; - end; - else - Assert(False); - end; - - end; - finally - Dec(cieLockCount); - end; - ContainerChanged; -end; - -procedure TwbContainedInElement.ElementChanged(const aElement: IwbElement; aContainer: Pointer); -begin -end; - -procedure TwbContainedInElement.InvalidateParentStorage; -begin -end; - -function TwbContainedInElement.IsElementEditable(const aElement: IwbElement): Boolean; -begin - Result := False; -end; - -procedure TwbContainedInElement.SetModified(aValue: Boolean); -begin - if not aValue then - inherited - else begin - Exclude(eStates, esSortKeyValid); - Exclude(eStates, esExtendedSortKeyValid); - eSortKey := ''; - end; -end; - -{ TwbMainRecordEntryHeader } - -procedure TwbMainRecordEntryHeader.BeginUse; -begin - Assert(not mrehInUse); - mrehInUse := True; - - Inc(mrehGeneration); - mrehHead := nil; - mrehTail := nil; - mrehCount := 0; -end; - -procedure TwbMainRecordEntryHeader.EndUse; -begin - Assert(mrehInUse); - mrehInUse := False; - - Inc(mrehGeneration); - mrehHead := nil; - mrehTail := nil; - mrehCount := 0; -end; - -const - WRLD : TwbSignature = 'WRLD'; - CELL : TwbSignature = 'CELL'; - DIAL : TwbSignature = 'DIAL'; - QUST : TwbSignature = 'QUST'; - -{ TwbFileSource } - -constructor TwbFileSource.CreateNew(const aFileName: string; aLoadOrder: Integer); -begin - Include(flStates, fsIsNew); - flLoadOrder := aLoadOrder; - flFileName := aFileName; -end; - -procedure TwbFileSource.GetMasters(aMasters: TStrings); -var - Header : IwbFileHeader; - MasterFiles : IwbContainerElementRef; - fPath : String; - i : Integer; - modOffset : Cardinal; - modPtr : Pointer; - mods : TwbArray; -begin - if (GetElementCount <> 1) or not Supports(GetElement(0), IwbFileHeader, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Header.FileMagic <> wbFileMagic then - raise Exception.CreateFmt('Expected File Magic %s, found %s in file "%s"', - [wbFileMagic, String(Header.FileMagic), flFileName]); - - if Pos('Absolute:', wbFilePlugins)=1 then begin - modOffset := Cardinal(flView)+StrToInt(Copy(wbFilePlugins, 10, Length(wbFilePlugins))); - modPtr := Pointer(modOffset); - mods := TwbArray.Create(nil, modPtr, flEndPtr, wbArray('Modules', wbLenString('PluginName', 2), -4), '', False); - Supports(mods, IwbContainerElementRef, MasterFiles); - end else - MasterFiles := Header.ElementByName[wbFilePlugins] as IwbContainerElementRef; - - if Assigned(MasterFiles) then - for i := 0 to Pred(MasterFiles.ElementCount) do begin - fPath := wbDataPath + MasterFiles[i].Value; - if FileExists(fPath) then - aMasters.Add(MasterFiles[i].Value) - end; - -end; - -function CreateTemporaryCopy(FileName, CompareFile: String): String; -var - s : String; - i : Integer; - -begin - if not SameText(ExtractFilePath(CompareFile), wbDataPath) then begin - s := wbDataPath + ExtractFileName(CompareFile); - if FileExists(s) then // Finds a unique name - for i := 0 to 255 do begin - s := wbDataPath + ExtractFileName(CompareFile) + IntToHex(i, 3); - if not FileExists(s) then Break; - end; - if FileExists(s) then begin - wbProgressCallback('Could not copy '+FileName+' into '+wbDataPath); - Exit; - end; - CompareFile := s; - CopyFile(PChar(FileName), PChar(CompareFile), false); - end; - Result := CompareFile; -end; - -function SelectTemporaryCopy(FileName, CompareFile: String): String; -var - s : String; - i : Integer; - -begin - if not SameText(ExtractFilePath(CompareFile), wbDataPath) then begin - for i := 0 to 255 do begin - s := wbDataPath + ExtractFileName(CompareFile) + IntToHex(i, 3); - if FileExists(s) then Break; - end; - if not FileExists(s) then - s := wbDataPath + CompareFile + IntToHex(0, 3); - CompareFile := s; - if not FileExists(CompareFile) then - CopyFile(PChar(FileName), PChar(CompareFile), false); - end; - Result := CompareFile; -end; - -procedure TwbFileSource.Scan; -var - CurrentPtr : Pointer; - Header : IwbFileHeader; - MasterFiles : IwbContainerElementRef; - i : Integer; - ExtractInfo : TByteSet; - Element : IwbElement; - Container : IwbContainer; - SelfRef : IwbContainerElementRef; - fPath : String; - modOffset : Cardinal; - modPtr : Pointer; - mods : TwbArray; - -begin - SelfRef := Self as IwbContainerElementRef; - flProgress('Start processing'); - - wbBaseOffset := Cardinal(flView); - - CurrentPtr := flView; - TwbFileHeader.Create(Self, CurrentPtr, flEndPtr, wbFileHeader, '', False); - - if (GetElementCount <> 1) or not Supports(GetElement(0), IwbFileHeader, Header) then - raise Exception.CreateFmt('Unexpected error reading file "%s"', [flFileName]); - - if Header.FileMagic <> wbFileMagic then - raise Exception.CreateFmt('Expected header Magic %s, found %s in file "%s"', - [wbFileMagic, String(Header.FileMagic), flFileName]); - - if fsOnlyHeader in flStates then - Exit; - - if Pos('Absolute:', wbFilePlugins)=1 then begin - modOffset := Cardinal(flView)+StrToInt(Copy(wbFilePlugins, 10, Length(wbFilePlugins))); - modPtr := Pointer(modOffset); - mods := TwbArray.Create(nil, modPtr, flEndPtr, wbArray('Modules', wbLenString('PluginName', 2), -4), '', False); - Supports(mods, IwbContainerElementRef, MasterFiles); - end else - MasterFiles := Header.ElementByName[wbFilePlugins] as IwbContainerElementRef; - - if Assigned(MasterFiles) then - for i := 0 to Pred(MasterFiles.ElementCount) do begin - fPath := wbDataPath + MasterFiles[i].Value; - if FileExists(fPath) then - AddMaster(fPath) - else if wbUseFalsePlugins then begin - fPath := wbDataPath + wbAppName + TheEmptyPlugin; // place holder to keep save indexes - if not FileExists(fPath) then - fPath := ExtractFilePath(wbProgramPath) + wbAppName + TheEmptyPlugin; // place holder to keep save indexes - if FileExists(fPath) then - AddMaster(SelectTemporaryCopy(fPath, MasterFiles[i].Value), True); - end; - end; - - if flCompareTo <> '' then - AddMaster(flCompareTo); - - if Assigned(wbExtractInfo) then - ExtractInfo := wbExtractInfo^ - else - ExtractInfo := []; - - for i := 0 to Pred(wbFileChapters.MemberCount) do begin - case wbFileChapters.Members[i].DefType of - dtArray: Element := TwbArray.Create(Self, currentPtr, flEndPtr, wbFileChapters.Members[i], ''); - dtStruct: Element := TwbStruct.Create(Self, currentPtr, flEndPtr, wbFileChapters.Members[i], ''); - dtStructChapter: Element := TwbChapter.Create(Self, currentPtr, flEndPtr, wbFileChapters.Members[i], ''); - dtUnion: Element := TwbUnion.Create(Self, currentPtr, flEndPtr, wbFileChapters.Members[i], ''); - else - Element := TwbValue.Create(Self, currentPtr, flEndPtr, wbFileChapters.Members[i], ''); - end; - if (i in ExtractInfo) and Supports(Element, IwbContainer, Container) then - with Element as TwbContainer do DoInit; - end; - - for i := 0 to Pred(GetElementCount) do - GetElement(i).SortOrder := i; - - flProgress('Processing completed'); - flLoadFinished := True; -end; - -{ TwbFileHeader } - -function TwbFileHeader.GetFileMagic: TwbFileMagic; -var - Element : IwbElement; - Container : IwbContainer; -begin - Result := ''; - if not Supports(Self, IwbContainer, Container) or (Container.ElementCount < 1) then Exit; - Element := Container.Elements[0]; - if Assigned(Element) then - Result := Element.NativeValue; -end; - -{ TwbChapter } - -constructor TwbChapter.Create(const aContainer : IwbContainer; - const aValueDef : IwbValueDef; - const aSource : IwbElement; - const aOnlySK : Boolean; - const aNameSuffix : string); -var - Dummy : Integer; -begin - if Assigned(aValueDef) then - Assert(Supports(aValueDef, IwbStructCDef)); - inherited; - cChapterSkipped := cChapterSkipped or ChaptersToSkip.Find(aValueDef.Name, Dummy); -end; - -function TwbChapter.GetChapterName: String; -var - Struct : IwbStructCDef; -begin - if Assigned(vbValueDef) and Supports(vbValueDef, IwbStructCDef, Struct) then - Result := Struct.GetChapterName(dcBasePtr, dcEndPtr, Self) - else - Result := Struct.GetChapterTypeName(dcBasePtr, dcEndPtr, Self); -end; - -function TwbChapter.GetChapterType: Integer; -var - Struct : IwbStructCDef; -begin - Result := -1; - if Assigned(vbValueDef) and Supports(vbValueDef, IwbStructCDef, Struct) then - Result := Struct.GetChapterType(dcBasePtr, dcEndPtr, Self); -end; - -function TwbChapter.GetChapterTypeName: String; -var - Struct : IwbStructCDef; -begin - if Assigned(vbValueDef) and Supports(vbValueDef, IwbStructCDef, Struct) then - Result := Struct.GetChapterTypeName(dcBasePtr, dcEndPtr, Self) - else - Result := IntToStr(Struct.GetChapterType(dcBasePtr, dcEndPtr, Self)); -end; - -function TwbChapter.GetElementType: TwbElementType; -begin - Result := etStructChapter; -end; - -function TwbChapter.GetSkipped: Boolean; -begin - Result := cChapterSkipped; -end; - -{ TwbKeepAliveRoot } - -constructor TwbKeepAliveRoot.Create; -begin - inherited; - Setup; -end; - -destructor TwbKeepAliveRoot.Destroy; -begin - inherited; - Teardown; -end; - -procedure TwbKeepAliveRoot.Done; -begin - Teardown; -end; - -procedure TwbKeepAliveRoot.Setup; -begin - New(karKAC); - karKAC.kacFinished := False; - karKAC.kacPrev := wbKeepAliveContext; - karKAC.kacHead := TwbContainer.Create(nil); - wbKeepAliveContext := karKAC; -end; - -procedure TwbKeepAliveRoot.Teardown; -var - KAC : PwbKeepAliveContext; -begin - if Assigned(karKAC) then begin - karKAC.kacFinished := True; - karKAC := nil; - end; - - KAC := wbKeepAliveContext; - while Assigned(KAC) and KAC.kacFinished do begin - wbKeepAliveContext := KAC.kacPrev; - while Assigned(KAC.kacHead) do - KAC.kacHead := KAC.kacHead.ReleaseKeepAlive; - Dispose(KAC); - KAC := wbKeepAliveContext; - end; -end; - -initialization - wbContainedInDef[1] := wbFormIDCk('Worldspace', [WRLD], False, cpNormal, True); - wbContainedInDef[6] := wbFormIDCk('Cell', [CELL], False, cpNormal, True); - wbContainedInDef[7] := wbFormIDCk('Topic', [DIAL], False, cpNormal, True); - wbContainedInDef[10] := wbFormIDCk('Quest', [QUST], False, cpNormal, True); - - SubRecordOrderList := TwbFastStringList.Create; - SubRecordOrderList.Sorted := True; - SubRecordOrderList.Duplicates := dupIgnore; - - RecordToSkip := TwbFastStringList.Create; - RecordToSkip.Sorted := True; - RecordToSkip.Duplicates := dupIgnore; - - GroupToSkip := TwbFastStringList.Create; - GroupToSkip.Sorted := True; - GroupToSkip.Duplicates := dupIgnore; - - ChaptersToSkip := TwbFastStringList.Create; - ChaptersToSkip.Sorted := True; - ChaptersToSkip.Duplicates := dupIgnore; - - FilesMap := TwbFastStringList.Create; - FilesMap.Sorted := True; - FilesMap.Duplicates := dupError; -finalization - WriteSubRecordOrderList; - FreeAndNil(SubRecordOrderList); - FreeAndNil(RecordToSkip); - FreeAndNil(GroupToSkip); - FreeAndNil(ChaptersToSkip); - FreeAndNil(FilesMap); - wbContainedInDef[1] := nil; - wbContainedInDef[6] := nil; - wbContainedInDef[7] := nil; - wbContainedInDef[10] := nil; -end. diff --git a/lib/xedit/wbInit.pas b/lib/xedit/wbInit.pas deleted file mode 100644 index 91c84bf..0000000 --- a/lib/xedit/wbInit.pas +++ /dev/null @@ -1,887 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbInit; - -{$I wbDefines.inc} - -interface - -uses - Classes; - -var - wbApplicationTitle : string; - wbScriptsPath : string; - wbScriptToRun : string; - wbBackupPath : string; - wbTempPath : string; - wbSavePath : string; - wbMyGamesTheGamePath : string; - wbPluginsFileName : String; - wbSettingsFileName : string; - wbModGroupFileName : string; - wbPluginToUse : string; // Passed a specific plugin as parameter - wbLogFile : string; // Optional log file for this session - wbMyProfileName : string; - - wbMasterUpdateDone : Boolean; - wbDontSave : Boolean; - wbDontBackup : Boolean = False; - wbRemoveTempPath : Boolean = True; - wbQuickShowConflicts : Boolean; - wbQuickClean : Boolean; - - wbParamIndex : integer = 1; // First unused parameter - wbPluginsToUse : TStringList; - -function wbFindNextValidCmdLineFileName(var startingIndex : integer; out aValue : string; defaultPath : string = '') : Boolean; -function wbFindNextValidCmdLinePlugin(var startingIndex : integer; out aValue : string; defaultPath : string) : Boolean; -function wbFindCmdLineParam(const aSwitch : string; out aValue : string): Boolean; overload; - -function wbLoadMOHookFile: Boolean; -procedure SwitchToCoSave; - -implementation - -uses - SysUtils, - Windows, - Registry, - ShellApi, - Dialogs, - ShlObj, - IOUtils, - IniFiles, - wbHelpers, - wbInterface, - wbImplementation, - wbDefinitionsFNV, - wbDefinitionsFNVSaves, - wbDefinitionsFO3, - wbDefinitionsFO3Saves, - wbDefinitionsFO4, - wbDefinitionsFO4Saves, - wbDefinitionsTES3, - wbDefinitionsTES4, - wbDefinitionsTES4Saves, - wbDefinitionsTES5, - wbDefinitionsTES5Saves; - -function wbFindCmdLineParam(const aSwitch : string; - const aChars : TSysCharSet; - aIgnoreCase : Boolean; - out aValue : string) - : Boolean; overload; -var - i : Integer; - s : string; -begin - Result := False; - aValue := ''; - for i := 1 to ParamCount do begin - s := ParamStr(i); - if (aChars = []) or (s[1] in aChars) then - if aIgnoreCase then begin - if AnsiCompareText(Copy(s, 2, Length(aSwitch)), aSwitch) = 0 then begin - if (length(s)>(length(aSwitch)+2)) and (s[Length(aSwitch) + 2] = ':') then begin - aValue := Copy(s, Length(aSwitch) + 3, MaxInt); - Result := True; - end; - Exit; - end; - end else - if AnsiCompareStr(Copy(s, 2, Length(aSwitch)), aSwitch) = 0 then begin - if s[Length(aSwitch) + 2] = ':' then begin - aValue := Copy(s, Length(aSwitch) + 3, MaxInt); - Result := True; - end; - Exit; - end; - end; -end; - -function wbFindCmdLineParam(var startingIndex : integer; - const aChars : TSysCharSet; - out aValue : string) - : Boolean; overload; -var - i : integer; - s : string; -begin - Result := False; - aValue := ''; - for i := startingIndex to ParamCount do begin - s := ParamStr(i); - if (aChars = []) or (s[1] in aChars) then // skipped - Inc(startingIndex) - else begin - aValue := ParamStr(i); - startingIndex := i+1; - Result := True; - break; - end - end; -end; - -function wbFindCmdLineParam(const aSwitch : string; - out aValue : string) - : Boolean; overload; -begin - Result := wbFindCmdLineParam(aSwitch, SwitchChars, True, aValue); -end; - -function wbFindCmdLineParam(var startingIndex : integer; out aValue : string) : Boolean; overload; -begin - Result := wbFindCmdLineParam(startingIndex, SwitchChars, aValue); -end; - -function wbCheckForValidExtension(aFilePath : string; const anExtension : string): Boolean; overload; -begin - Result := UpperCase(ExtractFileExt(aFilePath)) = UpperCase(anExtension); -end; - -function wbCheckForPluginExtension(aFilePath : string): Boolean; -begin - Result := wbCheckForValidExtension(aFilePath, '.esp') or wbCheckForValidExtension(aFilePath, '.esm'); -end; - -function wbCheckForValidExtension(aFilePath : string): Boolean; overload; -begin - Result := wbCheckForPluginExtension(aFilePath) or - wbCheckForValidExtension(aFilePath, '.fos') or wbCheckForValidExtension(aFilePath, '.ess'); -end; - -function wbFindNextValidCmdLineFileName(var startingIndex : integer; out aValue : string; defaultPath : string = '') : Boolean; -begin - Result := wbFindCmdLineParam(startingIndex, SwitchChars, aValue); - if Result and not FileExists(aValue) then - if (defaultPath<>'') then - if FileExists(defaultPath+'\'+aValue) then - aValue := ExpandFileName(defaultPath+'\'+aValue) - else - Result := False - else - Result := False; -end; - -function wbFindNextValidCmdLinePlugin(var startingIndex : integer; out aValue : string; defaultPath : string) : Boolean; -begin - repeat - Result := wbFindNextValidCmdLineFileName(startingIndex, aValue, defaultPath); - until not Result or wbCheckForPluginExtension(aValue); - if Result then - if (AnsiCompareText(ExtractFilePath(ExpandFileName(aValue)), ExpandFileName(defaultPath)) = 0) then begin - aValue := ExtractFileName(aValue); - if not Assigned(wbPluginsToUse) then wbPluginsToUse := TStringList.Create; - wbPluginsToUse.Add(aValue); - end else - Result := False; -end; - -// several ini settings should be read before record definitions -// they may affect definitions like wbSimpleRecords -// and should be overridden by command line parameters -procedure ReadSettings; -var - Settings: TMemIniFile; -begin - try - Settings := TMemIniFile.Create(wbSettingsFileName); - try - wbLoadBSAs := Settings.ReadBool('Options', 'LoadBSAs', wbLoadBSAs); - wbSimpleRecords := Settings.ReadBool('Options', 'SimpleRecords', wbSimpleRecords); - wbShowFlagEnumValue := Settings.ReadBool('Options', 'ShowFlagEnumValue', wbShowFlagEnumValue); - wbTrackAllEditorID := Settings.ReadBool('Options', 'TrackAllEditorID', wbTrackAllEditorID); - finally - Settings.Free; - end; - finally - end; -end; - -function GetCSIDLShellFolder(CSIDLFolder: integer): string; -begin - SetLength(Result, MAX_PATH); - SHGetSpecialFolderPath(0, PChar(Result), CSIDLFolder, True); - SetLength(Result, StrLen(PChar(Result))); - if (Result <> '') then - Result := IncludeTrailingBackslash(Result); -end; - -function CheckAppPath: string; -const - //gmFNV, gmFO3, gmTES3, gmTES4, gmTES5, gmSSE, gmFO4 - ExeName : array[TwbGameMode] of string = - ('FalloutNV.exe', 'Fallout3.exe', 'Morrowind.exe', 'Oblivion.exe', 'TESV.exe', 'SkyrimSE.exe', 'Fallout4.exe'); -var - s: string; -begin - Result := ''; - s := ExtractFilePath(ParamStr(0)); - while Length(s) > 3 do begin - if FileExists(s + ExeName[wbGameMode]) and DirectoryExists(s + 'Data') then begin - Result := s; - Exit; - end; - s := ExtractFilePath(ExcludeTrailingPathDelimiter(s)); - end; -end; - -{===SafeLoadLibrary============================================================} -{$IFDEF CPUX86} -function TestAndClearFPUExceptions(AExceptionMask: Word): Boolean; -asm - PUSH ECX - MOV CX, AX - FSTSW AX - TEST AX, CX - JNE @@bad - XOR EAX, EAX - INC EAX - JMP @@exit -@@bad: - XOR EAX, EAX -@@exit: - POP ECX - FCLEX - RET -end; -{------------------------------------------------------------------------------} -function SafeLoadLibrary(const Filename: string; ErrorMode: UINT): HMODULE; -var - OldMode: UINT; - FPUControlWord: Word; -begin - OldMode := SetErrorMode(ErrorMode); - try - FPUControlWord := Get8087CW(); - Result := LoadLibrary(PChar(Filename)); - TestAndClearFPUExceptions(0); - Set8087CW(FPUControlWord); - finally - SetErrorMode(OldMode); - end; -end; -{==============================================================================} -{$ENDIF CPUX86} - - -function wbLoadMOHookFile: Boolean; -var - HookDll : HMODULE; - Init : function(logLevel: Integer; profileName: LPCWSTR): BOOL; cdecl; -begin - if not wbShouldLoadMOHookFile then - Exit(True); - Result := False; - if not FileExists(wbMOHookFile) then - Exit; - - HookDll := SafeLoadLibrary(wbMOHookFile, SEM_NOOPENFILEERRORBOX); - if HookDll <> 0 then begin - Pointer(@Init) := GetProcAddress(HookDll, 'Init'); - if Assigned(Pointer(@Init)) then - Result := Init(0, PWideChar(UnicodeString(wbMOProfile))); - end; -end; - -procedure DoInitPath(const ParamIndex: Integer); -const - sBethRegKey = '\SOFTWARE\Bethesda Softworks\'; - sBethRegKey64 = '\SOFTWARE\Wow6432Node\Bethesda Softworks\'; -var - s : String; - IniFile : TIniFile; -begin - wbModGroupFileName := wbProgramPath + wbAppName + wbToolName + '.modgroups'; - - if not wbFindCmdLineParam('S', wbScriptsPath) then - wbScriptsPath := wbProgramPath + 'Edit Scripts\'; - - if not wbFindCmdLineParam('T', wbTempPath) then - wbTempPath := IncludeTrailingPathDelimiter(TPath.GetTempPath + wbAppName + 'Edit') - else - wbRemoveTempPath := not DirectoryExists(wbTempPath); - - if not wbFindCmdLineParam('D', wbDataPath) then begin - wbDataPath := CheckAppPath; - - if wbDataPath = '' then with TRegistry.Create do try - RootKey := HKEY_LOCAL_MACHINE; - - if not OpenKeyReadOnly(sBethRegKey + wbGameName2 + '\') then - if not OpenKeyReadOnly(sBethRegKey64 + wbGameName2 + '\') then begin - s := 'Fatal: Could not open registry key: ' + sBethRegKey + wbGameName + '\'; -// if wbGameMode = gmTES5 then // All game exists on steam now - ShowMessage(s+#13+#10+'This can happen after Steam updates, run game''s launcher to restore registry settings'); - wbDontSave := True; - Exit; - end; - - wbDataPath := ReadString('Installed Path'); - - if wbDataPath = '' then begin - s := 'Fatal: Could not determine '+wbGameName2+' installation path, no "Installed Path" registry key'; -// if wbGameMode = gmTES5 then - ShowMessage(s+#13+#10+'This can happen after Steam updates, run game''s launcher to restore registry settings'); - wbDontSave := True; - end; - finally - Free; - end; - if wbDataPath <>'' then - wbDataPath := IncludeTrailingPathDelimiter(wbDataPath) + 'Data\'; - end else - wbDataPath := IncludeTrailingPathDelimiter(wbDataPath); - - wbOutputPath := wbDataPath; - if wbFindCmdLineParam('O', s) and (Length(s) > 0) then - if s[1] = '.' then - //assume relative path - wbOutputPath := IncludeTrailingPathDelimiter(wbOutputPath + s) - else - //assume absolute path - wbOutputPath := IncludeTrailingPathDelimiter(s); - - wbMOHookFile := wbDataPath + '..\Mod Organizer\hook.dll'; - - if not wbFindCmdLineParam('I', wbTheGameIniFileName) then begin - wbMyProfileName := GetCSIDLShellFolder(CSIDL_PERSONAL); - if wbMyProfileName = '' then begin - ShowMessage('Fatal: Could not determine my documents folder'); - Exit; - end; - wbMyGamesTheGamePath := wbMyProfileName + 'My Games\'+ wbGameName2 +'\'; - - if wbGameMode in [gmFO3, gmFNV] then - wbTheGameIniFileName := wbMyGamesTheGamePath + 'Fallout.ini' - else if wbGameMode = gmFO4 then - wbTheGameIniFileName := wbMyGamesTheGamePath + 'Fallout4.ini' - else - wbTheGameIniFileName := wbMyGamesTheGamePath + wbGameName + '.ini'; - end; - - if not wbFindCmdLineParam('G', wbSavePath) then begin - if wbMyGamesTheGamePath = '' then - wbMyGamesTheGamePath := ExtractFilePath(wbTheGameIniFileName); - - s := 'Saves\'; - if FileExists(wbTheGameIniFileName) then begin - IniFile := TIniFile.Create(wbTheGameIniFileName); - try - s := IniFile.ReadString('General', 'SLocalSavePath', s); - finally - FreeAndNil(IniFile); - end; - end; - wbSavePath := wbMyGamesTheGamePath + s; - end; - wbSavePath := IncludeTrailingPathDelimiter(wbSavePath); - - wbParamIndex := ParamIndex; - if not wbFindCmdLineParam('P', wbPluginsFileName) then - if not (wbFindNextValidCmdLineFileName(wbParamIndex, wbPluginsFileName) and SameText(ExtractFileExt(wbPluginsFileName), '.txt')) - or wbCheckForValidExtension(wbPluginsFileName) - then begin - wbParamIndex := ParamIndex; - wbPluginsFileName := GetCSIDLShellFolder(CSIDL_LOCAL_APPDATA); - if wbPluginsFileName = '' then begin - ShowMessage('Fatal: Could not determine the local application data folder'); - Exit; - end; - - wbPluginsFileName := wbPluginsFileName + wbGameName2 + '\Plugins.txt'; - end; - - // settings in the ini file next to app, or in the same folder with plugins.txt - wbSettingsFileName := wbProgramPath + wbAppName + wbToolName + '.ini'; - if not FileExists(wbSettingsFileName) then - wbSettingsFileName := ChangeFileExt(wbPluginsFileName, '.'+LowerCase(wbAppName)+'viewsettings'); - - wbBackupPath := ''; - if not (wbDontSave or wbFindCmdLineParam('B', wbBackupPath)) then begin - wbBackupPath := wbDataPath + wbAppName + 'Edit Backups\'; - if not DirectoryExists(wbBackupPath) then - if not ForceDirectories(wbBackupPath) then - wbBackupPath := wbDataPath; - end; - wbFindCmdLineParam('R', wbLogFile); -end; - -var - wbForcedModes: string; - AppGameMode, AppToolMode, AppSourceMode: string; - -procedure DetectAppMode; -const - SourceModes : array [1..2] of string = ('plugins', 'saves'); - GameModes: array [1..6] of string = ('tes4', 'tes5', 'sse', 'fo3', 'fnv', 'fo4'); - ToolModes: array [1..12] of string = ( - 'edit', 'view', 'lodgen', 'script', 'translate', - 'setesm', 'clearesm', 'sortandclean', 'sortandcleanmasters', - 'checkforerrors', 'checkforitm', 'checkfordr'); -var - s, p: string; -begin - // Detecting game mode - // check command line params first for mode overrides - // they should take precendence over application name detection - // AppSourceMode := SourceModes[1]; - for s in SourceModes do - if FindCmdLineSwitch(s) or wbFindCmdLineParam(s, p) or (Pos(s, wbForcedModes) <> 0) then begin - AppSourceMode := s; - Break; - end; - // if no overrrides, then check by executable name - if AppSourceMode = '' then - for s in SourceModes do - if (Pos(s, LowerCase(ExtractFileName(ParamStr(0)))) <> 0) or (Pos(s, wbForcedModes) <> 0) then begin - AppSourceMode := s; - Break; - end; - // if still nothing, then default value - if AppSourceMode = '' then - AppSourceMode := 'plugins'; - - for s in GameModes do - if FindCmdLineSwitch(s) or wbFindCmdLineParam(s, p) or (Pos(s, wbForcedModes) <> 0) then begin - AppGameMode := s; - Break; - end; - // if no overrrides, then check by executable name - if AppGameMode = '' then - for s in GameModes do - if (Pos(s, LowerCase(ExtractFileName(ParamStr(0)))) <> 0) or (Pos(s, wbForcedModes) <> 0) then begin - AppGameMode := s; - Break; - end; - // if still nothing, then default value - if AppGameMode = '' then - AppGameMode := 'fo4'; - - // the same for tool mode - for s in ToolModes do - if FindCmdLineSwitch(s) or wbFindCmdLineParam(s, p) or (Pos(s, wbForcedModes) <> 0) then begin - AppToolMode := s; - Break; - end; - if AppToolMode = '' then - for s in ToolModes do - if (Pos(s, LowerCase(ExtractFileName(ParamStr(0)))) <> 0) or (Pos(s, wbForcedModes) <> 0) then begin - AppToolMode := s; - Break; - end; - if AppToolMode = '' then - AppToolMode := 'edit'; -end; - -function isMode(aMode: String): Boolean; -begin - aMode := LowerCase(aMode); - Result := (AppGameMode = aMode) or (AppToolMode = aMode) or (AppSourceMode = aMode); -end; - -// Force app modes -function CheckForcedMode: Boolean; -var - s: string; - i: integer; -begin - Result := False; - // there is a game specific script provided to execute - // go into 'script' tool mode and detect game mode by script's extension - i := 1; - if wbFindCmdLineParam('script', s) or wbFindNextValidCmdLineFileName(i, s) then begin - if not FileExists(s) then - Exit; - wbScriptToRun := s; - s := ExtractFileExt(s); - i := Pos(UpperCase('pas'), UpperCase(s)); - if (i > 0) and (i = Length(s) - 2) then begin - wbForcedModes := Copy(s, 2, Length(s) - 4) + ',script'; - Result := True; - end; - end; -end; - -procedure wbDoInit; -var - s: string; -begin - wbReportMode := False; - wbEditAllowed := True; - wbDontSave := False; - - CheckForcedMode; - DetectAppMode; - - if isMode('Saves') then begin - wbToolSource := tsSaves; - wbSourceName := 'Saves'; - wbUseFalsePlugins := True; - end else begin // defaults to plugin - wbToolSource := tsPlugins; - wbSourceName := 'Plugins'; - end; - - if isMode('View') then begin - wbToolMode := tmView; - wbToolName := 'View'; - wbEditAllowed := False; - wbDontSave := True; - end else if isMode('MasterUpdate') then begin - wbToolMode := tmMasterUpdate; - wbToolName := 'MasterUpdate'; - end else if isMode('MasterRestore') then begin - wbToolMode := tmMasterRestore; - wbToolName := 'MasterRestore'; - end else if isMode('LODGen') then begin - wbToolMode := tmLODgen; - wbToolName := 'LODGen'; - wbEditAllowed := False; - wbDontSave := True; - end else if isMode('Script') then begin - wbToolMode := tmScript; - wbToolName := 'Script'; - end else if isMode('Translate') then begin - wbToolMode := tmTranslate; - wbToolName := 'Trans'; - end else if isMode('setESM') then begin - wbToolMode := tmESMify; - wbToolName := 'SettingESMflag'; - end else if isMode('clearESM') then begin - wbToolMode := tmESPify; - wbToolName := 'ClearingESMflag'; - end else if isMode('SortAndClean') then begin - wbToolMode := tmSortAndCleanMasters; - wbToolName := 'SortAndCleanMasters'; - end else if isMode('CheckForErrors') then begin - wbToolMode := tmCheckForErrors; - wbToolName := 'CheckForErrors'; - end else if isMode('CheckForITM') then begin - wbToolMode := tmCheckForITM; - wbToolName := 'CheckForITM'; - end else if isMode('CheckForDR') then begin - wbToolMode := tmCheckForDR; - wbToolName := 'CheckForDR'; - end else if isMode('Edit') then begin - wbToolMode := tmEdit; - wbToolName := 'Edit'; - end else begin - ShowMessage('Application name must contain Edit, View, LODGen, MasterUpdate, MasterRestore, setESM, clearESM, sortAndCleanMasters, CheckForITM, CheckForDR or CheckForErrors to select mode.'); - Exit; - end; - - if isMode('FNV') then begin - wbGameMode := gmFNV; - wbAppName := 'FNV'; - wbGameName := 'FalloutNV'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in [tmMasterUpdate, tmMasterRestore]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins, tsSaves]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('FO3') then begin - wbGameMode := gmFO3; - wbAppName := 'FO3'; - wbGameName := 'Fallout3'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in [tmMasterUpdate, tmMasterRestore]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('TES3') then begin - wbGameMode := gmTES3; - wbAppName := 'TES3'; - wbGameName := 'Morrowind'; - if not (wbToolMode in []) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in []) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('TES4') then begin - wbGameMode := gmTES4; - wbAppName := 'TES4'; - wbGameName := 'Oblivion'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in []) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('TES5') then begin - wbGameMode := gmTES5; - wbAppName := 'TES5'; - wbGameName := 'Skyrim'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in [tmTranslate]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins, tsSaves]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('SSE') then begin - wbGameMode := gmSSE; - wbAppName := 'SSE'; - wbGameName := 'Skyrim'; - wbGameName2 := 'Skyrim Special Edition'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in [tmTranslate]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins, tsSaves]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else if isMode('FO4') then begin - wbGameMode := gmFO4; - wbAppName := 'FO4'; - wbGameName := 'Fallout4'; - wbArchiveExtension := '.ba2'; - if not (wbToolMode in wbAlwaysMode) and not (wbToolMode in [tmTranslate]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbToolName); - Exit; - end; - if not (wbToolSource in [tsPlugins, tsSaves]) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName); - Exit; - end; - end else begin - ShowMessage('Application name must contain FNV, FO3, FO4, SSE, TES4 or TES5 to select game.'); - Exit; - end; - if (wbToolSource = tsSaves) and (wbToolMode = tmEdit) then begin - ShowMessage('Application '+wbGameName+' does not currently support '+wbSourceName+' in '+wbToolName+' mode.'); - Exit; - end; - - if wbGameName2 = '' then - wbGameName2 := wbGameName; - - DoInitPath(wbParamIndex); - - if wbGameMode = gmFNV then begin - wbVWDInTemporary := True; - wbLoadBSAs := False; - ReadSettings; - end else if wbGameMode = gmFO3 then begin - wbVWDInTemporary := True; - wbLoadBSAs := False; - ReadSettings; - end else if wbGameMode = gmTES3 then begin - wbLoadBSAs := False; - wbAllowInternalEdit := false; - ReadSettings; - end else if wbGameMode = gmTES4 then begin - wbLoadBSAs := True; - wbAllowInternalEdit := false; - ReadSettings; - end else if wbGameMode = gmTES5 then begin - wbVWDInTemporary := True; - wbLoadBSAs := True; // localization won't work otherwise - wbHideIgnored := False; // to show Form Version - ReadSettings; - end else if wbGameMode = gmSSE then begin - wbVWDInTemporary := True; - wbLoadBSAs := True; // localization won't work otherwise - wbHideIgnored := False; // to show Form Version - ReadSettings; - end else if wbGameMode = gmFO4 then begin - wbVWDInTemporary := True; - wbVWDAsQuestChildren := True; - wbLoadBSAs := True; // localization won't work otherwise - wbHideIgnored := False; // to show Form Version - ReadSettings; - //wbCreateContainedIn := False; - end else begin - Exit; - end; - - case wbGameMode of - gmFNV: case wbToolSource of - tsSaves: DefineFNVSaves; - tsPlugins: DefineFNV; - end; - gmFO3: case wbToolSource of - tsSaves: DefineFO3Saves; - tsPlugins: DefineFO3; - end; - gmFO4: case wbToolSource of - tsSaves: DefineFO4Saves; - tsPlugins: DefineFO4; - end; - gmTES3: case wbToolSource of - tsPlugins: DefineTES3; - end; - gmTES4: case wbToolSource of - tsSaves: DefineTES4Saves; - tsPlugins: DefineTES4; - end; - gmTES5: case wbToolSource of - tsSaves: DefineTES5Saves; - tsPlugins: DefineTES5; - end; - gmSSE: case wbToolSource of - tsSaves: DefineTES5Saves; - tsPlugins: DefineTES5; - end - else - ShowMessage('Application name must contain FNV, FO3, FO4, SSE, TES4 or TES5 to select game.'); - Exit; - end; - - case wbGameMode of - gmTES5, gmSSE: - wbLanguage := 'English'; - gmFO4: - wbLanguage := 'En'; - end; - if wbFindCmdLineParam('l', s) then - wbLanguage := s; - - if wbFindCmdLineParam('cp', s) then begin - if SameText(s, 'utf-8') then - wbStringEncoding := seUTF8; - end; - - if FindCmdLineSwitch('speed') then - wbSpeedOverMemory := True; - if FindCmdLineSwitch('memory') then - wbSpeedOverMemory := False; - - if FindCmdLineSwitch('report') then - wbReportMode := (DebugHook <> 0); - if FindCmdLineSwitch('MoreInfoForIndex') then - wbMoreInfoForIndex := true; - - if FindCmdLineSwitch('fixup') then - wbAllowInternalEdit := True - else if FindCmdLineSwitch('nofixup') then - wbAllowInternalEdit := False; - - if FindCmdLineSwitch('skipbsa') then - wbLoadBSAs := False - else if FindCmdLineSwitch('forcebsa') then - wbLoadBSAs := True; - - if FindCmdLineSwitch('skipInternalEditing') then - wbAllowInternalEdit := False - else if FindCmdLineSwitch('forceInternalEditing') then - wbAllowInternalEdit := True; - - if FindCmdLineSwitch('showfixup') then - wbShowInternalEdit := True - else if FindCmdLineSwitch('hidefixup') then - wbShowInternalEdit := False; - - if FindCmdLineSwitch('quickshowconflicts') then - wbQuickShowConflicts := True; - - if FindCmdLineSwitch('IKnowWhatImDoing') then - wbIKnowWhatImDoing := True; - - if FindCmdLineSwitch('quickclean') and (wbToolSource in [tsPlugins]) then - wbQuickClean := wbIKnowWhatImDoing; - - if FindCmdLineSwitch('TrackAllEditorID') then - wbTrackAllEditorID := True; - - if wbToolMode in wbPluginModes then // look for the file name - if not wbFindNextValidCmdLinePlugin(wbParamIndex, wbPluginToUse, wbDataPath) then begin - ShowMessage(wbToolName+' mode requires a valid plugin name!'); - Exit; - end; - - if wbToolMode = tmLODgen then begin - wbIKnowWhatImDoing := True; - wbAllowInternalEdit := False; - wbShowInternalEdit := False; - wbLoadBSAs := True; - wbBuildRefs := False; - end else if wbToolMode = tmScript then begin - wbIKnowWhatImDoing := True; - wbLoadBSAs := True; - wbBuildRefs := True; - end else if wbToolMode in [tmMasterUpdate, tmESMify] then begin - wbIKnowWhatImDoing := True; - wbAllowInternalEdit := False; - wbShowInternalEdit := False; - wbLoadBSAs := False; - wbBuildRefs := False; - wbMasterUpdateFilterONAM := wbToolMode in [tmESMify]; - if FindCmdLineSwitch('filteronam') then - wbMasterUpdateFilterONAM := True - else if FindCmdLineSwitch('noFilteronam') then - wbMasterUpdateFilterONAM := True; - if FindCmdLineSwitch('FixPersistence') then - wbMasterUpdateFixPersistence := True - else if FindCmdLineSwitch('NoFixPersistence') then - wbMasterUpdateFixPersistence := False; - end else if wbToolMode in [tmMasterRestore, tmESPify, tmCheckForDR, tmCheckForITM, tmCheckForErrors] then begin - wbIKnowWhatImDoing := True; - wbAllowInternalEdit := False; - wbShowInternalEdit := False; - wbLoadBSAs := False; - wbBuildRefs := False; - end else if wbToolMode = tmTranslate then begin - wbTranslationMode := True; - end; - - wbApplicationTitle := wbAppName + wbToolName + ' ' + VersionString; - {$IFDEF LiteVersion} - wbApplicationTitle := wbApplicationTitle + ' Lite'; - {$ENDIF} - {$IFDEF WIN64} - wbApplicationTitle := wbApplicationTitle + ' x64'; - {$ENDIF WIN64} - - if FindCmdLineSwitch('fixuppgrd') then - wbFixupPGRD := True; - - wbShouldLoadMOHookFile := wbFindCmdLineParam('moprofile', wbMOProfile); - - if (wbToolMode = tmEdit) and not wbIsAssociatedWithExtension('.' + wbAppName + 'pas') then try - wbAssociateWithExtension('.' + wbAppName + 'pas', wbAppName + 'Script', wbAppName + wbToolName + ' script'); - except end; - -end; - -procedure SwitchToCoSave; -begin - case wbGameMode of - gmFNV: SwitchToFNVCoSave; - gmFO3: SwitchToFO3CoSave; - gmTES4: SwitchToTES4CoSave; - gmTES5: SwitchToTES5CoSave; - gmSSE: SwitchToTES5CoSave; - end; -end; - -initialization - wbDoInit; - -end. diff --git a/lib/xedit/wbInterface.pas b/lib/xedit/wbInterface.pas deleted file mode 100644 index 41e0287..0000000 --- a/lib/xedit/wbInterface.pas +++ /dev/null @@ -1,14801 +0,0 @@ -{****************************************************************************** - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbInterface; - -{$I wbDefines.inc} - -interface - -uses - Classes, - SysUtils, - Graphics; - -const - VersionString = '3.2'; - clOrange = $004080FF; - wbFloatDigits = 6; - wbHardcodedDat = '.Hardcoded.keep.this.with.the.exe.and.otherwise.ignore.it.I.really.mean.it.dat'; - -type - TwbProgressCallback = procedure(const aStatus: string); - TwbPointerArray = array [0..Pred(High(Integer) div SizeOf(Pointer))] of Pointer; - PwbPointerArray = ^TwbPointerArray; {General array of pointer} - -threadvar - wbProgressCallback : TwbProgressCallback; - wbCurrentTick : Integer; - wbCurrentAction : string; - wbStartTime : TDateTime; - wbShowStartTime : Integer; - -var - wbDisplayLoadOrderFormID : Boolean = False; - wbSimpleRecords : Boolean = True; - wbFixupPGRD : Boolean = False; - wbIKnowWhatImDoing : Boolean = False; - wbHideUnused : Boolean = True; - wbHideIgnored : Boolean = True; - wbHideNeverShow : Boolean = True; - wbShowFormVersion : Boolean = False; - wbShowFlagEnumValue : Boolean = False; - wbShowGroupRecordCount : Boolean = False; - wbDisplayShorterNames : Boolean = False; - wbSortSubRecords : Boolean = False; - wbSortFLST : Boolean = True; - wbSortGroupRecord : Boolean = False; - wbRemoveOffsetData : Boolean = True; - wbEditAllowed : Boolean = False; - wbFlagsAsArray : Boolean = False; - wbDelayLoadRecords : Boolean = True; - wbMoreInfoForUnknown : Boolean = False; - wbMoreInfoForIndex : Boolean = False; - wbTranslationMode : Boolean = False; - wbTestWrite : Boolean = False; - wbForceNewHeader : Boolean = False; // add wbNewHeaderAddon value to the headers of mainrecords and GRUP records - wbNewHeaderAddon : Cardinal = 40; // 4 additional bytes, 40 - new form version field - wbRequireLoadOrder : Boolean = False; - wbCreateContainedIn : Boolean = True; - wbVWDInTemporary : Boolean = False; - wbVWDAsQuestChildren : Boolean = False; - wbResolveAlias : Boolean = True; - wbActorTemplateHide : Boolean = True; - wbClampFormID : Boolean = True; - wbAllowErrors : Boolean = True; - wbDoNotBuildRefsFor : TStringList; - wbCopyIsRunning : Integer = 0; - - wbUDRSetXESP : Boolean = True; - wbUDRSetScale : Boolean = False; - wbUDRSetScaleValue : Single = 0.0; - wbUDRSetZ : Boolean = True; - wbUDRSetZValue : Single = -30000; - wbUDRSetMSTT : Boolean = True; - wbUDRSetMSTTValue : Int64 = $0000001B; { AshPile01 } - - wbMasterUpdateFilterONAM : Boolean = False; - wbMasterUpdateFixPersistence : Boolean = True; - - wbAllowInternalEdit : Boolean = True; - wbShowInternalEdit : Boolean = False; - - wbReportMode : Boolean = False; - wbReportUnused : Boolean = False; - wbReportRequired : Boolean = True; - wbReportUnusedData : Boolean = True; - wbReportUnknownFormIDs : Boolean = True; - wbReportUnknownFloats : Boolean = True; - wbReportUnknownStrings : Boolean = True; - wbReportEmpty : Boolean = True; - wbReportSometimesEmpty : Boolean = True; - wbReportFormIDs : Boolean = True; - wbReportNotFoundButAllowedFormIDs : Boolean = True; - wbReportUnknownFlags : Boolean = True; - wbReportUnknownEnums : Boolean = True; - wbReportFormIDNotAllowedReferences : Boolean = True; - wbReportUnknown : Boolean = True; - wbMoreInfoForRequired : Boolean = False; - wbMoreInfoForDecider : Boolean = False; - wbTrackAllEditorID : Boolean = False; - wbShowTip : Boolean = True; - - wbCheckExpectedBytes : Boolean = True; - - wbRotationFactor : Extended = 180/Pi; - wbRotationScale : Integer = 4; - - wbDumpOffset : Integer = 0; // 1= starting offset, 2 = Count, 3 = Offsets, size and count - wbBaseOffset : Cardinal = 0; - - wbProgramPath : string; - wbDataPath : string; - wbOutputPath : string; - wbTheGameIniFileName : string; - - wbShouldLoadMOHookFile : Boolean; - wbMOProfile : string; - wbMOHookFile : string; - - wbSpeedOverMemory : Boolean = False; - -{$IFDEF USE_CODESITE} -type - TwbLoggingArea = ( - laAddIfMissing, - laElementAssign, - laElementCanAssign, - laElementSetToDefault, - laElementWriteToStream, - laElementMergeStorage, - - laDummy - ); - TwbLoggingAreas = set of TwbLoggingArea; - -var - wbLoggingAreas : TwbLoggingAreas = [ - - laAddIfMissing, - laElementAssign, - laElementCanAssign, - laElementSetToDefault, - //laElementWriteToStream, - //laElementMergeStorage, - - laDummy - ]; - -function wbCodeSiteLoggingEnabled: Boolean; -function wbBeginCodeSiteLogging: Integer; -function wbEndCodeSiteLogging: Integer; -{$ENDIF} - - -type - TConflictAll = ( - caUnknown, - caOnlyOne, - caNoConflict, - caConflictBenign, - caOverride, - caConflict, - caConflictCritical - ); - - TByteSet = set of Byte; - TConflictAllSet = set of TConflictAll; - TConflictAllColors = array[TConflictAll] of TColor; - - TConflictThis = ( - ctUnknown, - ctIgnored, - ctNotDefined, - ctIdenticalToMaster, - ctOnlyOne, - ctHiddenByModGroup, - ctMaster, - ctConflictBenign, - ctOverride, - ctIdenticalToMasterWinsConflict, - ctConflictWins, - ctConflictLoses - ); - - TConflictThisSet = set of TConflictThis; - TConflictThisColors = array[TConflictThis] of TColor; - -var - wbColorConflictAll: TConflictAllColors = ( - clDefault, // caUnknown - clDefault, // caOnlyOne - clLime, // caNoConflict - clYellow, // caConflictBenign - clYellow, // caOverride - clRed, // caConflict - clFuchsia // caConflictCritical - ); - - wbColorConflictThis: TConflictThisColors = ( - clWindowText, // ctUnknown - clWindowText, // ctIgnored - clMedGray, // ctNotDefined - clDkGray, // ctIdenticalToMaster - clWindowText, // ctOnlyOne - clLtGray, // ctHiddenByModGroup - clPurple, // ctMaster - clWindowText, // ctConflictBenign - clGreen, // ctOverride - clOlive, // ctIdenticalToMasterWinsConflict - clOrange, // ctConflictWins - clRed // ctConflictLoses - ); - -type - TwbConflictPriority = ( - cpIgnore, - cpBenignIfAdded, - cpBenign, - cpTranslate, - cpNormal, - cpNormalIgnoreEmpty, - cpCritical, - cpFormID - ); - - LongRecSmall = packed record - Lo, Hi: Smallint; - end; - - PwbSignature = ^TwbSignature; - TwbSignature = array[0..3] of AnsiChar; - TwbSignatures = array of TwbSignature; - TwbFileMagic = string; - - TwbIntType = ( - it0, - itU8, - itS8, - itU16, - itS16, - itU32, - itS32, - itU64, - itS64, - itU24, - itU6to30 - ); - - TwbDefType = ( - dtRecord, - dtSubRecord, - dtSubRecordArray, - dtSubRecordStruct, - dtSubRecordUnion, - dtString, - dtLString, - dtLenString, - dtByteArray, - dtInteger, - dtIntegerFormater, - dtIntegerFormaterUnion, - dtFlag, - dtFloat, - dtArray, - dtStruct, - dtUnion, - dtEmpty, - dtStructChapter - ); - - TwbGroupTypes = set of Byte; - TwbStringEncoding = (seCP1252, seUTF8); - -var - dtNonValues : set of TwbDefType = [ - dtRecord, - dtSubRecord, - dtSubRecordArray, - dtSubRecordStruct, - dtSubRecordUnion, - dtArray, - dtStruct, - dtUnion, - dtStructChapter - ]; - - wbStringEncoding: TwbStringEncoding = seCP1252; - -type - IwbDef = interface; - - TwbDefs = array of IwbDef; - TwbDefPath = array of record - Def : IwbDef; - Index : Integer; - end; - - IwbElement = interface; - - IwbDef = interface - ['{C7739FBD-3B58-48A2-9DD0-8057D3496892}'] - function GetDefType: TwbDefType; - function GetDefTypeName: string; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; - function Assign(const aTarget: IwbElement; aIndex: Integer; const aSource: IwbElement; aOnlySK: Boolean): IwbElement; - function GetDefID: Cardinal; - function Equals(const aDef: IwbDef): Boolean; - function GetConflictPriority(const aElement: IwbElement): TwbConflictPriority; - function GetConflictPriorityCanChange: Boolean; - function GetRequired: Boolean; - function CanContainFormIDs: Boolean; - function GetDontShow(const aElement: IwbElement): Boolean; - function GetHasDontShow: Boolean; - function GetRoot: IwbDef; - function GetNoReach: Boolean; - function GetParent: IwbDef; - - procedure Report(const aParents: TwbDefPath); - procedure Used(const aElement: IwbElement = nil; const s: string = ''); - procedure PossiblyRequired; - procedure NotRequired; - function IsNotRequired: Boolean; - - property DefType: TwbDefType - read GetDefType; - property DefTypeName: string - read GetDefTypeName; - property DefID: Cardinal - read GetDefID; - property ConflictPriority[const aElement: IwbElement]: TwbConflictPriority - read GetConflictPriority; - property ConflictPriorityCanChange: Boolean - read GetConflictPriorityCanChange; - property Required: Boolean - read GetRequired; - property DontShow[const aElement: IwbElement]: Boolean - read GetDontShow; - property HasDontShow: Boolean - read GetHasDontShow; - property Root: IwbDef - read GetRoot; - property NoReach: Boolean - read GetNoReach; - property Parent: IwbDef - read GetParent; - end; - - TwbElementType = ( - etFile, - etMainRecord, - etGroupRecord, - etSubRecord, - etSubRecordStruct, - etSubRecordArray, - etSubRecordUnion, - etArray, - etStruct, - etValue, - etFlag, - etStringListTerminator, - etUnion, - etStructChapter - ); - - TwbElementTypes = set of TwbElementType; - - IwbContainer = interface; - IwbFile = interface; - IwbNamedDef = interface; - IwbValueDef = interface; - IwbMainRecord = interface; - - TwbElementState = ( - esModified, - esInternalModified, - esUnsaved, - esSortKeyValid, - esExtendedSortKeyValid, - esHidden, - esParentHidden, - esParentHiddenChecked, - esNotReachable, - esReachable, - esTagged, - esDeciding, - esNotSuitableToAddTo, - esDummy, {Used in wbScriptAdapter as a default value} - esConstructionComplete, - esDestroying, - esChangeNotified, - esModifiedUpdated, - esSorting - ); - - TwbElementStates = set of TwbElementState; - - TwbEditType = ( - etDefault, - etComboBox, - etCheckComboBox - ); - - TDynFiles = array of IwbFile; - - IwbElement = interface - ['{F4B4637D-C794-415F-B5C7-587EAA4095B3}'] - - function GetElementID: Cardinal; - function GetElementStates: TwbElementStates; - procedure SetElementState(aState: TwbElementState; Clear: Boolean = false); - function Equals(const aElement: IwbElement): Boolean; - - function GetValue: string; - function GetCheck: string; - function GetSortKey(aExtended: Boolean): string; - function GetSortPriority: Integer; - function GetName: string; - function GetBaseName: string; - function GetDisplayName: string; - function GetShortName: string; - function GetPath: string; - function GetFullPath: string; - function GetPathName: string; - function GetSkipped: Boolean; - function GetDef: IwbNamedDef; - function GetValueDef: IwbValueDef; - function GetResolvedValueDef: IwbValueDef; - function GetElementType: TwbElementType; - function GetContainer: IwbContainer; - function GetContainingMainRecord: IwbMainRecord; - function GetFile: IwbFile; - function GetReferenceFile: IwbFile; - function GetSortOrder: Integer; - procedure SetSortOrder(aSortOrder: Integer); - function GetMemoryOrder: Integer; - procedure SetMemoryOrder(aSortOrder: Integer); - procedure BuildRef; - function CompareExchangeFormID(aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; - function GetEditValue: string; - procedure SetEditValue(const aValue: string); - function GetNativeValue: Variant; - procedure SetNativeValue(const aValue: Variant); - function GetIsEditable: Boolean; - function GetIsRemoveable: Boolean; - procedure RequestStorageChange(var aBasePtr, aEndPtr: Pointer; aNewSize: Cardinal); - function GetConflictPriority: TwbConflictPriority; - function GetConflictPriorityCanChange: Boolean; - function GetModified: Boolean; - procedure MarkModifiedRecursive; - function GetIsInjected: Boolean; - function GetReferencesInjected: Boolean; - function GetInjectionSourceFiles: TDynFiles; - function GetIsNotReachable: Boolean; - function GetDataSize: Integer; - procedure SetDataSize(aSize: Integer); - procedure MergeStorage(var aBasePtr: Pointer; aEndPtr: Pointer); - procedure InformStorage(var aBasePtr: Pointer; aEndPtr: Pointer); - procedure AddReferencedFromID(aFormID: Cardinal); - function CanContainFormIDs: Boolean; - function GetLinksTo: IwbElement; - function GetNoReach: Boolean; - procedure ReportRequiredMasters(aStrings: TStrings; aAsNew: Boolean; recursive: Boolean = True; initial: Boolean = false); - function AddIfMissing(const aElement: IwbElement; aAsNew, aDeepCopy : Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; - procedure ResetConflict; - procedure ResetReachable; - function RemoveInjected(aCanRemove: Boolean): Boolean; - function GetEditType: TwbEditType; - function GetEditInfo: string; - function GetDontShow: Boolean; - procedure SetToDefault; - - procedure NotifyChanged(aContainer: Pointer); - - function CanAssign(aIndex: Integer; const aElement: IwbElement; aCheckDontShow: Boolean): Boolean; - function Assign(aIndex: Integer; const aElement: IwbElement; aOnlySK: Boolean): IwbElement; - procedure Remove; - - function HasErrors: Boolean; - - procedure Hide; - procedure Show; - function GetIsHidden: Boolean; - - procedure MoveUp; - procedure MoveDown; - function CanMoveUp: Boolean; - function CanMoveDown: Boolean; - - procedure NextMember; - procedure PreviousMember; - function CanChangeMember: Boolean; - - procedure Tag; - procedure ResetTags; - function IsTagged: Boolean; - - property IsHidden: Boolean - read GetIsHidden; - - procedure WriteToStream(aStream: TStream; aResetModified: Boolean); - - function CopyInto(const aFile: IwbFile; AsNew, DeepCopy: Boolean; const aPrefixRemove, aPrefix, aSuffix: string): IwbElement; - - function GetTreeHead: Boolean; // Is the element expected to be a "header record" in the tree navigator - function GetTreeBranch: Boolean; // Is the element expected to show in the tree navigator - - property ElementID: Cardinal - read GetElementID; - property ElementStates: TwbElementStates - read GetElementStates; - - property Container: IwbContainer - read GetContainer; - property ContainingMainRecord: IwbMainRecord - read GetContainingMainRecord; - property _File: IwbFile - read GetFile; - property ReferenceFile: IwbFile - read GetReferenceFile; - property InjectionSourceFiles: TDynFiles - read GetInjectionSourceFiles; - - property ElementType: TwbElementType - read GetElementType; - property Name: string - read GetName; - property BaseName: string - read GetBaseName; - property DisplayName: string - read GetDisplayName; - property ShortName: string - read GetShortName; - property Path: string - read GetPath; - property FullPath: string - read GetFullPath; - property PathName: string - read GetPathName; - property Skipped: Boolean - read GetSkipped; - - property Value: string - read GetValue; - property SortKey[aExtended: Boolean]: string - read GetSortKey; - property Check: string - read GetCheck; - - property Modified: Boolean - read GetModified; - property IsInjected: Boolean - read GetIsInjected; - property IsNotReachable: Boolean - read GetIsNotReachable; - property ReferencesInjected: Boolean - read GetReferencesInjected; - - property IsEditable: Boolean - read GetIsEditable; - property EditValue: string - read GetEditValue - write SetEditValue; - property NativeValue: Variant - read GetNativeValue - write SetNativeValue; - - property IsRemoveable: Boolean - read GetIsRemoveable; - - property Def: IwbNamedDef - read GetDef; - property ValueDef: IwbValueDef - read GetValueDef; - property ResolvedValueDef: IwbValueDef - read GetResolvedValueDef; - - property MemoryOrder: Integer - read GetMemoryOrder - write SetMemoryOrder; - property SortPriority: Integer - read GetSortPriority; - property SortOrder: Integer - read GetSortOrder - write SetSortOrder; - - property ConflictPriority: TwbConflictPriority - read GetConflictPriority; - property ConflictPriorityCanChange: Boolean - read GetConflictPriorityCanChange; - - property DataSize: Integer - read GetDataSize - write SetDataSize; - - property LinksTo: IwbElement - read GetLinksTo; - property NoReach: Boolean - read GetNoReach; - - property EditType: TwbEditType - read GetEditType; - property EditInfo: string - read GetEditInfo; - - property DontShow: Boolean - read GetDontShow; - - property TreeHead: Boolean - read GetTreeHead; - - property TreeBranch: Boolean - read GetTreeBranch; - end; - - IwbRecord = interface; - - TwbContainerState = ( - csInit, - csInitOnce, - csInitDone, - csInitializing, - csReseting, - csRefsBuild, - csAsCreatedEmpty - ); - - TwbContainerStates = set of TwbContainerState; - - TDynStrings = array of string; - - IwbContainerBase = interface(IwbElement) - ['{1484D26A-0F67-41FA-9044-8772E68CBA56}'] - - function GetElement(aIndex: Integer): IwbElement; - function GetElementCount: Integer; - function GetElementByName(const aName: string): IwbElement; - function GetRecordBySignature(const aSignature: TwbSignature): IwbRecord; - function GetElementByMemoryOrder(aSortOrder: Integer): IwbElement; - function GetElementBySignature(const aSignature: TwbSignature): IwbElement; - function GetElementBySortOrder(aSortOrder: Integer): IwbElement; - function GetAdditionalElementCount: Integer; - function GetContainerStates: TwbContainerStates; - function GetElementByPath(const aPath: string): IwbElement; - function GetElementValue(const aName: string): string; - function GetElementExists(const aName: string): Boolean; - function GetElementEditValue(const aName: string): string; - procedure SetElementEditValue(const aName, aValue: string); - function GetElementNativeValue(const aName: string): Variant; - procedure SetElementNativeValue(const aName: string; const aValue: Variant); - function GetElementLinksTo(const aName: string): IwbElement; - function GetElementSortKey(const aName: string; aExtended: Boolean): string; - - procedure AddElement(const aElement: IwbElement); - procedure InsertElement(aPos: Integer; const aElement: IwbElement); - function RemoveElement(aPos: Integer; aMarkModified: Boolean = False): IwbElement; overload; - function RemoveElement(const aElement: IwbElement; aMarkModified: Boolean = False): IwbElement; overload; - function RemoveElement(const aName: string): IwbElement; overload; - procedure ReverseElements; - - function LastElement: IwbElement; - - function IsElementRemoveable(const aElement: IwbElement): Boolean; - function IsElementEditable(const aElement: IwbElement): Boolean; - - function IndexOf(const aElement: IwbElement): Integer; - - function CanElementReset: Boolean; - - function GetAddList: TDynStrings; - function Add(const aName: string; aSilent: Boolean = True): IwbElement; - - property Elements[aIndex: Integer]: IwbElement - read GetElement; default; - property ElementCount: Integer - read GetElementCount; - property AdditionalElementCount: Integer - read GetAdditionalElementCount; - - property ElementByPath[const aPath: string]: IwbElement - read GetElementByPath; - property ElementValues[const aName: string]: string - read GetElementValue; - property ElementEditValues[const aName: string]: string - read GetElementEditValue - write SetElementEditValue; - property ElementNativeValues[const aName: string]: Variant - read GetElementNativeValue - write SetElementNativeValue; - property ElementLinksTo[const aName: string]: IwbElement - read GetElementLinksTo; - property ElementExists[const aName: string]: Boolean - read GetElementExists; - property ElementSortKeys[const aName: string; aExtended: Boolean]: string - read GetElementSortKey; - - - property ContainerStates: TwbContainerStates - read GetContainerStates; - - property ElementByName[const aName: string]: IwbElement - read GetElementByName; - property RecordBySignature[const aSignature: TwbSignature]: IwbRecord - read GetRecordBySignature; - property ElementByMemoryOrder[aSortOrder: Integer]: IwbElement - read GetElementByMemoryOrder; - property ElementBySignature[const aSignature: TwbSignature]: IwbElement - read GetElementBySignature; - property ElementBySortOrder[aSortOrder: Integer]: IwbElement - read GetElementBySortOrder; - end; - - IwbContainer = interface(IwbContainerBase) - ['{4C4FCDD0-C885-458A-B8F2-EA3EFF8B5EEE}'] - procedure Bar; - end; - - IwbContainerElementRef= interface(IwbContainerBase) - ['{4066BCCF-01AA-4638-9C3D-3475CD8D5749}'] - function ReleaseKeepAlive: IwbContainerElementRef; - end; - - IwbKeepAliveRoot = interface(IInterface) - ['{D1D2C080-CE73-428F-B88F-BF9503CB8619}'] - procedure Done; - end; - - IwbSortableContainer = interface(IwbContainer) - ['{A8A65D99-507C-4D2D-86EF-57BC99E09964}'] - function GetSorted: Boolean; - - property Sorted: Boolean - read GetSorted; - end; - - IwbGroupRecord = interface; - - TwbFileState = ( - fsIsNew, - fsIsCompareLoad, - fsOnlyHeader, - fsIsHardcoded, - fsIsGameMaster, - fsIsTemporary, - fsHasNoFormID - ); - - TwbFileStates = set of TwbFileState; - TwbPluginExtensions = TDynStrings; - - IwbFile = interface(IwbContainer) - ['{38AA15A6-F652-45C7-B875-9CB502E5DA92}'] - function GetFileName: string; - function GetUnsavedSince: TDateTime; - function GetMaster(aIndex: Integer): IwbFile; - function GetMasterCount: Integer; - function GetRecordByFormID(aFormID: Cardinal; aAllowInjected: Boolean): IwbMainRecord; - function GetRecordByEditorID(const aEditorID: string): IwbMainRecord; - function GetLoadOrder: Integer; - procedure ForceLoadOrder(aValue: Integer); - function GetGroupBySignature(const aSignature: TwbSignature): IwbGroupRecord; - function HasGroup(const aSignature: TwbSignature): Boolean; - function GetFileStates: TwbFileStates; - procedure BuildReachable; - - function LoadOrderFormIDtoFileFormID(aFormID: Cardinal): Cardinal; - function FileFormIDtoLoadOrderFormID(aFormID: Cardinal): Cardinal; - - function LoadOrderFileIDtoFileFileID(aFileID: Byte): Byte; - function FileFileIDtoLoadOrderFileID(aFileID: Byte): Byte; - - function NewFormID: Cardinal; - - procedure AddMasters(aMasters: TStrings); - procedure AddMasterIfMissing(const aMaster: string); - procedure SortMasters; - procedure CleanMasters; - - function GetRecord(aIndex: Integer): IwbMainRecord; - function GetRecordCount: Integer; - function GetHeader: IwbMainRecord; - - function GetIsESM: Boolean; - procedure SetIsESM(Value: Boolean); - - function GetIsLocalized: Boolean; - procedure SetIsLocalized(Value: Boolean); - - function GetNextObjectID: Cardinal; - procedure SetNextObjectID(aObjectID: Cardinal); - - function GetIsNotPlugin: Boolean; - function GetHasNoFormID: Boolean; - procedure SetHasNoFormID(Value: Boolean); - - property FileName: string - read GetFileName; - property UnsavedSince: TDateTime - read GetUnsavedSince; - - function HasMaster(const aFileName: string): Boolean; - property Masters[aIndex: Integer]: IwbFile - read GetMaster; - property MasterCount: Integer - read GetMasterCount; - - property RecordByFormID[aFormID: Cardinal; aAllowInjected: Boolean]: IwbMainRecord - read GetRecordByFormID; - property RecordByEditorID[const aEditorID: string]: IwbMainRecord - read GetRecordByEditorID; - property GroupBySignature[const aSignature: TwbSignature]: IwbGroupRecord - read GetGroupBySignature; - - property Records[aIndex: Integer]: IwbMainRecord - read GetRecord; - property RecordCount: Integer - read GetRecordCount; - - property Header: IwbMainRecord - read GetHeader; - - property LoadOrder: Integer - read GetLoadOrder; - - property FileStates: TwbFileStates - read GetFileStates; - - property IsESM: Boolean - read GetIsESM - write SetIsESM; - - property IsLocalized: Boolean - read GetIsLocalized - write SetIsLocalized; - - property NextObjectID: Cardinal - read GetNextObjectID - write SetNextObjectID; - - property IsNotPlugin: Boolean // Save or other file to display. - read GetIsNotPlugin; - property HasNoFormID: Boolean // Like Morrowind for example. Also true for save/coSave. - read GetHasNoFormID - write SetHasNoFormID; - end; - - IwbDataContainer = interface(IwbContainer) - ['{6E547F7C-87E4-4917-8F43-4D3CEE5AFE8C}'] - function GetDataBasePtr: Pointer; - function GetDataEndPtr: Pointer; - function GetDataSize: Integer; - function GetDontCompare: Boolean; - function GetDontSave: Boolean; - function IsValidOffset(aBasePtr, aEndPtr: Pointer; anOffset: Integer): Boolean; - function IsLocalOffset(anOffset: Integer): Boolean; - - property DataBasePtr: Pointer - read GetDataBasePtr; - property DataEndPtr: Pointer - read GetDataEndPtr; - property DataSize: Integer - read GetDataSize; - - property DontCompare: Boolean - read GetDontCompare; - property DontSave: Boolean - read GetDontSave; - end; - - TDynDataContainers = array of IwbDataContainer; - - IwbRecord = interface(IwbDataContainer) - ['{4FC53881-25E2-421D-8AF6-F589979767E6}'] - function GetSignature: TwbSignature; - - property Signature: TwbSignature - read GetSignature; - end; - - IwbHasSignature = interface(IwbElement) - ['{DF563D7C-A441-4864-B47A-49F3A96508F7}'] - function GetSignature: TwbSignature; - - property Signature: TwbSignature - read GetSignature; - end; - - PwbMainRecordStructFlags = ^TwbMainRecordStructFlags; - TwbMainRecordStructFlags = packed record - _Flags: Cardinal; - function IsESM: Boolean; inline; - function IsDeleted: Boolean; inline; - function IsLocalized: Boolean; inline; - function CastsShadows: Boolean; inline; - function IsPersistent: Boolean; inline; - function IsInitiallyDisabled: Boolean; inline; - function IsIgnored: Boolean; inline; - function IsVisibleWhenDistant: Boolean; inline; - function IsDangerous: Boolean; inline; - function IsCompressed: Boolean; inline; - function CantWait: Boolean; inline; - function HasLODtree: Boolean; inline; - - procedure SetESM(aValue: Boolean); - procedure SetDeleted(aValue: Boolean); - procedure SetLocalized(aValue: Boolean); - procedure SetPersistent(aValue: Boolean); - procedure SetCompressed(aValue: Boolean); - procedure SetInitiallyDisabled(aValue: Boolean); - procedure SetVisibleWhenDistant(aValue: Boolean); - end; - - PwbMainRecordStructFlags3 = ^TwbMainRecordStructFlags3; - TwbMainRecordStructFlags3 = packed record - _Flags: Cardinal; - end; - - TwbVector = packed record - x: Single; - y: Single; - z: Single; - end; - - TwbGridCell = record - x, y: Integer; - end; - - TDynMainRecords = array of IwbMainRecord; - - IwbMainRecord = interface(IwbRecord) - ['{F06FD5E2-621D-4422-BA00-CB3CA72B3691}'] - function GetFormID: Cardinal; - function GetFixedFormID: Cardinal; - function GetLoadOrderFormID: Cardinal; - procedure SetLoadOrderFormID(aFormID: Cardinal); - function GetEditorID: string; - function GetCanHaveEditorID: Boolean; - procedure SetEditorID(const aValue: string); - function GetFullName: string; - function GetDisplayNameKey: string; - function GetMaster: IwbMainRecord; - function GetIsMaster: Boolean; - function GetMasterOrSelf: IwbMainRecord; - function GetOverride(aIndex: Integer): IwbMainRecord; - function GetOverrideCount: Integer; - procedure AddReferencedBy(aMainRecord: IwbMainRecord); - procedure RemoveReferencedBy(aMainRecord: IwbMainRecord); - function GetReferencedBy(aIndex: Integer): IwbMainRecord; - function GetReferencedByCount: Integer; - function GetIsWinningOverride: Boolean; - function GetWinningOverride: IwbMainRecord; - function GetHighestOverrideOrSelf(aMaxLoadOrder: Integer): IwbMainRecord; - function GetFlags: TwbMainRecordStructFlags; - function GetChildGroup: IwbGroupRecord; - function EnsureChildGroup: IwbGroupRecord; - function GetBaseRecord: IwbMainRecord; - function GetBaseRecordID: Cardinal; - - function GetConflictAll: TConflictAll; - procedure SetConflictAll(aValue: TConflictAll); - function GetConflictThis: TConflictThis; - procedure SetConflictThis(aValue: TConflictThis); - - function GetIsESM: Boolean; - procedure SetIsESM(aValue: Boolean); - function GetIsPersistent: Boolean; - procedure SetIsPersistent(aValue: Boolean); - function GetIsDeleted: Boolean; - procedure SetIsDeleted(aValue: Boolean); - function GetIsLocalized: Boolean; - procedure SetIsLocalized(aValue: Boolean); - function GetIsCompressed: Boolean; - procedure SetIsCompressed(aValue: Boolean); - function GetIsVisibleWhenDistant: Boolean; - procedure SetIsVisibleWhenDistant(aValue: Boolean); - function GetHasVisibleWhenDistantMesh: Boolean; - function GetHasMesh: Boolean; - function GetHasPrecombinedMesh: Boolean; - function GetPrecombinedMesh: string; - function GetIsInitiallyDisabled: Boolean; - procedure SetIsInitiallyDisabled(aValue: Boolean); - - procedure UpdateRefs; - - function GetPosition(out aPosition: TwbVector): Boolean; - function SetPosition(const aPosition: TwbVector): Boolean; - function GetRotation(out aRotation: TwbVector): Boolean; - function GetScale(out aScale: Single): Boolean; - - function GetGridCell(out aGridCell: TwbGridCell): Boolean; - - procedure Delete; - procedure DeleteInto(const aFile: IwbFile); - - function MasterRecordsFromMasterFilesAndSelf: TDynMainRecords; - - function GetFormVersion: Cardinal; - procedure SetFormVersion(aFormVersion: Cardinal); - - procedure ChangeFormSignature(aSignature: TwbSignature); - procedure ClampFormID(aIndex: Cardinal); - - property Version: Cardinal - read GetFormVersion - write SetFormVersion; - - property BaseRecord: IwbMainRecord - read GetBaseRecord; - property BaseRecordID: Cardinal - read GetBaseRecordID; - property FormID: Cardinal - read GetFormID; - property FixedFormID: Cardinal - read GetFixedFormID; - property LoadOrderFormID: Cardinal - read GetLoadOrderFormID - write SetLoadOrderFormID; - property EditorID: string - read GetEditorID - write SetEditorID; - property CanHaveEditorID: Boolean - read GetCanHaveEditorID; - property FullName: string - read GetFullName; - property DisplayNameKey: string - read GetDisplayNameKey; - - property Flags: TwbMainRecordStructFlags - read GetFlags; - - property Master: IwbMainRecord - read GetMaster; - property MasterOrSelf: IwbMainRecord - read GetMasterOrSelf; - property IsMaster: Boolean - read GetIsMaster; - - property ChildGroup: IwbGroupRecord - read GetChildGroup; - - property Overrides[aIndex: Integer]: IwbMainRecord - read GetOverride; - property OverrideCount: Integer - read GetOverrideCount; - property IsWinningOverride: Boolean - read GetIsWinningOverride; - property WinningOverride: IwbMainRecord - read GetWinningOverride; - property HighestOverrideOrSelf[aMaxLoadOrder: Integer]: IwbMainRecord - read GetHighestOverrideOrSelf; - - property ReferencedBy[aIndex: Integer]: IwbMainRecord - read GetReferencedBy; - property ReferencedByCount: Integer - read GetReferencedByCount; - - property IsESM: Boolean - read GetIsESM - write SetIsESM; - property IsPersistent: Boolean - read GetIsPersistent - write SetIsPersistent; - property IsDeleted: Boolean - read GetIsDeleted - write SetIsDeleted; - property IsCompressed: Boolean - read GetIsCompressed - write SetIsCompressed; - property IsLocalized: Boolean - read GetIsLocalized - write SetIslocalized; - property IsVisibleWhenDistant: Boolean - read GetIsVisibleWhenDistant - write SetIsVisibleWhenDistant; - property HasVisibleWhenDistantMesh: Boolean - read GetHasVisibleWhenDistantMesh; - property HasMesh: Boolean - read GetHasMesh; - property HasPrecombinedMesh: Boolean - read GetHasPrecombinedMesh; - property PrecombinedMesh: string - read GetPrecombinedMesh; - property IsInitiallyDisabled: Boolean - read GetIsInitiallyDisabled - write SetIsInitiallyDisabled; - - property ConflictAll: TConflictAll - read GetConflictAll - write SetConflictAll; - property ConflictThis: TConflictThis - read GetConflictThis - write SetConflictThis; - end; - - IwbFileHeader = interface(IwbDataContainer) - ['{E309EEE2-C20E-4506-BF46-B63F903706C9}'] - function GetFileMagic: TwbFileMagic; - - property FileMagic: TwbFileMagic - read GetFileMagic; - end; - - IwbChapter = interface - ['{3E575648-EF6F-4e9f-956F-D2E184B670E4}'] - function GetChapterType: Integer; - function GetChapterTypeName: String; - function GetChapterName: String; - property ChapterType: Integer - read GetChapterType; - property ChapterTypeName: String - read GetChapterTypeName; - property ChapterName: String - read GetChapterName; - end; - - TDynElements = array of IwbElement; - {$IFDEF WIN32} - TDynCardinalArray = array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - TDynCardinalArray = array of UInt64; - {$ENDIF WIN32} - - IwbSubRecord = interface(IwbRecord) - ['{CDE36A3D-64F6-4B8E-980E-FBAB8D9FCAF7}'] - function GetSubRecordHeaderSize: Integer; - property SubRecordHeaderSize: Integer - read GetSubRecordHeaderSize; - end; - - TDynGroupRecords = array of IwbGroupRecord; - - IwbGroupRecord = interface(IwbRecord) - ['{BFF16E47-4E66-4EAD-9BEF-364728AE0A6B}'] - function GetGroupType: Integer; - function GetGroupLabel: Cardinal; - procedure SetGroupLabel(aLabel: Cardinal); - function GetChildrenOf: IwbMainRecord; - - function FindChildGroup(aType: Integer; aMainRecord: IwbMainRecord): IwbGroupRecord; - - function GetMainRecordByEditorID(const aEditorID: string): IwbMainRecord; - function GetMainRecordByFormID(const aFormID: Cardinal): IwbMainRecord; - - procedure AddElement(const aElement: IwbElement); - - property GroupType: Integer - read GetGroupType; - property GroupLabel: Cardinal - read GetGroupLabel - write SetGroupLabel; - - property ChildrenOf: IwbMainRecord - read GetChildrenOf; - - property MainRecordByEditorID[const aEditorID: string]: IwbMainRecord - read GetMainRecordByEditorID; - property MainRecordByFormID[const aFormID: Cardinal]: IwbMainRecord - read GetMainRecordByFormID; - end; - - IwbSubRecordArray = interface - ['{26937F7A-5F31-4D65-932F-038BD0FA9FEF}'] - end; - - IwbSubRecordStruct = interface - ['{E8C496D3-D396-4685-87EC-82E1FD2588B8}'] - end; - - IwbSubRecordUnion = interface - ['{11959F58-B396-4449-9D9D-5DF1251C3E76}'] - end; - - TwbCallbackType = ( - ctToStr, - ctToSortKey, - ctCheck, - ctToEditValue, - ctEditType, - ctEditInfo - ); - - TwbAfterLoadCallback = procedure(const aElement: IwbElement); - TwbAfterSetCallback = procedure(const aElement: IwbElement; const aOldValue, aNewValue: Variant); - TwbDontShowCallback = function(const aElement: IwbElement): Boolean; - TwbFloatNormalizer = function(const aElement: IwbElement; aFloat: Extended): Extended; - TwbGetConflictPriority = procedure(const aElement: IwbElement; var aConflictPriority: TwbConflictPriority); - TwbIntToStrCallback = function(aInt: Int64; const aElement: IwbElement; aType: TwbCallbackType): string; - TwbStrToIntCallback = function(const aString: string; const aElement: IwbElement): Int64; - TwbAddInfoCallback = function(const aMainRecord: IwbMainRecord): string; - TwbUnionDecider = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - TwbIntegerDefFormaterUnionDecider = function(const aElement: IwbElement): Integer; - TwbIsSortedCallback = function(const aContainer: IwbContainer): Boolean; - TwbCountCallback = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Cardinal; - TwbSizeCallback = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement;var CompressedSize: Integer): Cardinal; - TwbGetChapterTypeCallback = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - TwbGetChapterTypeNameCallback = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; - TwbGetChapterNameCallback = function(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; - - IwbNamedDef = interface(IwbDef) - ['{F8FEDE89-C089-42C5-B587-49A7D87055F0}'] - function GetName: string; - function GetPath: string; - procedure AfterLoad(const aElement: IwbElement); - procedure AfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); - - function GetTreeHead: Boolean; // Is the element expected to be a "header record" in the tree navigator - procedure SetTreeHead(aValue: Boolean); // Make the element a "header record" in the tree navigator; - function GetTreeBranch: Boolean; // Is the element included in a "leaf" expected to be displayed in the view pane - procedure SetTreeBranch(aValue: Boolean); // Make the element included in a "leaf" visible in the tree navigator; - - property Name: string - read GetName; - property Path: string - read GetPath; - - property TreeHead: Boolean - read GetTreeHead write SetTreeHead; - - property TreeBranch: Boolean - read GetTreeBranch write SetTreeBranch; - end; - - IwbSignatureDef = interface(IwbNamedDef) - ['{EF20E1A2-8719-4934-AC36-C91DC72C3F70}'] - function GetDefaultSignature: TwbSignature; - - function GetSignatures(const aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; - - property DefaultSignature: TwbSignature - read GetDefaultSignature; - - property Signatures[const aIndex: Integer]: TwbSignature - read GetSignatures; - property SignatureCount: Integer - read GetSignatureCount; - end; - - IwbRecordMemberDef = interface; - - IwbStructDef = interface; - - PwbRecordDef = ^IwbRecordDef; - IwbRecordDef = interface(IwbSignatureDef) - ['{89FE380F-7A0B-493C-AA9E-08957A4C167B}'] - function ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; - function GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; - function GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; - - function AllowUnordered: Boolean; - function AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; - - function GetMember(aIndex: Integer): IwbRecordMemberDef; - function GetMemberCount: Integer; - - function GetSkipSignature(const aSignature: TwbSignature): Boolean; - - function GetQuickInitLimit: Integer; - function GetContainsEditorID: Boolean; - - function GetRecordHeaderStruct: IwbStructDef; - - property Members[aIndex: Integer]: IwbRecordMemberDef read GetMember; - property MemberCount: Integer read GetMemberCount; - - property SkipSignature[const aSignature: TwbSignature]: Boolean - read GetSkipSignature; - - property QuickInitLimit: Integer - read GetQuickInitLimit; - property ContainsEditorID: Boolean - read GetContainsEditorID; - - property RecordHeaderStruct: IwbStructDef - read GetRecordHeaderStruct; - end; - - IwbHasSortKeyDef = interface(IwbRecordDef) - ['{877FEF58-72B1-4735-9E08-166B5F4043F3}'] - function GetSortKey(aIndex: Integer; aExtended: Boolean): Integer; - function GetSortKeyCount(aExtended: Boolean): Integer; - function IsInSK(aIndex: Integer): Boolean; - - property SortKeys[aIndex: Integer; aExtended: Boolean]: Integer - read GetSortKey; - property SortKeyCount[aExtended: Boolean]: Integer - read GetSortKeyCount; - end; - - IwbRecordMemberDef = interface(IwbSignatureDef) - ['{259F3F08-F4ED-439D-8C1A-48137C84E52A}'] - end; - - TwbUsedMasters = array[Byte] of Boolean; - PwbUsedMasters = ^TwbUsedMasters; - - IwbValueDef = interface(IwbNamedDef) - ['{BBF684A6-0EE5-4EF6-83DD-D323A0D2919A}'] - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; - function Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; - function GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; - procedure BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); - function GetIsVariableSize: Boolean; - function GetCanBeZeroSize: Boolean; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; - function GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; - function GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; - - procedure MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); - procedure MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); - procedure FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); - function CompareExchangeFormID(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; - - function GetElementMap: TDynCardinalArray; - - property Size[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: Integer - read GetSize; - property DefaultSize[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: Integer - read GetDefaultSize; - property IsVariableSize: Boolean - read GetIsVariableSize; - property CanBeZeroSize: Boolean - read GetCanBeZeroSize; - property IsEditable[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: Boolean - read GetIsEditable; - property EditValue[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: string - read ToEditValue - write FromEditValue; - property NativeValue[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: Variant - read ToNativeValue - write FromNativeValue; - property LinksTo[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: IwbElement - read GetLinksTo; - - property EditType[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: TwbEditType - read GetEditType; - property EditInfo[aBasePtr, aEndPtr: Pointer; const aElement: IwbElement]: string - read GetEditInfo; - end; - - IwbSubRecordDef = interface(IwbRecordMemberDef) - ['{D848E426-8768-45F4-B192-4DEFBE34D40A}'] - function GetValue: IwbValueDef; - procedure HasUnusedData; - - property Value: IwbValueDef read GetValue; - end; - - IwbSubRecordArrayDef = interface(IwbRecordMemberDef) - ['{67943BAC-B558-4112-8DBC-C94A44E0B1D1}'] - function GetElement: IwbRecordMemberDef; - function GetSorted(const aContainer: IwbContainer): Boolean; - - property Element: IwbRecordMemberDef read GetElement; - property Sorted[const aContainer: IwbContainer]: Boolean read GetSorted; - end; - - IwbSubRecordStructDef = interface(IwbRecordMemberDef) - ['{B5441812-5229-488B-AEA6-C182CEBED441}'] - end; - - IwbSubRecordUnionDef = interface(IwbRecordMemberDef) - ['{BC66ABFF-3108-4C64-B416-674A2A8F297D}'] - end; - - IwbUnionDef = interface(IwbValueDef) - ['{04D6B7BA-B457-4E43-9910-592395FEA0D6}'] - function Decide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): IwbValueDef; - - function GetMember(aIndex: Integer): IwbValueDef; - function GetMemberCount: Integer; - - property Members[aIndex: Integer]: IwbValueDef read GetMember; - property MemberCount: Integer read GetMemberCount; - end; - - IwbStringDef = interface(IwbValueDef) - ['{37B02D28-EDB4-41C6-B933-9F56C013A88A}'] - function GetStringSize: Integer; - - property StringSize: Integer - read GetStringSize; - end; - - IwbLenStringDef = interface(IwbValueDef) - ['{1AD7FAE2-DAA7-4651-B78D-10E138EDF48B}'] - end; - - IwbByteArrayDef = interface(IwbValueDef) - ['{3069E1AC-4307-421B-93E4-797E18075EF9}'] - end; - - IwbEmptyDef = interface(IwbValueDef) - ['{0A858744-947B-4B6E-9972-D8BF5398C87C}'] - function GetSorted: Boolean; - - property Sorted: Boolean - read GetSorted; - end; - - IwbIntegerDefFormater = interface; - - IwbIntegerDef = interface(IwbValueDef) - ['{00A270B0-ACFC-444C-A7E8-A577BD40704E}'] - function ToInt(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Int64; - procedure FromInt(aValue: Int64; aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); - - function GetFormater(const aElement: IwbElement): IwbIntegerDefFormater; - function GetFormaterCanChange: Boolean; - function GetIntType: TwbIntType; - function GetExpectedLength(aValue: Int64 = 0): Integer; - - property Formater[const aElement: IwbElement]: IwbIntegerDefFormater - read GetFormater; - property FormaterCanChange: Boolean - read GetFormaterCanChange; - property IntType: TwbIntType - read GetIntType; - - property ExpectedLength[aValue: Int64 = 0]: Integer - read GetExpectedLength; - end; - - IwbInternalIntegerDef = interface(IwbIntegerDef) - ['{16A15EF7-6295-4817-BA94-CDD7E8C1CF8B}'] - procedure ReplaceFormater(const aFormater: IwbIntegerDefFormater); - end; - - IwbFloatDef = interface(IwbValueDef) - ['{29F116C6-0208-4D55-ACA7-2A9BB17BF80B}'] - end; - - IwbArrayDef = interface(IwbValueDef) - ['{BD195F99-4AC3-4BD0-9193-267332E97D79}'] - function GetElement: IwbValueDef; - function GetCount: Integer; - function GetElementLabel(aIndex: Integer): string; - function GetSorted: Boolean; - function GetCanAddTo: Boolean; - function GetCountCallBack: TwbCountCallback; - function GetPrefixSize(aBasePtr: Pointer): Integer; - function GetPrefixLength(aBasePtr: Pointer): Integer; - function GetPrefixCount(aBasePtr: Pointer): Cardinal; - procedure SetPrefixCount(aBasePtr: Pointer; aCount: Cardinal); - - property Element: IwbValueDef - read GetElement; - property ElementCount: Integer - read GetCount; - - property ElementLabel[aIndex: Integer]: string - read GetElementLabel; - - property Sorted: Boolean - read GetSorted; - - property CountCallBack: TwbCountCallback - read GetCountCallback; - - property CanAddTo: Boolean - read GetCanAddTo; - - property PrefixSize[aBasePtr: Pointer]: Integer // how many bytes of storage for the prefix - read GetPrefixSize; - property PrefixLength[aBasePtr: Pointer]: Integer // Integer size of the prefix - read GetPrefixLength; - property PrefixCount[aBasePtr: Pointer]: Cardinal // Value stored in the prefix - read GetPrefixCount write SetPrefixCount; - end; - - IwbStructDef = interface(IwbValueDef) - ['{9B20A03C-BC3F-433A-9781-E46BD5C660A9}'] - - function GetMemberCount: Integer; - function GetMember(aIndex: Integer): IwbValueDef; - function GetMemberByName(const aName: string): IwbValueDef; - function GetOptionalFromElement: Integer; - - property MemberCount: Integer read GetMemberCount; - property Members[aIndex: Integer]: IwbValueDef read GetMember; - property MembersByName[const aName: string]: IwbValueDef read GetMemberByName; - property OptionalFromElement: Integer read GetOptionalFromElement; - end; - - IwbStructCDef = interface(IwbStructDef) - ['{B72FD1AD-018D-47D3-91E7-5028C5E0E759}'] - function GetSizing(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement;var CompressedSize: Integer): Cardinal; - function GetChapterType(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - function GetChapterTypeName(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; - function GetChapterName(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; - end; - - TwbStructCompression = ( - scNone, - scZComp, - scLZComp - ); - - IwbStructZDef = interface(IwbStructCDef) // Compressible structure !!! NOT SAFE FOR EDIT AT THE MOMEMNT !!! - ['{8ED8E461-E4BB-494E-8A3B-B352A245B9A0}'] - end; - - IwbStructLZDef = interface(IwbStructZDef) // Compressible structure using LZ4 !!! NOT SAFE FOR EDIT AT THE MOMEMNT !!! - ['{A5AB100F-83CA-4B53-B3CD-2BF926210900}'] - end; - - IwbIntegerDefFormater = interface(IwbDef) - ['{56A6EB7B-3A90-4F09-8E80-D7399569DFCC}'] - - function ToString(aInt: Int64; const aElement: IwbElement): string; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; - function Check(aInt: Int64; const aElement: IwbElement): string; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; - function GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; - - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; - - function MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; - function MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; - procedure FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); - function CompareExchangeFormID(var aInt: Int64; aOldFormID: Cardinal; aNewFormID: Cardinal; const aElement: IwbElement): Boolean; - - function GetRequiresKey: Boolean; - - property IsEditable[aInt: Int64; const aElement: IwbElement]: Boolean - read GetIsEditable; - property LinksTo[aInt: Int64; const aElement: IwbElement]: IwbElement - read GetLinksTo; - - property EditType[aInt: Int64; const aElement: IwbElement]: TwbEditType - read GetEditType; - property EditInfo[aInt: Int64; const aElement: IwbElement]: string - read GetEditInfo; - - property RequiresKey: Boolean - read GetRequiresKey; - end; - - IwbIntegerDefFormaterUnion = interface(IwbIntegerDefFormater) - ['{C04B1181-A570-41AE-A31E-7977B722EE0A}'] - function Decide(const aElement: IwbElement): IwbIntegerDefFormater; - - function GetMember(aIndex: Integer): IwbIntegerDefFormater; - function GetMemberCount: Integer; - - property Members[aIndex: Integer]: IwbIntegerDefFormater read GetMember; - property MemberCount: Integer read GetMemberCount; - end; - - IwbDumpIntegerDefFormater = interface(IwbIntegerDefFormater) - ['{9767F3EF-0E6F-45FB-AC9F-31A9B4312760}'] - end; - - IwbFormID = interface(IwbIntegerDefFormater) - ['{71C4A255-B983-488C-9837-0A720132348A}'] - function GetMainRecord(aInt: Int64; const aElement: IwbElement): IwbMainRecord; - end; - - IwbRefID = interface(IwbFormID) - ['{F6EEAFDD-5AD7-4DB3-BF45-5D5DB53465D4}'] - end; - - IwbFormIDChecked = interface(IwbFormID) - ['{DC7CBC9F-07EC-430B-94EE-ECE1867A2660}'] - function GetSignature(aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - property Signatures[aIndex: Integer]: TwbSignature - read GetSignature; - property SignatureCount: Integer - read GetSignatureCount; - end; - - IwbChar4 = interface(IwbIntegerDefFormater) - ['{CF657B3A-E7A6-48FE-AC68-8DF15962A531}'] - end; - - IwbStr4 = interface(IwbIntegerDefFormater) // 4 bytes strings stored as itU32 - ['{2DC5200E-C1F1-47e7-A927-3D110D59F55A}'] - end; // The interface handles swaping the character in readable order - - IwbFlagsDef = interface; - - IwbFlagDef = interface(IwbValueDef) - ['{CCD4FBC4-D1CA-4B91-9E2F-6EE6118D5D07}'] - function GetFlagsDef: IwbFlagsDef; - function GetFlagIndex: Integer; - - property FlagsDef: IwbFlagsDef - read GetFlagsDef; - property FlagIndex: Integer - read GetFlagIndex; - end; - - IwbFlagsDef = interface(IwbIntegerDefFormater) - ['{EF564466-A671-453A-88CF-42A0AA32D849}'] - function GetBaseFlagsDef: IwbFlagsDef; - function GetFlag(aIndex: Integer): string; - function GetFlagCount: Integer; - function GetFlagIgnoreConflict(aIndex: Integer): Boolean; - function GetFlagDontShow(const aElement: IwbElement; aIndex: Integer): Boolean; - function GetFlagHasDontShow(aIndex: Integer): Boolean; - procedure FlagGetCP(const aElement: IwbElement; aIndex: Integer; var aCP: TwbConflictPriority); - function GetFlagHasGetCP(aIndex: Integer): Boolean; - function GetFlagDef(aIndex : Integer): IwbFlagDef; - - property BaseFlagsDef: IwbFlagsDef - read GetBaseFlagsDef; - - property Flags[aIndex: Integer] : string - read GetFlag; - property FlagCount: Integer - read GetFlagCount; - - property FlagIgnoreConflict[aIndex: Integer] : Boolean - read GetFlagIgnoreConflict; - - property FlagDontShow[const aElement: IwbElement; aIndex: Integer]: Boolean - read GetFlagDontShow; - property FlagHasDontShow[aIndex: Integer]: Boolean - read GetFlagHasDontShow; - property FlagHasGetCP[aIndex: Integer]: Boolean - read GetFlagHasGetCP; - - property FlagDef[aIndex: Integer]: IwbFlagDef - read GetFlagDef; - end; - - IwbEnumDef = interface(IwbIntegerDefFormater) - ['{A3AFE02E-F72D-4E0E-BC56-219F7EE2B564}'] - - function GetName(aIndex: Integer): string; - function GetNameCount: Integer; - - property Names[aIndex: Integer]: string - read GetName; - property NameCount: Integer - read GetNameCount; - end; - - IwbKey2Data6EnumDef = interface(IwbEnumDef) - ['{A74C58CC-6280-4143-B72B-4AD4F68A9957}'] - end; - - IwbData6Key2EnumDef = interface(IwbEnumDef) - ['{AC7F99C9-9DF1-43BB-9052-6AD4B69E706F}'] - end; - - IwbCallbackDef = interface(IwbIntegerDefFormater) - ['{BF6A0830-F981-4E0A-B4F2-2A09D575CD19}'] - function GetCallback: TwbIntToStrCallback; - - property Callback: TwbIntToStrCallback - read GetCallback; - end; - - IwbResourceContainer = interface; - - IwbResource = interface(IInterface) - ['{B626E8BF-D2E3-40D1-8F3A-E6001D76B97B}'] - function GetContainer: IwbResourceContainer; - function GetData: TBytes; - - property Container: IwbResourceContainer - read GetContainer; - end; - - IwbResourceContainer = interface(IInterface) - ['{023EA9C4-19B5-4587-B298-559EEF8F224E}'] - function GetName: String; - function OpenResource(const aFileName: string): IwbResource; - function ResourceExists(const aFileName: string): Boolean; - procedure ResourceList(const aList: TStrings; const aFolder: string = ''); - procedure ResolveHash(const aHash: Int64; var Results: TDynStrings); - - property Name: string - read GetName; - end; - - IwbFolder = interface(IwbResourceContainer) - ['{E71981ED-3C0C-4334-8476-116AEB0EEA1E}'] - function GetPathName: string; - - property PathName: string - read GetPathName; - end; - - IwbBSAFile = interface(IwbResourceContainer) - ['{DC987017-9F5C-42D2-BAD2-E1A622E99081}'] - function GetFileName: string; - - property FileName: string - read GetFileName; - end; - - IwbBA2File = interface(IwbResourceContainer) - ['{D05EAAEC-8A23-4CDD-83E4-7593AC846CE3}'] - function GetFileName: string; - - property FileName: string - read GetFileName; - end; - - TDynResources = array of IwbResource; - - IwbContainerHandler = interface(IInterface) - ['{0CC80043-EADC-4C7D-8677-8719735582C7}'] - procedure AddFolder(const aPath: string); - procedure AddBSA(const aFileName: string); - procedure AddBA2(const aFileName: string); - - function OpenResource(const aFileName: string): TDynResources; - function OpenResourceData(const aContainerName, aFileName: string): TBytes; - function ResolveHash(const aHash: Int64): TDynStrings; - function ContainerExists(aContainerName: string): Boolean; - procedure ContainerList(const aList: TStrings); - procedure ContainerResourceList(const aContainerName: string; const aList: TStrings; - const aFolder: string = ''); - function ResourceExists(const aFileName: string): Boolean; - function ResourceCount(const aFileName: string; aContainers: TStrings = nil): Integer; - procedure ResourceCopy(const aContainerName, aFileName, aPathOut: string); - end; - -var - SortedElementTypes : set of TwbElementType = [ - etFile, - etMainRecord, - etGroupRecord, - etSubRecord, - etSubRecordArray, - etArray - ]; - wbPluginExtensions : TwbPluginExtensions; - -function wbRecord(const aSignature : TwbSignature; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean = False; - aAddInfoCallback: TwbAddInfoCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbRecordDef; overload; - -function wbRecord(const aSignature : TwbSignature; - const aName : string; - const aRecordFlags : IwbIntegerDefFormater; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean = False; - aAddInfoCallback: TwbAddInfoCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbRecordDef; overload; - -function wbSubRecord(const aSignature : TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbSubRecord(const aSignatures : array of TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbString(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbString(const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringForward(const aSignature : TwbSignature; // When the editor can leave chars after the ending #0 - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbString( aForward : Boolean = False; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStringT(const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringScript(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStringScript(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringLC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStringLC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringKC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStringKC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbLString(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbLString(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbLStringKC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbLStringKC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbStringMgefCode(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStringMgefCode(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; - -function wbLenString(const aSignature : TwbSignature; - const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbLenString(const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbLenStringDef; overload; - -function wbLenStringT(const aSignature : TwbSignature; - const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbLenStringT(const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbLenStringDef; overload; -function wbUnion(const aSignature : TwbSignature; - const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbUnion(const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbUnionDef; overload; - - -function wbByteArray(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbByteArray(const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; - -function wbByteArrayT(const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; - -function wbByteArray(const aName : string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; - -function wbUnknown(const aSignature : TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbUnknown(aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; - -function wbInteger(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aMatchSize : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbInteger(const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbInteger(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbInteger(const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - - -function wbIntegerT(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aMatchSize : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbIntegerT(const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64= 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbIntegerT(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbIntegerT(const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbFloat(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFloat(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbFloat(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbDouble(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbDouble(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbDouble(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbFloatT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFloatT(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbFloatT(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbDoubleT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbDoubleT(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -function wbDoubleT(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; - -{--- wbArray - list of identical elements -------------------------------------} -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayPT(const aSignature : TwbSignature; // case where the prefix is terminated. - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayT(const aName : string; // case where members are not terminated, but the array itself yes - const aElement : IwbValueDef; - aCount : Integer; - const aLabels : array of string; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayPT(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArrayPT(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayT(const aName : string; // case where members are not terminated, but the array itself yes - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbRArray(const aName : string; - const aElement : IwbRecordMemberDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; - -function wbArrayS(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aCanAddTo : Boolean = True; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbArrayS(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - - -function wbRArrayS(const aName : string; - const aElement : IwbRecordMemberDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aIsSorted : TwbIsSortedCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; - -{--- wbStruct - ordered list of members ----------------------------------------} -function wbStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - {$IFDEF WIN32} - const aElementMap : array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - const aElementMap : array of UInt64; - {$ENDIF WIN64} - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructSK(const aSignature : TwbSignature; - const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbMultiStructSK(const aSignatures : array of TwbSignature; - const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; - -function wbStructExSK(const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructExSK(const aSignature : TwbSignature; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStruct(const aSignature : TwbSignature; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStruct(const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructC(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructZ(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbStructLZ(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; - -function wbRStruct(const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; - -function wbRStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; - -function wbRStructExSK(const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; - -function wbRUnion(const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordUnionDef; - -{--- wbStructS - array of struct ----------------------------------------------} -function wbStructS(const aSignature : TwbSignature; - const aName : string; - const aElementName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbStructS(const aName : string; - const aElementName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; - -function wbRStructS(const aName : string; - const aElementName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; - -function wbRStructsSK(const aName : string; - const aElementName : string; - const aSortKey : array of Integer; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; - -function wbEmpty(const aSignature : TwbSignature; - const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbEmpty(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aSorted : Boolean = False; - aGetCP : TwbGetConflictPriority = nil) - : IwbValueDef; overload; - -function wbRefID: IwbRefID; overload; - -function wbRefID(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbRefIDT(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbDumpInteger : IwbIntegerDefFormater; overload; - -function wbKey2Data6Enum(const aNames : array of string) - : IwbKey2Data6EnumDef; overload; - -function wbData6Key2Enum(const aNames : array of string) - : IwbData6Key2EnumDef; overload; - -function wbFormID: IwbFormID; overload; - -function wbFormID(const aValidRefs : array of TwbSignature; - aPersistent: Boolean) - : IwbFormID; overload; - -function wbFormIDNoReach(const aValidRefs : array of TwbSignature; - aPersistent : Boolean) - : IwbFormID; overload; - -function wbFormID(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean) - : IwbFormID; overload; - -function wbFormIDNoReach(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean) - : IwbFormID; overload; - -function wbFormID(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFormID(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbIntegerDef; overload; - -function wbFormIDT(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbFormIDCk(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFormIDCkNoReach(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFormIDCk(const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbIntegerDef; overload; - -function wbFormIDCkNoReach(const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbFormIDCk(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; - -function wbFormIDCk(const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbFormIDCkNoReach(const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; - -function wbChar4: IwbChar4; - -function wbStr4: IwbStr4; - -function wbFlags(const aNames : array of string; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; -function wbFlags(const aNames : array of string; - const aFlagsToIgnore : array of integer) - : IwbFlagsDef; overload; -function wbFlags(const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; - -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aFlagsToIgnore : array of integer) - : IwbFlagsDef; overload; -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; - -function wbEnum(const aNames : array of string) - : IwbEnumDef; overload; -function wbEnum(const aNames : array of string; - const aSparseNames : array of const) - : IwbEnumDef; overload; - - -function wbDiv(aValue : Integer) - : IwbIntegerDefFormater; -function wbMul(aValue : Integer) - : IwbIntegerDefFormater; -function wbCallback(const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback) - : IwbIntegerDefFormater; - -function wbFormaterUnion(aDecider : TwbIntegerDefFormaterUnionDecider; - aMembers : array of IwbIntegerDefFormater) - : IwbIntegerDefFormaterUnion; - -function wbIsPlugin(aFileName: string): Boolean; - -function wbStr4ToString(aInt: Int64): string; - -type - PwbRecordDefEntry = ^TwbRecordDefEntry; - TwbRecordDefEntry = record - rdeSignature : TwbSignature; - rdeHash : Integer; - rdeDef : IwbRecordDef; - rdeNext : Integer; - end; - - TwbRecordDefEntries = array of TwbRecordDefEntry; - -const - RecordDefHashMapSize = 1546; - -var - wbRecordDefs : TwbRecordDefEntries; - wbRecordDefHashMap : array[0..Pred(RecordDefHashMapSize)] of Integer; - - wbIgnoreRecords : TStringList; - wbGroupOrder : TStringList; - wbLoadBSAs : Boolean{} = True{}; - wbLoadAllBSAs : Boolean{} = False{}; - wbArchiveExtension : string = '.bsa'; - wbBuildRefs : Boolean{} = True{}; - wbContainerHandler : IwbContainerHandler; - wbLoaderDone : Boolean; - wbLoaderError : Boolean; - -procedure wbAddGroupOrder(const aSignature: TwbSignature); -function wbGetGroupOrder(const aSignature: TwbSignature): Integer; - -function IntToHex64(Value: Int64; Digits: Integer): string; inline; -function CmpB8(a, b: Byte): Integer; -function CmpI32(a, b : Integer) : Integer; -function CmpW32(a, b: Cardinal): Integer; -function CmpI64(const a, b : Int64) : Integer; -function CompareElementsFormIDAndLoadOrder(Item1, Item2: Pointer): Integer; - -function ConflictAllToColor(aConflictAll: TConflictAll): TColor; -function ConflictThisToColor(aConflictThis: TConflictThis): TColor; - -var - wbGetFormIDCallback : function(const aElement: IwbElement): Cardinal; - -function wbFlagsList(aFlags: array of const; aDeleted : Boolean = True; aUnknowns: Boolean = False): TDynStrings; -function wbGetFormID(const aElement: IwbElement): Cardinal; -function wbPositionToGridCell(const aPosition: TwbVector): TwbGridCell; -function wbSubBlockFromGridCell(const aGridCell: TwbGridCell): TwbGridCell; -function wbBlockFromSubBlock(const aSubBlock: TwbGridCell): TwbGridCell; -function wbGridCellToGroupLabel(const aGridCell: TwbGridCell): Cardinal; -function wbIsInGridCell(const aPosition: TwbVector; const aGridCell: TwbGridCell): Boolean; - -var - wbRecordFlags : IwbIntegerDef; - wbMainRecordHeader : IwbStructDef; - wbSizeOfMainRecordStruct : Integer; - -type - TwbGameMode = (gmFNV, gmFO3, gmTES3, gmTES4, gmTES5, gmSSE, gmFO4); - TwbToolMode = (tmView, tmEdit, tmDump, tmExport, tmMasterUpdate, tmMasterRestore, tmLODgen, tmScript, - tmTranslate, tmESMify, tmESPify, tmSortAndCleanMasters, - tmCheckForErrors, tmCheckForITM, tmCheckForDR); - TwbToolSource = (tsPlugins, tsSaves); - TwbSetOfMode = set of TwbToolMode; - -var - wbGameMode : TwbGameMode; - wbToolMode : TwbToolMode; - wbToolSource : TwbToolSource; - wbAppName : string; - wbGameName : string; - wbGameName2 : string; // game title name - wbToolName : string; - wbSourceName : String; - wbLanguage : string; - wbAutoModes : TwbSetOfMode = [ tmMasterUpdate, tmMasterRestore, tmLODgen, // Tool modes that run without user interaction until final status - tmESMify, tmESPify, tmSortAndCleanMasters, - tmCheckForErrors, tmCheckForITM, tmCheckForDR ]; - wbPluginModes : TwbSetOfMode = [ tmESMify, tmESPify, tmSortAndCleanMasters, - tmCheckForErrors, tmCheckForITM, tmCheckForDR ]; // Auto modes that require a specific plugin to be provided. - wbAlwaysMode : TwbSetOfMode = [ tmView, tmEdit, tmESMify, tmESPify, tmSortAndCleanMasters, - tmLODgen, tmScript, tmCheckForITM, tmCheckForDR, tmCheckForErrors ]; // Modes available to all decoded games - -function wbDefToName(const aDef: IwbDef): string; -function wbDefsToPath(const aDefs: TwbDefPath): string; - -procedure ReportDefs; - -type - IwbProgress = interface - ['{054006B0-096D-43CD-A92A-3095B525C854}'] - - procedure UpdateStatus(aPosition: Integer; const aStatus: string); - end; - - IwbWaitForm = interface - ['{185C220C-3135-4A8A-8E0E-8001759F3C85}'] - function GetIsCanceled: Boolean; - - function CreateProgress(const aCaption : string; - const aStatus : string; - aMax : Integer) - : IwbProgress; - - property IsCanceled: Boolean - read GetIsCanceled; - end; - - TwbCreateWaitForm = function(const aCaption : string; - const aMessage : string; - aCanCancel : Boolean; - aShowDelay : Integer = 0; - aUpdateDelay : Integer = 0) - : IwbWaitForm; - -function NullCreateWaitForm(const aCaption : string; - const aMessage : string; - aCanCancel : Boolean; - aShowDelay : Integer = 0; - aUpdateDelay : Integer = 0) - : IwbWaitForm; - -var - wbCreateWaitForm : TwbCreateWaitForm = NullCreateWaitForm; - -type - TwbFastStringList = class(TStringList) - protected - function CompareStrings(const S1, S2: string): Integer; override; - public - constructor CreateSorted(aDups : TDuplicates = dupError); - - procedure Clear(aFreeObjects: Boolean = False); reintroduce; - end; - - TwbFastStringListCS = class(TwbFastStringList) - public - procedure AfterConstruction; override; - end; - - TwbFastStringListIC = class(TwbFastStringList) - end; - -function RadiansNormalize(const aElement: IwbElement; aFloat: Extended): Extended; - -function wbBeginInternalEdit(aForce: Boolean = False): Boolean; -procedure wbEndInternalEdit; -function wbIsInternalEdit: Boolean; - -function StrToSignature(const s: string): TwbSignature; -function wbStringToAnsi(const aString: string; const aElement: IwbElement): AnsiString; -function wbAnsiToString(const aString: AnsiString; const aElement: IwbElement): string; - -function FixupFormID(aFormID: Cardinal; const aOld, aNew: TBytes): Cardinal; - -threadvar - _InternalEditCount: Integer; - _BlockInternalEdit: Boolean; - -var - wbActorValueEnum: IwbEnumDef; - -function GetContainerFromUnion(const aElement: IwbElement): IwbContainer; -function GetContainerRefFromUnionOrValue(const aElement: IwbElement): IwbContainerElementRef; -function GetElementFromUnion(const aElement: IwbElement): IwbElement; - -var - wbHeaderSignature : TwbSignature = 'TES4'; - wbFileMagic : TwbFileMagic; - wbFilePlugins : String = 'Master Files'; - wbUseFalsePlugins : Boolean = False; - wbFileHeader : IwbStructDef; - wbFileChapters : IwbStructDef; - wbBytesToSkip : Cardinal = 0; - wbBytesToDump : Cardinal = $FFFFFFFF; - wbBytesToGroup : Cardinal = 4; - wbExtractInfo : ^TByteSet; - wbTerminator : Byte = Ord('|'); - wbPlayerRefID : Cardinal = $14; - wbChangedFormOffset : Integer = 10000; - wbOfficialDLC : array of string; - -type - {$IFDEF WIN32} - TwbRefIDArray = array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - TwbRefIDArray = array of UInt64; - {$ENDIF WIN64} - -function wbReadInteger24(aBasePtr: pointer): Int64; -procedure InitializeRefIDArray(anArray: TwbRefIDArray); - -function wbFindRecordDef(const aSignature : TwbSignature; - out aRecordDef : PwbRecordDef) - : Boolean; overload; - -function wbFindRecordDef(const aSignature : AnsiString; - out aRecordDef : PwbRecordDef) - : Boolean; overload; - -function _wbRecordDefMap: TStringList; - -implementation - -uses - Windows, - Variants, - Math, - AnsiStrings, - TypInfo, - wbSort, - wbLocalization; - -function StrToSignature(const s: string): TwbSignature; -var - t: AnsiString; -begin - t := AnsiString(s); - if Length(t) >= 4 then - Result := PwbSignature(@t[1])^ - else - raise Exception.Create('"'+t+'" is not a valid signature'); -end; - -function IsTranslatable(const aElement: IwbElement): Boolean; -var - Def: IwbDef; -begin - Result := False; - - if Assigned(aElement) then begin - Def := aElement.ValueDef; - if not Assigned(Def) then - Def := aElement.Def; - - if Assigned(Def) then - Result := Def.ConflictPriority[aElement] = cpTranslate; - end; -end; - -function wbStringToAnsi(const aString: String; const aElement: IwbElement): AnsiString; -var - Translatable: Boolean; -begin - if Assigned(aElement) then - Translatable := IsTranslatable(aElement) - else - Translatable := True; - - if Translatable and (wbStringEncoding = seUTF8) then - Result := UTF8Encode(aString) - else - Result := AnsiString(aString); -end; - -function wbAnsiToString(const aString: AnsiString; const aElement: IwbElement): string; -var - Translatable: Boolean; -begin - if Assigned(aElement) then - Translatable := IsTranslatable(aElement) - else - Translatable := True; - - if Translatable and (wbStringEncoding = seUTF8) then - Result := UTF8Decode(aString) - else - Result := string(aString); -end; - -function wbBeginInternalEdit(aForce: Boolean): Boolean; -begin - Result := wbEditAllowed and (wbAllowInternalEdit or aForce) and not _BlockInternalEdit; - if Result then - Inc(_InternalEditCount); -end; - -procedure wbEndInternalEdit; -begin - Dec(_InternalEditCount); -end; - -function wbIsInternalEdit: Boolean; -begin - Result := _InternalEditCount > 0; -end; - - -var - OnePi : Single = 3.1415927;//(2!) 653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067; - TwoPi : Extended; - -function RoundToEx(const AValue: Extended; const ADigit: TRoundToRange): Extended; -var - LFactor: Extended; -begin - LFactor := IntPower(10, ADigit); - Result := Round(AValue / LFactor) * LFactor; -end; - -function DoSingleSameValue(const A, B: Single): Boolean; -const - SingleResolution : Single = 0.000000499999999999999999999; -begin - Result := Abs(A - B) <= Max(Min(Abs(A), Abs(B)) * SingleResolution, SingleResolution) -end; - -function SingleSameValue(const A, B: Extended): Boolean; -var - sA, sB: Single; -begin - sA := A; - sB := B; - Result := DoSingleSameValue(sA, sB); -end; - -function RadiansNormalize(const aElement: IwbElement; aFloat: Extended): Extended; -begin -// Result := RoundToEx(aFloat, -6); - Result := aFloat; - - if Abs(Result/TwoPi) > 100.0 then - Result := Result - Sign(Result)*TwoPi*Trunc(Abs(Result/TwoPi) - 100.0); - - while Result < 0.0 do - Result := Result + TwoPi; - while Result > TwoPi do - Result := Result - TwoPi; - if SingleSameValue(Result, 0.0) or (Result < 0.0) then - Result := 0.0; - if SingleSameValue(Result, TwoPi) or (Result > TwoPi) then - Result := 0.0; - -// Result := RoundToEx(Result, -6); -end; - -type - TwbNullWaitForm = class(TInterfacedObject, IwbWaitForm) - protected - {--- IwbWaitForm ---} - function GetIsCanceled: Boolean; - - function CreateProgress(const aCaption : string; - const aStatus : string; - aMax : Integer) - : IwbProgress; - end; - - TwbNullProgress = class(TInterfacedObject, IwbProgress) - protected - {--- IwbProgress ---} - procedure UpdateStatus(aPosition: Integer; const aStatus: string); - end; - -{ TwbNullWaitForm } - -function TwbNullWaitForm.CreateProgress(const aCaption, aStatus: string; aMax: Integer): IwbProgress; -begin - Result := TwbNullProgress.Create; -end; - -function TwbNullWaitForm.GetIsCanceled: Boolean; -begin - Result := False; -end; - -{ TwbNullProgress } - -procedure TwbNullProgress.UpdateStatus(aPosition: Integer; const aStatus: string); -begin -end; - -function NullCreateWaitForm(const aCaption : string; - const aMessage : string; - aCanCancel : Boolean; - aShowDelay : Integer = 0; - aUpdateDelay : Integer = 0) - : IwbWaitForm; -begin - Result := TwbNullWaitForm.Create; -end; - -procedure ReportDefs; -var - i: Integer; -begin - for i:= Low(wbRecordDefs) to High(wbRecordDefs) do - wbRecordDefs[i].rdeDef.Report(nil); -end; - -function wbDefToName(const aDef: IwbDef): string; -var - SignatureDef : IwbSignatureDef; - Signature : TwbSignature; - NamedDef : IwbNamedDef; - i : Integer; -begin - if Supports(aDef, IwbSignatureDef, SignatureDef) then begin - Signature := SignatureDef.DefaultSignature; - if Signature[0]=#0 then - Result := '$(00)'+Signature[1]+Signature[2]+Signature[3] + ' - ' + SignatureDef.Name - else - Result := Signature + ' - ' + SignatureDef.Name; - end else if Supports(aDef, IwbNamedDef, NamedDef) then begin - Result := NamedDef.Name; - end else if Assigned(aDef) then begin - Result := '<'+GetEnumName(TypeInfo(TwbDefType), Ord(aDef.DefType))+'>'; - end else - Result := ''; - for i := Length(Result) downto 1 do - if Result[i]<' ' then begin - Insert('$('+IntToHex(Ord(Result[i]), 2)+')', Result, i); - Delete(Result, i + 5, 1); - end; -end; - -function wbDefsToPath(const aDefs: TwbDefPath): string; -var - i: Integer; -begin - Result := ''; - for i := Low(aDefs) to High(aDefs) do begin - Result := Result + wbDefToName(aDefs[i].Def) + ' \ '; - if aDefs[i].Index >= 0 then - Result := Result + '['+IntToStr(aDefs[i].Index)+'] '; - end; -end; -function wbIsInGridCell(const aPosition: TwbVector; const aGridCell: TwbGridCell): Boolean; -var - GridCell : TwbGridCell; -begin - GridCell := wbPositionToGridCell(aPosition); - Result := (GridCell.x = aGridCell.x) and (GridCell.y = aGridCell.y); -end; - -function wbPositionToGridCell(const aPosition: TwbVector): TwbGridCell; -begin - Result.x := Trunc(aPosition.x / 4096); - if aPosition.x < 0 then - Dec(Result.x); - Result.y := Trunc(aPosition.y / 4096); - if aPosition.y < 0 then - Dec(Result.y); -end; - -function wbSubBlockFromGridCell(const aGridCell: TwbGridCell): TwbGridCell; -begin - Result.x := aGridCell.x div 8; - if (aGridCell.x < 0) and ((aGridCell.x mod 8) <> 0) then - Dec(Result.x); - Result.y := aGridCell.y div 8; - if (aGridCell.y < 0) and ((aGridCell.y mod 8) <> 0) then - Dec(Result.y); -end; - -function wbBlockFromSubBlock(const aSubBlock: TwbGridCell): TwbGridCell; -begin - Result.x := aSubBlock.x div 4; - if (aSubBlock.x < 0) and ((aSubBlock.x mod 4) <> 0) then - Dec(Result.x); - Result.y := aSubBlock.y div 4; - if (aSubBlock.y < 0) and ((aSubBlock.y mod 4) <> 0) then - Dec(Result.y); -end; - -function wbGridCellToGroupLabel(const aGridCell: TwbGridCell): Cardinal; -var - x, y: Smallint; - xx,yy: Word; -begin - x := aGridCell.x; - y := aGridCell.y; - xx := PWord(@x)^; - yy := PWord(@y)^; - Result := Cardinal(yy) or (Cardinal(xx) shl 16); -end; - -function wbGetFormID(const aElement: IwbElement): Cardinal; -begin - if Assigned(wbGetFormIDCallback) then - Result := wbGetFormIDCallback(aElement) - else - Result := 0; -end; - -function ConflictAllToColor(aConflictAll: TConflictAll): TColor; -begin - Result := wbColorConflictAll[aConflictAll]; -end; - -function ConflictThisToColor(aConflictThis: TConflictThis): TColor; -begin - Result := wbColorConflictThis[aConflictThis]; -end; - -procedure wbAddGroupOrder(const aSignature: TwbSignature); -begin - if not Assigned(wbGroupOrder) then - wbGroupOrder := TwbFastStringListCS.CreateSorted; - wbGroupOrder.AddObject(aSignature, Pointer(wbGroupOrder.Count)); -end; - -function wbGetGroupOrder(const aSignature: TwbSignature): Integer; -begin - if Assigned(wbGroupOrder) then begin - Result := wbGroupOrder.IndexOf(aSignature); - if Result >= 0 then - Result := Integer(wbGroupOrder.Objects[Result]); - end else - Result := -1; -end; - -function CompareElementsFormIDAndLoadOrder(Item1, Item2: Pointer): Integer; -var - MainRecord1, MainRecord2: IwbMainRecord; -begin - if Item1 = Item2 then begin - Result := 0; - Exit; - end; - - MainRecord1 := IwbElement(Item1) as IwbMainRecord; - MainRecord2 := IwbElement(Item2) as IwbMainRecord; - - Result := CmpW32( - MainRecord1.LoadOrderFormID, - MainRecord2.LoadOrderFormID); - if Result = 0 then - Result := CmpI32( - MainRecord1._File.LoadOrder, - MainRecord2._File.LoadOrder); -end; - -function wbFlagsList(aFlags: array of const; aDeleted : Boolean = True; aUnknowns: Boolean = False): TDynStrings; -var - e: IwbEnumDef; - i: integer; - s: string; -begin - e := wbEnum([], aFlags); - SetLength(Result, 32); - for i := 0 to 31 do - if i = 12 then - Result[i] := 'Ignored' - else if aDeleted and (i = 5) then - Result[i] := 'Deleted' - else begin - s := e.ToString(i, nil); - if Pos('<', s) <> 1 then - Result[i] := s - else if aUnknowns then - Result[i] := 'Unknown ' + IntToStr(i); - end -end; - -type - TwbDef = class; - - IwbDefInternal = interface(IwbDef) - ['{8EBA62A9-AF6B-4377-B52C-A1CEBF5B3ED6}'] - function SetParent(const aParent: TwbDef; aForceDuplicate: Boolean): IwbDef; - end; - - TwbDefClass = class of TwbDef; - TwbDef = class(TInterfacedObject, IwbDef, IwbDefInternal) - private - defSource : IwbDef; - defParent : TwbDef; - - defPriority : TwbConflictPriority; - defGetCP : TwbGetConflictPriority; - defRequired : Boolean; - - defUsed : Boolean; - defReported : Boolean; - defPossiblyRequired : Boolean; - defNotRequired : Boolean; - - IsUnknown : Boolean; - IsUnknownChecked : Boolean; - UnknownValues : TStringList; - protected - constructor Clone(const aSource: TwbDef); virtual; - constructor Create(aPriority: TwbConflictPriority; aRequired: Boolean; aGetCP: TwbGetConflictPriority); - - {---IwbDef---} - function GetDefType: TwbDefType; virtual; abstract; - function GetDefTypeName: string; virtual; abstract; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; virtual; - function Assign(const aTarget: IwbElement; aIndex: Integer; const aSource: IwbElement; aOnlySK: Boolean): IwbElement; virtual; - function GetDefID: Cardinal; - function Equals(const aDef: IwbDef): Boolean; reintroduce; virtual; - function GetConflictPriority(const aElement: IwbElement): TwbConflictPriority; virtual; - function GetConflictPriorityCanChange: Boolean; virtual; - function GetRequired: Boolean; - function CanContainFormIDs: Boolean; virtual; - function GetDontShow(const aElement: IwbElement): Boolean; virtual; - function GetHasDontShow: Boolean; virtual; - function GetRoot: IwbDef; - function GetParent: IwbDef; - - procedure Report(const aParents: TwbDefPath); virtual; - procedure Used(const aElement: IwbElement; const s: string); - procedure PossiblyRequired; - procedure NotRequired; - function IsNotRequired: Boolean; - function GetNoReach: Boolean; virtual; - - {--- IwbDefInternal ---} - function SetParent(const aParent: TwbDef; aForceDuplicate: Boolean): IwbDef; virtual; - procedure ParentSet; virtual; - - function Duplicate: TwbDef; - end; - - TwbNamedDef = class(TwbDef, IwbNamedDef) - private - noName : string; - noAfterLoad : TwbAfterLoadCallback; - noAfterSet : TwbAfterSetCallback; - noDontShow : TwbDontShowCallback; - noTerminator : Boolean; - noUnused : Boolean; - noTreeHead : Boolean; - noTreeBranch : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); - {--- IwbDef ---} - function GetDontShow(const aElement: IwbElement): Boolean; override; - function GetHasDontShow: Boolean; override; - - {--- IwbDefInternal ---} - procedure ParentSet; override; - - {---IwbNamedDef---} - function GetName: string; - function GetPath: string; - procedure AfterLoad(const aElement: IwbElement); virtual; - procedure AfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); - function GetTreeHead: Boolean; // Is the element expected to be a "header record" in the tree navigator - procedure SetTreeHead(aValue: Boolean); // Make the element a "header record" in the tree navigator; - function GetTreeBranch: Boolean; // Is the element included in a "leaf" expected to be displayed in the view pane - procedure SetTreeBranch(aValue: Boolean); // Make the element included in a "leaf" visible in the tree navigator; - end; - - TwbSignatureDef = class(TwbNamedDef, IwbSignatureDef) - private - soSignatures : TwbSignatures; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); overload; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignatures : array of TwbSignature; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); overload; - - {---IwbSignatureDef---} - function GetDefaultSignature: TwbSignature; - - function GetSignatures(const aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; virtual; - end; - - TwbRecordDef = class(TwbSignatureDef, IwbRecordDef) - private - recRecordFlags : IwbIntegerDefFormater; - recRecordHeaderStruct : IwbStructDef; - recMembers : array of IwbRecordMemberDef; - recSignatures : TStringList; - recAllowUnordered : Boolean; - recAddInfoCallback : TwbAddInfoCallback; - recCanContainFormIDs : Boolean; - recQuickInitLimit : Integer; - recContainsEditorID : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - const aRecordFlags : IwbIntegerDefFormater; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean; - aAddInfoCallback : TwbAddInfoCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback); - destructor Destroy; override; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbRecordDef---} - function ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; - function GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; - function GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; - function AllowUnordered: Boolean; - function AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; - - function GetMember(aIndex: Integer): IwbRecordMemberDef; - function GetMemberCount: Integer; - function CanContainFormIDs: Boolean; override; - function GetSkipSignature(const aSignature: TwbSignature): Boolean; virtual; - function GetQuickInitLimit: Integer; - function GetContainsEditorID: Boolean; - function GetRecordHeaderStruct: IwbStructDef; - - procedure AfterLoad(const aElement: IwbElement); override; - end; - - TwbSubRecordDef = class(TwbSignatureDef, IwbRecordMemberDef, IwbSubRecordDef) - private - srValue : IwbValueDef; - srSizeMatch : Boolean; - - srHasUnusedData: Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeMatch : Boolean; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); overload; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignatures : array of TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeMatch : Boolean; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); overload; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbSubRecordDef---} - function GetValue: IwbValueDef; - function CanContainFormIDs: Boolean; override; - procedure HasUnusedData; - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; override; - end; - - TwbSubRecordArrayDef = class(TwbNamedDef, IwbRecordMemberDef, IwbSubRecordArrayDef) - private - sraElement : IwbRecordMemberDef; - sraSorted : Boolean; - sraIsSorted : TwbIsSortedCallback; - public - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; aRequired: Boolean; - const aName : string; - const aElement : IwbRecordMemberDef; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aIsSorted : TwbIsSortedCallback; - aGetCP : TwbGetConflictPriority); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbNamedDef---} - procedure AfterLoad(const aElement: IwbElement); override; - - {---IwbSignatureDef---} - function GetDefaultSignature: TwbSignature; - - function GetSignatures(const aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; virtual; - - {---IwbSubRecordArrayDef---} - function GetElement: IwbRecordMemberDef; - function GetSorted(const aContainer: IwbContainer): Boolean; - end; - - TwbSubRecordStructDef = class(TwbNamedDef, IwbRecordMemberDef, IwbSubRecordStructDef, IwbRecordDef) - private - srsMembers : array of IwbRecordMemberDef; - srsSignatures : TStringList; - srsSkipSignatures : TStringList; - srsCanContainFormIDs : Boolean; - srsAllowUnordered : Boolean; - public - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aDontShow : TwbDontShowCallback; - aAllowUnordered : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); - destructor Destroy; override; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbNamedDef---} - procedure AfterLoad(const aElement: IwbElement); override; - - {---IwbSignatureDef---} - function GetDefaultSignature: TwbSignature; - - function GetSignatures(const aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; virtual; - - {---IwbRecordDef---} - function ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; - function GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; - function GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; - function AllowUnordered: Boolean; - function AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; - - function GetMember(aIndex: Integer): IwbRecordMemberDef; - function GetMemberCount: Integer; - function GetSkipSignature(const aSignature: TwbSignature): Boolean; virtual; - function GetQuickInitLimit: Integer; virtual; - function GetContainsEditorID: Boolean; - function GetRecordHeaderStruct: IwbStructDef; - end; - - TwbSubRecordUnionDef = class(TwbNamedDef, IwbRecordMemberDef, IwbSubRecordUnionDef, IwbRecordDef) - private - sruMembers : array of IwbRecordMemberDef; - sruSignatures : TStringList; - sruSkipSignatures : TStringList; - sruCanContainFormIDs : Boolean; - public - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); - destructor Destroy; override; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbSignatureDef---} - function GetDefaultSignature: TwbSignature; - - function GetSignatures(const aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - - function CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; virtual; - - {---IwbRecordDef---} - function ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; - function GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; - function GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; - function AllowUnordered: Boolean; - function AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; - - function GetMember(aIndex: Integer): IwbRecordMemberDef; - function GetMemberCount: Integer; - function GetSkipSignature(const aSignature: TwbSignature): Boolean; virtual; - function GetQuickInitLimit: Integer; virtual; - function GetContainsEditorID: Boolean; - function GetRecordHeaderStruct: IwbStructDef; - end; - - - TwbSubRecordStructSKDef = class(TwbSubRecordStructDef, IwbHasSortKeyDef) - private - srsSortKey : array of Integer; - srsExSortKey : array of Integer; - srsMemberInSK : array of Boolean; - public - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - aDontShow : TwbDontShowCallback; - aAllowUnordered : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); - - {---IwbHasSortKeyDef---} - function GetSortKey(aIndex: Integer; aExtended: Boolean): Integer; - function GetSortKeyCount(aExtended: Boolean): Integer; - function IsInSK(aIndex: Integer): Boolean; - end; - - TwbValueDefState = ( - vdsIsVariableSize, - vdsIsVariableSizeChecked - ); - TwbValueDefStates = set of TwbValueDefState; - - TwbValueDef = class(TwbNamedDef, IwbValueDef) - protected - vdStates: TwbValueDefStates; - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; reintroduce; virtual; abstract; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; virtual; - function Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; virtual; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; virtual; abstract; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; virtual; abstract; - function GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; virtual; - procedure BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); virtual; - function GetIsVariableSize: Boolean; - function GetIsVariableSizeInternal: Boolean; virtual; - function GetCanBeZeroSize: Boolean; virtual; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; virtual; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); virtual; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; virtual; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); virtual; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; virtual; - function GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; virtual; - function GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; virtual; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; virtual; - function GetElementMap: TDynCardinalArray; virtual; - - procedure MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); virtual; - procedure MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); virtual; - procedure FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); virtual; - function CompareExchangeFormID(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; virtual; - end; - - TwbUnionDef = class(TwbValueDef, IwbUnionDef) - protected {private} - udDecider: TwbUnionDecider; - udMembers: array of IwbValueDef; - ubCanContainFormIDs: Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; override; - procedure BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); override; - function GetIsVariableSizeInternal: Boolean; override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - {---IwbUnionDef---} - function Decide(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): IwbValueDef; - function GetMember(aIndex: Integer): IwbValueDef; - function GetMemberCount: Integer; - end; - - TwbStringTransformType = ( - ttToString, - ttToSortKey, - ttToEditValue, - ttFromEditValue, - ttToNativeValue, - ttFromNativeValue - ); - - TwbStringDef = class(TwbValueDef, IwbStringDef) - protected - sdSize: Integer; - sdForward: boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aSize : Integer; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean; - aForward : boolean = false); virtual; - function ToStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): AnsiString; virtual; - function ToStringTransform(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aTransformType: TwbStringTransformType): string; - - procedure FromStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: AnsiString); virtual; - procedure FromStringTransform(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string; aTransformType: TwbStringTransformType); - - function TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; virtual; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetIsVariableSizeInternal: Boolean; override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - {---IwbStringDef---} - function GetStringSize: Integer; - end; - - TwbStringScriptDef = class(TwbStringDef) - protected - function TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; override; - end; - - TwbStringLCDef = class(TwbStringDef) - protected - function TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; override; - end; - - TwbStringKCDef = class(TwbStringDef) // Keep Case - protected - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - end; - - TwbStringMgefCodeDef = class(TwbStringDef) - protected - function TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; override; - - {---IwbDef---} - function CanContainFormIDs: Boolean; override; - - {---IwbValueDef---} - function GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; override; - procedure BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); override; - - procedure MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - end; - - TwbLStringDef = class(TwbStringDef) - protected - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function ToStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): AnsiString; override; - procedure FromStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: AnsiString); override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - end; - - TwbLStringKCDef = class(TwbLStringDef) - protected - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - end; - - TwbLenStringDef = class(TwbValueDef, IwbLenStringDef) - protected - Prefix: Integer; - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aPrefix : integer; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetIsVariableSizeInternal: Boolean; override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - function GetPrefixLen: Integer; - function GetPrefixOffset: Integer; - function GetPrefixValue(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; - procedure SetPrefixValue(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement; aValue: Cardinal); - end; - - TwbByteArrayDef = class(TwbValueDef, IwbByteArrayDef) - protected {private} - badSize : Int64; - - FoundFormIDAtOffSet : array of Integer; - NotFoundFormIDAtOffSet : array of Integer; - SignaturesAtOffSet : array of TStringList; - FormIDsAtOffSetFoundIn : array of TStringList; - - FoundFloatAtOffSet : array of Integer; - NotFoundFloatAtOffSet : array of Integer; - FloatsAtOffSet : array of TStringList; - - FoundString : Integer; - NotFoundString : Integer; - Strings : TStringList; - -//------------------------------------------------------------------------------ -// Added LString Routine -//------------------------------------------------------------------------------ - FoundLString : Integer; - NotFoundLString : Integer; - - IsEmpty : Integer; - IsNotEmpty : Integer; - - badCountCallback : TwbCountCallBack; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aSize : Int64; - aDontShow : TwbDontShowCallback; - aCountCallback : TwbCountCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - - procedure Report(const aParents: TwbDefPath); override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetIsVariableSizeInternal: Boolean; override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - end; - - TwbEmptyDef = class(TwbValueDef, IwbEmptyDef) - protected {private} - edSorted: Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aSorted : Boolean; - aGetCP : TwbGetConflictPriority); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanContainFormIDs: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetCanBeZeroSize: Boolean; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - {--- IwbEmptyDef ---} - function GetSorted: Boolean; - end; - - TwbIntegerDef = class(TwbValueDef, IwbIntegerDef, IwbInternalIntegerDef) - private - inType : TwbIntType; - inFormater : IwbIntegerDefFormater; - inDefault : Int64; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback; - aDefault : Int64; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function Assign(const aTarget: IwbElement; aIndex: Integer; const aSource: IwbElement; aOnlySK: Boolean): IwbElement; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - function GetNoReach: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; override; - procedure BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - procedure MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); override; - procedure MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); override; - procedure FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); override; - function CompareExchangeFormID(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOldFormID: Cardinal; aNewFormID: Cardinal): Boolean; override; - - {---IwbIntegerDef---} - function ToInt(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Int64; - procedure FromInt(aValue: Int64; aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); - function GetFormater(const aElement: IwbElement): IwbIntegerDefFormater; - function GetFormaterCanChange: Boolean; - function GetIntType: TwbIntType; - function GetExpectedLength(aValue: Int64 = 0): Integer; - - {---IwbInternalIntegerDef---} - procedure ReplaceFormater(const aFormater: IwbIntegerDefFormater); - end; - - TwbFloatDef = class(TwbValueDef, IwbFloatDef) - private - fdDefault : Extended; - fdScale : Extended; - fdDigits : Integer; - fdNormalizer : TwbFloatNormalizer; - fdDouble : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - procedure FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); override; - function ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; override; - procedure FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); override; - function GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - function SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; override; - - function ToValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Extended; - public - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aScale : Extended; - aDigits : Integer; - aDontShow : TwbDontShowCallback; - aNormalizer : TwbFloatNormalizer; - aDefault : Extended; - aGetCP : TwbGetConflictPriority; - aDouble : Boolean; - aTerminator : Boolean); - end; - - TwbArrayDef = class(TwbValueDef, IwbArrayDef) - private - arCount : Integer; - arCountCallback : TwbCountCallback; - arElement : IwbValueDef; - arLabels : array of string; - arSorted : Boolean; - arCanAddTo : Boolean; - arTerminated : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - const aLabels : array of string; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aCanAddTo : Boolean; - aTerminator : Boolean; - aTerminated : Boolean); overload; - - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - const aLabels : array of string; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aCanAddTo : Boolean; - aTerminator : Boolean; - aTerminated : Boolean); overload; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbValueDef---} - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetIsVariableSizeInternal: Boolean; override; - function GetCanBeZeroSize: Boolean; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - {---IwbArrayDef---} - function GetElement: IwbValueDef; - function GetCount: Integer; - function GetElementLabel(aIndex: Integer): string; - function GetSorted: Boolean; - function GetCanAddTo: Boolean; - function GetCountCallBack: TwbCountCallback; - function GetPrefixSize(aBasePtr: Pointer): Integer; - function GetPrefixLength(aBasePtr: Pointer): Integer; - function GetPrefixCount(aBasePtr: Pointer): Cardinal; - procedure SetPrefixCount(aBasePtr: Pointer; aValue: Cardinal); - end; - - TwbStructDef = class(TwbValueDef, IwbStructDef) - private - stMembers : array of IwbValueDef; - stSortKey : array of Integer; - stExSortKey : array of Integer; - stElementMap : TDynCardinalArray; - stCanContainFormIDs : Boolean; - stOptionalFromElement : Integer; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbValueDef; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - {$IFDEF WIN32} - const aElementMap : array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - const aElementMap : array of UInt64; - {$ENDIF WIN64} - aOptionalFromElement : Integer; - aDontShow : TwbDontShowCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - - {---IwbValueDef---} - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; override; - function GetIsVariableSizeInternal: Boolean; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function GetElementMap: TDynCardinalArray; override; - - {---IwbStructDef---} - function GetMemberCount: Integer; - function GetMember(aIndex: Integer): IwbValueDef; - function GetMemberByName(const aName: string): IwbValueDef; - function GetOptionalFromElement: Integer; - end; - - TwbStructCDef = class(TwbStructDef, IwbStructCDef) - private - scSizeCallback : TwbSizeCallback; - scGetChapterType : TwbGetChapterTypeCallback; - scGetChapterTypeName : TwbGetChapterTypeNameCallback; - scGetChapterName : TwbGetChapterNameCallback; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbValueDef; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - aOptionalFromElement : Integer; - aDontShow : TwbDontShowCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeCallBack : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - aGetCP : TwbGetConflictPriority); - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - public - function GetSizing(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement;var CompressedSize: Integer): Cardinal; virtual; - function GetChapterType(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; virtual; - function GetChapterTypeName(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; virtual; - function GetChapterName(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): String; virtual; - end; - - TwbStructZDef = class(TwbStructCDef, IwbStructZDef) - end; - - TwbStructLZDef = class(TwbStructCDef, IwbStructLZDef) - end; - - TwbIntegerDefFormater = class(TwbDef, IwbIntegerDefFormater) - protected - constructor Clone(const aSource: TwbDef); override; - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; reintroduce; virtual; abstract; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; virtual; abstract; - function Check(aInt: Int64; const aElement: IwbElement): string; virtual; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); virtual; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; virtual; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; virtual; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; virtual; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; virtual; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; virtual; - function GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; virtual; - - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; virtual; - function MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; virtual; - procedure FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); virtual; - function CompareExchangeFormID(var aInt: Int64; aOldFormID: Cardinal; aNewFormID: Cardinal; const aElement: IwbElement): Boolean; virtual; - - function GetRequiresKey: Boolean; virtual; - end; - - TwbIntegerDefFormaterUnion = class(TwbIntegerDefFormater, IwbIntegerDefFormaterUnion) - private - idfuDecider: TwbIntegerDefFormaterUnionDecider; - idfuMembers: array of IwbIntegerDefFormater; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - aGetCP : TwbGetConflictPriority; - aDecider : TwbIntegerDefFormaterUnionDecider; - const aMembers : array of IwbIntegerDefFormater); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function CanContainFormIDs: Boolean; override; - procedure Report(const aParents: TwbDefPath); override; - function GetNoReach: Boolean; override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function Check(aInt: Int64; const aElement: IwbElement): string; override; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); override; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - function GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; override; - - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; override; - function MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; override; - procedure FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); override; - function CompareExchangeFormID(var aInt: Int64; aOldFormID: Cardinal; aNewFormID: Cardinal; const aElement: IwbElement): Boolean; override; - - {---IwbIntegerDefFormaterUnion---} - function Decide(const aElement: IwbElement): IwbIntegerDefFormater; - - function GetMember(aIndex: Integer): IwbIntegerDefFormater; - function GetMemberCount: Integer; - - property Members[aIndex: Integer]: IwbIntegerDefFormater read GetMember; - property MemberCount: Integer read GetMemberCount; - end; - - TwbDumpIntegerDefFormater = class(TwbIntegerDefFormater, IwbDumpIntegerDefFormater) - protected - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - end; - - TwbFormID = class(TwbIntegerDefFormater, IwbFormID) - protected - FoundSignatures: TStringList; - FoundNotAllowedReferences: TStringList; - NotResolved: TStringList; - - constructor Clone(const aSource: TwbDef); override; - - function IsValid(const aSignature: TwbSignature): Boolean; virtual; - function IsValidFlst(const aSignature: TwbSignature): Boolean; virtual; - function CheckFlst(const aMainRecord: IwbMainRecord): Boolean; virtual; - function IsValidMainRecord(const aMainRecord: IwbMainRecord): Boolean; virtual; - - function FindRecordForAVCode(aInt: Int64; const aElement: IwbElement): IwbMainRecord; - - {---IwbDef---} - procedure Report(const aParents: TwbDefPath); override; - - {---IwbIntegerDefFormater---} - function Check(aInt: Int64; const aElement: IwbElement): string; override; - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); override; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - function GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; override; - - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function CanContainFormIDs: Boolean; override; - - function MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; override; - function MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; override; - procedure FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); override; - function CompareExchangeFormID(var aInt: Int64; aOldFormID: Cardinal; aNewFormID: Cardinal; const aElement: IwbElement): Boolean; override; - - {---IwbFormID---} - function GetMainRecord(aInt: Int64; const aElement: IwbElement): IwbMainRecord; virtual; - end; - - TwbRefID = class(TwbFormID, IwbRefID) - protected - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); override; - end; - - TwbFormIDChecked = class(TwbFormID, IwbFormIDChecked) - protected {private} - fidcValidRefsArr : array of TwbSignature; - fidcValidRefs : TStringList; - fidcValidFlstRefsArr : array of TwbSignature; - fidcValidFlstRefs : TStringList; - fidcPersistent : Boolean; - fidcNoReach : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean; - aNoReach : Boolean = False); - destructor Destroy; override; - - function IsValid(const aSignature: TwbSignature): Boolean; override; - function IsValidFlst(const aSignature: TwbSignature): Boolean; override; - function CheckFlst(const aMainRecord: IwbMainRecord): Boolean; override; - function IsValidMainRecord(const aMainRecord: IwbMainRecord): Boolean; override; - - {---IwbDef---} - procedure Report(const aParents: TwbDefPath); override; - function GetNoReach: Boolean; override; - - {---IwbIntegerDefFormater---} - function Check(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - {---IwbFormIDChecked---} - function GetSignature(aIndex: Integer): TwbSignature; - function GetSignatureCount: Integer; - end; - - TwbChar4 = class(TwbIntegerDefFormater, IwbChar4) - protected - constructor Clone(const aSource: TwbDef); override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - procedure BuildRef(aInt: Int64; const aElement: IwbElement); override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - function CanContainFormIDs: Boolean; override; - end; - - TwbStr4 = class(TwbIntegerDefFormater, IwbStr4) - protected - constructor Clone(const aSource: TwbDef); override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - function CanContainFormIDs: Boolean; override; - end; - - TwbFlagsDef = class(TwbIntegerDefFormater, IwbFlagsDef) - private - flgBaseFlagsDef : IwbFlagsDef; - flgNames : array of string; - flgDontShows : array of TwbDontShowCallback; - flgHasDontShows : Boolean; - flgUnusedMask : Int64; - flgIgnoreMask : Int64; - flgUnknownIsUnused : Boolean; - flgGetCPs : array of TwbGetConflictPriority; - flgHasGetCPs : Boolean; - flgFlagDefs : array of IwbFlagDef; - - UnknownFlags : array[0..63] of Integer; - HasUnknownFlags : Boolean; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean; - aIgnoreMask : Int64; - const aGetCPs : array of TwbGetConflictPriority); - - {---IwbDef---} - procedure Report(const aParents: TwbDefPath); override; - function GetDefTypeName: string; override; - - {---IwbIntegerDefFormater---} - function Check(aInt: Int64; const aElement: IwbElement): string; override; - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - function Assign(const aTarget: IwbElement; aIndex: Integer; const aSource: IwbElement; aOnlySK: Boolean): IwbElement; override; - function CanContainFormIDs: Boolean; override; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - - function GetRequiresKey: Boolean; override; - - {---IwbFlagsDef---} - function GetBaseFlagsDef: IwbFlagsDef; - function GetFlag(aIndex: Integer): string; - function GetFlagCount: Integer; - function GetFlagIgnoreConflict(aIndex: Integer): Boolean; - function GetFlagDontShow(const aElement: IwbElement; aIndex: Integer): Boolean; - function GetFlagHasDontShow(aIndex: Integer): Boolean; - procedure FlagGetCP(const aElement: IwbElement; aIndex: Integer; var aCP: TwbConflictPriority); - function GetFlagHasGetCP(aIndex: Integer): Boolean; - function GetFlagDef(aIndex : Integer): IwbFlagDef; - end; - - TwbFlagDef = class(TwbValueDef, IwbFlagDef) - private - fdFlagIndex : Integer; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean; - aFlagIndex : Integer); - - {---IwbDef---} - function GetDefType: TwbDefType; override; - function GetDefTypeName: string; override; - function CanContainFormIDs: Boolean; override; - function GetHasDontShow: Boolean; override; - function GetDontShow(const aElement: IwbElement): Boolean; override; - function GetConflictPriority(const aElement: IwbElement): TwbConflictPriority; override; - function GetConflictPriorityCanChange: Boolean; override; - function GetCanBeZeroSize: Boolean; override; - - {---IwbValueDef---} - function ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; override; - function GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - function GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; override; - - {---IwbFlagDef---} - function GetFlagsDef: IwbFlagsDef; - function GetFlagIndex: Integer; - end; - - PwbSparseName = ^TwbSparseName; - TwbSparseName = record - snIndex : Int64; - snName : string; - end; - - TwbEnumDef = class(TwbIntegerDefFormater, IwbEnumDef) - private - enNames : array of string; - enSparseNames : array of TwbSparseName; - enSparseNamesMap : array of PwbSparseName; - enEditInfo : string; - - UnknownEnums: TStringList; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(const aNames : array of string; - const aSparseNames : array of const); - - function FindSparseName(aSearchIndex: Int64; var Index: Integer): Boolean; - - function CanContainFormIDs: Boolean; override; - - {---IwbDef---} - procedure Report(const aParents: TwbDefPath); override; - function GetDefTypeName: string; override; - - {---IwbIntegerDefFormater---} - function Check(aInt: Int64; const aElement: IwbElement): string; override; - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - - {---IwbEnumDef---} - function GetName(aIndex: Integer): string; - function GetNameCount: Integer; - end; - - TwbKey2Data6EnumDef = class(TwbEnumDef, IwbKey2Data6EnumDef) - protected - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - end; - - TwbData6Key2EnumDef = class(TwbEnumDef, IwbData6Key2EnumDef) - protected - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - end; - - TwbDivDef = class(TwbIntegerDefFormater) - private - ddValue: Integer; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aValue: Integer); - - function CanContainFormIDs: Boolean; override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - end; - - TwbMulDef = class(TwbIntegerDefFormater) - private - mdValue: Integer; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(aValue: Integer); - - function CanContainFormIDs: Boolean; override; - - {---IwbIntegerDefFormater---} - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - end; - - TwbCallbackDef = class(TwbIntegerDefFormater, IwbCallbackDef) - private - cdToStr: TwbIntToStrCallback; - cdToInt: TwbStrToIntCallback; - protected - constructor Clone(const aSource: TwbDef); override; - constructor Create(const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback); - - function CanContainFormIDs: Boolean; override; - - {---IwbIntegerDefFormater---} - function Check(aInt: Int64; const aElement: IwbElement): string; override; - function ToString(aInt: Int64; const aElement: IwbElement): string; override; - function ToSortKey(aInt: Int64; const aElement: IwbElement): string; override; - function CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; override; - - function GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; override; - function GetEditInfo(aInt: Int64; const aElement: IwbElement): string; override; - - function ToEditValue(aInt: Int64; const aElement: IwbElement): string; override; - function FromEditValue(const aValue: string; const aElement: IwbElement): Int64; override; - function GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; override; - - {---IwbCallbackDef---} - function GetCallback: TwbIntToStrCallback; - end; - - -function wbRecord(const aSignature : TwbSignature; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean = False; - aAddInfoCallback : TwbAddInfoCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbRecordDef; -begin - Result := wbRecord(aSignature, aName, nil, aMembers, aAllowUnordered, aAddInfoCallback, aPriority, aRequired, aAfterLoad, aAfterSet); -end; - -function wbRecord(const aSignature : TwbSignature; - const aName : string; - const aRecordFlags : IwbIntegerDefFormater; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean = False; - aAddInfoCallback : TwbAddInfoCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbRecordDef; -var - Hash : Integer; - Index : Integer; - RDE : PwbRecordDefEntry; - NewIndex : Integer; -begin - Hash := Cardinal(aSignature) mod RecordDefHashMapSize; - Index := Pred(wbRecordDefHashMap[Hash]); - if Index >= 0 then begin - RDE := @wbRecordDefs[Index]; - while Assigned(RDE) do begin - if Cardinal(RDE.rdeSignature) = Cardinal(aSignature) then - raise Exception.CreateFmt('Duplicated record definition for signature %s', [String(aSignature)]); - if RDE.rdeNext >= 0 then - RDE := @wbRecordDefs[RDE.rdeNext] - else - RDE := nil; - end; - end; - - Result := TwbRecordDef.Create(aPriority, aRequired, aSignature, aName, aRecordFlags, aMembers, aAllowUnordered, aAddInfoCallback, aAfterLoad, aAfterSet); - NewIndex := Length(wbRecordDefs); - SetLength(wbRecordDefs, Succ(NewIndex)); - with wbRecordDefs[NewIndex] do begin - rdeDef := Result; - rdeSignature := aSignature; - rdeHash := Hash; - rdeNext := Index; - end; - wbRecordDefHashMap[Hash] := Succ(NewIndex); -end; - -function wbSubRecord(const aSignature : TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; -begin - Result := TwbSubRecordDef.Create(aPriority, aRequired, aSignature, aName, aValue, aAfterLoad, aAfterSet, aSizeMatch, aDontShow, aGetCP); -end; - -function wbSubRecord(const aSignatures : array of TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback = nil; aAfterSet: TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; -begin - Result := TwbSubRecordDef.Create(aPriority, aRequired, aSignatures, aName, aValue, aAfterLoad, aAfterSet, aSizeMatch, aDontShow, aGetCP); -end; - - -function wbString(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbString('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbString(const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbStringForward(const aSignature : TwbSignature; // When the editor can leave chars after the ending #0 - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbString(True, '', aSize, aPriority, aRequired, aDontShow, aAfterSet), nil, aAfterSet, aPriority, aRequired, False, aDontShow); -end; - -function wbString( aForward : Boolean = False; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False, aForward); -end; - -function wbStringT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStringT('', aSize, aPriority, aRequired, aDontShow, aAfterSet, aGetCP), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStringT(const aName : string = 'Unknown'; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, True); -end; - -function wbStringScript(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStringScript('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStringScript(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringScriptDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbStringLC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStringLC('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStringLC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringLCDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbStringKC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStringKC('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStringKC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringKCDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbLString(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbLString('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbLString(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbLStringDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbLStringKC(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbLStringKC('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbLStringKC(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbLStringKCDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbStringMgefCode(const aSignature : TwbSignature; - const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStringMgefCode('', aSize, aPriority), nil, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStringMgefCode(const aName : string; - aSize : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStringDef; overload; -begin - Result := TwbStringMgefCodeDef.Create(aPriority, aRequired, aName, aSize, nil, aAfterSet, aDontShow, aGetCP, False); -end; - -function wbLenString(const aSignature : TwbSignature; - const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbLenString('', aPrefix, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbLenString(const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbLenStringDef; overload; -begin - Result := TwbLenStringDef.Create(aPriority, aRequired, aName, aPrefix, nil, nil, aDontShow, aGetCP, False); -end; - -function wbLenStringT(const aSignature : TwbSignature; - const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbLenStringT('', aPrefix, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbLenStringT(const aName : string; - aPrefix : Integer = 4; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbLenStringDef; overload; -begin - Result := TwbLenStringDef.Create(aPriority, aRequired, aName, aPrefix, nil, nil, aDontShow, aGetCP, True); -end; - -function wbUnion(const aSignature : TwbSignature; - const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbUnion('', aDecider, aMembers, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbUnion(const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbUnionDef; overload; -begin - Result := TwbUnionDef.Create(aPriority, aRequired, aName, aDecider, aMembers, aDontShow, aAfterSet, aGetCP); -end; - - -function wbByteArray(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aSizeMatch : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbByteArray('', aSize, aPriority), nil, nil, aPriority, aRequired, aSizeMatch, aDontShow, aGetCP); -end; - -function wbByteArray(const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; -begin - Result := TwbByteArrayDef.Create(aPriority, aRequired, aName, aSize, aDontShow, nil, aGetCP, False); -end; - -function wbByteArrayT(const aName : string = 'Unknown'; - aSize : Int64 = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; -begin - Result := TwbByteArrayDef.Create(aPriority, aRequired, aName, aSize, aDontShow, nil, aGetCP, True); -end; - -function wbByteArray(const aName : string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; overload; -begin - Result := TwbByteArrayDef.Create(aPriority, aRequired, aName, 0, aDontShow, aCountCallback, aGetCP, False); -end; - -function wbUnknown(const aSignature : TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; -begin - Result := wbByteArray(aSignature, 'Unknown', 0, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbUnknown(aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbByteArrayDef; -begin - Result := wbByteArray('Unknown', 0, aPriority, aRequired, aDontShow, aGetCP); -end; - -function wbInteger(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aMatchSize : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbInteger('', aIntType, aFormater, aPriority, False, nil, nil, aDefault), nil, aAfterSet, aPriority, aRequired, aMatchSize, aDontShow, aGetCP); -end; - -function wbIntegerT(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aMatchSize : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbIntegerT('', aIntType, aFormater, aPriority, False, nil, nil, aDefault), nil, aAfterSet, aPriority, aRequired, aMatchSize, aDontShow, aGetCP); -end; - -function wbInteger(const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := TwbIntegerDef.Create(aPriority, aRequired, aName, aIntType, aFormater, aDontShow, aAfterSet, aDefault, aGetCP, False); -end; - -function wbIntegerT(const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := TwbIntegerDef.Create(aPriority, aRequired, aName, aIntType, aFormater, aDontShow, aAfterSet, aDefault, aGetCP, True); -end; - -function wbInteger(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -var - Callback: IwbIntegerDefFormater; -begin - if Assigned(aToStr) then - Callback := wbCallback(aToStr, aToInt); - Result := wbInteger(aSignature, aName, aIntType, Callback, aPriority, aRequired, False, aDontShow, aAfterSet, aDefault); -end; - -function wbIntegerT(const aSignature : TwbSignature; - const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -var - Callback: IwbIntegerDefFormater; -begin - if Assigned(aToStr) then - Callback := wbCallback(aToStr, aToInt); - Result := wbIntegerT(aSignature, aName, aIntType, Callback, aPriority, aRequired, False, aDontShow, aAfterSet, aDefault, aGetCP); -end; - -function wbInteger(const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -var - Callback: IwbIntegerDefFormater; -begin - if Assigned(aToStr) then - Callback := wbCallback(aToStr, aToInt); - Result := wbInteger(aName, aIntType, Callback, aPriority, aRequired, aDontShow, aAfterSet, aDefault); -end; - -function wbIntegerT(const aName : string; - const aIntType : TwbIntType; - const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDefault : Int64 = 0; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -var - Callback: IwbIntegerDefFormater; -begin - if Assigned(aToStr) then - Callback := wbCallback(aToStr, aToInt); - Result := wbIntegerT(aName, aIntType, Callback, aPriority, aRequired, aDontShow, aAfterSet, aDefault, aGetCP); -end; - -function wbFloat(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbFloat('', aPriority, False, aScale, aDigits, nil, aNormalizer, aDefault, aGetCP), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbDouble(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbDouble('', aPriority, False, aScale, aDigits, nil, aNormalizer, aDefault), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbFloat(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, nil, aScale, aDigits, aDontShow, aNormalizer, aDefault, aGetCP, False, False); -end; - -function wbDouble(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, nil, aScale, aDigits, aDontShow, aNormalizer, aDefault, aGetCP, True, False); -end; - -function wbFloat(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, aAfterSet, 1.0, -1, aDontShow, aNormalizer, aDefault, aGetCP, False, False); -end; - -function wbDouble(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, aAfterSet, 1.0, -1, aDontShow, aNormalizer, aDefault, aGetCP, True, False); -end; - -function wbFloatT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbFloatT('', aPriority, False, aScale, aDigits, nil, aNormalizer, aDefault), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbDoubleT(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbDoubleT('', aPriority, False, aScale, aDigits, nil, aNormalizer, aDefault), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbFloatT(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, nil, aScale, aDigits, aDontShow, aNormalizer, aDefault, aGetCP, False, True); -end; - -function wbDoubleT(const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aScale : Extended = 1.0; - aDigits : Integer = -1; - aDontShow : TwbDontShowCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, nil, aScale, aDigits, aDontShow, aNormalizer, aDefault, aGetCP, True, True); -end; - -function wbFloatT(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, aAfterSet, 1.0, -1, aDontShow, aNormalizer, aDefault, aGetCP, False, True); -end; - -function wbDoubleT(const aName : string; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback = nil; - aNormalizer : TwbFloatNormalizer = nil; - aDefault : Extended = 0.0; - aGetCP : TwbGetConflictPriority = nil) - : IwbFloatDef; overload; -begin - Result := TwbFloatDef.Create(aPriority, aRequired, aName, nil, aAfterSet, 1.0, -1, aDontShow, aNormalizer, aDefault, aGetCP, True, True); -end; - -{--- wbArray - list of identical elements -------------------------------------} -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArray('', aElement, aCount, aPriority), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], False, nil, nil, aDontShow, aGetCP, True, False, False); -end; - - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], False, aAfterLoad, nil, aDontShow, aGetCP, True, False, False); -end; - -function wbArrayPT(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArrayPT('', aElement, aCount, aPriority), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], False, nil, nil, aDontShow, aGetCP, True, True, False); -end; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], False, aAfterLoad, nil, aDontShow, aGetCP, True, True, False); -end; - -function wbArrayT(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - const aLabels : array of string; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, aLabels, False, aAfterLoad, nil, aDontShow, aGetCP, True, True, True); -end; - -function wbRArray(const aName : string; - const aElement : IwbRecordMemberDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; -begin - Result := TwbSubRecordArrayDef.Create(aPriority, aRequired, aName, aElement, False, aAfterLoad, aAfterSet, aDontShow, nil, aGetCP); -end; - -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArray('', aElement, aLabels, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArray(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArray('', aElement, aLabels, aCountCallback, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, Length(aLabels), aLabels, False, nil, nil, aDontShow, aGetCP, True, False, False); -end; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, aLabels, False, nil, nil, aDontShow, aGetCP, True, False, False); -end; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, [], False, nil, nil, aDontShow, aGetCP, True, False, False); -end; - -function wbArrayPT(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArrayPT('', aElement, aLabels, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArrayPT(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArrayPT('', aElement, aLabels, aCountCallback, aPriority), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, Length(aLabels), aLabels, False, nil, nil, aDontShow, aGetCP, True, True, False); -end; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, aLabels, False, nil, nil, aDontShow, aGetCP, True, True, False); -end; - -function wbArrayT(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, aLabels, False, nil, nil, aDontShow, aGetCP, True, True, True); -end; - -function wbArrayPT(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, [], False, nil, nil, aDontShow, aGetCP, True, True, False); -end; - -{--- wbArrayS - list of identical elements - gets sorted ----------------------} -function wbArrayS(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArrayS('', aElement, aCount, aPriority, False, aAfterLoad, aAfterSet), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCount : Integer = 0; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aCanAddTo : Boolean = True; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], True, aAfterLoad, aAfterSet, aDontShow, aGetCP, aCanAddTo, False, False); -end; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - aAfterLoad : TwbAfterLoadCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCount, [], True, aAfterLoad, aAfterSet, aDontShow, aGetCP, True, False, False); -end; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, [], True, aAfterLoad, aAfterSet, aDontShow, aGetCP, True, False, False); -end; - -function wbArray(const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - aPriority : TwbConflictPriority; - aRequired : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, aCountCallback, [], False, aAfterLoad, aAfterSet, aDontShow, aGetCP, True, False, False); -end; - -function wbRArrayS(const aName : string; - const aElement : IwbRecordMemberDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aIsSorted : TwbIsSortedCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; -begin - Result := TwbSubRecordArrayDef.Create(aPriority, aRequired, aName, aElement, True, aAfterLoad, aAfterSet, aDontShow, aIsSorted, aGetCP); -end; - -function wbArrayS(const aSignature : TwbSignature; - const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbArrayS('', aElement, aLabels, aPriority, False, aAfterLoad), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbArrayS(const aName : string; - const aElement : IwbValueDef; - const aLabels : array of string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := TwbArrayDef.Create(aPriority, aRequired, aName, aElement, Length(aLabels), aLabels, True, aAfterLoad, aAfterSet, aDontShow, aGetCP, True, False, False); -end; - -{--- wbStruct - ordered list of members ----------------------------------------} -function wbStructSK(const aSignature : TwbSignature; - const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStructSK(aSortKey, '', aMembers, aPriority, False, nil, aOptionalFromElement), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbMultiStructSK(const aSignatures : array of TwbSignature; - const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; -begin - Result := wbSubRecord(aSignatures, aName, wbStructSK(aSortKey, '', aMembers, aPriority, False, nil, aOptionalFromElement), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructDef.Create(aPriority, aRequired, aName, aMembers, aSortKey, [], [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - {$IFDEF WIN32} - const aElementMap : array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - const aElementMap : array of UInt64; - {$ENDIF WIN64} - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructDef.Create(aPriority, aRequired, aName, aMembers, aSortKey, [], aElementMap, aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aGetCP); -end; - - -function wbStructExSK(const aSignature : TwbSignature; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStructExSK(aSortKey, aExSortKey, '', aMembers, aPriority, False, nil, aOptionalFromElement), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStructExSK(const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructDef.Create(aPriority, aRequired, aName, aMembers, aSortKey, aExSortKey, [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbStruct(const aSignature : TwbSignature; - const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbSubRecord(aSignature, aName, wbStruct('', aMembers, aPriority, False, nil, aOptionalFromElement), aAfterLoad, aAfterSet, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbStruct(const aName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructDef.Create(aPriority, aRequired, aName, aMembers, [], [], [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbStructC(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructCDef.Create(aPriority, aRequired, aName, aMembers, [], [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aSizing, aGetChapterType, aGetChapterTypeName, aGetChapterName, aGetCP); -end; - -function wbStructZ(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructZDef.Create(aPriority, aRequired, aName, aMembers, [], [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aSizing, aGetChapterType, aGetChapterTypeName, agetChapterName, aGetCP); -end; - -function wbStructLZ(const aName : string; - aSizing : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aOptionalFromElement : Integer = -1; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbStructDef; overload; -begin - Result := TwbStructLZDef.Create(aPriority, aRequired, aName, aMembers, [], [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aSizing, aGetChapterType, aGetChapterTypeName, agetChapterName, aGetCP); -end; - -function wbRStruct(const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; -begin - Result := TwbSubRecordStructDef.Create(aPriority, aRequired, aName, aMembers, aSkipSigs, aDontShow, aAllowUnordered, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbRStructSK(const aSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; -begin - Result := TwbSubRecordStructSKDef.Create(aPriority, aRequired, aName, aMembers, aSkipSigs, aSortKey, [], aDontShow, aAllowUnordered, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbRStructExSK(const aSortKey : array of Integer; - const aExSortKey : array of Integer; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAllowUnordered : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordStructDef; overload; -begin - Result := TwbSubRecordStructSKDef.Create(aPriority, aRequired, aName, aMembers, aSkipSigs, aSortKey, aExSortKey, aDontShow, aAllowUnordered, aAfterLoad, aAfterSet, aGetCP); -end; - -function wbRUnion(const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordUnionDef; overload; -begin - Result := TwbSubRecordUnionDef.Create(aPriority, aRequired, aName, aMembers, aSkipSigs, aDontShow, aGetCP); -end; - -{--- wbStructS - array of struct ----------------------------------------------} -function wbStructS(const aSignature : TwbSignature; - const aName : string; - const aElementName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbArray(aSignature, aName, wbStruct(aElementName, aMembers, aPriority), 0, nil, nil, aPriority, aRequired, aDontShow, aGetCP); -end; - -function wbStructS(const aName : string; - const aElementName : string; - const aMembers : array of IwbValueDef; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbArrayDef; overload; -begin - Result := wbArray(aName, wbStruct(aElementName, aMembers, aPriority), 0, aPriority, aRequired, aDontShow, aGetCP); -end; - -function wbRStructS(const aName : string; - const aElementName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; -begin - Result := wbRArray(aName, wbRStruct(aElementName, aMembers, aSkipSigs ,aPriority), aPriority, aRequired, nil, nil, aDontShow, aGetCP); -end; - -function wbRStructsSK(const aName : string; - const aElementName : string; - const aSortKey : array of Integer; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aAfterLoad : TwbAfterLoadCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordArrayDef; overload; -begin - Result := wbRArrayS(aName, wbRStructSK(aSortKey, aElementName, aMembers, aSkipSigs, aPriority), aPriority, aRequired, aAfterLoad, aAfterSet, aDontShow, nil, aGetCP); -end; - -function wbEmpty(const aSignature : TwbSignature; - const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; -begin - Result := wbSubRecord(aSignature, aName, wbEmpty('', aPriority, aRequired), nil, nil, aPriority, aRequired, False, aDontShow, aGetCP); -end; - -function wbEmpty(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aSorted : Boolean = False; - aGetCP : TwbGetConflictPriority = nil) - : IwbValueDef; -begin - Result := TwbEmptyDef.Create(aPriority, aRequired, aName, nil, nil, aDontShow, aSorted, aGetCP); -end; - -function wbDumpInteger : IwbIntegerDefFormater; -begin - Result := TwbDumpIntegerDefFormater.Create(cpNormal, False, nil); -end; - -function wbKey2Data6Enum(const aNames : array of string) : IwbKey2Data6EnumDef; -begin - Result := TwbKey2Data6EnumDef.Create(aNames, []); -end; - -function wbData6Key2Enum(const aNames : array of string) : IwbData6Key2EnumDef; -begin - Result := TwbData6Key2EnumDef.Create(aNames, []); -end; - -var - _RefID: IwbRefID; - -function wbRefID: IwbRefID; -begin - if wbReportMode then - Result := TwbRefID.Create(cpNormal, False, nil) - else begin - if not Assigned(_RefID) then - _RefID := TwbRefID.Create(cpNormal, False, nil); - Result := _RefID; - end; -end; - -function wbRefID(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU24, wbRefID, aPriority, aRequired, aDontShow, aAfterSet, 0, aGetCP); -end; - -function wbRefIDT(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbIntegerT(aName, itU24, wbRefID, aPriority, aRequired, aDontShow, aAfterSet, 0, aGetCP); -end; - -var - _FormID: IwbFormID; - -function wbFormID: IwbFormID; -begin - if wbReportMode then - Result := TwbFormID.Create(cpNormal, False, nil) - else begin - if not Assigned(_FormID) then - _FormID := TwbFormID.Create(cpNormal, False, nil); - Result := _FormID; - end; -end; - -function wbFormID(const aValidRefs : array of TwbSignature; - aPersistent: Boolean) - : IwbFormID; -begin - Result := TwbFormIDChecked.Create(aValidRefs, [], aPersistent); -end; - -function wbFormID(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean) - : IwbFormID; -begin - Result := TwbFormIDChecked.Create(aValidRefs, aValidFlstRefs, aPersistent); -end; - -function wbFormIDNoReach(const aValidRefs : array of TwbSignature; - aPersistent: Boolean) - : IwbFormID; -begin - Result := TwbFormIDChecked.Create(aValidRefs, [], aPersistent, True); -end; - -function wbFormIDNoReach(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean) - : IwbFormID; -begin - Result := TwbFormIDChecked.Create(aValidRefs, aValidFlstRefs, aPersistent, True); -end; - - -function wbChar4: IwbChar4; -begin - Result := TwbChar4.Create(cpNormal, False, nil); -end; - -function wbStr4: IwbStr4; -begin - Result := TwbStr4.Create(cpNormal, False, nil); -end; - -function wbFormID(const aSignature : TwbSignature; - const aName : string = 'Unknown'; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbInteger( - aSignature, - aName, - itU32, - wbFormID, - aPriority, - aRequired, - False, - aDontShow, - nil, - 0, - aGetCP); -end; - -function wbFormID(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU32, wbFormID, aPriority, aRequired, aDontShow, aAfterSet); -end; - -function wbFormIDT(const aName : string; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbIntegerT(aName, itU32, wbFormID, aPriority, aRequired, aDontShow, aAfterSet, 0, aGetCP); -end; - -function wbFormIDCk(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbInteger(aSignature, aName, itU32, wbFormID(aValidRefs, aPersistent), aPriority, aRequired, False, aDontShow, nil, 0, aGetCP); -end; - -function wbFormIDCkNoReach(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbInteger(aSignature, aName, itU32, wbFormIDNoReach(aValidRefs, aPersistent), aPriority, aRequired, False, aDontShow, nil, 0, aGetCP); -end; - -function wbFormIDCk(const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aAfterSet : TwbAfterSetCallback = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU32, wbFormID(aValidRefs, aPersistent), aPriority, aRequired, aDontShow, aAfterSet); -end; - -function wbFormIDCkNoReach(const aName : string; - const aValidRefs : array of TwbSignature; - aPersistent: Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU32, wbFormIDNoReach(aValidRefs, aPersistent), aPriority, aRequired, aDontShow, nil, 0, aGetCP); -end; - - -function wbFormIDCk(const aSignature : TwbSignature; - const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbSubRecordDef; overload; -begin - Result := wbInteger(aSignature, aName, itU32, wbFormID(aValidRefs, aValidFlstRefs, aPersistent), aPriority, aRequired, False, aDontShow, nil, 0, aGetCP); -end; - -function wbFormIDCk(const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU32, wbFormID(aValidRefs, aValidFlstRefs, aPersistent), aPriority, aRequired, aDontShow, nil, 0, aGetCP); -end; - -function wbFormIDCkNoReach(const aName : string; - const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean = False; - aPriority : TwbConflictPriority = cpNormal; - aRequired : Boolean = False; - aDontShow : TwbDontShowCallback = nil; - aGetCP : TwbGetConflictPriority = nil) - : IwbIntegerDef; overload; -begin - Result := wbInteger(aName, itU32, wbFormIDNoReach(aValidRefs, aValidFlstRefs, aPersistent), aPriority, aRequired, aDontShow, nil, 0, aGetCP); -end; - - -function wbFlags(const aNames : array of string; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; -begin - Result := wbFlags(nil, aNames, aUnknownIsUnused); -end; - -function wbFlags(const aNames : array of string; - const aFlagsToIgnore : array of integer) - : IwbFlagsDef; overload; -begin - Result := wbFlags(nil, aNames, aFlagsToIgnore); -end; - - -function wbFlags(const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; -begin - Result := wbFlags(nil, aNames, aDontShows, aUnknownIsUnused); -end; - -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; -begin - Result := TwbFlagsDef.Create(aBaseFlagsDef, aNames, [], aUnknownIsUnused, 0, []); -end; - -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aFlagsToIgnore : array of integer) - : IwbFlagsDef; overload; -var - IgnoreMask : Int64; - i : Integer; - Index : Int64; -begin - IgnoreMask := 0; - for i := Low(aFlagsToIgnore) to High(aFlagsToIgnore) do begin - Index := aFlagsToIgnore[i]; - if (Index >= 0) and (Index <= High(aNames)) then - IgnoreMask := IgnoreMask or (1 shl Index); - end; - Result := TwbFlagsDef.Create(aBaseFlagsDef, aNames, [], False, IgnoreMask, []); -end; - - -function wbFlags(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean = False) - : IwbFlagsDef; overload; -begin - Result := TwbFlagsDef.Create(aBaseFlagsDef, aNames, aDontShows, aUnknownIsUnused, 0, []); -end; - -function wbEnum(const aNames : array of string) - : IwbEnumDef; -begin - Result := TwbEnumDef.Create(aNames, []); -end; - -function wbEnum(const aNames : array of string; - const aSparseNames : array of const) - : IwbEnumDef; overload; -begin - Result := TwbEnumDef.Create(aNames, aSparseNames); -end; - - -function wbDiv(aValue : Integer) - : IwbIntegerDefFormater; -begin - Result := TwbDivDef.Create(aValue); -end; - -function wbMul(aValue : Integer) - : IwbIntegerDefFormater; -begin - Result := TwbMulDef.Create(aValue); -end; - -function wbCallback(const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback) - : IwbIntegerDefFormater; -begin - Result := TwbCallbackDef.Create(aToStr, aToInt); -end; - -function wbFormaterUnion(aDecider : TwbIntegerDefFormaterUnionDecider; - aMembers : array of IwbIntegerDefFormater) - : IwbIntegerDefFormaterUnion; -begin - Result := TwbIntegerDefFormaterUnion.Create(cpNormal, False, nil, aDecider, aMembers); -end; - -{ TwbDef } - -function TwbDef.Assign(const aTarget : IwbElement; - aIndex : Integer; - const aSource : IwbElement; - aOnlySK : Boolean) - : IwbElement; -begin - Result := nil; - aTarget.SetEditValue(aSource.EditValue); -end; - -function TwbDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := False; -end; - -function TwbDef.CanContainFormIDs: Boolean; -begin - Result := True; -end; - -constructor TwbDef.Clone(const aSource: TwbDef); -begin - with aSource do - Self.Create(defPriority, defRequired, defGetCP).defSource := aSource; -end; - -constructor TwbDef.Create(aPriority: TwbConflictPriority; aRequired: Boolean; aGetCP: TwbGetConflictPriority); -begin - defPriority := aPriority; - defRequired := aRequired; - defGetCP := aGetCP; - inherited Create; -end; - -function TwbDef.Duplicate: TwbDef; -begin - Result := TwbDefClass(ClassType).Clone(Self); -end; - -function TwbDef.Equals(const aDef: IwbDef): Boolean; -begin - Result := Assigned(aDef) and (aDef.DefID = GetDefID); -end; - -function TwbDef.GetConflictPriority(const aElement: IwbElement): TwbConflictPriority; -begin - Result := defPriority; - if Assigned(defGetCP) then - defGetCP(aElement, Result); -end; - -function TwbDef.GetConflictPriorityCanChange: Boolean; -begin - Result := Assigned(defGetCP); -end; - -function TwbDef.GetDefID: Cardinal; -begin - Result := Cardinal(Self); -end; - -function TwbDef.GetDontShow(const aElement: IwbElement): Boolean; -begin - Result := False; -end; - -function TwbDef.GetHasDontShow: Boolean; -begin - Result := False; -end; - -function TwbDef.GetNoReach: Boolean; -begin - Result := False; -end; - -function TwbDef.GetParent: IwbDef; -begin - Result := defParent; -end; - -function TwbDef.GetRequired: Boolean; -begin - Result := defRequired; -end; - -function TwbDef.GetRoot: IwbDef; -begin - Result := defSource; - if not Assigned(Result) then - Result := Self - else - Result := Result.GetRoot; -end; - -function TwbDef.IsNotRequired: Boolean; -begin - Result := defNotRequired; -end; - -procedure TwbDef.NotRequired; -begin - defNotRequired := True; -end; - -procedure TwbDef.ParentSet; -begin - {can be overriden} -end; - -procedure TwbDef.PossiblyRequired; -begin - defPossiblyRequired := True; -end; - -procedure TwbDef.Report(const aParents: TwbDefPath); -var - i, j : Integer; - sl : TStringList; -begin - if defReported then - Exit; - - if wbReportUnused then - if not defUsed then - WriteLn('Unused: ', wbDefsToPath(aParents), wbDefToName(Self)); - - if wbReportRequired and defPossiblyRequired then - if defNotRequired = defRequired then - if defNotRequired then - WriteLn('Not Required: ', wbDefsToPath(aParents), wbDefToName(Self)) - else - WriteLn('Required: ', wbDefsToPath(aParents), wbDefToName(Self)); - - if wbReportUnknown then - if Assigned(UnknownValues) then begin - WriteLn('Unknown Field: ', wbDefsToPath(aParents), wbDefToName(Self), ' (', UnknownValues.Count ,')'); - for i := 0 to Pred(UnknownValues.Count) do begin - sl := UnknownValues.Objects[i] as TStringList; - WriteLn(' ', UnknownValues[i], ' (', sl.Count ,')'); - for j := 0 to Pred(sl.Count) do - WriteLn(' ', sl[j]); - end; - end else - if IsUnknown then - WriteLn('Unknown Field: ', wbDefsToPath(aParents), wbDefToName(Self)); - - defReported := True; -end; - -function TwbDef.SetParent(const aParent: TwbDef; aForceDuplicate: Boolean): IwbDef; -begin - Assert(Assigned(aParent)); - if Assigned(defParent) or aForceDuplicate then - Result := Duplicate.SetParent(aParent, False) - else begin - Result := Self; - defParent := aParent; - ParentSet; - end; -end; - -procedure TwbDef.Used(const aElement: IwbElement; const s: string); -var - i: Integer; - NamedDef: IwbNamedDef; -begin - if not wbReportMode then - Exit; - - defUsed := True; - - if not IsUnknown then - if not IsUnknownChecked then begin - IsUnknownChecked := True; - if Supports(defParent, IwbNamedDef, NamedDef) then - if Pos('unknown', LowerCase(NamedDef.Name)) > 0 then - IsUnknown := True; - end; - - if wbReportUnknown then - if IsUnknown and Assigned(aElement) and (s <> '') then begin - - if not Assigned(UnknownValues) then - UnknownValues := TwbFastStringListCS.CreateSorted; - - if UnknownValues.Count < 20 then begin - if not UnknownValues.Find(s, i) then - i := UnknownValues.AddObject(s, TwbFastStringListCS.CreateSorted(dupIgnore)); - - with UnknownValues.Objects[i] as TStringList do - if Count < 20 then - Add(aElement.FullPath); - end; - end; -end; - -{ TwbNamedDef } - -procedure TwbNamedDef.AfterLoad(const aElement: IwbElement); -begin - Used(nil, ''); - if Assigned(noAfterLoad) then - noAfterLoad(aElement); -end; - - -procedure TwbNamedDef.AfterSet(const aElement: IwbElement; const aOldValue, aNewValue: Variant); -begin - if Assigned(noAfterSet) then - noAfterSet(aElement, aOldValue, aNewValue); -end; - -constructor TwbNamedDef.Clone(const aSource: TwbDef); -begin - with (aSource as TwbNamedDef) do begin - Self.Create(defPriority, defRequired, noName, noAfterLoad, noAfterSet, noDontShow, defGetCP, noTerminator).defSource := aSource; - Self.noTreeHead := GetTreeHead; - Self.notreeBranch := GetTreeBranch; - end -end; - -constructor TwbNamedDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); -begin - noName := aName; - noDontShow := aDontShow; - noAfterLoad := aAfterLoad; - noAfterSet := aAfterSet; - noTerminator := aTerminator; - noTreeHead := False; - noTreeBranch := False; - if aName = 'Unused' then begin - noUnused := True; - if aPriority = cpNormal then - aPriority := cpIgnore; - end; - inherited Create(aPriority, aRequired, aGetCP); - - if Pos('unknown', LowerCase(aName)) > 0 then - IsUnknown := True; -end; - -function TwbNamedDef.GetDontShow(const aElement: IwbElement): Boolean; -begin - if Assigned(noDontShow) then - Result := noDontShow(aElement) - else - Result := wbHideUnused and noUnused; -end; - -function TwbNamedDef.GetHasDontShow: Boolean; -begin - Result := Assigned(noDontShow) or (wbHideUnused and noUnused); -end; - -function TwbNamedDef.GetName: string; -begin - Result := noName; -end; - -function TwbNamedDef.GetPath: string; -var - Parent: IwbDef; - NamedDef: IwbNamedDef; -begin - Result := GetName; - Parent := defParent; - while Assigned(Parent) do begin - if Supports(Parent, IwbNamedDef, NamedDef) then - Result := NamedDef.Name + ' \ ' + Result - else - Result := Parent.DefTypeName + ' \ ' + Result; - Parent := Parent.Parent; - end; -end; - -function TwbNamedDef.GetTreeBranch: Boolean; -begin - Result := noTreeBranch; -end; - -function TwbNamedDef.GetTreeHead: Boolean; -begin - Result := noTreeHead; -end; - -procedure TwbNamedDef.ParentSet; -var - Parent: IwbNamedDef; -begin - inherited; - if not (IsUnknown or noUnused) and (noName = '') and Supports(defParent, IwbNamedDef, Parent) then begin - IsUnknown := IsUnknown or (Pos('unknown', LowerCase(Parent.Name)) > 0); - noUnused := noUnused or (Parent.Name = 'Unused'); - end; -end; - -procedure TwbNamedDef.SetTreeBranch(aValue: Boolean); -begin - noTreeBranch := avalue; -end; - -procedure TwbNamedDef.SetTreeHead(aValue: Boolean); -begin - noTreeHead := aValue; -end; - -{ TwbSignatureDef } - -function TwbSignatureDef.CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -begin - Result := aSignature = GetDefaultSignature; -end; - -constructor TwbSignatureDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); -begin - SetLength(soSignatures, 1); - soSignatures[0] := aSignature; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); -end; - -constructor TwbSignatureDef.Clone(const aSource: TwbDef); -begin - with (aSource as TwbSignatureDef) do - Self.Create(defPriority, defRequired, soSignatures, noName, noAfterLoad, noAfterSet, noDontShow, defGetCP).defSource := aSource; -end; - -constructor TwbSignatureDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignatures : array of TwbSignature; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); -var - i: Integer; -begin - Assert(Length(aSignatures) >= 1); - SetLength(soSignatures, Length(aSignatures)); - for i := Low(soSignatures) to High(soSignatures) do - soSignatures[i] := aSignatures[i]; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); -end; - - -function TwbSignatureDef.GetDefaultSignature: TwbSignature; -begin - Result := soSignatures[0]; -end; - -function TwbSignatureDef.GetSignatureCount: Integer; -begin - Result := Length(soSignatures); -end; - -function TwbSignatureDef.GetSignatures(const aIndex: Integer): TwbSignature; -begin - Result := soSignatures[aIndex]; -end; - -{ TwbRecordDef } - -function TwbRecordDef.AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; -begin - if (wbCopyIsRunning = 0) and Assigned(recAddInfoCallback) then - Result := recAddInfoCallback(aMainRecord) - else - Result := ''; -end; - -procedure TwbRecordDef.AfterLoad(const aElement: IwbElement); -var - Found : Boolean; - Container : IwbContainerElementRef; - Element : IwbElement; - i, j : Integer; -begin - inherited; - if wbReportMode and wbReportRequired and Supports(aElement, IwbContainerElementRef, Container) then begin - for i := Low(recMembers) to High(recMembers) do if not recMembers[i].IsNotRequired then begin - Found := False; - for j := 0 to Pred(Container.ElementCount) do begin - Element := Container.Elements[j]; - if recMembers[i].Equals(Element.Def) or recMembers[i].Equals(Element.ValueDef) then begin - Found := True; - Break; - end; - end; - recMembers[i].PossiblyRequired; - if not Found then - recMembers[i].NotRequired; - end; - end; -end; - -function TwbRecordDef.AllowUnordered: Boolean; -begin - Result := recAllowUnordered; -end; - -function TwbRecordDef.CanContainFormIDs: Boolean; -begin - Result := recCanContainFormIDs; -end; - -constructor TwbRecordDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbRecordDef do - Self.Create(defPriority, defRequired, GetDefaultSignature, noName, recRecordFlags, recMembers, - recAllowUnordered, recAddInfoCallback, noAfterLoad, noAfterSet).defSource := aSource; -end; - -function TwbRecordDef.ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -var - Dummy: Integer; -begin - Result := recSignatures.Find(aSignature, Dummy); -end; - -constructor TwbRecordDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - const aRecordFlags : IwbIntegerDefFormater; - const aMembers : array of IwbRecordMemberDef; - aAllowUnordered : Boolean; - aAddInfoCallback : TwbAddInfoCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback); -var - i, j : Integer; - Sig : TwbSignature; -begin - recRecordFlags := aRecordFlags; - recQuickInitLimit := -1; - recAllowUnordered := aAllowUnordered; - recAddInfoCallback := aAddInfoCallback; - - if Assigned(recRecordFlags) and Assigned(wbRecordFlags) and Assigned(wbMainRecordHeader) then begin - recRecordHeaderStruct := (wbMainRecordHeader as IwbDefInternal).SetParent(Self, True) as IwbStructDef; - (recRecordHeaderStruct.MembersByName[wbRecordFlags.Name] as IwbInternalIntegerDef).ReplaceFormater(recRecordFlags); - end; - - recSignatures := TwbFastStringListCS.CreateSorted(dupAccept); - if aAllowUnordered then - recSignatures.Duplicates := dupError; - - SetLength(recMembers, Length(aMembers)); - for i := Low(recMembers) to High(recMembers) do begin - recMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbRecordMemberDef; - recCanContainFormIDs := recCanContainFormIDs or aMembers[i].CanContainFormIDs; - for j := 0 to Pred(aMembers[i].SignatureCount) do begin - Sig := aMembers[i].Signatures[j]; - if (Sig = 'EDID') or - (Sig = 'FULL') or - ( - (Sig = 'NAME') and - ( - (aSignature = 'REFR') or - (aSignature = 'ACHR') or - (aSignature = 'ACRE') or - (aSignature = 'PGRE') or - (aSignature = 'PMIS') or - (aSignature = 'PARW') or {>>> Skyrim <<<} - (aSignature = 'PBEA') or {>>> Skyrim <<<} - (aSignature = 'PFLA') or {>>> Skyrim <<<} - (aSignature = 'PCON') or {>>> Skyrim <<<} - (aSignature = 'PBAR') or {>>> Skyrim <<<} - (aSignature = 'PHZD') {>>> Skyrim <<<} - ) - ) then begin - - recQuickInitLimit := i; - if Sig = 'EDID' then - recContainsEditorID := True; - - end; - try - recSignatures.AddObject(Sig, Pointer(i) ); - except - on E: Exception do - raise Exception.Create('Duplicate definition ' + Sig + ' in allow unordered record ' + aSignature); - end; - end; - end; - - inherited Create(aPriority, aRequired, aSignature, aName, aAfterLoad, aAfterSet, nil, nil); -end; - -function TwbRecordDef.GetMember(aIndex: Integer): IwbRecordMemberDef; -begin - Result := recMembers[aIndex]; -end; - -function TwbRecordDef.GetMemberCount: Integer; -begin - Result := Length(recMembers); -end; - -function TwbRecordDef.GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; -var - i: Integer; -begin - if recSignatures.Find(aSignature, i) then - Result := recMembers[Integer(recSignatures.Objects[i])] - else - Result := nil; -end; - -function TwbRecordDef.GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; -var - i: Integer; -begin - if recSignatures.Find(aSignature, i) then - Result := Integer(recSignatures.Objects[i]) - else - Result := -1; -end; - -function TwbRecordDef.GetQuickInitLimit: Integer; -begin - Result := recQuickInitLimit; -end; - -function TwbRecordDef.GetRecordHeaderStruct: IwbStructDef; -begin - if Assigned(recRecordHeaderStruct) then - Result := recRecordHeaderStruct - else - Result := wbMainRecordHeader; -end; - -function TwbRecordDef.GetSkipSignature(const aSignature: TwbSignature): Boolean; -begin - Result := False; -end; - -procedure TwbRecordDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; - i : Integer; -begin - if defReported then - Exit; - - inherited; - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - for i := Low(recMembers) to High(recMembers) do - if Assigned(recMembers[i]) then begin - Parents[High(Parents)].Index := i; - recMembers[i].Report(Parents); - end; - - defReported := True; -end; - -destructor TwbRecordDef.Destroy; -begin - inherited; - FreeAndNil(recSignatures); -end; - -function TwbRecordDef.GetContainsEditorID: Boolean; -begin - Result := recContainsEditorID; -end; - -function TwbRecordDef.GetDefType: TwbDefType; -begin - Result := dtRecord; -end; - -function TwbRecordDef.GetDefTypeName: string; -begin - Result := 'Record'; -end; - -{ TwbSubRecordDef } - -function TwbSubRecordDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - SubRecordDef : IwbSubRecordDef; -begin - if Supports(aDef, IwbSubRecordDef, SubRecordDef) then - Result := Equals(aDef) or Assigned(srValue) and srValue.CanAssign(aElement, aIndex, SubRecordDef.Value) - else - Result := Assigned(srValue) and srValue.CanAssign(aElement, aIndex, aDef); -end; - -function TwbSubRecordDef.CanContainFormIDs: Boolean; -begin - Result := srValue.CanContainFormIDs; -end; - -function TwbSubRecordDef.CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -begin - Result := inherited CanHandle(aSignature, aDataContainer); - if Result and srSizeMatch and Assigned(aDataContainer) and Assigned(srValue) then - Result := aDataContainer.DataSize = srValue.DefaultSize[nil, nil, nil]; -end; - -constructor TwbSubRecordDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbSubRecordDef do - Self.Create(defPriority, defRequired, soSignatures, noName, srValue, noAfterLoad, noAfterSet, srSizeMatch, noDontShow, defGetCP).defSource := aSource; -end; - -constructor TwbSubRecordDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignature : TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeMatch : Boolean; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); -begin - srSizeMatch := aSizeMatch; - if Assigned(aValue) then - srValue := (aValue as IwbDefInternal).SetParent(Self, False) as IwbValueDef; - inherited Create(aPriority, aRequired, aSignature, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP); -end; - -constructor TwbSubRecordDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aSignatures : array of TwbSignature; - const aName : string; - const aValue : IwbValueDef; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeMatch : Boolean; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); -begin - srSizeMatch := aSizeMatch; - if Assigned(aValue) then - srValue := (aValue as IwbDefInternal).SetParent(Self, False) as IwbValueDef; - inherited Create(aPriority, aRequired, aSignatures, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP); -end; - -function TwbSubRecordDef.GetDefType: TwbDefType; -begin - Result := dtSubRecord; -end; - -function TwbSubRecordDef.GetDefTypeName: string; -begin - Result := 'SubRecord of '+GetValue.GetDefTypeName; -end; - -function TwbSubRecordDef.GetValue: IwbValueDef; -begin - Result := srValue; -end; - -procedure TwbSubRecordDef.HasUnusedData; -begin - srHasUnusedData := True; -end; - -procedure TwbSubRecordDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; -begin - if defReported then - Exit; - - inherited; - if Assigned(srValue) then begin - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - Parents[High(Parents)].Index := -1; - srValue.Report(Parents); - end; - if wbReportUnusedData then - if srHasUnusedData then - WriteLn('Has Unused Data: ', wbDefsToPath(aParents), wbDefToName(Self)); - - defReported := True; -end; - -{ TwbSubRecordArrayDef } - -procedure TwbSubRecordArrayDef.AfterLoad(const aElement: IwbElement); -var - Container: IwbContainerElementRef; -begin - inherited; - if wbReportMode and wbReportRequired and Supports(aElement, IwbContainerElementRef, Container) then begin - sraElement.PossiblyRequired; - if Container.ElementCount < 1 then - sraElement.NotRequired; - end; -end; - -function TwbSubRecordArrayDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - SubRecordArrayDef : IwbSubRecordArrayDef; -begin - if aIndex = Low(Integer) then - Result := Supports(aDef, IwbSubRecordArrayDef, SubRecordArrayDef) and - GetElement.CanAssign(aElement, aIndex, SubRecordArrayDef.Element) - else if aIndex = High(Integer) then - Result := GetElement.CanAssign(aElement, Low(Integer), aDef) - else - Result := False; -end; - -function TwbSubRecordArrayDef.CanContainFormIDs: Boolean; -begin - Result := sraElement.CanContainFormIDs; -end; - -function TwbSubRecordArrayDef.CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -begin - Result := sraElement.CanHandle(aSignature, aDataContainer); -end; - -constructor TwbSubRecordArrayDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbSubRecordArrayDef do - Self.Create(defPriority, defRequired, noName, sraElement, sraSorted, - noAfterLoad, noAfterSet, noDontShow, sraIsSorted, defGetCP).defSource := aSource; -end; - -constructor TwbSubRecordArrayDef.Create(aPriority : TwbConflictPriority; aRequired: Boolean; - const aName : string; - const aElement : IwbRecordMemberDef; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aIsSorted : TwbIsSortedCallback; - aGetCP : TwbGetConflictPriority); -begin - if Assigned(aElement) then - sraElement := (aElement as IwbDefInternal).SetParent(Self, False) as IwbRecordMemberDef; - sraSorted := aSorted; - sraIsSorted := aIsSorted; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); -end; - -function TwbSubRecordArrayDef.GetElement: IwbRecordMemberDef; -begin - Result := sraElement; -end; - -function TwbSubRecordArrayDef.GetDefaultSignature: TwbSignature; -begin - Result := sraElement.GetDefaultSignature; -end; - -function TwbSubRecordArrayDef.GetSignatureCount: Integer; -begin - Result := sraElement.GetSignatureCount; -end; - -function TwbSubRecordArrayDef.GetSignatures(const aIndex: Integer): TwbSignature; -begin - Result := sraElement.GetSignatures(aIndex); -end; - -function TwbSubRecordArrayDef.GetSorted(const aContainer: IwbContainer): Boolean; -begin - if Assigned(sraIsSorted) then - Result := sraIsSorted(aContainer) - else - Result := sraSorted; -end; - -procedure TwbSubRecordArrayDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; -begin - if defReported then - Exit; - - inherited; - if Assigned(sraElement) then begin - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - Parents[High(Parents)].Index := -1; - sraElement.Report(Parents); - end; - - defReported := True; -end; - -function TwbSubRecordArrayDef.GetDefType: TwbDefType; -begin - Result := dtSubRecordArray; -end; - -function TwbSubRecordArrayDef.GetDefTypeName: string; -begin - Result := 'SubRecordArray of '+GetElement.GetDefTypeName; -end; - -{ TwbSubRecordStructDef } - -function TwbSubRecordStructDef.AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; -begin - Result := ''; -end; - -procedure TwbSubRecordStructDef.AfterLoad(const aElement: IwbElement); -var - Found : Boolean; - Container : IwbContainerElementRef; - Element : IwbElement; - i, j : Integer; -begin - inherited; - if wbReportMode and wbReportRequired and Supports(aElement, IwbContainerElementRef, Container) then begin - for i := 1 to High(srsMembers) do if not srsMembers[i].IsNotRequired then begin - Found := False; - for j := 0 to Pred(Container.ElementCount) do begin - Element := Container.Elements[j]; - if srsMembers[i].Equals(Element.Def) or srsMembers[i].Equals(Element.ValueDef) then begin - Found := True; - Break; - end; - end; - srsMembers[i].PossiblyRequired; - if not Found then - srsMembers[i].NotRequired; - end; - end; -end; - -function TwbSubRecordStructDef.AllowUnordered: Boolean; -begin - Result := srsAllowUnordered; -end; - -function TwbSubRecordStructDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - SubRecordStructDef : IwbSubRecordStructDef; - RecordDef : IwbRecordDef; - i : Integer; -begin - if Supports(aDef, IwbSubRecordStructDef, SubRecordStructDef) then begin - Result := Equals(aDef); - if not Result and - Supports(aDef, IwbRecordDef, RecordDef) and - (GetMemberCount = RecordDef.MemberCount)then begin - Result := True; - for i := 0 to Pred(GetMemberCount) do - if not srsMembers[i].CanAssign(aElement, aIndex, RecordDef.Members[i]) then begin - Result := False; - Break; - end; - end; - end else - Result := False; -end; - -function TwbSubRecordStructDef.CanContainFormIDs: Boolean; -begin - Result := srsCanContainFormIDs; -end; - -function TwbSubRecordStructDef.CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -begin - if srsAllowUnordered then - Result := ContainsMemberFor(aSignature, aDataContainer) - else - Result := srsMembers[0].CanHandle(aSignature, aDataContainer); -end; - -constructor TwbSubRecordStructDef.Clone(const aSource: TwbDef); -var - SkipSigs : array of TwbSignature; - i : Integer; -begin - with aSource as TwbSubRecordStructDef do begin - if Assigned(srsSkipSignatures) then begin - SetLength(SkipSigs, srsSkipSignatures.Count); - for i := 0 to Pred(srsSkipSignatures.Count) do - SkipSigs[i] := StrToSignature(srsSkipSignatures[i]); - end; - Self.Create(defPriority, defRequired, noName, srsMembers, SkipSigs, noDontShow, srsAllowUnordered, noAfterLoad, noAfterSet, defGetCP).defSource := aSource; - end; -end; - -function TwbSubRecordStructDef.ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -var - Dummy: Integer; -begin - Result := srsSignatures.Find(aSignature, Dummy); -end; - -constructor TwbSubRecordStructDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aDontShow : TwbDontShowCallback; - aAllowUnordered : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); -var - i,j: Integer; - FoundRequired : Boolean; -begin - srsAllowUnordered := aAllowUnordered; - srsSignatures := TwbFastStringListCS.CreateSorted(dupIgnore); - - FoundRequired := False; - SetLength(srsMembers, Length(aMembers)); - for i := Low(srsMembers) to High(srsMembers) do begin - srsMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbRecordMemberDef; - srsCanContainFormIDs := srsCanContainFormIDs or aMembers[i].CanContainFormIDs; - FoundRequired := FoundRequired or srsMembers[i].Required; - for j := 0 to Pred(aMembers[i].SignatureCount) do - srsSignatures.AddObject(aMembers[i].Signatures[j], Pointer(i) ); - end; - - if Length(aSkipSigs) > 0 then begin - srsSkipSignatures := TwbFastStringListCS.CreateSorted(dupIgnore); - for i := Low(aSkipSigs) to High(aSkipSigs) do - srsSkipSignatures.Add(aSkipSigs[i]); - end; - - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); - - if srsAllowUnordered and not FoundRequired then - raise Exception.Create(GetPath + ' must contain at least one required element'); -end; - -destructor TwbSubRecordStructDef.Destroy; -begin - inherited; - FreeAndNil(srsSignatures); - FreeAndNil(srsSkipSignatures); -end; - -function TwbSubRecordStructDef.GetDefType: TwbDefType; -begin - Result := dtSubRecordStruct; -end; - -function TwbSubRecordStructDef.GetDefTypeName: string; -begin - Result := 'SubRecordStruct'; -end; - -function TwbSubRecordStructDef.GetMember(aIndex: Integer): IwbRecordMemberDef; -begin - Result := srsMembers[aIndex]; -end; - -function TwbSubRecordStructDef.GetMemberCount: Integer; -begin - Result := Length(srsMembers); -end; - -function TwbSubRecordStructDef.GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; -var - i: Integer; -begin - if srsSignatures.Find(aSignature, i) then - Result := srsMembers[Integer(srsSignatures.Objects[i])] - else - Result := nil; -end; - -function TwbSubRecordStructDef.GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; -var - i: Integer; -begin - if srsSignatures.Find(aSignature, i) then - Result := Integer(srsSignatures.Objects[i]) - else - Result := -1; -end; - -function TwbSubRecordStructDef.GetQuickInitLimit: Integer; -begin - Result := -1; -end; - -function TwbSubRecordStructDef.GetRecordHeaderStruct: IwbStructDef; -begin - Result := wbMainRecordHeader; -end; - -function TwbSubRecordStructDef.GetContainsEditorID: Boolean; -begin - Result := False; -end; - -function TwbSubRecordStructDef.GetDefaultSignature: TwbSignature; -begin - Result := srsMembers[0].GetDefaultSignature; -end; - -function TwbSubRecordStructDef.GetSignatureCount: Integer; -begin - if srsAllowUnordered then - Result := srsSignatures.Count - else - Result := srsMembers[0].GetSignatureCount; -end; - -function TwbSubRecordStructDef.GetSignatures(const aIndex: Integer): TwbSignature; -begin - if srsAllowUnordered then - Result := StrToSignature(srsSignatures[aIndex]) - else - Result := srsMembers[0].GetSignatures(aIndex); -end; - -function TwbSubRecordStructDef.GetSkipSignature(const aSignature: TwbSignature): Boolean; -var - Dummy: Integer; -begin - Result := Assigned(srsSkipSignatures) and srsSkipSignatures.Find(aSignature, Dummy); -end; - -procedure TwbSubRecordStructDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; - i : Integer; -begin - if defReported then - Exit; - - inherited; - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - for i := Low(srsMembers) to High(srsMembers) do - if Assigned(srsMembers[i]) then begin - Parents[High(Parents)].Index := i; - srsMembers[i].Report(Parents); - end; - - defReported := True; -end; - -{ TwbSubRecordUnionDef } - -function TwbSubRecordUnionDef.AdditionalInfoFor(const aMainRecord: IwbMainRecord): string; -begin - Result := ''; -end; - -function TwbSubRecordUnionDef.AllowUnordered: Boolean; -begin - Result := True; -end; - -function TwbSubRecordUnionDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - SubRecordUnionDef : IwbSubRecordUnionDef; - RecordDef : IwbRecordDef; - i : Integer; -begin - for i := Low(sruMembers) to High(sruMembers) do begin - Result := sruMembers[i].CanAssign(aElement, aIndex, aDef); - if Result = True then - Exit; - end; - - if Supports(aDef, IwbSubRecordUnionDef, SubRecordUnionDef) then begin - Result := Equals(aDef); - if not Result and - Supports(aDef, IwbRecordDef, RecordDef) and - (GetMemberCount = RecordDef.MemberCount)then begin - Result := True; - for i := 0 to Pred(GetMemberCount) do - if not sruMembers[i].CanAssign(aElement, aIndex, RecordDef.Members[i]) then begin - Result := False; - Break; - end; - end; - end else - Result := False; -end; - -function TwbSubRecordUnionDef.CanContainFormIDs: Boolean; -begin - Result := sruCanContainFormIDs; -end; - -function TwbSubRecordUnionDef.CanHandle(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -var - i: Integer; -begin - Result := False; - for i := Low(sruMembers) to High(sruMembers) do begin - Result := sruMembers[i].CanHandle(aSignature, aDataContainer); - if Result then - Exit; - end; -end; - -constructor TwbSubRecordUnionDef.Clone(const aSource: TwbDef); -var - SkipSigs : array of TwbSignature; - i : Integer; -begin - with aSource as TwbSubRecordUnionDef do begin - if Assigned(sruSkipSignatures) then begin - SetLength(SkipSigs, sruSkipSignatures.Count); - for i := 0 to Pred(sruSkipSignatures.Count) do - SkipSigs[i] := StrToSignature(sruSkipSignatures[i]); - end; - Self.Create(defPriority, defRequired, noName, sruMembers, SkipSigs, noDontShow, defGetCP).defSource := aSource; - end; -end; - -function TwbSubRecordUnionDef.ContainsMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Boolean; -begin - Result := CanHandle(aSignature, aDataContainer); -end; - -constructor TwbSubRecordUnionDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority); -var - i,j: Integer; -begin - sruSignatures := TwbFastStringListCS.CreateSorted(dupIgnore); - - SetLength(sruMembers, Length(aMembers)); - for i := Low(sruMembers) to High(sruMembers) do begin - sruMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbRecordMemberDef; - sruCanContainFormIDs := sruCanContainFormIDs or aMembers[i].CanContainFormIDs; - for j := 0 to Pred(aMembers[i].SignatureCount) do - sruSignatures.AddObject(aMembers[i].Signatures[j], Pointer(i)); - end; - - if Length(aSkipSigs) > 0 then begin - sruSkipSignatures := TwbFastStringListCS.CreateSorted(dupIgnore); - for i := Low(aSkipSigs) to High(aSkipSigs) do - sruSkipSignatures.Add(aSkipSigs[i]); - end; - - inherited Create(aPriority, aRequired, aName, nil, nil, aDontShow, aGetCP, False); -end; - -destructor TwbSubRecordUnionDef.Destroy; -begin - inherited; - FreeAndNil(sruSignatures); -end; - -function TwbSubRecordUnionDef.GetContainsEditorID: Boolean; -begin - Result := False; -end; - -function TwbSubRecordUnionDef.GetDefaultSignature: TwbSignature; -begin - Result := sruMembers[0].GetDefaultSignature; -end; - -function TwbSubRecordUnionDef.GetDefType: TwbDefType; -begin - Result := dtSubRecordUnion; -end; - -function TwbSubRecordUnionDef.GetDefTypeName: string; -begin - Result := 'SubRecordUnion'; -end; - -function TwbSubRecordUnionDef.GetMember(aIndex: Integer): IwbRecordMemberDef; -begin - Result := sruMembers[aIndex]; -end; - -function TwbSubRecordUnionDef.GetMemberCount: Integer; -begin - Result := Length(sruMembers); -end; - -function TwbSubRecordUnionDef.GetMemberFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : IwbRecordMemberDef; -var - i: Integer; -begin - Result := nil; - for i := Low(sruMembers) to High(sruMembers) do begin - if sruMembers[i].CanHandle(aSignature, aDataContainer) then begin - Result := sruMembers[i]; - Exit; - end; - end; -end; - -function TwbSubRecordUnionDef.GetMemberIndexFor(aSignature : TwbSignature; - const aDataContainer : IwbDataContainer) - : Integer; -var - i: Integer; -begin - Result := -1; - for i := Low(sruMembers) to High(sruMembers) do begin - if sruMembers[i].CanHandle(aSignature, aDataContainer) then begin - Result := i; - Exit; - end; - end; -end; - -function TwbSubRecordUnionDef.GetQuickInitLimit: Integer; -begin - Result := -1; -end; - -function TwbSubRecordUnionDef.GetRecordHeaderStruct: IwbStructDef; -begin - Result := wbMainRecordHeader; -end; - -function TwbSubRecordUnionDef.GetSignatureCount: Integer; -var - i: Integer; -begin - Result := 0; - for i := Low(sruMembers) to High(sruMembers) do - Inc(Result, sruMembers[i].GetSignatureCount); -end; - -function TwbSubRecordUnionDef.GetSignatures(const aIndex: Integer): TwbSignature; -var - i, j, k: Integer; -begin - j := aIndex; - for i := Low(sruMembers) to High(sruMembers) do begin - k := sruMembers[i].GetSignatureCount; - if k > 0 then begin - if j >= k then - Dec(j, k) - else begin - Result := sruMembers[i].GetSignatures(Pred(k)); - Exit; - end; - end; - end; - raise Exception.Create('Invalid index'); -end; - -function TwbSubRecordUnionDef.GetSkipSignature(const aSignature: TwbSignature): Boolean; -var - Dummy: Integer; -begin - Result := Assigned(sruSkipSignatures) and sruSkipSignatures.Find(aSignature, Dummy); -end; - -procedure TwbSubRecordUnionDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; - i : Integer; -begin - if defReported then - Exit; - - inherited; - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - for i := Low(sruMembers) to High(sruMembers) do - if Assigned(sruMembers[i]) then begin - Parents[High(Parents)].Index := i; - sruMembers[i].Report(Parents); - end; - - defReported := True; -end; - -function wbReadInteger24(aBasePtr: pointer): Int64; -var - Buffer : array[0..3] of Byte; -begin - Result := 0; - Buffer[3] := 0; - Buffer[2] := PByte(aBasePtr)^; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - Buffer[1] := PByte(aBasePtr)^; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - Buffer[0] := PByte(aBasePtr)^; - Move(Buffer, Result, SizeOf(Result)); -end; - -procedure WriteInteger24(aBasePtr: pointer; aValue: Int64); -var - Buffer : array[0..3] of Byte; -begin - Move(aValue, Buffer, SizeOf(aValue)); - PByte(aBasePtr)^ := Buffer[2]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[1]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[0]; -end; - -function ReadIntegerCounterSize(aBasePtr: pointer): Int64; -var - Key : Byte; -begin - if Assigned(aBasePtr) then begin - Key := $3 and PByte(aBasePtr)^; // The counter length is coded into the 2 least significant bits - case key of - 0: Result := 1; - 1: Result := 2; - 2: Result := 4; - else - Result := 1; - end - end else - Result := 1; // Minimum size -end; - -function ReadIntegerCounter(aBasePtr: pointer): Int64; -var - Key : Byte; -begin - Result := 0; - if Assigned(aBasePtr) then begin - Key := $3 and PByte(aBasePtr)^; // The counter length is coded into the 2 least significant bits - case key of - 0: Move(PByte(aBasePtr)^, Result, 1); // The 6 remaining bits are the count. - 1: Move(PWord(aBasePtr)^, Result, 2); // 6 + 8 bits of count - 2: Move(PCardinal(aBasePtr)^, Result, 4); // 6 + 24 bits of count - 3: ; // Not supposed to exist : zeroed out by the engine - end; - Result := Result shr 2; - end; -end; - -procedure WriteIntegerCounter(aBasePtr: pointer; aValue: Int64); -var - Buffer : array[0..3] of Byte; -begin - if Assigned(aBasePtr) then begin - Move(aValue, Buffer, SizeOf(aValue)); - if Buffer[3] > 0 then begin // 4 bytes counter - Buffer[3] := (Buffer[3] shl 2 ) or 3; - PByte(aBasePtr)^ := Buffer[3]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[2]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[1]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[0]; - end else if Buffer[2] > 0 then begin - Buffer[2] := (Buffer[3] shl 2 ) or 2; - PByte(aBasePtr)^ := Buffer[2]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[1]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[0]; - end else if Buffer[1] > 0 then begin - Buffer[1] := (Buffer[1] shl 2 ) or 1; - PByte(aBasePtr)^ := Buffer[1]; aBasePtr := Pointer(Cardinal(aBasePtr)+1); - PByte(aBasePtr)^ := Buffer[0]; - end else begin - Buffer[0] := (Buffer[0] shl 2 ) or 0; - PByte(aBasePtr)^ := Buffer[0]; - end; - end; -end; - -{ TwbIntegerDef } - -function TwbIntegerDef.Assign(const aTarget : IwbElement; - aIndex : Integer; - const aSource : IwbElement; - aOnlySK : Boolean) - : IwbElement; -begin - if Assigned(inFormater) then - Result := inFormater.Assign(aTarget, aIndex, aSource, aOnlySK) - else - Result := inherited Assign(aTarget, aIndex, aSource, aOnlySK) -end; - -procedure TwbIntegerDef.BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); -var - Value : Int64; -begin - if Assigned(inFormater) then - if (Cardinal(aEndPtr) - Cardinal(aBasePtr)) >= GetExpectedLength then begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {it0:} Value := 0; - end; - inFormater.BuildRef(Value, aElement); - end; -end; - -function TwbIntegerDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - IntegerDef : IwbIntegerDef; -begin - Result := Supports(aDef, IwbIntegerDef, IntegerDef); - if Result then begin - if Assigned(inFormater) then - Result := inFormater.CanAssign(aElement, aIndex, IntegerDef.Formater[aElement]) - else if Assigned(IntegerDef.Formater[aElement]) then - Result := IntegerDef.Formater[aElement].CanAssign(aElement, aIndex, GetFormater(aElement)); - end else - if Assigned(inFormater) then - Result := inFormater.CanAssign(aElement, aIndex, aDef); -end; - -function TwbIntegerDef.CanContainFormIDs: Boolean; -begin - Result := Assigned(inFormater) and (inFormater.CanContainFormIDs); -end; - -function TwbIntegerDef.Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Len : Cardinal; - Value : Int64; -begin - Result := ''; - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetExpectedLength then begin - if wbCheckExpectedBytes then - Result := Format('Expected %d bytes of data, found %d', [GetExpectedLength , Len]) - end else begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {itU0:} Value := 0; - end; - if Assigned(inFormater) then - Result := inFormater.Check(Value, aElement) - else - Result := ''; - end; -end; - -constructor TwbIntegerDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbIntegerDef do - Self.Create(defPriority, defRequired, noName, inType, inFormater, noDontShow, noAfterSet, inDefault, defGetCP, noTerminator).defSource := aSource; -end; - -function TwbIntegerDef.CompareExchangeFormID(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOldFormID, aNewFormID: Cardinal): Boolean; -var - i: Int64; -begin - if Assigned(inFormater) then begin - i := ToInt(aBasePtr, aEndPtr, aElement); - Result := inFormater.CompareExchangeFormID(i, aOldFormID, aNewFormID, aElement); - if Result then - FromInt(i, aBasePtr, aEndPtr, aElement); - end else - Result := inherited CompareExchangeFormID(aBasePtr, aEndPtr, aElement, aOldFormID, aNewFormID); -end; - -constructor TwbIntegerDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aIntType : TwbIntType; - const aFormater : IwbIntegerDefFormater; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback; - aDefault : Int64; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); -begin - inDefault := aDefault; - inType := aIntType; - if Assigned(aFormater) then - inFormater := (aFormater as IwbDefInternal).SetParent(Self, False) as IwbIntegerDefFormater; - inherited Create(aPriority, aRequired, aName, nil, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -procedure TwbIntegerDef.FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); -begin - if Assigned(inFormater) then - inFormater.FindUsedMasters(ToInt(aBasePtr, aEndPtr, aElement), aMasters, aElement) - else - inherited FindUsedMasters(aBasePtr, aEndPtr, aElement, aMasters); -end; - -procedure TwbIntegerDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -var - i: Int64; -begin - if aValue = '' then - i := 0 - else if Assigned(inFormater) then - i := inFormater.FromEditValue(aValue, aElement) - else - i := StrToInt64(aValue); - FromInt(i, aBasePtr, aEndPtr, aElement); -end; - -procedure TwbIntegerDef.FromInt(aValue: Int64; aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); -begin - aElement.RequestStorageChange(aBasePtr, aEndPtr, GetExpectedLength(aValue)); - case inType of - itU8: PByte(aBasePtr)^ := aValue; - itS8: PShortInt(aBasePtr)^ := aValue; - itU16: PWord(aBasePtr)^ := aValue; - itS16: PSmallInt(aBasePtr)^ := aValue; - itU24: WriteInteger24(aBasePtr, aValue); - itU32: PCardinal(aBasePtr)^ := aValue; - itS32: PLongInt(aBasePtr)^ := aValue; - itU64: PUInt64(aBasePtr)^ := aValue; - itS64: PInt64(aBasePtr)^ := aValue; - itU6to30: WriteIntegerCounter(aBasePtr, aValue); - else - {it0: } - end; -end; - -procedure TwbIntegerDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -begin - aElement.RequestStorageChange(aBasePtr, aEndPtr, GetExpectedLength(aValue)); - case inType of - itS8: PShortInt(aBasePtr)^ := aValue; - itU16: PWord(aBasePtr)^ := aValue; - itS16: PSmallInt(aBasePtr)^ := aValue; - itU24: WriteInteger24(aBasePtr, aValue); - itU32: PCardinal(aBasePtr)^ := aValue; - itS32: PLongInt(aBasePtr)^ := aValue; - itU64: PUInt64(aBasePtr)^ := aValue; - itS64: PInt64(aBasePtr)^ := aValue; - itU6to30: WriteIntegerCounter(aBasePtr, aValue); - else - PByte(aBasePtr)^ := aValue; - end; -end; - -function TwbIntegerDef.GetDefType: TwbDefType; -begin - Result := dtInteger; -end; - -function TwbIntegerDef.GetDefTypeName: string; -begin - if Assigned(inFormater) then - Result := inFormater.GetDefTypeName - else case inType of - itS8: Result := 'Signed Byte'; - itU16: Result := 'Unsigned Word'; - itS16: Result := 'Signed Word'; - itU24: Result := 'RefID'; - itU32: Result := 'Unsigned DWord'; - itS32: Result := 'Signed DWord'; - itU64: Result := 'Unsigned QWord'; - itS64: Result := 'Signed QWord'; - itU6to30: Result := 'Counter'; - else - Result := 'Unsigned Byte'; - end; -end; - -function TwbIntegerDef.GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - if Assigned(inFormater) then - Result := inFormater.EditInfo[ToInt(aBasePtr, aEndPtr, aElement), aElement] - else - Result := inherited GetEditInfo(aBasePtr, aEndPtr, aElement); -end; - -function TwbIntegerDef.GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; -begin - if Assigned(inFormater) then - Result := inFormater.EditType[ToInt(aBasePtr, aEndPtr, aElement), aElement] - else - Result := inherited GetEditType(aBasePtr, aEndPtr, aElement); -end; - -function TwbIntegerDef.GetExpectedLength(aValue: Int64 = 0): Integer; -const - ExpectedLen : array[TwbIntType] of Cardinal = ( - 0, 1, 1, 2, 2, 4, 4, 8, 8, 3, 1 - ); -begin - if inType = it0 then - Result := 0 - else begin - Result := ExpectedLen[inType]+Ord(noTerminator); - if (inType=itU6to30) and (aValue<>0) then - case (aValue and 3) of - 0 : Result := 1 + Ord(noTerminator); - 1 : Result := 2 + Ord(noTerminator); - 2 : Result := 4 + Ord(noTerminator); - end; - end; -end; - -function TwbIntegerDef.GetFormater(const aElement: IwbElement): IwbIntegerDefFormater; -var - Union: IwbIntegerDefFormaterUnion; -begin - Result := inFormater; - while Supports(Result, IwbIntegerDefFormaterUnion, Union) do - Result := Union.Decide(aElement); -end; - -function TwbIntegerDef.GetFormaterCanChange: Boolean; -begin - Result := Supports(inFormater, IwbIntegerDefFormaterUnion); -end; - -function TwbIntegerDef.GetIntType: TwbIntType; -begin - Result := inType; -end; - -function TwbIntegerDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := wbIsInternalEdit or (not Assigned(inFormater) or inFormater.IsEditable[ToInt(aBasePtr, aEndPtr, aElement), aElement]); -end; - -function TwbIntegerDef.GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; -var - Value : Int64; -begin - Result := nil; - if Assigned(inFormater) then - if (Cardinal(aEndPtr) - Cardinal(aBasePtr)) >= GetExpectedLength then begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {it0:} Value := 0; - end; - Result := inFormater.LinksTo[Value, aElement]; - end; -end; - -function TwbIntegerDef.GetNoReach: Boolean; -begin - Result := Assigned(inFormater) and inFormater.NoReach; -end; - -function TwbIntegerDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if inType = it0 then - Result := 0 - else if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aBasePtr) NewValue then - FromInt(NewValue, aBasePtr, aEndPtr, aElement) - end else - inherited MasterCountUpdated(aBasePtr, aEndPtr, aElement, aOld, aNew); -end; - -procedure TwbIntegerDef.MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); -var - OldValue : Int64; - NewValue : Int64; -begin - if Assigned(inFormater) then begin - OldValue := ToInt(aBasePtr, aEndPtr, aElement); - NewValue := inFormater.MasterIndicesUpdated(OldValue, aOld, aNew, aElement); - if OldValue <> NewValue then - FromInt(NewValue, aBasePtr, aEndPtr, aElement) - end else - inherited MasterIndicesUpdated(aBasePtr, aEndPtr, aElement, aOld, aNew); -end; - -procedure TwbIntegerDef.ReplaceFormater(const aFormater: IwbIntegerDefFormater); -begin - defSource := nil; - if Assigned(aFormater) then - inFormater := (aFormater as IwbDefInternal).SetParent(Self, True) as IwbIntegerDefFormater - else - inFormater := nil -end; - -procedure TwbIntegerDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; -begin - if defReported then - Exit; - - inherited; - if Assigned(inFormater) then begin - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - Parents[High(Parents)].Index := -1; - inFormater.Report(aParents); - end; - - defReported := True; -end; - -function TwbIntegerDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := not Assigned(aBasePtr) or (ToInt(aBasePtr, aEndPtr, aElement) <> inDefault); - if Result then - FromInt(inDefault, aBasePtr, aEndPtr, aElement); -end; - -function IntToHex64(Value: Int64; Digits: Integer): string; -begin - Result := IntToHex(Value, Digits); -end; - - -function TwbIntegerDef.ToEditValue(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): string; -var - Len : Cardinal; - Value : Int64; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if (Len < GetExpectedLength) or (inType = it0) then - Result := '' - else begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {it0:} Value := 0; - end; - - Result := ''; - if Assigned(inFormater) then - Result := inFormater.ToEditValue(Value, aElement); - - if Result = '' then - Result := IntToStr(Value); - end; -end; - -function TwbIntegerDef.ToInt(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Int64; -var - Len : Cardinal; -begin - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetExpectedLength then - Result := 0 - else - case inType of - itU8: Result := PByte(aBasePtr)^; - itS8: Result := PShortInt(aBasePtr)^; - itU16: Result := PWord(aBasePtr)^; - itS16: Result := PSmallInt(aBasePtr)^; - itU24: Result := wbReadInteger24(aBasePtr); - itU32: Result := PCardinal(aBasePtr)^; - itS32: Result := PLongInt(aBasePtr)^; - itU64: Result := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Result := PInt64(aBasePtr)^; - itU6to30: Result := ReadIntegerCounter(aBasePtr); - else - {it0:} Result := 0; - end; -end; - -function TwbIntegerDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -begin - if (Cardinal(aEndPtr) - Cardinal(aBasePtr)) < GetExpectedLength then - VarClear(Result) - else - case inType of - itU8: Result := PByte(aBasePtr)^; - itS8: Result := PShortInt(aBasePtr)^; - itU16: Result := PWord(aBasePtr)^; - itS16: Result := PSmallInt(aBasePtr)^; - itU24: Result := wbReadInteger24(aBasePtr); - itU32: Result := PCardinal(aBasePtr)^; - itS32: Result := PLongInt(aBasePtr)^; - itU64: Result := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Result := PInt64(aBasePtr)^; - itU6to30: Result := ReadIntegerCounter(aBasePtr); - else - {it0:} Result := 0; - end; -end; - -function TwbIntegerDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -var - Len : Cardinal; - Value : Int64; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetExpectedLength then - if Assigned(inFormater) and inFormater.RequiresKey then - Result := inFormater.ToSortKey(0, aElement) - else - Result := '' - else begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {it0:} Value := 0; - end; - - Result := ''; - if Assigned(inFormater) then - Result := inFormater.ToSortKey(Value, aElement); - - if Result = '' then begin - case inType of - itS8: Value := Value + Abs(Int64(Low(ShortInt))); - itS16: Value := Value + Abs(Int64(Low(SmallInt))); - itS32: Value := Value + Abs(Int64(Low(LongInt))); - itS64: Value := Value + Abs(Int64(Low(Int64))); - end; - Result := Result + IntToHex64(Value, Succ(GetExpectedLength(Value) * 2)); - end; - end; -end; - -function TwbIntegerDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Len : Cardinal; - Value : Int64; -begin - Result := ''; - - if inType = it0 then - Exit; - - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetExpectedLength then begin - if wbCheckExpectedBytes then - Result := Format('', [GetExpectedLength, Len]) - end else begin - case inType of - itU8: Value := PByte(aBasePtr)^; - itS8: Value := PShortInt(aBasePtr)^; - itU16: Value := PWord(aBasePtr)^; - itS16: Value := PSmallInt(aBasePtr)^; - itU24: Value := wbReadInteger24(aBasePtr); - itU32: Value := PCardinal(aBasePtr)^; - itS32: Value := PLongInt(aBasePtr)^; - itU64: Value := PUInt64(aBasePtr)^; //no U64 in delphi... - itS64: Value := PInt64(aBasePtr)^; - itU6to30: Value := ReadIntegerCounter(aBasePtr); - else - {it0:} Value := 0; - end; - if Assigned(inFormater) then - Result := inFormater.ToString(Value, aElement) - else - Result := IntToStr(Value); - if (Len > GetExpectedLength) and not (inType in [itU6to30]) then begin - if wbCheckExpectedBytes then - Result := Result + Format(' ', [GetExpectedLength , Len]) - end; - end; - Used(aElement, Result); -end; - -{ TwbArrayDef } - -constructor TwbArrayDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aElement : IwbValueDef; - aCount : Integer; - const aLabels : array of string; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aCanAddTo : Boolean; - aTerminator : Boolean; - aTerminated : Boolean); -var - i: Integer; -begin - Assert((not aSorted) or (Length(aLabels) < 1)); - - SetLength(arLabels, Length(aLabels)); - for i := Low(arLabels) to High(arLabels) do - arLabels[i] := aLabels[i]; - - arCount := aCount; - if Assigned(aElement) then - arElement := (aElement as IwbDefInternal).SetParent(Self, False) as IwbValueDef; - arSorted := aSorted; - arCanAddTo := aCanAddTo; - arTerminated := aTerminated; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -function TwbArrayDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - ArrayDef: IwbArrayDef; -begin - Result := (aIndex = Low(Integer)) and - Supports(aDef, IwbArrayDef, ArrayDef) and - ( ( arCount <= 0 ) or (arCount = ArrayDef.ElementCount) ) and - arElement.CanAssign(aElement, aIndex, ArrayDef.Element); -end; - -function TwbArrayDef.CanContainFormIDs: Boolean; -begin - Result := arElement.CanContainFormIDs; -end; - -constructor TwbArrayDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbArrayDef do - if Assigned(arCountCallback) then - Self.Create(defPriority, defRequired, noName, arElement, arCountCallback, - arLabels, arSorted, noAfterLoad, noAfterSet, noDontShow, defGetCP, arCanAddTo, noTerminator, arTerminated).defSource := aSource - else - Self.Create(defPriority, defRequired, noName, arElement, arCount, - arLabels, arSorted, noAfterLoad, noAfterSet, noDontShow, defGetCP, arCanAddTo, noTerminator, arTerminated).defSource := aSource; -end; - -constructor TwbArrayDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aElement : IwbValueDef; - aCountCallback : TwbCountCallback; - const aLabels : array of string; - aSorted : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aCanAddTo : Boolean; - aTerminator : Boolean; - aTerminated : Boolean); -begin - arCountCallback := aCountCallback; - Create(aPriority, aRequired, aName, aElement, 0, aLabels, aSorted, aAfterLoad, aAfterSet, aDontShow, aGetCP, aCanAddTo, aTerminator, aTerminated); -end; - -function TwbArrayDef.GetCanAddTo: Boolean; -begin - Result := arCanAddTo; -end; - -function TwbArrayDef.GetCanBeZeroSize: Boolean; -begin - Result := True; -end; - -function TwbArrayDef.GetCount: Integer; -begin - Result := arCount; -end; - -function TwbArrayDef.GetCountCallBack: TwbCountCallback; -begin - Result := arCountCallBack; -end; - -function TwbArrayDef.GetDefType: TwbDefType; -begin - Result := dtArray; -end; - -function TwbArrayDef.GetDefTypeName: string; -var - Prefix: Integer; -begin - if arCount < 0 then begin - if arCount < -1 then - if arCount < -2 then - Prefix := 1 - else - Prefix := 2 - else - Prefix := 4; - if noTerminator then - Result := 'Separated Array with '+IntToStr(Prefix)+' Bytes Counter of ' - else - Result := 'Array with '+IntToStr(Prefix)+' Bytes Counter of '; - end else begin - if (arCount < 1) and Assigned(arCountCallback) then - if noTerminator then - Result := 'Separated Variable Count Array' - else - Result := 'Variable Count Array' - else if arCount > 0 then - if noTerminator then - Result := 'Separated Array of '+IntToStr(arCount)+' ' - else - Result := 'Array of '+IntToStr(arCount)+' ' - else - if noTerminator then - Result := 'Separated Array of ' - else - Result := 'Array of '; - end; - Result := Result + GetElement.GetDefTypeName; -end; - -function TwbArrayDef.GetElement: IwbValueDef; -begin - Result := arElement; -end; - -function TwbArrayDef.GetElementLabel(aIndex: Integer): string; -begin - if (aIndex >= Low(arLabels)) and (aIndex <= High(arLabels)) then - Result := arLabels[aIndex] - else - Result := ''; -end; - -function TwbArrayDef.GetIsVariableSizeInternal: Boolean; -begin - Result := (arCount <= 0) or arElement.IsVariableSize; -end; - -function TwbArrayDef.GetPrefixCount(aBasePtr: Pointer): Cardinal; -var - Count : int64; -begin - Result := 0; - if arCount = -255 then - Result := 0 - else if arCount = -254 then - Result := ReadIntegerCounter(aBasePtr) - else if arCount = -253 then begin // Matrix of count * count - Count := ReadIntegerCounter(aBasePtr); - Result := Count * Count; - end - else if arCount = -241 then begin // Matrix of cardinal * cardinal - Count := PCardinal(aBasePtr)^; - Result := Count * Count; - end - else if Assigned(aBasePtr) then - case GetPrefixlength(aBasePtr) of - 1: Result := PByte(aBasePtr)^; - 2: Result := PWord(aBasePtr)^; - 4: Result := PCardinal(aBasePtr)^; - end; -end; - -function TwbArrayDef.GetPrefixLength(aBasePtr: Pointer): Integer; -begin - Result := 0; - if arCount < 0 then - if arCount = -1 then - Result := 4 - else if arCount = -2 then - Result := 2 - else if arCount = -4 then - Result := 1 - else if arCount = -241 then - Result := 4 - else if arCount = -253 then - Result := ReadIntegerCounterSize(aBasePtr) - else if arCount = -254 then - Result := ReadIntegerCounterSize(aBasePtr); -end; - -function TwbArrayDef.GetPrefixSize(aBasePtr: Pointer): Integer; -begin - Result := GetPrefixLength(aBasePtr); - if (Result>0) and noTerminator then - Inc(Result); -end; - -function TwbArrayDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Prefix : Integer; - Count : Integer; - Index : Integer; // Used instead of count for easier debugging output. - Size : Integer; - BasePtr : Pointer; - CheckedContainer : Boolean; - ArrayContainer : IwbContainerElementRef; - Element : IwbElement; - DataContainer : IwbDataContainer; - KnownSize : Boolean; -// aName : String; - - function CheckContainer: IwbContainerElementRef; - begin - if Assigned(aElement) and (aElement.ValueDef.DefID = GetDefID) then - Supports(aElement, IwbContainerElementRef, ArrayContainer); - Result := ArrayContainer; - CheckedContainer := True; - end; - - function Container: IwbContainerElementRef; - begin - if CheckedContainer then - Result := ArrayContainer - else - Result := CheckContainer; - end; - -begin - Result := 0; - CheckedContainer := False; - ArrayContainer := nil; - - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr) '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Exit; - end; - - Prefix := GetPrefixSize(aBasePtr); - BasePtr := aBasePtr; - Count := arCount; - if Count < 0 then begin - Count := GetPrefixCount(aBasePtr); - Result := Prefix; - end else begin - if (Count < 1) and Assigned(arCountCallback) and not (Container=nil) then - Count := arCountCallback(BasePtr, aEndPtr, ArrayContainer); - - if not Assigned(BasePtr) and (Count < 1) and not Assigned(arCountCallback) then // EXPERIMENT: Probably should not be done - Count := 1; - - if (Count < 1) and not Assigned(arCountCallback) then begin - Result := High(Integer); - Exit; - end; - end; - - if Assigned(BasePtr) then - Inc(PByte(BasePtr), Prefix); - - if Count > 0 then - if arElement.IsVariableSize then begin - if Container = nil then begin // Make sure it won't be used if unassigned, and still delay FindOurself until it is effectivly required - if not Assigned(BasePtr) then - Result := arElement.DefaultSize[nil, nil, aElement] - else - Result := High(Integer); - Exit; - end; - - if ArrayContainer.ElementCount = Count then begin - KnownSize := True; - for Index := 0 to Pred(Count) do begin - Element := ArrayContainer.Elements[Index]; - if Supports(Element, IwbDataContainer, DataContainer) then begin - Size := Cardinal(DataContainer.DataEndPtr)-Cardinal(DataContainer.DataBasePtr); - Inc(Result, Size); - end else begin - KnownSize := False; - Break; - end; - end; - end else - KnownSize := False; - - Index := 0; - if not KnownSize then - while (Count > Index) and (Cardinal(BasePtr) < Cardinal(aEndPtr)) do begin - Element := ArrayContainer.Elements[Index]; - if not Assigned(Element) then begin - if wbMoreInfoForIndex and (DebugHook <> 0) and Assigned(wbProgressCallback) then - wbProgressCallback('Debug: ['+ ArrayContainer.Path +'] Index ' + IntToStr(Index) + ' of ' + IntToStr(Count) + ' greater than max '+ - IntToStr(ArrayContainer.ElementCount-1)); - Element := aElement; // If it is too soon, revert to previous way of doing things - end; - Size := arElement.Size[BasePtr, aEndPtr, Element]; - if Size = High(Integer) then begin - Result := High(Integer); - Exit; - end; - Inc(Result, Size); - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr)aBasePtr) then -// wbProgressCallback('Found an array with a negative size! (2) '+IntToHex64(Cardinal(aBasePtr)+Result, 8)+ -// ' > '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Result := Cardinal(aEndPtr)-Cardinal(aBasePtr)+Result; - Exit; - end; - if Assigned(BasePtr) then - Inc(PByte(BasePtr), Size); - Inc(Index); - end; - - end else begin - if (Container <> nil) and (ArrayContainer.ElementCount > 0) then - Element := ArrayContainer.Elements[0] - else - Element := aElement; - - Size := arElement.Size[BasePtr, aEndPtr, Element]; - if Size = High(Integer) then begin - Result := High(Integer); - Exit; - end; - Result := (Count * Size) + Prefix; - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr)aBasePtr) then -// wbProgressCallback('Found a static array with a negative size! (3) '+IntToHex64(Cardinal(aBasePtr)+Result, 8)+ -// ' > '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Result := Cardinal(aEndPtr)-Cardinal(aBasePtr); - Exit; - end; - end; - Inc(Result, Ord(arTerminated)); -end; - -function TwbArrayDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if ((arCount = 0) and not Assigned(arCountCallback)) then - Result := 0 - else - Result := GetSize(aBasePtr, aEndPtr, aElement); -end; - -function TwbArrayDef.GetSorted: Boolean; -begin - if wbCopyIsRunning = 0 then - Result := arSorted - else - Result := False; -end; - -procedure TwbArrayDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; -begin - if defReported then - Exit; - - inherited; - if Assigned(arElement) then begin - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - Parents[High(Parents)].Index := -1; - arElement.Report(aParents); - end; - - defReported := True; -end; - -procedure TwbArrayDef.SetPrefixCount(aBasePtr: Pointer; aValue: Cardinal); -begin - if arCount = -255 then - else if arCount = -254 then - WriteIntegerCounter(aBasePtr, aValue) - else if Assigned(aBasePtr) then - case GetPrefixlength(aBasePtr) of - 1: PByte(aBasePtr)^ := aValue; - 2: PWord(aBasePtr)^ := aValue; - 4: PCardinal(aBasePtr)^ := aValue; - end; -end; - -function TwbArrayDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := ''; - Used(aElement, Result); -end; - -{ TwbStructDef } - -function TwbStructDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - StructDef : IwbStructDef; - i : Integer; -begin - Result := (aIndex = Low(Integer)) and - Supports(aDef, IwbStructDef, StructDef) and - ( GetMemberCount = StructDef.MemberCount); - if Result and not Equals(aDef) then - for i := 0 to Pred(GetMemberCount) do - if not stMembers[i].CanAssign(aElement, Low(Integer), StructDef.Members[i]) then begin - Result := False; - Exit; - end; -end; - -function TwbStructDef.CanContainFormIDs: Boolean; -begin - Result := stCanContainFormIDs; -end; - -constructor TwbStructDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbStructDef do - Self.Create(defPriority, defRequired, noName, stMembers, stSortKey, - stExSortKey, stElementMap, stOptionalFromElement, noDontShow, noAfterLoad, noAfterSet, defGetCP).defSource := aSource; -end; - -constructor TwbStructDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbValueDef; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - {$IFDEF WIN32} - const aElementMap : array of Cardinal; - {$ENDIF WIN32} - {$IFDEF WIN64} - const aElementMap : array of UInt64; - {$ENDIF WIN64} - aOptionalFromElement : Integer; - aDontShow : TwbDontShowCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); -var - i: Integer; -begin - stOptionalFromElement := aOptionalFromElement; - SetLength(stMembers, Length(aMembers)); - for i := Low(stMembers) to High(stMembers) do begin - stMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbValueDef; - stCanContainFormIDs := stCanContainFormIDs or aMembers[i].CanContainFormIDs; - end; - SetLength(stSortKey, Length(aSortKey)); - for i := Low(stSortKey) to High(stSortKey) do - stSortKey[i] := aSortKey[i]; - SetLength(stExSortKey, Length(aExSortKey)); - for i := Low(stExSortKey) to High(stExSortKey) do - stExSortKey[i] := aExSortKey[i]; - SetLength(stElementMap, Length(aElementMap)); - for i := Low(stElementMap) to High(stElementMap) do - stElementMap[i] := aElementMap[i]; - if Length(stElementMap) > 0 then begin - Assert(Length(stElementMap) = Length(stMembers)); - // should really check that the element map only contains valid values - // and that there are no optional elements... - end; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); -end; - -function TwbStructDef.GetDefType: TwbDefType; -begin - Result := dtStruct; -end; - -function TwbStructDef.GetDefTypeName: string; -begin - Result := 'Structure'; -end; - -function TwbStructDef.GetElementMap: TDynCardinalArray; -begin - Result := stElementMap; -end; - -function TwbStructDef.GetMember(aIndex: Integer): IwbValueDef; -begin - Result := stMembers[aIndex]; -end; - -function TwbStructDef.GetMemberByName(const aName: string): IwbValueDef; -var - i: Integer; -begin - for i := Low(stMembers) to High(stMembers) do - if SameText(stMembers[i].Name, aName) then - Exit(stMembers[i]); - Result := nil; -end; - -function TwbStructDef.GetMemberCount: Integer; -begin - Result := Length(stMembers); -end; - -function TwbStructDef.GetOptionalFromElement: Integer; -begin - Result := stOptionalFromElement; -end; - -function TwbStructDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - i : Integer; - Size : Integer; - scDef : IwbStructCDef; - BasePtr : Pointer; - Container : IwbContainerElementRef; - Element : IwbElement; -begin - Result := 0; - if Supports(Self, IwbStructCDef, scDef) then begin - scDef.GetSizing(aBasePtr, aEndPtr, aElement, Size); - if Size>0 then begin - Inc(Result, Size); - Exit; - end; - end; - if (Cardinal(aBasePtr) > Cardinal(aEndPtr)) then begin // if aBasePtr >= aEndPtr then no allocation (or error) -// wbProgressCallback('Found a struct with a negative size! (1) '+IntToHex64(Cardinal(aBasePtr), 8)+ -// ' > '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+ noName); - end else if (not Assigned(aBasePtr) or (Cardinal(aBasePtr) = Cardinal(aEndPtr))) and (GetIsVariableSizeInternal) then begin - Result := 0; // assuming we would have called GetDefaultSize otherwise... GetDefaultSize(aBasePtr, aEndPtr, aElement); - end else begin - BasePtr := aBasePtr; - if GetIsVariableSize and Supports(aElement, IwbContainerElementRef, Container) and Equals(Container.ValueDef) and - (Container.ElementCount > 0) then begin - for i := 0 to Pred(Container.ElementCount) do begin - Element := Container.Elements[i]; - Size := Element.ValueDef.Size[BasePtr, aEndPtr, Element]; - if Size = High(Integer) then begin - Result := High(Integer); - Break; - end; - Inc(Result, Size); - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr)aBasePtr) then -// wbProgressCallback('Found a struct with a negative size! (2) '+IntToHex64(Cardinal(aBasePtr)+Size, 8)+ -// ' < '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Result := Cardinal(aEndPtr)-Cardinal(aBasePtr); - Break; - end; - if Assigned(BasePtr) then - Inc(PByte(BasePtr), Size); - end; - end else - for i := Low(stMembers) to High(stMembers) do begin - Size := stMembers[i].Size[BasePtr, aEndPtr, aElement]; - if Size = High(Integer) then begin - Result := High(Integer); - Break; - end; - Inc(Result, Size); - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr)aBasePtr) then -// wbProgressCallback('Found a struct with a negative size! (2) '+IntToHex64(Cardinal(aBasePtr)+Result, 8)+ -// ' > '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Result := Cardinal(aEndPtr)-Cardinal(aBasePtr); - Break; - end; - if Assigned(BasePtr) then - Inc(PByte(BasePtr), Size); - end; - end; -end; - -function TwbStructDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - i : Integer; - Size : Integer; -begin - Result := 0; - for i := Low(stMembers) to High(stMembers) do begin - Size := stMembers[i].DefaultSize[aBasePtr, aEndPtr, aElement]; - if Size = High(Integer) then begin - Result := High(Integer); - Break; - end; - if Assigned(aBasePtr) then - Inc(PByte(aBasePtr), Size); - Inc(Result, Size); - end; -end; - -function TwbStructDef.GetIsVariableSizeInternal: Boolean; -var - i : Integer; -begin - Result := False; - for i := Low(stMembers) to High(stMembers) do - if stMembers[i].IsVariableSize then begin - Result := True; - Break; - end; -end; - -procedure TwbStructDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; - i : Integer; -begin - if defReported then - Exit; - - inherited; - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - for i := Low(stMembers) to High(stMembers) do - if Assigned(stMembers[i]) then begin - Parents[High(Parents)].Index := i; - stMembers[i].Report(Parents); - end; - - defReported := True; -end; - -function TwbStructDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -var - i, j : Integer; - SortMember : Integer; - BasePtr : Pointer; - EndPtr : Pointer; -begin - Result := ''; - if (Length(stSortKey) > 0) or (aExtended and (Length(stExSortKey) > 0)) then begin - for i := Low(stSortKey) to High(stSortKey) do begin - SortMember := stSortKey[i]; - if SortMember <= High(stMembers) then begin - BasePtr := aBasePtr; - for j := Low(stMembers) to Pred(SortMember) do begin - Inc(PByte(BasePtr), stMembers[j].Size[BasePtr, aEndPtr, aElement]); - if Cardinal(BasePtr) > Cardinal(aEndPtr) then - BasePtr := aEndPtr; - end; - - EndPtr := Pointer( Cardinal(BasePtr) + Cardinal(stMembers[SortMember].Size[BasePtr, aEndPtr, aElement]) ); - - if Cardinal(BasePtr) > Cardinal(aEndPtr) then - BasePtr := aEndPtr; - if Cardinal(EndPtr) > Cardinal(aEndPtr) then - EndPtr := aEndPtr; - - Result := Result + stMembers[SortMember].ToSortKey(BasePtr, EndPtr, aElement, aExtended); - end; - - if i < High(stSortKey) then - Result := Result + '|'; - end; - if aExtended then begin - if (Length(stSortKey) > 0) and (Length(stExSortKey) > 0) then - Result := Result + '|'; - - for i := Low(stExSortKey) to High(stExSortKey) do begin - SortMember := stExSortKey[i]; - if SortMember <= High(stMembers) then begin - BasePtr := aBasePtr; - for j := Low(stMembers) to Pred(SortMember) do begin - Inc(PByte(BasePtr), stMembers[j].Size[BasePtr, aEndPtr, aElement]); - if Cardinal(BasePtr) > Cardinal(aEndPtr) then - BasePtr := aEndPtr; - end; - - EndPtr := Pointer( Cardinal(BasePtr) + Cardinal(stMembers[SortMember].Size[BasePtr, aEndPtr, aElement]) ); - - if Cardinal(BasePtr) > Cardinal(aEndPtr) then - BasePtr := aEndPtr; - if Cardinal(EndPtr) > Cardinal(aEndPtr) then - EndPtr := aEndPtr; - - Result := Result + stMembers[SortMember].ToSortKey(BasePtr, EndPtr, aElement, aExtended); - end; - - if i < High(stExSortKey) then - Result := Result + '|'; - end; - end; - end else begin - BasePtr := aBasePtr; - for j := Low(stMembers) to High(stMembers) do begin - EndPtr := Pointer( Cardinal(BasePtr) + Cardinal(stMembers[j].Size[BasePtr, aEndPtr, aElement]) ); - - if Cardinal(BasePtr) > Cardinal(aEndPtr) then - BasePtr := aEndPtr; - if Cardinal(EndPtr) > Cardinal(aEndPtr) then - EndPtr := aEndPtr; - - Result := Result + stMembers[j].ToSortKey(BasePtr, EndPtr, aElement, aExtended); - - BasePtr := EndPtr; - - if j < High(stMembers) then - Result := Result + '|'; - end; - end; -end; - -function TwbStructDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := ''; - Used(aElement, Result); -end; - -{ TwbFlagsDef } - -function TwbFlagsDef.Assign(const aTarget : IwbElement; - aIndex : Integer; - const aSource : IwbElement; - aOnlySK : Boolean) - : IwbElement; -var - FlagDef : IwbFlagDef; - i : Int64; -begin - if Supports(aSource.ValueDef, IwbFlagDef, FlagDef) then begin - i := aTarget.NativeValue; - i := i or (1 shl FlagDef.FlagIndex); - aTarget.NativeValue := i; - end else - Result := inherited Assign(aTarget, aIndex, aSource, aOnlySK); -end; - -function TwbFlagsDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - FlagsDef : IwbFlagsDef; - FlagDef : IwbFlagDef; - i : Integer; -begin - if Supports(aDef, IwbFlagsDef, FlagsDef) then begin - Result := FlagsDef.FlagCount = GetFlagCount; - if Result and not GetRoot.Equals(FlagsDef.Root) then - for i := 0 to Pred(GetFlagCount) do - if not SameStr(FlagsDef.Flags[i], GetFlag(i)) then begin - Result := False; - Exit; - end; - end else if Supports(aDef, IwbFlagDef, FlagDef) then begin - FlagsDef := FlagDef.FlagsDef; - Result := GetBaseFlagsDef.Equals(FlagsDef.BaseFlagsDef); - if Result then begin - i := FlagDef.FlagIndex; - Result := SameStr(FlagsDef.Flags[i], GetFlag(i)); - end; - end else - Result := false; -end; - -function TwbFlagsDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbFlagsDef.Check(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; - s: string; -begin - Result := ''; - if not flgUnknownIsUnused then begin - for i := 0 to 63 do - if (aInt and (Int64(1) shl i)) <> 0 then begin - s := ''; - if i <= High(flgNames) then - s := flgNames[i]; - if s = '' then begin - s := ''; - Result := Result + s + ', '; - end; - end; - SetLength(Result, Length(Result)-2); - end; -end; - -constructor TwbFlagsDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbFlagsDef do - Self.Create(flgBaseFlagsDef, flgNames, flgDontShows, flgUnknownIsUnused, flgIgnoreMask, flgGetCPs).defSource := aSource; -end; - -constructor TwbFlagsDef.Create(const aBaseFlagsDef : IwbFlagsDef; - const aNames : array of string; - const aDontShows : array of TwbDontShowCallback; - aUnknownIsUnused : Boolean; - aIgnoreMask : Int64; - const aGetCPs : array of TwbGetConflictPriority); -var - i: Integer; -begin - if Assigned(aBaseFlagsDef) then - flgBaseFlagsDef := aBaseFlagsDef.Root as IwbFlagsDef; - flgIgnoreMask := aIgnoreMask; - flgUnknownIsUnused := aUnknownIsUnused; - flgUnusedMask := 0; - if flgUnknownIsUnused then - flgUnusedMask := not flgUnusedMask; - SetLength(flgNames, Length(aNames)); - for i := Low(flgNames) to High(flgNames) do begin - flgNames[i] := aNames[i]; - if SameText(flgNames[i], 'Unused') then - flgUnusedMask := flgUnusedMask or (Int64(1) shl i) - else if flgUnknownIsUnused and (flgNames[i] <> '') then - flgUnusedMask := flgUnusedMask and not (Int64(1) shl i); - end; - SetLength(flgFlagDefs, Length(flgNames)); - - SetLength(flgDontShows, Length(aDontShows)); - for i := Low(flgDontShows) to High(flgDontShows) do begin - flgDontShows[i] := aDontShows[i]; - flgHasDontShows := flgHasDontShows or Assigned(flgDontShows[i]); - end; - - SetLength(flgGetCPs, Length(aGetCPs)); - for i := Low(flgGetCPs) to High(flgGetCPs) do begin - flgGetCPs[i] := aGetCPs[i]; - flgHasGetCPs := flgHasGetCPs or Assigned(flgGetCPs[i]); - end; - - inherited Create(cpNormal, False, nil); -end; - -function TwbFlagsDef.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -var - i: Integer; -begin - Result := 0; - for i := 1 to Length(aValue) do - case aValue[i] of - '0': {do nothing}; - '1': Result := Result or (Int64(1) shl Pred(i)); - else - raise Exception.Create('"'+aValue[i]+'" is not a valid character for a flag'); - end; - Result := Result and not flgUnusedMask; -end; - -function TwbFlagsDef.GetBaseFlagsDef: IwbFlagsDef; -begin - if Assigned(flgBaseFlagsDef) then - Result := flgBaseFlagsDef - else - Result := GetRoot as IwbFlagsDef; -end; - -function TwbFlagsDef.GetDefTypeName: string; -var - i: Integer; -begin - if Length(flgNames)=0 then - inherited - else begin - Result := '('+flgNames[Low(flgNames)]; - for i := 1 to High(flgNames) do - Result := Result+','+flgNames[i]; - Result := Result+')' - end; -end; - -function TwbFlagsDef.GetEditInfo(aInt: Int64; const aElement: IwbElement): string; -var - FlagCount : Integer; - IntegerDef : IwbIntegerDef; - i : Integer; - s : string; -begin - FlagCount := 64; - if Assigned(aElement) and (Supports(aElement.Def, IwbIntegerDef, IntegerDef) or Supports(aElement.ValueDef, IwbIntegerDef, IntegerDef)) then - case IntegerDef.IntType of - it0: FlagCount := 0; - itU8, itS8: FlagCount := 8; - itU16, itS16: FlagCount := 16; - itU32, itS32: FlagCount := 32; - end; - - with TStringList.Create do try - for i := 0 to Pred(FlagCount) do begin - s := ''; - if i <= High(flgNames) then - s := flgNames[i]; - if s = '' then - if flgUnknownIsUnused then - s := 'Unused' - else - s := ''; - if GetFlagDontShow(aElement, i) then - s := '(' + s + ')'; - if wbShowFlagEnumValue then - s := s + ' (0x' + IntToHex(Int64(1) shl i, 8) + ')'; - Add(s); - end; - Result := CommaText; - finally - Free; - end; -end; - -function TwbFlagsDef.GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; -begin - Result := etCheckComboBox; -end; - -function TwbFlagsDef.GetFlag(aIndex: Integer): string; -begin - Result := flgNames[aIndex]; - if wbShowFlagEnumValue then - Result := Result + ' (0x' + IntToHex(Int64(1) shl aIndex, 8) + ')'; -end; - -function TwbFlagsDef.GetFlagCount: Integer; -begin - Result := Length(flgNames); -end; - -function TwbFlagsDef.GetFlagDef(aIndex: Integer): IwbFlagDef; -var - FlagDef: IwbFlagDef; -begin - Result := flgFlagDefs[aIndex]; - if not Assigned(Result) then begin - FlagDef := TwbFlagDef.Create(defPriority, False, flgNames[aIndex], nil, nil, - nil, nil, False, aIndex).SetParent(Self, False) as IwbFlagDef; - - {this really should be done threadsafe with a locked compare exchange} - flgFlagDefs[aIndex] := FlagDef; - - Result := flgFlagDefs[aIndex]; - end; -end; - -function TwbFlagsDef.GetFlagDontShow(const aElement: IwbElement; aIndex: Integer): Boolean; -begin - Result := False; - if flgHasDontShows and (aIndex <= High(flgDontShows)) and Assigned(flgDontShows[aIndex]) then - Result := flgDontShows[aIndex](aElement); -end; - -procedure TwbFlagsDef.FlagGetCP(const aElement : IwbElement; - aIndex : Integer; - var aCP : TwbConflictPriority); -begin - if flgHasGetCPs and (aIndex <= High(flgGetCPs)) and Assigned(flgGetCPs[aIndex]) then - flgGetCPs[aIndex](aElement, aCP); -end; - -function TwbFlagsDef.GetFlagHasDontShow(aIndex: Integer): Boolean; -begin - Result := flgHasDontShows and (aIndex <= High(flgDontShows)) and Assigned(flgDontShows[aIndex]); -end; - -function TwbFlagsDef.GetFlagHasGetCP(aIndex: Integer): Boolean; -begin - Result := flgHasGetCPs and (aIndex <= High(flgGetCPs)) and Assigned(flgGetCPs[aIndex]); -end; - -function TwbFlagsDef.GetFlagIgnoreConflict(aIndex: Integer): Boolean; -begin - Result := (flgIgnoreMask and (Int64(1) shl Int64(aIndex))) <> 0; -end; - -function TwbFlagsDef.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -procedure TwbFlagsDef.Report(const aParents: TwbDefPath); -var - i: Integer; -begin - if defReported then - Exit; - - inherited; - if wbReportMode and wbReportUnknownFlags and HasUnknownFlags then begin - WriteLn('Unknown Flags in: ', wbDefsToPath(aParents), wbDefToName(Self)); - for i := 0 to 63 do - if UnknownFlags[i] > 0 then - WriteLn(' ', i,' (',UnknownFlags[i],')'); - end; - - defReported := True; -end; - -function TwbFlagsDef.GetRequiresKey: Boolean; -begin - Result := True; -end; - -function TwbFlagsDef.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; -begin - aInt := aInt and not flgUnusedMask; - Result := StringOfChar('0', 64); - for i := 0 to 63 do - if (aInt and (Int64(1) shl i)) <> 0 then begin - Result[Succ(i)] := '1'; - aInt := aInt and not (Int64(1) shl i); - if aInt = 0 then begin - SetLength(Result, Succ(i)); - Exit; - end; - end; -end; - -function TwbFlagsDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; -begin - aInt := aInt and not flgUnusedMask; - Result := StringOfChar('0', 64); - for i := 0 to 63 do - if (aInt and (Int64(1) shl i)) <> 0 then - if not GetFlagDontShow(aElement, i) then - Result[Succ(i)] := '1'; -end; - -function TwbFlagsDef.ToString(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; - s: string; -begin - Result := ''; - aInt := aInt and not flgUnusedMask; - for i := 0 to 63 do - if (aInt and (Int64(1) shl i)) <> 0 then begin - s := ''; - if i <= High(flgNames) then - s := flgNames[i]; - if s = '' then begin - s := ''; - if wbReportMode and wbReportUnknownFlags then begin - Inc(UnknownFlags[i]); - HasUnknownFlags := True; - end; - end; - if wbShowFlagEnumValue then - s := s + ' (0x' + IntToHex(Int64(1) shl i, 8) + ')'; - if not GetFlagDontShow(aElement, i) then - Result := Result + s + ', '; - end; - SetLength(Result, Length(Result)-2); - Used(aElement, Result); -end; - -{ TwbEnumDef } - -function TwbEnumDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - EnumDef: IwbEnumDef; - i: Integer; -begin - Result := Supports(aDef, IwbEnumDef, EnumDef) and (EnumDef.NameCount = GetNameCount); - if Result and not Equals(EnumDef) then - for i := 0 to Pred(GetNameCount) do - if not SameStr(EnumDef.Names[i], GetName(i)) then begin - Result := False; - Exit; - end; -end; - -function TwbEnumDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbEnumDef.Check(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; -begin - Result := ''; - - if (aInt >= Low(enNames)) and (aInt <= High(enNames)) then - Result := enNames[aInt]; - - if Result = '' then - if FindSparseName(aInt, i) then - Result := enSparseNamesMap[i].snName; - - if Result = '' then - Result := '' - else - Result := ''; -end; - -function CompareSparseName(Item1, Item2: Pointer): Integer; -var - Index1, Index2: Int64; -begin - Index1 := PwbSparseName(Item1).snIndex; - Index2 := PwbSparseName(Item2).snIndex; - - if Index1 < Index2 then - Result := -1 - else if Index1 = Index2 then - Result := 0 - else - Result := 1; -end; - -constructor TwbEnumDef.Clone(const aSource: TwbDef); -var - i: Integer; -begin - with aSource as TwbEnumDef do begin - inherited Create(defPriority, defRequired, defGetCP).defSource := aSource; - Self.enNames := Copy(enNames, 0, Length(enNames)); - Self.enSparseNames := Copy(enSparseNames, 0, Length(enSparseNames)); - Self.enEditInfo := enEditInfo; - end; - - SetLength(enSparseNamesMap, Length(enSparseNames)); - for i := Low(enSparseNames) to High(enSparseNames) do - enSparseNamesMap[i] := @enSparseNames[i]; - if Length(enSparseNames) > 0 then - wbMergeSort(@enSparseNamesMap[0], Length(enSparseNames), CompareSparseName); -end; - -constructor TwbEnumDef.Create(const aNames: array of string; - const aSparseNames : array of const); -var - i : Integer; - EditInfo : TStringList; -begin - EditInfo := TwbFastStringListIC.Create; - try - SetLength(enNames, Length(aNames)); - for i := Low(enNames) to High(enNames) do begin - enNames[i] := aNames[i]; - if aNames[i] <> '' then - if wbShowFlagEnumValue then - EditInfo.Add(aNames[i] + ' (' + IntToStr(i) + ')') - else - EditInfo.Add(aNames[i]); - end; - - Assert(Length(aSparseNames) mod 2 = 0); - SetLength(enSparseNames, Length(aSparseNames) div 2); - for i := Low(enSparseNames) to High(enSparseNames) do begin - Assert(aSparseNames[ i * 2 ].VType in [vtInteger, vtInt64]); - Assert(aSparseNames[Succ(i * 2)].VType in [vtAnsiString, vtChar, vtUnicodeString, vtWideChar]); - with enSparseNames[i] do begin - - if aSparseNames[i * 2].VType = vtInteger then - snIndex := aSparseNames[i * 2 ].VInteger - else - snIndex := aSparseNames[i * 2 ].VInt64^; - - if aSparseNames[Succ(i * 2)].VType = vtAnsiString then - snName := AnsiString(aSparseNames[Succ(i * 2)].VAnsiString) - else if aSparseNames[Succ(i * 2)].VType = vtChar then - snName := aSparseNames[Succ(i * 2)].VChar - else if aSparseNames[Succ(i * 2)].VType = vtUnicodeString then - snName := UnicodeString(aSparseNames[Succ(i * 2)].VUnicodeString) - else if aSparseNames[Succ(i * 2)].VType = vtWideChar then - snName := aSparseNames[Succ(i * 2)].VWideChar; - - if snName <> '' then - if wbShowFlagEnumValue then - EditInfo.Add(snName + ' (' + IntToStr(snIndex) + ')') - else - EditInfo.Add(snName); - end; - end; - EditInfo.Sort; - enEditInfo := EditInfo.CommaText; - finally - FreeAndNil(EditInfo); - end; - - SetLength(enSparseNamesMap, Length(enSparseNames)); - for i := Low(enSparseNames) to High(enSparseNames) do - enSparseNamesMap[i] := @enSparseNames[i]; - if Length(enSparseNames) > 0 then - wbMergeSort(@enSparseNamesMap[0], Length(enSparseNames), CompareSparseName); - - inherited Create(cpNormal, False, nil); -end; - -function CmpB8(a, b: Byte): Integer; -asm -{$IFDEF WIN32} - xor ecx, ecx - cmp al, dl - ja @@GT - je @@EQ -@@LT: - dec ecx - dec ecx -@@GT: - inc ecx -@@EQ: - mov eax, ecx -{$ENDIF WIN32} -{$IFDEF WIN64} - xor eax, eax - cmp ecx, edx - ja @@GT - je @@EQ -@@LT: - dec eax - dec eax -@@GT: - inc eax -@@EQ: -{$ENDIF WIN64} -end; - -function CmpI32(a, b : Integer) : Integer; -asm -{$IFDEF WIN32} - xor ecx, ecx - cmp eax, edx - jg @@GT - je @@EQ -@@LT: - dec ecx - dec ecx -@@GT: - inc ecx -@@EQ: - mov eax, ecx -{$ENDIF WIN32} -{$IFDEF WIN64} - xor eax, eax - cmp ecx, edx - jg @@GT - je @@EQ -@@LT: - dec eax - dec eax -@@GT: - inc eax -@@EQ: -{$ENDIF WIN64} -end; - -function CmpW32(a, b: Cardinal): Integer; -asm -{$IFDEF WIN32} - xor ecx, ecx - cmp eax, edx - ja @@GT - je @@EQ -@@LT: - dec ecx - dec ecx -@@GT: - inc ecx -@@EQ: - mov eax, ecx -{$ENDIF WIN32} -{$IFDEF WIN64} - xor eax, eax - cmp ecx, edx - ja @@GT - je @@EQ -@@LT: - dec eax - dec eax -@@GT: - inc eax -@@EQ: -{$ENDIF WIN64} -end; - -function CmpI64(const a, b : Int64) : Integer; -//begin -// if a = b then -// Result := nxEqual -// else if a < b then -// Result := nxSmallerThan -// else -// Result := nxGreaterThan; -//end; -asm -{$IFDEF WIN32} - xor eax, eax - mov edx, [ebp+20] - cmp edx, [ebp+12] - jg @@GT - jl @@LT - mov edx, [ebp+16] - cmp edx, [ebp+8] - ja @@GT - je @@EQ -@@LT: - dec eax - dec eax -@@GT: - inc eax -@@EQ: -{$ENDIF WIN32} -{$IFDEF WIN64} - xor rax, rax - cmp rcx, rdx - jg @@GT - je @@EQ -@@LT: - dec rax - dec rax -@@GT: - inc rax -@@EQ: -{$ENDIF WIN64} -end; - -function TwbEnumDef.FindSparseName(aSearchIndex: Int64; var Index: Integer): Boolean; -var - L, H, I, C: Integer; -begin - Result := False; - - L := Low(enSparseNamesMap); - H := High(enSparseNamesMap); - while L <= H do begin - I := (L + H) shr 1; - C := CmpI64(enSparseNamesMap[I].snIndex, aSearchIndex); - if C < 0 then - L := I + 1 - else begin - H := I - 1; - if C = 0 then begin - Result := True; - L := I; - end; - end; - end; - Index := L; -end; - -function TwbEnumDef.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -var - i, j: Integer; - Value: string; -begin - if aValue = '' then - Result := 0 - else begin - Value := aValue; - if wbShowFlagEnumValue and (Value[Length(Value)] = ')') then begin - // remove an integer value of enum from enum string value - i := LastDelimiter('(', Value); - if (i > 0) and TryStrToInt(Copy(Value, Succ(i), Length(Value) - Succ(i)), j) then - Delete(Value, Pred(i), Length(Value)); - end; - for i := Low(enNames) to High(enNames) do - if SameStr(enNames[i], Value) then begin - Result := i; - Exit; - end; - for i := Low(enSparseNames) to High(enSparseNames) do with enSparseNames[i] do - if SameStr(snName, Value) then begin - Result := snIndex; - Exit; - end; - Result := StrToInt64(Value); - end; -end; - -function TwbEnumDef.GetDefTypeName: string; -var - i: Integer; -begin - if Length(enNames)=0 then - inherited - else begin - Result := '('+enNames[Low(enNames)]; - for i := 1 to High(enNames) do - Result := Result+','+enNames[i]; - Result := Result+')' - end; -end; - -function TwbEnumDef.GetEditInfo(aInt: Int64; const aElement: IwbElement): string; -begin - Result := enEditInfo; -end; - -function TwbEnumDef.GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; -begin - Result := etComboBox; -end; - -function TwbEnumDef.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbEnumDef.GetName(aIndex: Integer): string; -begin - Result := enNames[aIndex]; -end; - -function TwbEnumDef.GetNameCount: Integer; -begin - Result := Length(enNames); -end; - -procedure TwbEnumDef.Report(const aParents: TwbDefPath); -var - i, j: Integer; - sl: TStringList; -begin - if defReported then - Exit; - - inherited; - if wbReportMode and wbReportUnknownEnums and Assigned(UnknownEnums) then begin - WriteLn('Unknown Enums in: ', wbDefsToPath(aParents), wbDefToName(Self)); - for i := 0 to Pred(UnknownEnums.Count) do begin - sl := UnknownEnums.Objects[i] as TStringList; - WriteLn(' ', UnknownEnums[i], ' (',sl.Count,')' ); - for j := 0 to Pred(sl.Count) do - WriteLn(' ', sl[j], ' (',Integer(sl.Objects[j]),')' ); - end; - end; - - defReported := True; -end; - -function TwbEnumDef.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -var - i: Integer; -begin - Result := ''; - - if (aInt >= Low(enNames)) and (aInt <= High(enNames)) then begin - Result := enNames[aInt]; - if wbShowFlagEnumValue then - Result := Result + ' (' + IntToStr(aInt) + ')'; - end; - - if Result = '' then - if FindSparseName(aInt, i) then begin - Result := enSparseNamesMap[i].snName; - if wbShowFlagEnumValue then - Result := Result + ' (' + IntToStr(enSparseNamesMap[i].snIndex) + ')'; - end; - - if Result = '' then begin - Result := IntToStr(aInt); - if wbShowFlagEnumValue then - Result := Result + ' (' + IntToStr(aInt) + ')'; - end; -end; - -function TwbEnumDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ''; {handled by IntegerDef} -end; - -function TwbEnumDef.ToString(aInt: Int64; const aElement: IwbElement): string; -var - s: string; - i: Integer; -begin - Result := ''; - - if (aInt >= Low(enNames)) and (aInt <= High(enNames)) then begin - Result := enNames[aInt]; - if wbShowFlagEnumValue and (Result <> '') then - Result := Result + ' (' + IntToStr(aInt) + ')'; - end; - - if Result = '' then begin - if FindSparseName(aInt, i) then begin - Result := enSparseNamesMap[i].snName; - if wbShowFlagEnumValue then - Result := Result + ' (' + IntToStr(enSparseNamesMap[i].snIndex) + ')'; - end - else begin - Result := ''; - if wbReportMode and wbReportUnknownEnums then begin - if not Assigned(UnknownEnums) then - UnknownEnums := TwbFastStringListIC.CreateSorted; - if not UnknownEnums.Find(Result, i) then - i := UnknownEnums.AddObject(Result, TwbFastStringListIC.CreateSorted); - with UnknownEnums.Objects[i] as TStringList do begin - if Count < 10 then begin - s := aElement.FullPath; - if not Find(s, i) then - i := Add(s); - Objects[i] := TObject(Succ(Integer(Objects[i]))); - end; - end; - end; - end; - end; - Used(aElement, Result); -end; - -{ TwbStringDef } - -function TwbStringDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - StringDef: IwbStringDef; -begin - Result := Supports(aDef, IwbStringDef, StringDef) and - ((sdSize = 0) or (StringDef.StringSize = 0) or (sdSize <= StringDef.StringSize)); -end; - -function TwbStringDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbStringDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbStringDef do - Self.Create(defPriority, defRequired, noName, sdSize, noAfterLoad, noAfterSet, noDontShow, defGetCP, noTerminator).defSource := aSource; -end; - -constructor TwbStringDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aSize : Integer; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean; - aForward : boolean); -begin - sdSize := aSize; - sdForward := aForward; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -procedure TwbStringDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -begin - FromStringTransform(aBasePtr, aEndPtr, aElement, aValue, ttFromEditValue); -end; - -procedure TwbStringDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -begin - FromStringTransform(aBasePtr, aEndPtr, aElement, aValue, ttFromNativeValue); -end; - -procedure TwbStringDef.FromStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: AnsiString); -var - NewSize : Integer; -begin - if sdSize > 0 then - NewSize := sdSize - else - NewSize := Succ(Length(aValue)); - - aElement.RequestStorageChange(aBasePtr, aEndPtr, NewSize + Ord(noTerminator)); - - if sdSize > 0 then begin - FillChar(aBasePtr^, sdSize, 0); - NewSize := Length(aValue); - if NewSize > 0 then - Move(aValue[1], aBasePtr^, NewSize); - end else begin - if NewSize > 1 then - Move(aValue[1], aBasePtr^, Length(aValue)); - - PAnsiChar(aBasePtr)[Pred(NewSize)] := #0; - end; - if noTerminator then - PAnsiChar(aBasePtr)[NewSize] := AnsiChar(wbTerminator); -end; - -procedure TwbStringDef.FromStringTransform(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string; aTransformType: TwbStringTransformType); -begin - FromStringNative(aBasePtr, aEndPtr, aElement, TransformString(wbStringToAnsi(aValue, aElement), aTransformType, aElement)); -end; - -function TwbStringDef.GetDefType: TwbDefType; -begin - Result := dtString; -end; - -function TwbStringDef.GetDefTypeName: string; -begin - Result := 'Terminated String'; -end; - -function TwbStringDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbStringDef.GetIsVariableSizeInternal: Boolean; -begin - Result := sdSize = 0; -end; - -function TwbStringDef.GetStringSize: Integer; -begin - Result := sdSize; -end; - -function TwbStringDef.SetToDefault(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): Boolean; -begin - Result := not Assigned(aBasePtr) or (ToString(aBasePtr, aEndPtr, aElement) <> ''); - if Result then - FromEditValue(aBasePtr, aEndPtr, aElement, ''); -end; - -function TwbStringDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if sdSize > 0 then - Result := sdSize + Ord(noTerminator) - else begin - if aBasePtr = nil then - Result := 1 + Ord(noTerminator) - else begin - Result := Ord(noTerminator); - while Cardinal(aBasePtr) < Cardinal(aEndPtr) do begin - Inc(Result); - if PAnsiChar(aBasePtr)^ = #0 then - Exit; - - Inc(PByte(aBasePtr)); - end; - end; - end; -end; - -function TwbStringDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if sdSize > 0 then - Result := sdSize + Ord(noTerminator) - else - Result := 1 + Ord(noTerminator); -end; - -function TwbStringDef.ToEditValue(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): string; -begin - Result := ToStringTransform(aBasePtr, aEndPtr, aElement, ttToEditValue); -end; - -function TwbStringDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -begin - Result := ToStringTransform(aBasePtr, aEndPtr, aElement, ttToNativeValue); -end; - -function TwbStringDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -begin - Result := UpperCase(ToStringTransform(aBasePtr, aEndPtr, aElement, ttToSortKey)); -end; - -function TwbStringDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := ToStringTransform(aBasePtr, aEndPtr, aElement, ttToString); -end; - -function TwbStringDef.ToStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): AnsiString; -var - aLen, Len : Cardinal; -begin - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if sdSize > 0 then begin - if Len > Cardinal(sdSize) then - Len := sdSize; - end; - - if sdForward then begin - aLen := 0; - while aLen < Len do begin - if PAnsiChar(aBasePtr)[aLen] = #0 then - Break; - Inc(aLen); - end; - Len := aLen; - //if aLen < Len then - // Len := Succ(aLen); - end else - while (Len > 0) and (PAnsiChar(aBasePtr)[Pred(Len)] = #0) do - Dec(Len); - - SetLength(Result, Len); - if Len > 0 then - Move(aBasePtr^, Result[1], Len); - Used(aElement, Result); -end; - -function TwbStringDef.ToStringTransform(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aTransformType: TwbStringTransformType): string; -begin - Result := wbAnsiToString(TransformString(ToStringNative(aBasePtr, aEndPtr, aElement), aTransformType, aElement), aElement); -end; - -function TwbStringDef.TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; -begin - Result := s; -end; - -{ TwbFloatDef } - -const - SingleNaN : Single = 0.0/0.0; - DoubleNaN : Double = 0.0/0.0; - SingleInf : Single = 1.0/0.0; - DoubleInf : Double = 1.0/0.0; - -function TwbFloatDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - FloatDef: IwbFloatDef; -begin - Result := Supports(aDef, IwbFloatDef, FloatDef); -end; - -function TwbFloatDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbFloatDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbFloatDef do - Self.Create(defPriority, defRequired, noName, noAfterLoad, noAfterSet, fdScale, fdDigits, noDontShow, - fdNormalizer, fdDefault, defGetCP, fdDouble, noTerminator).defSource := aSource; -end; - -constructor TwbFloatDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aScale : Extended; - aDigits : Integer; - aDontShow : TwbDontShowCallback; - aNormalizer : TwbFloatNormalizer; - aDefault : Extended; - aGetCP : TwbGetConflictPriority; - aDouble : Boolean; - aTerminator : Boolean); -begin - fdDefault := aDefault; - fdScale := aScale; - fdDigits := aDigits; - fdNormalizer := aNormalizer; - fdDouble := aDouble; - if fdDigits < 0 then - fdDigits := wbFloatDigits; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -procedure TwbFloatDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -var - Value: Extended; -begin - aElement.RequestStorageChange(aBasePtr, aEndPtr, 4); - if aValue = '' then begin - if fdDouble then - PDouble(aBasePtr)^ := 0.0 - else - PSingle(aBasePtr)^ := 0.0; - end else if SameText(aValue, 'NaN') then begin - if fdDouble then - PDouble(aBasePtr)^ := DoubleNaN - else - PSingle(aBasePtr)^ := SingleNaN; - end else if SameText(aValue, 'Inf') then begin - if fdDouble then - PDouble(aBasePtr)^ := DoubleInf - else - PSingle(aBasePtr)^ := SingleInf; - end else if SameText(aValue, 'Default') or SameText(aValue, 'Max') then begin - if fdDouble then - PInt64(aBasePtr)^ := $7FEFFFFFFFFFFFFF - else - PCardinal(aBasePtr)^ := $7F7FFFFF; - end else if SameText(aValue, 'Min') then begin - if fdDouble then - PInt64(aBasePtr)^ := -$10000000000001 // $FFEFFFFFFFFFFFFF - else - PCardinal(aBasePtr)^ := $FF7FFFFF; - end else begin - Value := RoundToEx(StrToFloat(aValue), -fdDigits); - Value := Value / fdScale; - if Assigned(fdNormalizer) then - Value := fdNormalizer(aElement, Value); - if fdDouble then - PDouble(aBasePtr)^ := Value - else - PSingle(aBasePtr)^ := Value; - end; -end; - -procedure TwbFloatDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -var - Clear : Boolean; - Value : Extended; - Size : Integer; -begin - Clear := VarIsClear(aValue); - if not Clear then - Value := aValue - else - Value := 0; - - if fdDouble then - Size := SizeOf(Double)+Ord(noTerminator) - else - Size := SizeOf(Single)+Ord(noTerminator); - aElement.RequestStorageChange(aBasePtr, aEndPtr, Size); - if Assigned(aBasePtr) then begin - if Clear then begin - if fdDouble then - PDouble(aBasePtr)^ := DoubleNaN - else - PSingle(aBasePtr)^ := SingleNaN; - end else if fdDouble and (SameValue(Value, MaxDouble) or (Value > MaxDouble)) then - PInt64(aBasePtr)^ := $7FEFFFFFFFFFFFFF - else if fdDouble and (SameValue(Value, -MaxDouble) or (Value < -MaxDouble)) then - PInt64(aBasePtr)^ := -$10000000000001 // $FFEFFFFFFFFFFFFF - else if not fdDouble and (SameValue(Value, MaxSingle) or (Value > MaxSingle)) then - PCardinal(aBasePtr)^ := $7F7FFFFF - else if not fdDouble and (SameValue(Value, -MaxSingle) or (Value < -MaxSingle)) then - PCardinal(aBasePtr)^ := $FF7FFFFF - else begin - Value := RoundToEx(Value, -fdDigits); - Value := Value / fdScale; - if Assigned(fdNormalizer) then - Value := fdNormalizer(aElement, Value); - if fdDouble then - PDouble(aBasePtr)^ := Value - else - PSingle(aBasePtr)^ := Value; - end; - if noTerminator then - PByte(aBasePtr)[SizeOf(Single)] := wbTerminator; - end; -end; - -function TwbFloatDef.GetDefType: TwbDefType; -begin - Result := dtFloat; -end; - -function TwbFloatDef.GetDefTypeName: string; -begin - Result := 'Float'; -end; - -function TwbFloatDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbFloatDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aBasePtr) >= Cardinal(aEndPtr)) then - Result := Ord(noTerminator) - else - Result := GetDefaultSize(aBasePtr, aEndPtr, aElement) -end; - -function TwbFloatDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if fdDouble then - Result := SizeOf(Double) + Ord(noTerminator) - else - Result := SizeOf(Single) + Ord(noTerminator); -end; - -function TwbFloatDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -var - Value: Extended; -begin - Value := ToNativeValue(aBasePtr, aEndPtr, aElement); - if fdDouble then - Result := not Assigned(aBasePtr) or not SameValue(Value, fdDefault) - else - Result := not Assigned(aBasePtr) or not SingleSameValue(Value, fdDefault); - if Result then - FromNativeValue(aBasePtr, aEndPtr, aElement, fdDefault); -end; - -function TwbFloatDef.ToValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Extended; -var - Len : Cardinal; - Value : Extended; -begin - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetDefaultSize(aBasePtr, aEndPtr, aElement) then - Result := NaN - else if fdDouble then try - if PInt64(aBasePtr)^ = $7FEFFFFFFFFFFFFF then - Result := maxDouble - else if PInt64(aBasePtr)^ = $FFEFFFFFFFFFFFFF then - Result := -maxDouble - else begin - Value := PDouble(aBasePtr)^; - if IsInfinite(Value) or IsNan(Value) then - Result := Value - else begin - try - if Value <> 0.0 then - if SameValue(Value, 0.0) then - Value := 0.0; - except - Value := 0.0; - end; - - if Assigned(fdNormalizer) then - Value := fdNormalizer(aElement, Value); - Value := Value * fdScale; - Result := RoundToEx(Value, -fdDigits); - end; - end; - except - Result := NaN; - end else try - if PCardinal(aBasePtr)^ = $7F7FFFFF then - Result := maxSingle - else if PCardinal(aBasePtr)^ = $FF7FFFFF then - Result := -maxSingle - else begin - Value := PSingle(aBasePtr)^; - if IsInfinite(Value) or IsNan(Value) then - Result := Value - else begin - try - if Value <> 0.0 then - if SingleSameValue(Value, 0.0) then - Value := 0.0; - except - Value := 0.0; - end; - - if Assigned(fdNormalizer) then - Value := fdNormalizer(aElement, Value); - Value := Value * fdScale; - Result := RoundToEx(Value, -fdDigits); - end; - end; - except - Result := NaN; - end; -end; - -function TwbFloatDef.ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Value : Extended; -begin - Value := ToValue(aBasePtr, aEndPtr, aElement); - if IsNaN(Value) then - Result := 'NaN' - else if IsInfinite(Value) then - Result := 'Inf' - else if (Value = maxDouble) or (Value = maxSingle) then - Result := 'Default' // 'Max' ?? - else if (Value = -maxDouble) or (Value = -maxSingle) then - Result := 'Min' - else - Result := FloatToStrF(Value, ffFixed, 99, fdDigits); -end; - -function TwbFloatDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -var - Value: Extended; -begin - Value := ToValue(aBasePtr, aEndPtr, aElement); - if IsNaN(Value) then - VarClear(Result) - else if Value = maxDouble then - Result := maxDouble - else if Value = maxSingle then - Result := maxSingle - else - Result := Value; -end; - -function TwbFloatDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -var - Value : Extended; - g : Extended; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Value := ToValue(aBasePtr, aEndPtr, aElement); - if IsNaN(Value) then - Result := StringOfChar(' ', 23) - else if (Value = maxDouble) or (Value = maxSingle) then - Result := '+' + StringOfChar('9', 22) - else begin - g := Abs(Value); - Result := FloatToStrF(g, ffFixed, 99, fdDigits); - - if Length(Result) < 22 then - Result := StringOfChar('0', 22 - Length(Result)) + Result; - Result := PlusMinus[(Value < 0) and not IsZero(Value, 0.0000009999999999)] + Result; - end; -end; - -function TwbFloatDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Len : Cardinal; - Value : Extended; -begin - Result := ''; - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetDefaultSize(aBasePtr, aEndPtr, aElement) then begin - if wbCheckExpectedBytes then - Result := Format('', [GetDefaultSize(aBasePtr, aEndPtr, aElement), Len]) - end else begin - Value := ToValue(aBasePtr, aEndPtr, aElement); - if IsNan(Value) then - Result := 'NaN' - else if IsInfinite(Value) then - Result := 'Inf' - else if (Value=maxDouble) or (Value=maxSingle) then - Result := 'Default' // 'Max' ?? - else if (Value=-maxDouble) or (Value=-maxSingle) then - Result := 'Min' - else - Result := FloatToStrF(Value, ffFixed, 99, fdDigits); - if Len > GetDefaultSize(aBasePtr, aEndPtr, aElement) then - if wbCheckExpectedBytes then - Result := Format(' ', [GetDefaultSize(aBasePtr, aEndPtr, aElement), Len]); - end; - Used(aElement, Result); -end; - -{ TwbChar4 } - -procedure TwbChar4.BuildRef(aInt: Int64; const aElement: IwbElement); -var - U32: Cardinal; - _File: IwbFile; - Rec: IwbMainRecord; -begin - U32 := aInt; - - _File := aElement._File; - if Assigned(_File) then begin - Rec := _File.RecordByEditorID[PwbSignature(@U32)^]; - if Assigned(Rec) then - aElement.AddReferencedFromID(Rec.LoadOrderFormID); // should always be 00, these are only defined in Oblivion.esm - end; -end; - -function TwbChar4.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := Supports(aDef, IwbChar4); -end; - -function TwbChar4.CanContainFormIDs: Boolean; -begin - Result := True; -end; - -constructor TwbChar4.Clone(const aSource: TwbDef); -begin - with aSource as TwbChar4 do - Self.Create(defPriority, defRequired, defGetCP).defSource := aSource; -end; - -function TwbChar4.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -const - Empty : TwbSignature = ' '; -var - s : AnsiString; -begin - if aValue = '' then - Result := Cardinal(Empty) - else begin - s := AnsiString(aValue); - if Length(s) <> 4 then - raise Exception.Create('The value must be exactly 4 characters'); - - Result := PCardinal(@s[1])^; - end; -end; - -function TwbChar4.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbChar4.GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; -var - U32: Cardinal; - _File: IwbFile; -begin - Result := nil; - U32 := aInt; - _File := aElement._File; - if Assigned(_File) then - Result := _File.RecordByEditorID[PwbSignature(@U32)^]; -end; - -function TwbChar4.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ToSortKey(aInt, aElement); -end; - -function TwbChar4.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -var - U32: Cardinal; -begin - U32 := aInt; - Result := PwbSignature(@U32)^; -end; - -function TwbChar4.ToString(aInt: Int64; const aElement: IwbElement): string; -var - U32: Cardinal; - _File: IwbFile; - Rec: IwbRecord; -begin - U32 := aInt; - Result := PwbSignature(@U32)^; - - _File := aElement._File; - if Assigned(_File) then begin - Rec := _File.RecordByEditorID[Result]; - if Assigned(Rec) then begin - Result := Rec.Name; - Used(aElement, Result); - Exit; - end; - end; - - if U32 <> 0 then - Result := Result + ' '; - Used(aElement, Result); -end; - -{ TwbStr4 } - -function TwbStr4.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := Supports(aDef, IwbStr4); -end; - -function TwbStr4.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbStr4.Clone(const aSource: TwbDef); -begin - with aSource as TwbStr4 do - Self.Create(defPriority, defRequired, defGetCP).defSource := aSource; -end; - -function TwbStr4.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -const - Empty : TwbSignature = ' '; -var - s : AnsiString; - Temp : AnsiString; - i : Integer; -begin - if aValue = '' then - Result := Cardinal(Empty) - else begin - s := AnsiString(aValue); - if Length(s) <> 4 then - raise Exception.Create('The value must be exactly 4 characters'); - Temp := s; - for i := 1 to 4 do s[i] := Temp[5-i]; - - Result := PCardinal(@s[1])^; - end; -end; - -function TwbStr4.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbStr4.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ToSortKey(aInt, aElement); -end; - -function TwbStr4.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := wbStr4ToString(aInt); -end; - -function TwbStr4.ToString(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ToSortKey(aInt, aElement); - Used(aElement, Result); -end; - -{ TwbFormID } - -procedure TwbFormID.BuildRef(aInt: Int64; const aElement: IwbElement); -begin - if ((aInt < $800) or (aInt = $FFFFFFFF)) and IsValid('ACVA') then - Exit; - - if (aInt <> 0) and (aInt <> $14) then - aElement.AddReferencedFromID(aInt); -end; - -function TwbFormID.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := Supports(aDef, IwbFormID); -end; - -function TwbFormID.CanContainFormIDs: Boolean; -begin - Result := True; -end; - -function TwbFormID.Check(aInt: Int64; - const aElement: IwbElement): string; -var - _File: IwbFile; - MainRecord: IwbMainRecord; -begin - Result := ''; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - try - MainRecord := _File.RecordByFormID[aInt, True]; - if Assigned(MainRecord) then - Exit; - except - on E: Exception do begin - Result := E.Message; - Exit; - end; - end; - end; - end; - - if aInt > $800 then - Result := '['+IntToHex64(aInt,8)+'] < Error: Could not be resolved >'; -end; - -function TwbFormID.CheckFlst(const aMainRecord: IwbMainRecord): Boolean; -begin - Result := True; -end; - -constructor TwbFormID.Clone(const aSource: TwbDef); -begin - with aSource as TwbFormID do - Self.Create(defPriority, defRequired, defGetCP).defSource := aSource; -end; - -function TwbFormID.CompareExchangeFormID(var aInt: Int64; aOldFormID: Cardinal; aNewFormID: Cardinal; const aElement: IwbElement): Boolean; -var - _File : IwbFile; - - FormID : Cardinal; - FileID : Integer; - NewFileID : Integer; - i : Integer; -begin - Result := False; - - if {(aInt < $800) or} (aInt = $FFFFFFFF) and IsValid('ACVA') then // Allows source to be reserverd as this does NOT change the record itself - Exit; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - FormID := aInt; - FileID := FormID shr 24; - - if FileID >= _File.MasterCount then - FileID := _File.LoadOrder - else - FileID := _File.Masters[FileID].LoadOrder; - - if FileID < 0 then - raise Exception.Create('Could not determine load order FormID for old value'); - - FormID := (FormID and $00FFFFFF) or (Cardinal(FileID) shl 24); - if FormID = aOldFormID then begin - FileID := aNewFormID shr 24; - NewFileID := -1; - if FileID = _File.LoadOrder then - NewFileID := _File.MasterCount - else - for i := 0 to Pred(_File.MasterCount) do - if _File.Masters[i].LoadOrder = FileID then begin - NewFileID := i; - break; - end; - if NewFileID < 0 then - raise Exception.Create('FormID ['+IntToHex64(aNewFormID, 8)+'] references a master which is not available in file ' + _File.Name); - - FormID := (aNewFormID and $00FFFFFF) or (Cardinal(NewFileID) shl 24); - if aInt <> FormID then begin - aInt := FormID; - Result := True; - end; - end; - end; - end; -end; - -function TwbFormID.FindRecordForAVCode(aInt: Int64; const aElement: IwbElement): IwbMainRecord; -var - CheckedFiles : TList; - MaxLoadOrder : Integer; - - function CheckFile(aFile: IwbFile): IwbMainRecord; - var - Group : IwbContainerElementRef; - i : Integer; - AV : Variant; - begin - if CheckedFiles.IndexOf(Pointer(aFile)) >= 0 then - Exit(nil); - CheckedFiles.Add(Pointer(aFile)); - - if Supports(aFile.GroupBySignature['MISC'], IwbContainerElementRef, Group) then begin - for i := 0 to Pred(Group.ElementCount) do - if Supports(Group.Elements[i], IwbMainRecord, Result) then begin - Result := Result.HighestOverrideOrSelf[MaxLoadOrder]; - if (Result.Flags._Flags and $000000C0) = $000000C0 then begin - AV := Result.ElementNativeValues['DATA\Actor Value']; - if not (VarIsNull(AV) or VarIsEmpty(AV)) then begin - if AV = aInt then - Exit; - end; - end; - end; - end; - Result := nil; - for i := Pred(aFile.MasterCount) downto 0 do begin - Result := CheckFile(aFile.Masters[i]); - if Assigned(Result) then - Exit; - end; - end; - -var - _File : IwbFile; -begin - Result := nil; - - if not Assigned(aElement) then - Exit; - - _File := aElement._File; - if not Assigned(_File) then - Exit; - - if aInt < $800 then begin - CheckedFiles := TList.Create; - try - MaxLoadOrder := _File.LoadOrder; - Result := CheckFile(_File); - finally - CheckedFiles.Free; - end; - end else try - Result := _File.RecordByFormID[aInt, True]; - except end; -end; - -procedure TwbFormID.FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); -var - OldValue : Cardinal; - FileID : Integer; -begin - if (aInt < $800) or (aInt = $FFFFFFFF) and IsValid('ACVA') then - Exit; - - OldValue := aInt; - if OldValue <> 0 then begin - FileID := OldValue shr 24; - aMasters[FileID] := True; - end; -end; - -function TwbFormID.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -var - _File : IwbFile; - - FormID : Cardinal; - FileID : Integer; - NewFileID : Integer; - i : Integer; - s, t : string; -begin - s := ''; - t := aValue; - i := Pos('[', t); - while i > 0 do begin - Delete(t, 1, i); - i := Pos(']', t); - if i > 0 then begin - s := Copy(t, 1, Pred(i)); - Delete(t, 1, i); - if (Length(s) = 13) and (s[5] = ':') then - Delete(s, 1, 5); - end; - - try - StrToInt64('$' + s); - if Length(s) = 8 then - i := 0 - else - i := Pos('[', t); - except - i := Pos('[', t); - end; - end; - - if Length(s) = 8 then - Result := StrToInt64('$' + s) - else begin - if IsValid('ACVA') and SameText(Trim(aValue), 'None') then begin - Result := $FF; - Exit; - end else - Result := StrToInt64('$' + aValue); - end; - - if not wbDisplayLoadOrderFormID then - Exit; - - if Result < $800 then - Exit; - - if Result = $FFFFFFFF then - Exit; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - FormID := Result; - - FileID := FormID shr 24; - NewFileID := -1; - if FileID = _File.LoadOrder then - NewFileID := _File.MasterCount - else - for i := 0 to Pred(_File.MasterCount) do - if _File.Masters[i].LoadOrder = FileID then begin - NewFileID := i; - break; - end; - - if NewFileID < 0 then - raise Exception.Create('FormID ['+IntToHex64(FormID, 8)+'] references a master which is not available in file ' + _File.Name); - - FormID := (FormID and $00FFFFFF) or (Cardinal(NewFileID) shl 24); - Result := FormID; - end; - end; -end; - -function TwbFormID.GetEditInfo(aInt: Int64; const aElement: IwbElement): string; -var - ACVAIsValid : Boolean; - Strings : TStringList; - CheckAll : Boolean; - Wait : IwbWaitForm; - FilesProg : IwbProgress; - - procedure Process(const aFile: IwbFile); - var - i, j : Integer; - s : string; - MainRecord : IwbMainRecord; - GroupRecord : IwbGroupRecord; - GroupsProg : IwbProgress; - RecordsProg : IwbProgress; - begin - if CheckAll then begin - for i := 0 to Pred(aFile.RecordCount) do begin - MainRecord := aFile.Records[i]; - if IsValid(MainRecord.Signature) and IsValidMainRecord(MainRecord) then begin - if MainRecord.CanHaveEditorID and (MainRecord.EditorID = '') then - Continue; - - s := Trim(MainRecord.Name); - if s <> '' then begin - if s[1] = '<' then - Delete(s, 1, 1); - - if CheckFlst(MainRecord) then - Strings.Add(s); - - if not Assigned(RecordsProg) then - RecordsProg := Wait.CreateProgress('Records', s, Pred(aFile.RecordCount) ) - else - RecordsProg.UpdateStatus(i, s); - end; - end; - - if Wait.IsCanceled then - Exit; - end; - end else - for i := 0 to Pred(aFile.ElementCount) do begin - - if not Assigned(GroupsProg) then - GroupsProg := Wait.CreateProgress('Groups', aFile.Elements[i].Name, Pred(aFile.ElementCount) ) - else - GroupsProg.UpdateStatus(i, aFile.Elements[i].Name); - - if Supports(aFile.Elements[i], IwbGroupRecord, GroupRecord) then - if GroupRecord.GroupType = 0 then - if IsValid(TwbSignature(GroupRecord.GroupLabel)) then - for j := 0 to Pred(GroupRecord.ElementCount) do begin - - if Supports(GroupRecord.Elements[j], IwbMainRecord, MainRecord) then begin - if IsValid(MainRecord.Signature) and IsValidMainRecord(MainRecord) then begin - if MainRecord.CanHaveEditorID and (MainRecord.EditorID = '') then - Continue; - - s := Trim(MainRecord.Name); - if s <> '' then begin - if s[1] = '<' then - Delete(s, 1, 1); - - if CheckFlst(MainRecord) then - Strings.Add(s); - - if not Assigned(RecordsProg) then - RecordsProg := Wait.CreateProgress('Records', s, Pred(GroupRecord.ElementCount) ) - else - RecordsProg.UpdateStatus(j, s); - - end; - end; - end; - - if Wait.IsCanceled then - Exit; - end; - - if Wait.IsCanceled then - Exit; - end; - end; - -var - _File : IwbFile; - i : Integer; - s : string; -begin - Result := ''; - if not wbDisplayLoadOrderFormID then - Exit; - - ACVAIsValid := IsValid('ACVA'); - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - Strings := TwbFastStringListIC.Create; - try - CheckAll := - IsValid('CELL') or - IsValid('LAND') or - IsValid('ROAD') or - IsValid('REFR') or - IsValid('ACHR') or - IsValid('ACRE') or - IsValid('PGRE') or - IsValid('PGRD') or - IsValid('PARW') or {>>> Skyrim <<<} - IsValid('PBAR') or {>>> Skyrim <<<} - IsValid('PBEA') or {>>> Skyrim <<<} - IsValid('PFLA') or {>>> Skyrim <<<} - IsValid('PCON') or {>>> Skyrim <<<} - IsValid('PHZD') or {>>> Skyrim <<<} - IsValid('NAVM') or - IsValid('INFO'); - - Wait := wbCreateWaitForm('Building DropDownList', 'The DropDown list is being built. Please Wait...', True, 2000, 500); - - FilesProg := Wait.CreateProgress('Files', _File.Name, _File.MasterCount); - Process(_File); - for i := Pred(_File.MasterCount) downto 0 do if not Wait.IsCanceled then begin - FilesProg.UpdateStatus( _File.MasterCount - i, _File.Masters[i].Name ); - Process(_File.Masters[i]); - end; - - Wait := nil; - FilesProg := nil; - - if ACVAIsValid then begin - for i := 0 to Pred(wbActorValueEnum.NameCount) do - Strings.Add(wbActorValueEnum.Names[i] + ' [ACVA:' + IntToHex64(i, 8) + ']'); - Strings.Add(' None [ACVA:000000FF]'); - Strings.Add(' Invalid [ACVA:00000048]'); - end else begin - if IsValid('NULL') then - Strings.Add('NULL - Null Reference [00000000]'); - if IsValid('FFFF') then - Strings.Add('FFFF - None Reference [FFFFFFFF]'); - if IsValid('TRGT') then - Strings.Add('TARGET - Target Reference [00000000]'); - if IsValid('PLYR') then - Strings.Add('Player [00000014]'); - end; - - Strings.Sort; - s := ''; - for i := Pred(Strings.Count) downto 0 do - if Strings[i] <> s then - s := Strings[i] - else - Strings.Delete(i); - - Result := Strings.CommaText; - finally - FreeAndNil(Strings); - end; - end; - end; -end; - -function TwbFormID.GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; -begin - Result := etComboBox; -end; - -function TwbFormID.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbFormID.GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; -var - _File : IwbFile; -begin - Result := nil; - - if aInt = 0 then - Exit; - if aInt = $14 then - Exit; - if (aInt = $FFFFFFFF) and IsValid('FFFF') then - Exit; - - if (aInt < $800) and IsValid('ACVA') then - Exit; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then try - Result := _File.RecordByFormID[aInt, True]; - except end; - end; -end; - -function TwbFormID.GetMainRecord(aInt: Int64; const aElement: IwbElement): IwbMainRecord; -var - _File: IwbFile; -begin - Result := nil; - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then - Result := _File.RecordByFormID[aInt, True]; - end; -end; - -function TwbFormID.IsValid(const aSignature: TwbSignature): Boolean; -begin - Result := aSignature <> 'ACVA'; -end; - -function TwbFormID.IsValidFlst(const aSignature: TwbSignature): Boolean; -begin - Result := True; -end; - -function TwbFormID.IsValidMainRecord(const aMainRecord: IwbMainRecord): Boolean; -begin - Result := True; -end; - -function TwbFormID.MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; -var - OldValue : Cardinal; - NewValue : Cardinal; - FileID : Cardinal; -begin - OldValue := aInt; - NewValue := OldValue; - - if (aInt < $800) or (aInt = $FFFFFFFF) and (IsValid('ACVA') or IsValid('FFFF')) then begin - Result := NewValue; - Exit; - end; - - if OldValue <> 0 then begin - FileID := OldValue shr 24; - if FileID >= aOld then begin - FileID := aNew; - NewValue := (OldValue and $00FFFFFF) or (FileID shl 24); - end; - end; - - Result := NewValue; -end; - -function FixupFormID(aFormID: Cardinal; const aOld, aNew: TBytes): Cardinal; -var - FileID : Integer; - i : Integer; -begin - Result := aFormID; - if (Result = 0) or (Result = $14) or (Result = $FFFFFFFF) then - Exit; - FileID := aFormID shr 24; - for i := Low(aOld) to High(aOld) do - if aOld[i] = FileID then begin - Result := (aFormID and $00FFFFFF) or (Cardinal(aNew[i]) shl 24); - Exit; - end; -end; - -function TwbFormID.MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; -var - OldValue : Cardinal; - NewValue : Cardinal; -begin - OldValue := aInt; - NewValue := OldValue; - - if (aInt < $800) or (aInt = $FFFFFFFF) and (IsValid('ACVA') or IsValid('FFFF')) then begin - Result := NewValue; - Exit; - end; - - if OldValue <> 0 then - NewValue := FixupFormID(OldValue, aOld, aNew); - - Result := NewValue; -end; - -procedure TwbFormID.Report(const aParents: TwbDefPath); -var - i: Integer; -begin - if defReported then - Exit; - - inherited; - if wbReportMode then - if wbReportFormIDs then begin - if Assigned(FoundSignatures) then - if ClassType = TwbFormID then begin - WriteLn('Unchecked FormID Formater: ', wbDefsToPath(aParents), wbDefToName(Self)); - WriteLn(' ', FoundSignatures.CommaText); - for i := 0 to Pred(FoundSignatures.Count) do - WriteLn(' ', FoundSignatures.Strings[i], ' (', Integer(FoundSignatures.Objects[i]),')'); - end; - if Assigned(NotResolved) then begin - WriteLn('FormID contains unresolvable values: ', wbDefsToPath(aParents), wbDefToName(Self)); - for i := 0 to Pred(NotResolved.Count) do - WriteLn(' ', NotResolved.Strings[i], ' (', Integer(NotResolved.Objects[i]),')'); - end; - if Assigned(FoundNotAllowedReferences) then begin - WriteLn('FormID contains not allowed references: ', wbDefsToPath(aParents), wbDefToName(Self)); - for i := 0 to Pred(FoundNotAllowedReferences.Count) do - WriteLn(' ', FoundNotAllowedReferences.Strings[i], ' (', Integer(FoundNotAllowedReferences.Objects[i]),')'); - end; - end; - - defReported := True; -end; - -function TwbFormID.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - if wbDisplayLoadOrderFormID then begin - Result := ToString(aInt, aElement);//ToSortKey(aInt, aElement) - if (Length(Result) > 0) and (Result[1] = '<') then - Delete(Result, 1, 1); - end else - Result := IntToHex64(aInt, 8); -end; - -function TwbFormID.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -var - MainRecord: IwbMainRecord; -begin - if (aInt < $800) or (aInt = $FFFFFFFF) then begin - Result := IntToHex64(aInt, 8); - Exit; - end; - - MainRecord := GetMainRecord(aInt, aElement); - if Assigned(MainRecord) then begin - try - Result := IntToHex64(MainRecord.LoadOrderFormID, 8); - Exit; - except - on E: Exception do begin - Result := IntToHex64(aInt, 8); - Exit; - end; - end; - end; - - Result := IntToHex64(aInt, 8); -end; - -function TwbFormID.ToString(aInt: Int64; const aElement: IwbElement): string; -var - _File : IwbFile; - i : Integer; - s : string; - MainRecord : IwbMainRecord; -begin - if ((aInt < $800) or (aInt = $FFFFFFFF)) and IsValid('ACVA') then begin - if (aInt = -1) or (aInt = $FF) or (aInt = $FFFFFFFF) then - Result := ' None [ACVA:000000FF]' - else if aInt = $48 then - Result := ' Invalid [ACVA:00000048]' - else begin - MainRecord := FindRecordForAVCode(aInt, aElement); - if Assigned(MainRecord) then - Result := MainRecord.FullName - else - Result := wbActorValueEnum.ToString(aInt, aElement); - Result := Result + ' [ACVA:' + IntToHex64(aInt,8) + ']'; - end; - Exit; - end; - - if aInt = 0 then begin - if IsValid('TRGT') and not IsValid('NULL') then begin - Result := 'TARGET - Target Reference ['+IntToHex64(aInt,8)+']'; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('TRGT', i) then - i := FoundSignatures.Add('TRGT'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - end else begin - Result := 'NULL - Null Reference ['+IntToHex64(aInt,8)+']'; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('NULL', i) then - i := FoundSignatures.Add('NULL'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - end; - Used(aElement, Result); - Exit; - end else if aInt = $FFFFFFFF then begin - Result := 'FFFF - None Reference ['+IntToHex64(aInt,8)+']'; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('FFFF', i) then - i := FoundSignatures.Add('FFFF'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - Used(aElement, Result); - Exit; - end else if aInt = $14 then begin - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('PLYR', i) then - i := FoundSignatures.Add('PLYR'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - - Result := 'Player ['+IntToHex64(aInt,8)+']'; - Used(aElement, Result); - Exit; - end; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - try - MainRecord := _File.RecordByFormID[aInt, True]; - if Assigned(MainRecord) then begin - Result := MainRecord.Name; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find(MainRecord.Signature, i) then - i := FoundSignatures.Add(MainRecord.Signature); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - - if wbReportFormIDNotAllowedReferences and (ClassType = TwbFormIDChecked) then with TwbFormIDChecked(Self) do begin - if fidcValidRefs.IndexOf(MainRecord.Signature) < 0 then begin - if not Assigned(FoundNotAllowedReferences) then - FoundNotAllowedReferences := TwbFastStringListCS.CreateSorted; - if not FoundNotAllowedReferences.Find(MainRecord.Name, i) then - i := FoundNotAllowedReferences.Add(MainRecord.Name); - FoundNotAllowedReferences.Objects[i] := TObject(Succ(Integer(FoundNotAllowedReferences.Objects[i]))); - end; - end; - - Used(aElement, Result); - Exit; - end; - except - on E: Exception do begin - Result := '['+IntToHex64(aInt,8)+'] '; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('Error', i) then - i := FoundSignatures.Add('Error'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - end; - Used(aElement, Result); - Exit; - end; - end; - end; - end; - - if aInt < $800 then begin - s := IntToHex64(aInt,8); - Result := '['+s+'] '; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('Hardcoded', i) then - i := FoundSignatures.Add('Hardcoded'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - - if not Assigned(NotResolved) then - NotResolved := TwbFastStringListCS.CreateSorted; - if NotResolved.Count < 50 then begin - if not NotResolved.Find(s, i) then - i := NotResolved.Add(s); - NotResolved.Objects[i] := TObject(Succ(Integer(NotResolved.Objects[i]))); - end; - end; - end else begin - s := IntToHex64(aInt,8); - Result := '['+s+'] < Error: Could not be resolved >'; - if wbReportMode then - if wbReportFormIDs then begin - if not Assigned(FoundSignatures) then - FoundSignatures := TwbFastStringListCS.CreateSorted; - if not FoundSignatures.Find('NotResolved', i) then - i := FoundSignatures.Add('NotResolved'); - FoundSignatures.Objects[i] := TObject(Succ(Integer(FoundSignatures.Objects[i]))); - - if not Assigned(NotResolved) then - NotResolved := TwbFastStringListCS.CreateSorted; - if NotResolved.Count < 50 then begin - if not NotResolved.Find(s, i) then - i := NotResolved.Add(s); - NotResolved.Objects[i] := TObject(Succ(Integer(NotResolved.Objects[i]))); - end; - end; - end; - Used(aElement, Result); -end; - -{ TwbByteArrayDef } - -function TwbByteArrayDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - ByteArrayDef: IwbByteArrayDef; -begin - Result := Supports(aDef, IwbByteArrayDef, ByteArrayDef); - if Result and (badSize > 0) then begin - Result := ByteArrayDef.IsVariableSize or (ByteArrayDef.DefaultSize[nil, nil, nil] <= Integer(badSize)); - end; -end; - -function TwbByteArrayDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbByteArrayDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbByteArrayDef do - Self.Create(defPriority, defRequired, noName, badSize, noDontShow, badCountCallBack, defGetCP, noTerminator).defSource := aSource; -end; - -constructor TwbByteArrayDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aSize : Int64; - aDontShow : TwbDontShowCallback; - aCountCallback : TwbCountCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); -begin - badSize := aSize; - badCountCallback := aCountCallback; - inherited Create(aPriority, aRequired, aName, nil, nil, aDontShow, aGetCP, aTerminator); -end; - -procedure TwbByteArrayDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -var - Bytes : array of Byte; - i, j : Integer; - Prefix : Integer; -begin - SetLength(Bytes, Length(aValue) div 2); - i := 1; - j := 0; - while i <= Length(aValue) do begin - case aValue[i] of - ' ', ',', ';': {allowed whitespace} - Inc(i); - '0'..'9', 'a'..'f', 'A'..'F': begin - if i = Length(aValue) then - raise Exception.Create('Unexpected end of value. Single digit in hexadecimal pair'); - if aValue[Succ(i)] in ['0'..'9', 'a'..'f', 'A'..'F'] then begin - Bytes[j] := StrToInt('$'+Copy(aValue,i, 2)); - Inc(j); - Inc(i, 2); - end else - raise Exception.Create('"'+aValue[Succ(i)]+'" at position '+IntToStr(Succ(i))+' is not a valid character for ' + GetName); - end; - else - raise Exception.Create('"'+aValue[i]+'" at position '+IntToStr(i)+' is not a valid character for ' + GetName); - end; - end; - - SetLength(Bytes, j); - - case badSize of - -1 : Prefix := SizeOf(Cardinal); - -2 : Prefix := SizeOf(Word); - -4 : Prefix := SizeOf(Byte); - else - Prefix := 0; - end; - if (badSize > 0) then - SetLength(Bytes, badSize); - - aElement.RequestStorageChange(aBasePtr, aEndPtr, Length(Bytes)+Prefix); - - if Length(Bytes) > 0 then - Move(Bytes[0], Pointer(Cardinal(aBasePtr)+Prefix)^, Length(Bytes)); -end; - -procedure TwbByteArrayDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -var - Bytes : TBytes; - Prefix : Integer; -begin - Bytes := aValue; - - case badSize of - -1 : Prefix := SizeOf(Cardinal); - -2 : Prefix := SizeOf(Word); - -4 : Prefix := SizeOf(Byte); - else - Prefix := 0; - end; - if (badSize > 0) then - SetLength(Bytes, badSize); - - aElement.RequestStorageChange(aBasePtr, aEndPtr, Length(Bytes)+Prefix); - - if Length(Bytes) > 0 then - Move(Bytes[0], Pointer(Cardinal(aBasePtr)+Prefix)^, Length(Bytes)); -end; - -function TwbByteArrayDef.GetDefType: TwbDefType; -begin - Result := dtByteArray; -end; - -function TwbByteArrayDef.GetDefTypeName: string; -begin - if badSize > 0 then - Result := IntToStr(badSize)+' Bytes Array' - else if Assigned(badCountCallback) then - Result := 'Variable Size Byte Array' - else case badSize of - -1 : Result := 'Variable Size Byte Array with four bytes length'; - -2 : Result := 'Variable Size Byte Array with two bytes length'; - -4 : Result := 'Variable Size Byte Array with one byte length'; - -255 : Result := 'Null'; - 0 : Result := 'Filler for remaining data'; - end -end; - -function TwbByteArrayDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbByteArrayDef.GetIsVariableSizeInternal: Boolean; -begin - Result := badSize <= 0; -end; - -function TwbByteArrayDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aBasePtr) >= Cardinal(aEndPtr)) then - Result := 0 - else if Assigned(badCountCallback) then - Result := badCountCallback(aBasePtr, aEndPtr, aElement) - else begin - Result := badSize; - if Assigned(aBasePtr) then - case Result of - -1 : Result := PCardinal(aBasePtr)^+SizeOf(Cardinal); - -2 : Result := PWord(aBasePtr)^+SizeOf(Word); - -4 : Result := PByte(aBasePtr)^+SizeOf(Byte); - -255 : Result := 0; // Explicitly null for wbNull (displays better in unions) - 0 : Result := High(Integer); - end - else if Result < 0 then Result := 0; - end; - if Result>0 then Inc(Result, Ord(noTerminator)); -end; - -function TwbByteArrayDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if badSize>=0 then - Result := badSize - else - case badSize of - -1 : Result := SizeOf(Cardinal); - -2 : Result := SizeOf(Word); - -4 : Result := SizeOf(Byte); - -255 : Result := 0; // Explicitly null for wbNull (displays better in unions) - else - Result := 0; - end; - if Result>0 then Inc(Result, Ord(noTerminator)); -end; - -procedure TwbByteArrayDef.Report(const aParents: TwbDefPath); -var - FoundOne: Boolean; - {i,} j, k, l : Integer; - s: string; - sl: TStringList; - BA: TwbByteArrayDef; -begin - if defReported then - Exit; - - inherited; - BA := Self; - - s := wbDefsToPath(aParents) + wbDefToName(Self); - - if (Pos('Hashes', s) < 1) and - (Pos('SCDA', s) < 1) and - (Pos('SCTX', s) < 1) and - (Pos('MODT', s) < 1) and - (Pos('MO2T', s) < 1) and - (Pos('MO3T', s) < 1) and - (Pos('MO4T', s) < 1) and - (Pos('DMDT', s) < 1) and - (Pos('NIFT', s) < 1) and - (Pos('XRGD', s) < 1) and - (Pos('XCLP', s) < 1) and - (Pos('RCLR', s) < 1) then begin - - if wbReportUnknownFormIDs then begin - FoundOne := False; - with BA do begin - for j := Low(FoundFormIDAtOffSet) to High(FoundFormIDAtOffSet) do - if (FoundFormIDAtOffSet[j] > 2) and (NotFoundFormIDAtOffSet[j] = 0) then begin - if not FoundOne then begin - FoundOne := True; - WriteLn('Found FormIDs: ', s); - end; - with SignaturesAtOffSet[j] do begin - WriteLn(' Offset ', j, ': ', Count, ' (', FoundFormIDAtOffSet[j],')'); - for k := 0 to Pred(Count) do begin - sl := Objects[k] as TStringList; - WriteLn(' ', Strings[k], ' (', sl.Count,')'); - with sl do - for l := 0 to Pred(Count) do - WriteLn(' ', Strings[l],' (',Integer(Objects[l]),') '); - end; - if Assigned(FormIDsAtOffSetFoundIn[j]) then with FormIDsAtOffSetFoundIn[j] do - for k := 0 to Pred(Count) do - WriteLn(' ', Strings[k]); - end; - end; - - end; - end; - - if wbReportUnknownFloats then begin - FoundOne := False; - with BA do begin - for j := Low(FoundFloatAtOffSet) to High(FoundFloatAtOffSet) do - if (FoundFloatAtOffSet[j] > 2) and (NotFoundFloatAtOffSet[j] = 0) then begin - if not FoundOne then begin - FoundOne := True; - WriteLn('Found Floats: ', s); - end; - with FloatsAtOffSet[j] do begin - WriteLn(' Offset ', j, ': ', Count, ' (', FoundFloatAtOffSet[j],')'); - for k := 0 to Pred(Count) do - WriteLn(' ', Strings[k], ' (', Integer(Objects[k]),')'); - end; - end; - end; - end; - - end; - - if wbReportUnknownStrings then - if (FoundString > 0) and (NotFoundString < 1) then begin - WriteLn('Found Strings: ', s, ': ',Strings.Count,' (', FoundString, ')'); - with Strings do - for k := 0 to Pred(Count) do - WriteLn(' ', Strings[k], ' (', Integer(Objects[k]),')'); - end; - - if wbReportEmpty then - if IsEmpty > 0 then - if IsNotEmpty > 0 then begin - if wbReportSometimesEmpty then - WriteLn('Sometimes Empty: ', s, ': ', IsEmpty, ' (Empty) vs. ', IsNotEmpty, ' (not Empty)') - end else - WriteLn('Always Empty: ', s, ': ', IsEmpty, ' (Empty) vs. ', IsNotEmpty, ' (not Empty)'); - - defReported := True; -end; - -function TwbByteArrayDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -var - Size : Integer; - Default : String; -begin - Size := GetSize(aBasePtr, aEndPtr, aElement); - if (Size > 0) and (Size < High(Integer)) then begin - Default := '00'; - while Length(Default)<(Size*3-1) do - Default := Default + ' 00'; - end else - Default := ''; - Result := not Assigned(aBasePtr) or (ToString(aBasePtr, aEndPtr, aElement) <> Default); - if Result then - FromEditValue(aBasePtr, aEndPtr, aElement, Default); -end; - -function TwbByteArrayDef.ToEditValue(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): string; -begin - Result := ToString(aBasePtr, aEndPtr, aElement); -end; - -function TwbByteArrayDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -var - Bytes: TBytes; -begin - case badSize of - -1 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Cardinal)); - -2 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Word)); - -4 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Byte)); - end; - SetLength(Bytes, Cardinal(aEndPtr) - Cardinal(aBasePtr)); - if Length(Bytes) > 0 then - Move(aBasePtr^, Bytes[0], Length(Bytes)); - Result := Bytes; -end; - -function CountBits(aCardinal: Cardinal): Integer; -var - i: Integer; -begin - Result := 0; - for I := 0 to 31 do - if (aCardinal shr i) and 1 = 1 then - Inc(Result); -end; - -function TwbByteArrayDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - p: PByte; -{} _File: IwbFile; - MainRecord: IwbMainRecord; - OffSet: Integer; - aInt: Cardinal; -// Path : string; - s: string; - i: Integer; - f, f2: Single; -begin - Result := ''; - case badSize of - -1 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Cardinal)); - -2 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Word)); - -4 : aBasePtr := Pointer(Cardinal(aBasePtr)+SizeOf(Byte)); - end; - p := aBasePtr; - while Cardinal(p) < Cardinal(aEndPtr) do begin - Result := Result + IntToHex64(p^, 2) + ' '; - Inc(p); - end; - SetLength(Result, Length(Result) - 1); - - if wbReportMode then begin - if Assigned(aElement) and (Self.noName <> 'Unused') then begin - _File := aElement._File; - - if wbReportUnknownFormIDs then begin - p := aBasePtr; - OffSet := 0; - while (Cardinal(p)+3) < Cardinal(aEndPtr) do begin - aInt := PCardinal(p)^; - if (aInt <> $0) and (aInt <> $14) and ((Length(NotFoundFormIDAtOffSet) < Succ(OffSet)) or (NotFoundFormIDAtOffSet[Offset] < 1)) then begin - MainRecord := nil; - try - MainRecord := _File.RecordByFormID[aInt, True]; - except - on E: Exception do begin - MainRecord := nil; - end; - end; - if Length(FoundFormIDAtOffSet) < Succ(Offset) then - SetLength(FoundFormIDAtOffSet, Succ(Offset)); - if Length(NotFoundFormIDAtOffSet) < Succ(Offset) then - SetLength(NotFoundFormIDAtOffSet, Succ(Offset)); - if Length(SignaturesAtOffSet) < Succ(Offset) then - SetLength(SignaturesAtOffSet, Succ(Offset)); - if Length(FormIDsAtOffSetFoundIn) < Succ(Offset) then - SetLength(FormIDsAtOffSetFoundIn, Succ(Offset)); - if Assigned(MainRecord) then begin - if (aInt > $14) and (CountBits(aInt) > 4) then begin - Inc(FoundFormIDAtOffSet[Offset]); - if not Assigned(SignaturesAtOffSet[Offset]) then - SignaturesAtOffSet[Offset] := TwbFastStringListCS.CreateSorted; - s := MainRecord.Signature; - if not SignaturesAtOffSet[Offset].Find(s, i) then - i := SignaturesAtOffSet[Offset].AddObject(s, TwbFastStringListCS.CreateSorted); - s := MainRecord.Name; - with TStringList(SignaturesAtOffSet[Offset].Objects[i]) do - if Find(s, i) then - Objects[i] := TObject(Succ(Integer(Objects[i]))) - else - if Count < 10 then - AddObject(s, TObject(1)); - - if not Assigned(FormIDsAtOffSetFoundIn[Offset]) then - FormIDsAtOffSetFoundIn[Offset] := TwbFastStringListCS.CreateSorted(dupIgnore); - if FormIDsAtOffSetFoundIn[Offset].Count < 50 then - FormIDsAtOffSetFoundIn[Offset].Add(aElement.FullPath); - end; - end else - Inc(NotFoundFormIDAtOffSet[Offset]); - end; - Inc(p,4); - Inc(OffSet,4); - end; - end; - - if wbReportUnknownFloats then begin - p := aBasePtr; - OffSet := 0; - while (Cardinal(p)+3) < Cardinal(aEndPtr) do begin - aInt := PCardinal(p)^; - f := PSingle(p)^; - if (aInt <> $0) and ((Length(NotFoundFloatAtOffSet) < Succ(OffSet)) or (NotFoundFloatAtOffSet[Offset] < 1)) then begin - - if Length(FoundFloatAtOffSet) < Succ(Offset) then - SetLength(FoundFloatAtOffSet, Succ(Offset)); - if Length(NotFoundFloatAtOffSet) < Succ(Offset) then - SetLength(NotFoundFloatAtOffSet, Succ(Offset)); - if Length(FloatsAtOffSet) < Succ(Offset) then - SetLength(FloatsAtOffSet, Succ(Offset)); - - try - f2 := RoundToEx(f, -3); {>>> Floating Point Violation <<<} - if (f2 <> 0) and (Abs(f-f2) < 0.0002) then begin - if (f2 > -1000000) and (f2 < 1000000) then begin - Inc(FoundFloatAtOffSet[Offset]); - - if not Assigned(FloatsAtOffSet[Offset]) then - FloatsAtOffSet[Offset] := TwbFastStringListCS.CreateSorted; - - s := FloatToStr(RoundToEx(f,-7)); - with FloatsAtOffSet[Offset] do if Count < 15 then begin - if not Find(s, i) then - i := AddObject(s, TObject(0)); - Objects[i] := TObject(Succ(Integer(Objects[i]))); - end; - end; - - end else - Inc(NotFoundFloatAtOffSet[Offset]); - except - Inc(NotFoundFloatAtOffSet[Offset]); - end; - - end; - Inc(p,4); - Inc(OffSet,4); - end; - end; - - if wbReportUnknownStrings then begin - if (badSize < 1) and (NotFoundString < 1) then begin - p := aBasePtr; - while (Cardinal(p)) < Cardinal(aEndPtr) do begin - if p^ < 32 then - if (Succ(Cardinal(p)) = Cardinal(aEndPtr)) and (p^ = 0) then begin - s := PAnsiChar(aBasePtr); - if Length(s) > 4 then begin - Inc(FoundString); - - if not Assigned(Strings) then - Strings := TwbFastStringListCS.CreateSorted; - - with Strings do if Count < 15 then begin - if not Find(s, i) then - i := AddObject(s, TObject(0)); - Objects[i] := TObject(Succ(Integer(Objects[i]))); - end; - end; - end else begin - Inc(NotFoundString); - Break; - end; - - Inc(p); - end; - end; - end; - - if wbReportEmpty then begin - if (Cardinal(aBasePtr)) < Cardinal(aEndPtr) then - Inc(IsNotEmpty) - else - Inc(IsEmpty); - end; - - end; - end; - Used(aElement, Result); -end; - -{ TwbDivDef } - -function TwbDivDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := True; -end; - -function TwbDivDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbDivDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbDivDef do - Self.Create(ddValue).defSource := aSource; -end; - -constructor TwbDivDef.Create(aValue: Integer); -begin - ddValue := aValue; - inherited Create(cpNormal, False, nil); -end; - -function TwbDivDef.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -begin - Result := Round(StrToFloat(aValue) * ddValue); -end; - -function TwbDivDef.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbDivDef.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - Result := FloatToStrF(aInt / ddValue, ffFixed, 99, wbFloatDigits); -end; - -function TwbDivDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -const - PlusMinus : array[Boolean] of string = ('+', '-'); -begin - Result := PlusMinus[aInt < 0] + IntToHex64(Abs(aInt), 16); -end; - -function TwbDivDef.ToString(aInt: Int64; const aElement: IwbElement): string; -begin - Result := FloatToStrF(aInt / ddValue, ffFixed, 99, wbFloatDigits); - Used(aElement, Result); -end; - -{ TwbMulDef } - -function TwbMulDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := True; -end; - -function TwbMulDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbMulDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbMulDef do - Self.Create(mdValue).defSource := aSource; -end; - -constructor TwbMulDef.Create(aValue: Integer); -begin - mdValue := aValue; - inherited Create(cpNormal, False, nil); -end; - -function TwbMulDef.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -begin - Result := StrToInt64(aValue) div mdValue; -end; - -function TwbMulDef.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbMulDef.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToStr(aInt * mdValue); -end; - -function TwbMulDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ''; {handled by integer def} -end; - -function TwbMulDef.ToString(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToStr(aInt * mdValue); - Used(aElement, Result); -end; - -{ TwbCallbackDef } - -function TwbCallbackDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - CallbackDef: IwbCallbackDef; -begin - Result := Supports(aDef, IwbCallbackDef, CallbackDef) and - (@CallbackDef.Callback = @cdToStr); -end; - -function TwbCallbackDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbCallbackDef.Check(aInt: Int64; const aElement: IwbElement): string; -begin - Result := cdToStr(aInt, aElement, ctCheck); -end; - -constructor TwbCallbackDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbCallbackDef do - Self.Create(cdToStr, cdToInt).defSource := aSource; -end; - -constructor TwbCallbackDef.Create(const aToStr : TwbIntToStrCallback; - const aToInt : TwbStrToIntCallback); -begin - cdToStr := aToStr; - cdToInt := aToInt; - inherited Create(cpNormal, False, nil); -end; - -function TwbCallbackDef.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -begin - if Assigned(cdToInt) then - Result := cdToInt(aValue, aElement) - else - Result := StrToInt64(aValue) -end; - -function TwbCallbackDef.GetCallback: TwbIntToStrCallback; -begin - Result := cdToStr; -end; - -function TwbCallbackDef.GetEditInfo(aInt: Int64; const aElement: IwbElement): string; -begin - Result := cdToStr(aInt, aElement, ctEditInfo); -end; - -function TwbCallbackDef.GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; -var - s: string; -begin - Result := etDefault; - s := cdToStr(aInt, aElement, ctEditType); - if SameText(s, 'ComboBox') then - Result := etComboBox - else if SameText(s, 'CheckComboBox') then - Result := etCheckComboBox; -end; - -function TwbCallbackDef.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbCallbackDef.ToEditValue(aInt: Int64; const aElement: IwbElement): string; -begin - Result := cdToStr(aInt, aElement, ctToEditValue); - if Result = '' then - Result := IntToStr(aInt); -end; - -function TwbCallbackDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := cdToStr(aInt, aElement, ctToSortKey); -end; - -function TwbCallbackDef.ToString(aInt: Int64; const aElement: IwbElement): string; -begin - Result := cdToStr(aInt, aElement, ctToStr); - Used(aElement, Result); -end; - -{ TwbValueDef } - -procedure TwbValueDef.BuildRef; -begin - {nothing} -end; - -function TwbValueDef.Check(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): string; -begin - Result := ''; -end; - -function TwbValueDef.CompareExchangeFormID(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOldFormID, aNewFormID: Cardinal): Boolean; -begin - {can be overriden} - Result := False; -end; - -procedure TwbValueDef.FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); -begin - {can be overriden} -end; - -procedure TwbValueDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -begin - raise Exception.Create(GetName + ' is not editable.'); -end; - -procedure TwbValueDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -begin - raise Exception.Create(GetName + ' is not editable.'); -end; - -function TwbValueDef.GetCanBeZeroSize: Boolean; -begin - Result := False; -end; - -function TwbValueDef.GetEditInfo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := ''; -end; - -function TwbValueDef.GetEditType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): TwbEditType; -begin - Result := etDefault; -end; - -function TwbValueDef.GetElementMap: TDynCardinalArray; -begin - Result := nil; -end; - -function TwbValueDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := wbIsInternalEdit; -end; - -function TwbValueDef.GetIsVariableSize: Boolean; -begin - if not (vdsIsVariableSizeChecked in vdStates) then begin - if GetIsVariableSizeInternal then - Include(vdStates, vdsIsVariableSize) - else - Exclude(vdStates, vdsIsVariableSize); - Include(vdStates, vdsIsVariableSizeChecked) - end; - Result := vdsIsVariableSize in vdStates; -end; - -function TwbValueDef.GetIsVariableSizeInternal: Boolean; -begin - Result := False; -end; - -function TwbValueDef.GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; -begin - Result := nil; -end; - -procedure TwbValueDef.MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); -begin - {can be overriden} -end; - -procedure TwbValueDef.MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); -begin - {can be overriden} -end; - -function TwbValueDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := False; - {can be overriden} -end; - -function TwbValueDef.ToEditValue(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): string; -begin - Result := ''; -end; - -function TwbValueDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -begin - VarClear(Result); -end; - -function TwbValueDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -begin - Result := UpperCase(ToString(aBasePtr, aEndPtr, aElement)); -end; - -{ TwbSubRecordStructSKDef } - -constructor TwbSubRecordStructSKDef.Clone(const aSource: TwbDef); -var - SkipSigs : array of TwbSignature; - i : Integer; -begin - with aSource as TwbSubRecordStructSKDef do begin - if Assigned(srsSkipSignatures) then begin - SetLength(SkipSigs, srsSkipSignatures.Count); - for i := 0 to Pred(srsSkipSignatures.Count) do - SkipSigs[i] := StrToSignature(srsSkipSignatures[i]); - end; - Self.Create(defPriority, defRequired, noName, srsMembers, SkipSigs, srsSortKey, srsExSortKey, noDontShow, srsAllowUnordered, noAfterLoad, noAfterSet, defGetCP).defSource := aSource; - end; -end; - -constructor TwbSubRecordStructSKDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbRecordMemberDef; - const aSkipSigs : array of TwbSignature; - const aSortKey : array of Integer; - const aExSortKey : array of Integer; - aDontShow : TwbDontShowCallback; - aAllowUnordered : Boolean; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); -var - i: Integer; -begin - SetLength(srsMemberInSK, Length(aMembers)); - - SetLength(srsSortKey, Length(aSortKey)); - for i := Low(srsSortKey) to High(srsSortKey) do begin - Assert( not srsMemberInSK[aSortKey[i]] ); - srsMemberInSK[aSortKey[i]] := True; - - srsSortKey[i] := aSortKey[i]; - end; - - SetLength(srsExSortKey, Length(aExSortKey)); - for i := Low(srsExSortKey) to High(srsExSortKey) do - srsExSortKey[i] := aExSortKey[i]; - - inherited Create(aPriority, aRequired, aName, aMembers, aSkipSigs, aDontShow, aAllowUnordered, aAfterLoad, aAfterSet, aGetCP); -end; - -function TwbSubRecordStructSKDef.GetSortKey(aIndex: Integer; aExtended: Boolean): Integer; -begin - if aIndex <= High(srsSortKey) then - Result := srsSortKey[aIndex] - else - Result := srsExSortKey[aIndex-Length(srsSortKey)]; -end; - -function TwbSubRecordStructSKDef.GetSortKeyCount(aExtended: Boolean): Integer; -begin - Result := Length(srsSortKey); - if aExtended then - Inc(Result, Length(srsExSortKey)); -end; - -function TwbSubRecordStructSKDef.IsInSK(aIndex: Integer): Boolean; -begin - Result := (aIndex >= Low(srsMemberInSK)) and (aIndex <= High(srsMemberInSK)) and srsMemberInSK[aIndex]; -end; - -{ TwbFormIDChecked } - -function TwbFormIDChecked.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - FormIDChecked : IwbFormIDChecked; - i : Integer; - Dummy : Integer; -begin - if Supports(aDef, IwbFormIDChecked, FormIDChecked) then begin - Result := False; - for i := 0 to Pred(FormIDChecked.SignatureCount) do - if (FormIDChecked.Signatures[i] <> 'NULL') and (FormIDChecked.Signatures[i] <> 'TRGT') then - if fidcValidRefs.Find(FormIDChecked.Signatures[i], Dummy) then begin - Result := True; - Exit; - end; - end else - Result := inherited CanAssign(aElement, aIndex, aDef); -end; - -function TwbFormIDChecked.Check(aInt: Int64; - const aElement: IwbElement): string; -var - _File: IwbFile; - MainRecord: IwbMainRecord; - Found: TwbSignature; -begin - Result := ''; - - {>>> No ACVA errors <<<} - if IsValid('ACVA') then - Exit; - - if aInt = 0 then begin - if IsValid('TRGT') and not IsValid('NULL') then begin - Found := 'TRGT'; - if fidcValidRefs.IndexOf(Found) < 0 then - Result := 'Found a TRGT reference, expected: ' + fidcValidRefs.CommaText; - end else begin - Found := 'NULL'; - if fidcValidRefs.IndexOf(Found) < 0 then - Result := 'Found a NULL reference, expected: ' + fidcValidRefs.CommaText; - end; - Exit; - end else if aInt = $FFFFFFFF then begin - Found := 'FFFF'; - if fidcValidRefs.IndexOf(Found) < 0 then - Result := 'Found a None (FFFFFFFF) reference, expected: ' + fidcValidRefs.CommaText; - Exit; - end else if aInt = $14 then begin - Found := 'PLYR'; - if fidcValidRefs.IndexOf(Found) < 0 then - Result := 'Found a PLYR reference, expected: ' + fidcValidRefs.CommaText; - Exit; - end; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - try - MainRecord := _File.RecordByFormID[aInt, True]; - if Assigned(MainRecord) then begin - Found := MainRecord.Signature; - if fidcValidRefs.IndexOf(Found) < 0 then - Result := 'Found a '+Found+' reference, expected: ' + fidcValidRefs.CommaText - else begin - if fidcPersistent then - if not MainRecord.WinningOverride.Flags.IsPersistent then begin - Result := 'Target is not persistent'; - Exit; - end; - if not CheckFlst(MainRecord) then - Result := 'Referenced FLST contains invalid entry'; - end; - Exit; - end; - except - on E: Exception do begin - Result := E.Message; - Exit; - end; - end; - end; - end; - - if aInt > $800 then - Result := '['+IntToHex64(aInt,8)+'] < Error: Could not be resolved >'; -end; - -function TwbFormIDChecked.CheckFlst(const aMainRecord: IwbMainRecord): Boolean; -var - Container : IwbContainerElementRef; - i, j : Integer; - MainRecord : IwbMainRecord; -begin - Result := True; - - if fidcValidFlstRefs.Count < 1 then - Exit; - - if aMainRecord.Signature <> 'FLST' then - Exit; - - if Supports(aMainRecord.ElementByName['FormIDs'], IwbContainerElementRef, Container) then - for i := 0 to Pred(Container.ElementCount) do - if Supports(Container.Elements[i].LinksTo, IwbMainRecord, MainRecord) then - if not fidcValidFlstRefs.Find(MainRecord.Signature, j) then begin - Result := False; - Exit; - end; -end; - -constructor TwbFormIDChecked.Clone(const aSource: TwbDef); -begin - with aSource as TwbFormIDChecked do - Self.Create(fidcValidRefsArr, fidcValidFlstRefsArr, fidcPersistent, fidcNoReach).defSource := aSource; -end; - -constructor TwbFormIDChecked.Create(const aValidRefs : array of TwbSignature; - const aValidFlstRefs : array of TwbSignature; - aPersistent : Boolean; - aNoReach : Boolean); -var - i: Integer; -begin - fidcPersistent := aPersistent; - fidcNoReach := aNoReach; - - fidcValidRefs := TwbFastStringListCS.CreateSorted; - SetLength(fidcValidRefsArr, Length(aValidRefs)); - for i := Low(aValidRefs) to High(aValidRefs) do begin - fidcValidRefsArr[i] := aValidRefs[i]; - fidcValidRefs.Add(aValidRefs[i]); - end; - - fidcValidFlstRefs := TwbFastStringListCS.CreateSorted; - SetLength(fidcValidFlstRefsArr, Length(aValidFlstRefs)); - for i := Low(aValidFlstRefs) to High(aValidFlstRefs) do begin - fidcValidFlstRefsArr[i] := aValidFlstRefs[i]; - fidcValidFlstRefs.Add(aValidFlstRefs[i]); - end; - - inherited Create(cpNormal, False, nil); -end; - -destructor TwbFormIDChecked.Destroy; -begin - FreeAndNil(fidcValidRefs); - FreeAndNil(fidcValidFlstRefs); - inherited; -end; - -function TwbFormIDChecked.FromEditValue(const aValue: string; const aElement: IwbElement): Int64; -var - Error: string; -begin - Result := inherited FromEditValue(aValue, aElement); - if not wbAllowErrors then begin - Error := Check(Result, aElement); - if Error <> '' then - raise Exception.Create(Error); - end; -end; - -function TwbFormIDChecked.GetNoReach: Boolean; -begin - Result := fidcNoReach; -end; - -function TwbFormIDChecked.GetSignature(aIndex: Integer): TwbSignature; -begin - Result := StrToSignature(fidcValidRefs[aIndex]); -end; - -function TwbFormIDChecked.GetSignatureCount: Integer; -begin - Result := fidcValidRefs.Count; -end; - -function TwbFormIDChecked.IsValid(const aSignature: TwbSignature): Boolean; -begin - Result := fidcValidRefs.IndexOf(aSignature) >= 0; -end; - -function TwbFormIDChecked.IsValidFlst(const aSignature: TwbSignature): Boolean; -begin - Result := (fidcValidFlstRefs.Count = 0) or (fidcValidFlstRefs.IndexOf(aSignature) >= 0); -end; - -function TwbFormIDChecked.IsValidMainRecord(const aMainRecord: IwbMainRecord): Boolean; -begin - Result := not fidcPersistent or aMainRecord.IsPersistent; -end; - -procedure TwbFormIDChecked.Report(const aParents: TwbDefPath); -var - i, j : Integer; - s : string; - Sigs : TStringList; -begin - if defReported then - Exit; - - inherited; - if wbReportMode then - if wbReportFormIDs and Assigned(FoundSignatures) and (FoundSignatures.Count > 0) then begin - s := ''; - - Sigs := TwbFastStringListCS.CreateSorted; - try - Sigs.AddStrings(FoundSignatures); - - for i := 0 to Pred(fidcValidRefs.Count) do - if Sigs.Find(fidcValidRefs[i], j) then - Sigs.Delete(j) - else - s := s + fidcValidRefs[i] + ','; - SetLength(s, Pred(Length(s))); - - if not wbReportNotFoundButAllowedFormIDs then - s := ''; - - if (s <> '') or (Sigs.Count > 0) then begin - WriteLn('Differences in Checked FormID Formater: ', wbDefsToPath(aParents), wbDefToName(Self)); - if s <> '' then - WriteLn(' Not found but allowed: ', s); - if Sigs.Count > 0 then begin - WriteLn(' Found but not allowed: ', Sigs.CommaText); - for i := 0 to Pred(Sigs.Count) do - WriteLn(' ', Sigs.Strings[i], ' (', Integer(Sigs.Objects[i]),')'); - end; - end; - finally - Sigs.Free; - end; - end; - - defReported := True; -end; - -{ TwbIntegerDefFormater } - -procedure TwbIntegerDefFormater.BuildRef(aInt: Int64; - const aElement: IwbElement); -begin - { nothing } -end; - -function TwbIntegerDefFormater.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -begin - Result := False; -end; - -function TwbIntegerDefFormater.Check(aInt: Int64; - const aElement: IwbElement): string; -begin - Result := ''; -end; - -constructor TwbIntegerDefFormater.Clone(const aSource: TwbDef); -begin - with aSource as TwbIntegerDefFormater do - Self.Create(defPriority, defRequired, defGetCP).defSource := aSource; -end; - -function TwbIntegerDefFormater.CompareExchangeFormID(var aInt: Int64; - aOldFormID, aNewFormID: Cardinal; const aElement: IwbElement): Boolean; -begin - Result := False; // ? Should be overriden -end; - -procedure TwbIntegerDefFormater.FindUsedMasters(aInt: Int64; aMasters: PwbUsedMasters; const aElement: IwbElement); -begin - {can be overriden} -end; - -function TwbIntegerDefFormater.FromEditValue(const aValue: string; - const aElement: IwbElement): Int64; -begin - raise Exception.Create(Classname + ' does not support editing'); -end; - -function TwbIntegerDefFormater.GetDefType: TwbDefType; -begin - Result := dtIntegerFormater; -end; - -function TwbIntegerDefFormater.GetDefTypeName: string; -begin - Result := ClassName; -end; - -function TwbIntegerDefFormater.GetEditInfo(aInt: Int64; const aElement: IwbElement): string; -begin - Result := ''; -end; - -function TwbIntegerDefFormater.GetEditType(aInt: Int64; const aElement: IwbElement): TwbEditType; -begin - Result := etDefault; -end; - -function TwbIntegerDefFormater.GetIsEditable(aInt: Int64; const aElement: IwbElement): Boolean; -begin - Result := wbIsInternalEdit; -end; - -function TwbIntegerDefFormater.GetLinksTo(aInt: Int64; const aElement: IwbElement): IwbElement; -begin - Result := nil; -end; - -function TwbIntegerDefFormater.GetRequiresKey: Boolean; -begin - Result := False; -end; - -function TwbIntegerDefFormater.MasterCountUpdated(aInt: Int64; aOld, aNew: Byte; const aElement: IwbElement): Int64; -begin - Result := aInt; -end; - -function TwbIntegerDefFormater.MasterIndicesUpdated(aInt: Int64; const aOld, aNew: TBytes; const aElement: IwbElement): Int64; -begin - Result := aInt; -end; - -function TwbIntegerDefFormater.ToEditValue(aInt: Int64; - const aElement: IwbElement): string; -begin - Result := ''; -end; - -{ TwbUnionDef } - -procedure TwbUnionDef.BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); -var - ValueDef : IwbValueDef; -begin - inherited; - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - ValueDef.BuildRef(aBasePtr, aEndPtr, aElement); -end; - -function TwbUnionDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef): Boolean; -var - UnionDef : IwbUnionDef; - i : Integer; -begin - if Supports(aDef, IwbUnionDef, UnionDef) then begin - Result := Equals(aDef); - if not Result then - for i := 0 to Pred(UnionDef.MemberCount) do begin - Result := CanAssign(aElement, aIndex, UnionDef.Members[i]); - if Result then - Exit; - end; - - end else begin - Result := False; - for i := 0 to Pred(GetMemberCount) do begin - Result := udMembers[i].CanAssign(aElement, aIndex, aDef); - if Result then - Exit; - end; - end; -end; - -function TwbUnionDef.CanContainFormIDs: Boolean; -begin - Result := ubCanContainFormIDs; -end; - -function TwbUnionDef.Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := Decide(aBasePtr, aEndPtr, aElement).Check(aBasePtr, aEndPtr, aElement); -end; - -constructor TwbUnionDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbUnionDef do - Self.Create(defPriority, defRequired, noName, udDecider, udMembers, noDontShow, noAfterSet, defGetCP).defSource := aSource; -end; - -constructor TwbUnionDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aDecider : TwbUnionDecider; - const aMembers : array of IwbValueDef; - aDontShow : TwbDontShowCallback; - aAfterSet : TwbAfterSetCallback; - aGetCP : TwbGetConflictPriority); -var - i: Integer; -begin - inherited Create(aPriority, aRequired, aName, nil, aAfterSet, aDontShow, aGetCP, False); - udDecider := aDecider; - SetLength(udMembers, Length(aMembers)); - for I := Low(udMembers) to High(udMembers) do begin - udMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbValueDef; - ubCanContainFormIDs := ubCanContainFormIDs or aMembers[i].CanContainFormIDs; - end; -end; - -function TwbUnionDef.Decide(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbValueDef; -var - aMemberIndex : Integer; -begin - aMemberIndex := udDecider(aBasePtr, aEndPtr, aElement); - if (aMemberIndex>=0) and (aMemberIndex j then begin - j := -1; - break; - end; - Result := j = -1; - end; -end; - -function TwbUnionDef.GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.LinksTo[aBasePtr, aEndPtr, aElement] - else - Result := nil; -end; - -function TwbUnionDef.GetMember(aIndex: Integer): IwbValueDef; -begin - Result := udMembers[aIndex]; -end; - -function TwbUnionDef.GetMemberCount: Integer; -begin - Result := Length(udMembers); -end; - -function TwbUnionDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - i : Integer; - Size : Integer; - aMember : IwbValueDef; - Container : IwbContainerElementRef; - Element : IwbElement; -begin -// if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr) '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); -// end; - if GetIsVariableSize then - aMember := Decide(aBasePtr, aEndPtr, aElement) - else - aMember := nil;; - if not Assigned(aMember) then begin - if Length(udMembers)>0 then - Result := udMembers[0].Size[aBasePtr, aEndPtr, aElement] - else - Result := Low(Integer); - if (Result > 0) and GetIsVariableSize then - for i := 1 to High(udMembers) do - if Result <> High(Integer) then begin - Size := udMembers[i].Size[aBasePtr, aEndPtr, aElement]; - if Size = 0 then begin // No valid value can be found - Result := 0; - Break; - end else if Result < Size then - Result := Size; - end else - break; - end else begin - if GetIsVariableSize and Supports(aElement, IwbContainerElementRef, Container) and Equals(Container.ValueDef) and (Container.ElementCount = 1) then begin - Element := Container.Elements[0]; - if not aMember.Equals(Element.ValueDef) then - Element := nil; - end; - if not Assigned(Element) then - Element := aElement; - Result := aMember.Size[aBasePtr, aEndPtr, Element]; - if Result = High(Integer) then Exit; - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aEndPtr)aBasePtr) then -// wbProgressCallback('Found a union with a negative size! (2) '+IntToHex64(Cardinal(aBasePtr)+Result, 8)+ -// ' > '+IntToHex64(Cardinal(aEndPtr), 8)+' for '+noName); - Result := Cardinal(aEndPtr)-Cardinal(aBasePtr); - end; - end; -end; - -function TwbUnionDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - aMember : IwbValueDef; -begin - aMember := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(aMember) then - Result := aMember.DefaultSize[aBasePtr, aEndPtr, aElement] - else - Result := 0; -end; - -procedure TwbUnionDef.Report(const aParents: TwbDefPath); -var - Parents : TwbDefPath; - i : Integer; -begin - if defReported then - Exit; - - inherited; - Parents := aParents; - SetLength(Parents, Succ(Length(Parents))); - Parents[High(Parents)].Def := Self; - for i := Low(udMembers) to High(udMembers) do - if Assigned(udMembers[i]) then begin - Parents[High(Parents)].Index := i; - udMembers[i].Report(Parents); - end; - - defReported := True; -end; - -function TwbUnionDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.SetToDefault(aBasePtr, aEndPtr, aElement) - else - Result := False; -end; - -function TwbUnionDef.ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.EditValue[aBasePtr, aEndPtr, aElement] - else - Result := ''; -end; - -function TwbUnionDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.NativeValue[aBasePtr, aEndPtr, aElement] - else - Result := ''; -end; - -function TwbUnionDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.ToSortKey(aBasePtr, aEndPtr, aElement, aExtended) - else - Result := ''; -end; - -function TwbUnionDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - ValueDef: IwbValueDef; -begin - ValueDef := Decide(aBasePtr, aEndPtr, aElement); - if Assigned(ValueDef) then - Result := ValueDef.ToString(aBasePtr, aEndPtr, aElement) - else - Result := ''; - Used(aElement, Result); -end; - -{ TwbEmptyDef } - -function TwbEmptyDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbEmptyDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbEmptyDef do - Self.Create(defPriority, defRequired, noName, noAfterLoad, noAfterSet, noDontShow, edSorted, defGetCP).defSource := aSource; -end; - -constructor TwbEmptyDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aSorted : Boolean; - aGetCP : TwbGetConflictPriority); -begin - edSorted := aSorted; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, False); -end; - -procedure TwbEmptyDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -begin -end; - -function TwbEmptyDef.GetCanBeZeroSize: Boolean; -begin - Result := True; -end; - -function TwbEmptyDef.GetDefType: TwbDefType; -begin - Result := dtEmpty; -end; - -function TwbEmptyDef.GetDefTypeName: string; -begin - Result := 'Place holder for optional elements'; -end; - -function TwbEmptyDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbEmptyDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := 0; -end; - -function TwbEmptyDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := 0; -end; - -function TwbEmptyDef.GetSorted: Boolean; -begin - Result := edSorted; -end; - -function TwbEmptyDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -//var -// NamedDef: IwbNamedDef; -begin -// Result := GetName; -// if (Result = '') and Supports(defParent, IwbNamedDef, NamedDef) then -// Result := NamedDef.Name; -// if Result = '' then - Result := ''; -// Result := ''; -end; - -function TwbEmptyDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -//var -// NamedDef: IwbNamedDef; -begin -// Result := GetName; -// if (Result = '') and Supports(defParent, IwbNamedDef, NamedDef) then -// Result := NamedDef.Name; - Result := ''; - - Used(aElement, Result); -end; - -{ TwbMainRecordStructFlags } - -function TwbMainRecordStructFlags.CantWait: Boolean; -begin - Result := (_Flags and $00080000) <> 0; -end; - -function TwbMainRecordStructFlags.CastsShadows: Boolean; -begin - Result := (_Flags and $00000200) <> 0; -end; - -function TwbMainRecordStructFlags.HasLODtree: Boolean; -begin - Result := (_Flags and $00000040) <> 0; -end; - -function TwbMainRecordStructFlags.IsCompressed: Boolean; -begin - Result := (_Flags and $00040000) <> 0; -end; - -function TwbMainRecordStructFlags.IsDangerous: Boolean; -begin - Result := (_Flags and $00020000) <> 0; -end; - -function TwbMainRecordStructFlags.IsDeleted: Boolean; -begin - Result := (_Flags and $00000020) <> 0; -end; - -function TwbMainRecordStructFlags.IsLocalized: Boolean; -begin - Result := (_Flags and $00000080) <> 0; -end; - -function TwbMainRecordStructFlags.IsESM: Boolean; -begin - Result := (_Flags and $00000001) <> 0; -end; - -function TwbMainRecordStructFlags.IsIgnored: Boolean; -begin - Result := (_Flags and $00001000) <> 0; -end; - -function TwbMainRecordStructFlags.IsInitiallyDisabled: Boolean; -begin - Result := (_Flags and $00000800) <> 0; -end; - -function TwbMainRecordStructFlags.IsPersistent: Boolean; -begin - Result := (_Flags and $00000400) <> 0; -end; - -function TwbMainRecordStructFlags.IsVisibleWhenDistant: Boolean; -begin - Result := (_Flags and $00008000) <> 0; -end; - -procedure TwbMainRecordStructFlags.SetCompressed(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00040000 - else - _Flags := _Flags and not $00040000; -end; - -procedure TwbMainRecordStructFlags.SetDeleted(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00000020 - else - _Flags := _Flags and not $00000020; -end; - -procedure TwbMainRecordStructFlags.SetESM(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00000001 - else - _Flags := _Flags and not $00000001; -end; - -procedure TwbMainRecordStructFlags.SetLocalized(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00000080 - else - _Flags := _Flags and not $00000080 -end; - -procedure TwbMainRecordStructFlags.SetInitiallyDisabled(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00000800 - else - _Flags := _Flags and not $00000800; -end; - -procedure TwbMainRecordStructFlags.SetPersistent(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00000400 - else - _Flags := _Flags and not $00000400; -end; - -procedure TwbMainRecordStructFlags.SetVisibleWhenDistant(aValue: Boolean); -begin - if aValue then - _Flags := _Flags or $00008000 - else - _Flags := _Flags and not $00008000; -end; - -{ TwbLenStringDef } - -function TwbLenStringDef.CanAssign(const aElement: IwbElement; aIndex: Integer; const aDef: IwbDef) : Boolean; -begin - Result := aDef.DefType in [dtString, dtLString, dtLenString]; -end; - -function TwbLenStringDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -function TwbLenStringDef.Check(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Size : Cardinal; - Len : Cardinal; -begin - Result := ''; - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len < GetPrefixOffset then begin - if wbCheckExpectedBytes then - Result := Format('Expected at least %d bytes of data, found %d', [Abs(Prefix) , Len]); - Exit; - end; - Size := GetPrefixValue(aBasePtr, aEndPtr, aElement) + GetPrefixOffset; - if Len < Size then begin - if wbCheckExpectedBytes then - Result := Format('Expected %d bytes of data, found %d', [Size , Len]); - end; -end; - -constructor TwbLenStringDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbLenStringDef do - Self.Create(defPriority, defRequired, noName, Prefix, noAfterLoad, noAfterSet, noDontShow, defGetCP, noTerminator).defSource := aSource; -end; - -constructor TwbLenStringDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aPrefix : Integer; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean); -begin - Prefix := aPrefix; - if not (Abs(Prefix) in [1, 2, 3, 4, 5]) then - Prefix := 4; - - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -procedure TwbLenStringDef.FromEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: string); -var - Len : Cardinal; - NewSize : Cardinal; - p : Pointer; - s : AnsiString; -begin - s := AnsiString(aValue); - Len := Length(s); - NewSize := Len + GetPrefixOffset; - aElement.RequestStorageChange(aBasePtr, aEndPtr, NewSize + Ord(noTerminator)); - SetPrefixValue(aBasePtr, aEndPtr, aElement, Len); - p := Pointer(Cardinal(aBasePtr) + GetPrefixOffset); - if Len > 0 then - Move(s[1], p^, Len); - if noTerminator then begin - Inc(PByte(p), Len+1); - PByte(p)^ := wbTerminator; - end; -end; - -procedure TwbLenStringDef.FromNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: Variant); -begin - FromEditValue(aBasePtr, aEndPtr, aElement, aValue); -end; - -function TwbLenStringDef.GetDefType: TwbDefType; -begin - Result := dtLenString; -end; - -function TwbLenStringDef.GetDefTypeName: string; -begin - if Prefix > 0 then - Result := 'String with length of '+IntToStr(Prefix)+' bytes' - else - Result := 'Separated String with length of '+IntToStr(GetPrefixLen)+' bytes' -end; - -function TwbLenStringDef.GetIsEditable(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := True; -end; - -function TwbLenStringDef.GetIsVariableSizeInternal: Boolean; -begin - Result := True; -end; - -function TwbLenStringDef.GetPrefixLen: Integer; -begin - case Prefix of - 1, -2: Result := 1; - 2, -3: Result := 2; - 4, -5: Result := 4; - else - Result := 0; - end; -end; - -function TwbLenStringDef.GetPrefixOffset: Integer; -begin - Result := Abs(Prefix); -end; - -function TwbLenStringDef.GetPrefixValue(aBasePtr: Pointer; aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - case Prefix of - 1, -2: Result := PByte(aBasePtr)^; - 2, -3: Result := PWord(aBasePtr)^; - 4, -5: Result := PCardinal(aBasePtr)^; - else - Result := 0; - end; -end; - -function TwbLenStringDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -var - Len : Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) then - if (Cardinal(aBasePtr) >= Cardinal(aEndPtr)) then - Result := 0 - else begin - Result := Cardinal(aEndPtr) - Cardinal(aBasePtr); - Len := GetPrefixValue(aBasePtr, aEndPtr, aElement); - if Len>0 then - Len := Len+GetPrefixOffset+Ord(noTerminator) - else - Len := GetPrefixOffset; - if Len>Result then - Exit; - if Len < Result then - Result := Len; - end - else - Result := GetPrefixOffset; -end; - -function TwbLenStringDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := GetPrefixOffset+Ord(noTerminator); -end; - -procedure TwbLenStringDef.SetPrefixValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aValue: Cardinal); -begin - case Prefix of - 1, -2: PByte(aBasePtr)^ := aValue; - 2, -3: PWord(aBasePtr)^ := aValue; - 4, -5: PCardinal(aBasePtr)^ := aValue; - end; -end; - -function TwbLenStringDef.SetToDefault(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): Boolean; -begin - Result := not Assigned(aBasePtr) or (ToString(aBasePtr, aEndPtr, aElement) <> ''); - if Result then - FromEditValue(aBasePtr, aEndPtr, aElement, ''); -end; - -function TwbLenStringDef.ToEditValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Result := ToString(aBasePtr, aEndPtr, aElement); -end; - -function TwbLenStringDef.ToNativeValue(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Variant; -begin - Result := ToString(aBasePtr, aEndPtr, aElement); -end; - -function TwbLenStringDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -var - Size : Cardinal; - Len : Cardinal; - s : AnsiString; -begin - s := ''; - Len := Cardinal(aEndPtr) - Cardinal(aBasePtr); - if Len Size then - Len := Size; - - SetLength(s, Len); - if Len > 0 then - Move(aBasePtr^, s[1], Len); - Result := wbAnsiToString(s, aElement); - Used(aElement, Result); -end; - -{ TwbFastStringList } - -procedure TwbFastStringList.Clear(aFreeObjects: Boolean); -var - i: Integer; -begin - if aFreeObjects then - for i := 0 to Pred(Count) do - Objects[i].Free; - inherited Clear; -end; - -function TwbFastStringList.CompareStrings(const S1, S2: string): Integer; -begin - if CaseSensitive then - Result := CompareStr(S1, S2) - else - Result := CompareText(S1, S2); -end; - -constructor TwbFastStringList.CreateSorted(aDups: TDuplicates); -begin - Create; - Duplicates := aDups; - Sorted := True; -end; - -{ TwbFastStringListCS } - -procedure TwbFastStringListCS.AfterConstruction; -begin - inherited; - CaseSensitive := True; -end; - -{ TwbStringLCDef } - -function TwbStringLCDef.TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; -begin - Result := LowerCase(s); -end; - -{ TwbLString } - -function TwbLStringDef.GetDefType: TwbDefType; -begin - Result := dtLString; -end; - -function TwbLStringDef.GetDefTypeName: string; -begin - Result := 'Localized String'; -end; - -procedure TwbLStringDef.FromStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aValue: AnsiString); -var - ID: Cardinal; -begin - if Copy(aValue, 1, Length(sStringID)) = sStringID then begin - aElement.RequestStorageChange(aBasePtr, aEndPtr, SizeOf(Cardinal)); - PCardinal(aBasePtr)^ := StrToInt64Def('$' + Copy(aValue, Succ(Length(sStringID)), Length(aValue)), 0); - Exit; - end; - - if aElement._File.IsLocalized then - if wbLocalizationHandler.NoTranslate then - // assign a string when delocalizing and NoTranslate is true - inherited FromStringNative(aBasePtr, aEndPtr, aElement, aValue) - else begin - // set localized string's value - ID := wbLocalizationHandler.SetValue(PCardinal(aBasePtr)^, aElement, aValue); - aElement.RequestStorageChange(aBasePtr, aEndPtr, SizeOf(Cardinal)); - PCardinal(aBasePtr)^ := ID; - //raise Exception.Create('Can not assign to a localized string') - end - else - inherited FromStringNative(aBasePtr, aEndPtr, aElement, aValue); -end; - -function TwbLStringDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aBasePtr) and Assigned(aEndPtr) and (Cardinal(aBasePtr) >= Cardinal(aEndPtr)) then - Result := 0 - else if Assigned(aBasePtr) and Assigned(aEndPtr) and Assigned(aElement._File) and aElement._File.IsLocalized then - Result := Min(4, Cardinal(aEndPtr) - Cardinal(aBasePtr)) - else - Result := inherited GetSize(aBasePtr, aEndPtr, aElement); -end; - -function TwbLStringDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(aElement._File) and aElement._File.IsLocalized then - Result := 4 - else - Result := inherited GetDefaultSize(aBasePtr, aEndPtr, aElement); -end; - -function TwbLStringDef.ToStringNative(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): AnsiString; -begin - if Assigned(aElement._File) and aElement._File.IsLocalized then begin - if (Cardinal(aEndPtr) - Cardinal(aBasePtr)) <> 4 then - Result := '< Error: lstring ID should be Int32 value >' - else - Result := wbStringToAnsi(wbLocalizationHandler.GetValue(PCardinal(aBasePtr)^, aElement), aElement) - end else - Result := inherited ToStringNative(aBasePtr, aEndPtr, aElement); -end; - -{ TwbStringScriptDef } - -function TwbStringScriptDef.TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; -var - i: Integer; -begin - if aTransformType = ttToSortKey then begin - with TStringList.Create do try - Text := s; - for i := Pred(Count) downto 0 do begin - Strings[i] := Trim(Strings[i]); - if Strings[i] = '' then - Delete(i); - end; - Result := AnsiString(Text); - finally - Free; - end; - end else - Result := s; -end; - -{ TwbStringMgefCodeDef } - -procedure TwbStringMgefCodeDef.BuildRef(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement); -var - _File : IwbFile; - Rec : IwbMainRecord; -begin - _File := aElement._File; - if Assigned(_File) then begin - Rec := _File.RecordByEditorID[ToStringTransform(aBasePtr, aEndPtr, aElement, ttToSortKey)]; - if Assigned(Rec) then - aElement.AddReferencedFromID(Rec.LoadOrderFormID); - end; -end; - -function TwbStringMgefCodeDef.CanContainFormIDs: Boolean; -begin - Result := True; -end; - -procedure TwbStringMgefCodeDef.FindUsedMasters(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aMasters: PwbUsedMasters); -var - s : AnsiString; - MgefCode : PCardinal; -begin - s := ToStringNative(aBasePtr, aEndPtr, aElement); - - if Length(s) <> 4 then - Exit; - - MgefCode := PCardinal(@s[1]); - - if (MgefCode^ and $80000000) <> 0 then - { yes, it's a dynamic code } - aMasters[(MgefCode^ and $000000FF)] := True; -end; - -function TwbStringMgefCodeDef.GetLinksTo(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): IwbElement; -var - _File : IwbFile; -begin - Result := nil; - _File := aElement._File; - if Assigned(_File) then - Result := _File.RecordByEditorID[ToStringTransform(aBasePtr, aEndPtr, aElement, ttToSortKey)]; -end; - -procedure TwbStringMgefCodeDef.MasterCountUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aOld, aNew: Byte); -var - s : AnsiString; - MgefCode : PCardinal; -begin - s := ToStringNative(aBasePtr, aEndPtr, aElement); - - if Length(s) <> 4 then - Exit; - - MgefCode := PCardinal(@s[1]); - - if (MgefCode^ and $80000000) <> 0 then - { yes, it's a dynamic code } - if (MgefCode^ and $000000FF) >= aOld then begin - { yes, it refers to this file } - MgefCode^ := (MgefCode^ and $FFFFFF00) or aNew; - FromStringNative(aBasePtr, aEndPtr, aElement, s); - aElement.NotifyChanged(Pointer(aElement.Container)); - end; -end; - -procedure TwbStringMgefCodeDef.MasterIndicesUpdated(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; const aOld, aNew: TBytes); -var - s : AnsiString; - MgefCode : PCardinal; - i : Integer; -begin - s := ToStringNative(aBasePtr, aEndPtr, aElement); - - if Length(s) <> 4 then - Exit; - - MgefCode := PCardinal(@s[1]); - - Assert(Length(aOld) = Length(aNew)); - if (MgefCode^ and $80000000) <> 0 then - { yes, it's a dynamic code } - for i := Low(aOld) to High(aOld) do - if (MgefCode^ and $000000FF) = aOld[i] then begin - { yes, it refers to this file } - MgefCode^ := (MgefCode^ and $FFFFFF00) or aNew[i]; - FromStringNative(aBasePtr, aEndPtr, aElement, s); - aElement.NotifyChanged(Pointer(aElement.Container)); - Exit; - end; -end; - -function TwbStringMgefCodeDef.SetToDefault(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Boolean; -begin - Result := not Assigned(aBasePtr) or (ToString(aBasePtr, aEndPtr, aElement) <> '____'); - if Result then - FromEditValue(aBasePtr, aEndPtr, aElement, '____'); -end; - -function TwbStringMgefCodeDef.TransformString(const s: AnsiString; aTransformType: TwbStringTransformType; const aElement: IwbElement): AnsiString; -var - IsAlpha : Boolean; - i, j : Integer; - MgefCode : Cardinal; - _File : IwbFile; - FileID : Byte; - t : AnsiString; -begin - case aTransformType of - ttToString, ttToSortKey, ttToEditValue, ttToNativeValue: begin - Result := s; - if Length(s) = 4 then begin - IsAlpha := True; - for i := 1 to 4 do - if not(s[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_']) then begin - IsAlpha := False; - break; - end; - if not IsAlpha then begin - MgefCode := PCardinal(@s[1])^; - if (MgefCode and $80000000) <> 0 then begin - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - FileID := MgefCode and $000000FF; - - if FileID >= _File.MasterCount then - Result := AnsiString(_File.Name) - else - Result := AnsiString(_File.Masters[FileID].Name); - - Result := Result + ':' + AnsiString(IntToStr((MgefCode and not $800000FF) shr 8)); - - Exit; - end; - end; - end; - Result := AnsiString(IntToHex64(MgefCode, 8)); - if aTransformType = ttToString then - Result := Result + ' '; - end; - end else if aTransformType = ttToString then - Result := Result + AnsiString(' '); - end; - ttFromEditValue, ttFromNativeValue: begin - Result := Trim(s); - if S = '' then - Exit; - i := Pos(':', Result); - if i > 0 then begin - - t := Copy(Result, 1, Pred(i)); - - FileID := $FF; - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then begin - if SameText(t, _File.FileName) then - FileID := _File.MasterCount - else if SameText(t, _File.Name) then - FileID := _File.MasterCount - else begin - for j := 0 to Pred(_File.MasterCount) do - if SameText(t, _File.Masters[j].Name) then begin - FileID := j; - break; - end; - if FileID = $FF then - for j := 0 to Pred(_File.MasterCount) do - if SameText(t, _File.Masters[j].FileName) then begin - FileID := j; - break; - end; - end; - end; - end; - - if FileID = $FF then begin - if i > 1 then - FileID := StrToInt('$' + t); - - if Assigned(aElement) then begin - _File := aElement._File; - if Assigned(_File) then - if FileID = $FF then - FileID := _File.MasterCount - else - FileID := _File.LoadOrderFileIDtoFileFileID(FileID); - end; - end; - - t := Copy(Result, Succ(i), High(Integer)); - MgefCode := StrToInt(t); - if MgefCode > $7FFFFF then - raise Exception.Create('"'+t+'" exceeds the maximum value for a dynamic magic effect code'); - MgefCode := (MgefCode shl 8) or $80000000; - - MgefCode := MgefCode or FileID; - - end else if Length(Result) = 8 then begin - - MgefCode := StrToInt('$' + Result); - if (MgefCode and $80000000) <> 0 then - raise Exception.Create('"'+Result+'" is not a valid magic effect code'); - - end else if Length(s) = 4 then begin - - IsAlpha := True; - for i := 1 to 4 do - if not(s[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_']) then begin - IsAlpha := False; - break; - end; - if not IsAlpha then - raise Exception.Create('"'+Result+'" is not a valid magic effect code'); - MgefCode := PCardinal(@Result[1])^; - - end else - raise Exception.Create('"'+Result+'" is not a valid magic effect code'); - - SetLength(Result, 4); - PCardinal(@Result[1])^ := MgefCode; - end; - end; -end; - -function GetContainerFromUnion(const aElement: IwbElement): IwbContainer; -begin // Should change the name to GetContainerFromUnionOrValue :) - if (aElement.ElementType = etUnion) or (aElement.ElementType = etValue) then begin - Result := aElement.Container; - while Result.ElementType = etUnion do - Result := Result.Container - end else - Result := aElement as IwbContainer; -end; - -function GetContainerRefFromUnionOrValue(const aElement: IwbElement): IwbContainerElementRef; -begin - if (aElement.ElementType = etUnion) or (aElement.ElementType = etValue) then begin - Supports(aElement.Container, IwbContainerElementRef, Result); - while Result.ElementType = etUnion do - Supports(Result.Container, IwbContainerElementRef, Result); - end else - Supports(aElement, IwbContainerElementRef, Result); -end; - -function GetElementFromUnion(const aElement: IwbElement): IwbElement; -begin - if (aElement.ElementType = etUnion) then begin - Result := aElement.Container; - while Result.ElementType = etUnion do - Result := Result.Container; - end else - Result := aElement; -end; - -{ TwbStringKCDef } - -function TwbStringKCDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -begin - Result := ToStringTransform(aBasePtr, aEndPtr, aElement, ttToSortKey); -end; - -{ TwbLStringKCDef } - -function TwbLStringKCDef.ToSortKey(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; aExtended: Boolean): string; -begin - Result := ToStringTransform(aBasePtr, aEndPtr, aElement, ttToSortKey); -end; - -{ TwbRefID } - -var - wbRefIDArray : TwbRefIDArray = nil; - -procedure InitializeRefIDArray(anArray: TwbRefIDArray); -begin - wbRefIDArray := anArray; -end; - -procedure TwbRefID.BuildRef(aInt: Int64; const aElement: IwbElement); -var - key : Integer; - val : Integer; -begin - // First two bits are the key: - key := aInt shr 22; - val := aInt and $003FFFFF; - case key of - 0: if (val > 0) and (val < Length(wbRefIDArray)) then - inherited BuildRef(wbRefIDArray[val - 1], aElement); - 1: inherited BuildRef(val, aElement); // '['+IntToHex64(val, 8)+'] Skyrim.esm FormID'; - end; -end; - -function TwbRefID.ToString(aInt: Int64; const aElement: IwbElement): string; -var - key : Integer; - val : Integer; -begin - // First two bits are the key: - key := aInt shr 22; - val := aInt and $003FFFFF; - case key of - 0: if val = 0 then - Result := '[00000000] NULL' - else if val < Length(wbRefIDArray) then begin - val := wbRefIDArray[val - 1]; - Result := inherited ToString(val, aElement); - Result := Copy(Result, 1, Pos('[', Result)) + IntToHex64(val, 8) + Copy(Result, Pos(']', Result), Length(Result)); - end else - Result := '['+IntToHex64(val-1, 8)+'] Index in FormID Array'; - 1: Result := inherited ToString(val, aElement); - 2: Result := '[FF'+IntToHex64(val, 6)+'] Created FormID'; - else - Result := '['+IntToHex64(aInt, 8)+'] '; - end; - Result := IntToStr(aInt)+' '+Result; - Used(aElement, Result); -end; - -{ TwbDumpIntegerDefFormater } - -function TwbDumpIntegerDefFormater.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToHex64(aInt, 8); -end; - -function TwbDumpIntegerDefFormater.ToString(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToStr(aInt) + ' [' + IntToHex64(aInt, 8) + '] ['+IntToStr(aInt and $03)+':'+IntToStr(aInt shr 2)+']'; -end; - -{ TwbStructCDef } - -constructor TwbStructCDef.Clone(const aSource: TwbDef); -begin - with aSource as TwbStructCDef do - Self.Create(defPriority, defRequired, noName, stMembers, stSortKey, - stExSortKey, stOptionalFromElement, noDontShow, noAfterLoad, noAfterSet, - scSizeCallback, scGetChapterType, scGetChapterTypeName, scGetChapterName, defGetCP).defSource := aSource; -end; - -constructor TwbStructCDef.Create(aPriority: TwbConflictPriority; - aRequired : Boolean; - const aName : string; - const aMembers : array of IwbValueDef; - const aSortKey, aExSortKey : array of Integer; - aOptionalFromElement : Integer; - aDontShow : TwbDontShowCallback; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aSizeCallBack : TwbSizeCallback; - aGetChapterType : TwbGetChapterTypeCallback; - aGetChapterTypeName : TwbGetChapterTypeNameCallback; - aGetChapterName : TwbGetChapterNameCallback; - aGetCP : TwbGetConflictPriority); -begin - scSizeCallback := aSizeCallback; - scGetChapterType := aGetChapterType; - scGetChapterTypeName := aGetChapterTypeName; - scGetChapterName := aGetChapterName; - inherited Create(aPriority, aRequired, aName, aMembers, aSortKey, aExSortKey, [], aOptionalFromElement, aDontShow, aAfterLoad, aAfterSet, aGetCP); - noTreeBranch := False; -end; - -function TwbStructCDef.GetDefType: TwbDefType; -begin - Result := dtStructChapter; -end; - -function TwbStructCDef.GetDefTypeName: string; -begin - Result := 'Chapter'; -end; - -function TwbStructCDef.GetSizing(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement; var CompressedSize: Integer): Cardinal; -begin - if Assigned(scSizeCallback) then - Result := scSizeCallback(aBasePtr, aEndPtr, aElement, CompressedSize) - else begin - CompressedSize := -1; - Result := 0; - end; -end; - -function TwbStructCDef.GetChapterName(aBasePtr, aEndPtr: Pointer; - const aElement: IwbElement): String; -begin - if Assigned(scGetChapterName) then - Result := scGetChapterName(aBasePtr, aEndPtr, aElement) - else if Assigned(scGetChapterTypeName) then - Result := scGetChapterTypeName(aBasePtr, aEndPtr, aElement) - else - Result := GetName; -end; - -function TwbStructCDef.GetChapterType(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - if Assigned(scGetChapterType) then - Result := scGetChapterType(aBasePtr, aEndPtr, aElement) - else - Result := -1; -end; - -function TwbStructCDef.GetChapterTypeName(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): String; -begin - if Assigned(scGetChapterTypeName) then - Result := scGetChapterTypeName(aBasePtr, aEndPtr, aElement) - else - Result := IntToStr(GetChapterType(aBasePtr, aEndPtr, aElement)); -end; - -{ TwbKey2Data6EnumDef } - -function TwbKey2Data6EnumDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToHex64(aInt, 2); -end; - -function TwbKey2Data6EnumDef.ToString(aInt: Int64; const aElement: IwbElement): string; -var - key : Integer; - val : Integer; -begin - key := aInt shr 6; - val := aInt and $3f; - if val>=Length(enNames) then - Result := 'Bad enum index: ' + IntToStr(val) + ' [' + IntToHex64(val, 2) + ']' - else - Result := enNames[val]; - case key of - 0: Result := Result + ' Small size'; - 1: Result := Result + ' Medium size'; - 2: Result := Result + ' Large size'; - end; -end; - -{ TwbData6Key2EnumDef } - -function TwbData6Key2EnumDef.ToSortKey(aInt: Int64; const aElement: IwbElement): string; -begin - Result := IntToHex64(aInt, 2); -end; - -function TwbData6Key2EnumDef.ToString(aInt: Int64; const aElement: IwbElement): string; -var - key : Integer; -begin - if aInt < Power(2, 6) then - key := 0 - else if aInt < Power(2, 14) then - key := 1 - else if aInt < Power(2, 22) then - key := 2 - else - key := 3; - Result := IntToStr(aInt); - case key of - 0: Result := Result + ' Small size'; - 1: Result := Result + ' Medium size'; - 2: Result := Result + ' Large size'; - 3: Result := '0' + ' Null size'; - end; -end; - -{ TwbIntegerDefFormaterUnion } - -procedure TwbIntegerDefFormaterUnion.BuildRef(aInt : Int64; - const aElement : IwbElement); -var - IntegerDef: IwbIntegerDefFormater; -begin - IntegerDef := Decide(aElement); - if Assigned(IntegerDef) then - IntegerDef.BuildRef(aInt, aElement); -end; - -function TwbIntegerDefFormaterUnion.CanAssign(const aElement : IwbElement; - aIndex : Integer; - const aDef : IwbDef) - : Boolean; -var - IntegerDef: IwbIntegerDefFormater; -begin - IntegerDef := Decide(aElement); - if Assigned(IntegerDef) then - Result := IntegerDef.CanAssign(aElement, aIndex, aDef) - else - Result := False; -end; - -function TwbIntegerDefFormaterUnion.CanContainFormIDs: Boolean; -var - i: Integer; -begin - for i := Low(idfuMembers) to High(idfuMembers) do - if idfuMembers[i].CanContainFormIDs then - Exit(True); - Result := False; -end; - -function TwbIntegerDefFormaterUnion.Check(aInt : Int64; - const aElement : IwbElement) - : string; -begin - Result := Decide(aElement).Check(aInt, aElement); -end; - -constructor TwbIntegerDefFormaterUnion.Clone(const aSource: TwbDef); -begin - with aSource as TwbIntegerDefFormaterUnion do - Self.Create(defPriority, defRequired, defGetCP, idfuDecider, idfuMembers).defSource := aSource; -end; - -function TwbIntegerDefFormaterUnion.CompareExchangeFormID(var aInt : Int64; - aOldFormID : Cardinal; - aNewFormID : Cardinal; - const aElement : IwbElement) - : Boolean; -var - IntegerDef: IwbIntegerDefFormater; -begin - IntegerDef := Decide(aElement); - if Assigned(IntegerDef) then - Result := IntegerDef.CompareExchangeFormID(aInt, aOldFormID, aNewFormID, aElement) - else - Result := False; -end; - -constructor TwbIntegerDefFormaterUnion.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - aGetCP : TwbGetConflictPriority; - aDecider : TwbIntegerDefFormaterUnionDecider; - const aMembers : array of IwbIntegerDefFormater); -var - i: Integer; -begin - inherited Create(aPriority, aRequired, aGetCP); - idfuDecider := aDecider; - SetLength(idfuMembers, Length(aMembers)); - for i := Low(aMembers) to High(aMembers) do - idfuMembers[i] := (aMembers[i] as IwbDefInternal).SetParent(Self, False) as IwbIntegerDefFormater; -end; - -function TwbIntegerDefFormaterUnion.Decide(const aElement : IwbElement) - : IwbIntegerDefFormater; -var - i: Integer; -begin - i := idfuDecider(aElement); - if (i>=0) and (i=0) and (aIndex= 0 then begin - RDE := @wbRecordDefs[Index]; - while Assigned(RDE) do begin - if Cardinal(RDE.rdeSignature) = Cardinal(aSignature) then begin - aRecordDef := @RDE.rdeDef; - Exit(True); - end; - if RDE.rdeNext >= 0 then - RDE := @wbRecordDefs[RDE.rdeNext] - else - RDE := nil; - end; - end; - aRecordDef := nil; - Result := False; -end; - -function wbFindRecordDef(const aSignature : AnsiString; - out aRecordDef : PwbRecordDef) - : Boolean; -begin - Result := (Length(aSignature) = 4) and - wbFindRecordDef(PwbSignature(@aSignature[1])^, aRecordDef); -end; - -var - wbRecordDefMap: TStringList; - -function _wbRecordDefMap: TStringList; -var - i: Integer; -begin - if not Assigned(wbRecordDefMap) then begin - wbRecordDefMap := TwbFastStringList.Create; - for i := Low(wbRecordDefs) to High(wbRecordDefs) do - with wbRecordDefs[i] do - wbRecordDefMap.AddObject(rdeSignature, Pointer(rdeDef)); - wbRecordDefMap.Sorted := True; - end; - Result := wbRecordDefMap; -end; - -{$IFDEF USE_CODESITE} -threadvar - wbCodeSiteLoggingCount: Integer; - -function wbCodeSiteLoggingEnabled: Boolean; -begin - Result := wbCodeSiteLoggingCount > 0; -end; - -function wbBeginCodeSiteLogging: Integer; -begin - Result := Succ(wbCodeSiteLoggingCount); - wbCodeSiteLoggingCount := Result; -end; - -function wbEndCodeSiteLogging: Integer; -begin - Result := Pred(wbCodeSiteLoggingCount); - wbCodeSiteLoggingCount := Result; -end; -{$ENDIF} - -{ TwbFlagDef } - -function TwbFlagDef.CanContainFormIDs: Boolean; -begin - Result := False; -end; - -constructor TwbFlagDef.Clone(const aSource: TwbDef); -begin - with (aSource as TwbFlagDef) do - Self.Create(defPriority, defRequired, noName, noAfterLoad, noAfterSet, - noDontShow, defGetCP, noTerminator, fdFlagIndex).defSource := aSource; -end; - -constructor TwbFlagDef.Create(aPriority : TwbConflictPriority; - aRequired : Boolean; - const aName : string; - aAfterLoad : TwbAfterLoadCallback; - aAfterSet : TwbAfterSetCallback; - aDontShow : TwbDontShowCallback; - aGetCP : TwbGetConflictPriority; - aTerminator : Boolean; - aFlagIndex : Integer); -begin - fdFlagIndex := aFlagIndex; - inherited Create(aPriority, aRequired, aName, aAfterLoad, aAfterSet, aDontShow, aGetCP, aTerminator); -end; - -function TwbFlagDef.GetCanBeZeroSize: Boolean; -begin - Result := True; -end; - -function TwbFlagDef.GetConflictPriority(const aElement: IwbElement): TwbConflictPriority; -begin - with GetFlagsDef do begin - if FlagIgnoreConflict[GetFlagIndex] then - Result := cpIgnore - else - Result := cpNormal; - FlagGetCP(aElement, GetFlagIndex, Result); - end; -end; - -function TwbFlagDef.GetConflictPriorityCanChange: Boolean; -begin - Result := GetFlagsDef.FlagHasGetCP[GetFlagIndex]; -end; - -function TwbFlagDef.GetDefaultSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := 0; -end; - -function TwbFlagDef.GetDefType: TwbDefType; -begin - Result := dtFlag; -end; - -function TwbFlagDef.GetDefTypeName: string; -begin - Result := 'FlagDef'; -end; - -function TwbFlagDef.GetDontShow(const aElement: IwbElement): Boolean; -begin - Result := GetFlagsDef.FlagDontShow[aElement, GetFlagIndex]; -end; - -function TwbFlagDef.GetFlagIndex: Integer; -begin - Result := fdFlagIndex; -end; - -function TwbFlagDef.GetFlagsDef: IwbFlagsDef; -begin - Result := defParent as IwbFlagsDef; -end; - -function TwbFlagDef.GetHasDontShow: Boolean; -begin - Result := GetFlagsDef.FlagHasDontShow[GetFlagIndex]; -end; - -function TwbFlagDef.GetSize(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): Integer; -begin - Result := 0; -end; - -function TwbFlagDef.ToString(aBasePtr, aEndPtr: Pointer; const aElement: IwbElement): string; -begin - Assert(False); - Result := ''; -end; - -function wbIsPlugin(aFileName: string): Boolean; -var - i: Integer; -begin - Result := Pos(UpperCase(wbHardcodedDat), UpperCase(aFileName))<>0; - if not Result then - for i := 0 to Pred(Length(wbPluginExtensions)) do - if Pos(UpperCase(wbPluginExtensions[i]), UpperCase(ExtractFileExt(aFileName)))=1 then begin - Result := True; - Exit; - end; -end; - -function wbStr4ToString(aInt: Int64): string; -var - U32 : Cardinal; - Temp : String; - i : Integer; -begin - if aInt=0 then - Result := ' ' - else begin - U32 := aInt; - Result := PwbSignature(@U32)^; - if Length(Result)=4 then begin - Temp := Result; - for i := 1 to 4 do Result[i] := Temp[5-i]; - end else begin - Result := ' '; - // wbProgressCallback('Found a str4 that does not have 4 characters! (1) '+IntToHex64(aInt, 8)); - end; - end; -end; - -initialization - TwoPi := 2 * OnePi; - - if (DebugHook = 0) then - wbReportMode := False; - - wbIgnoreRecords := TStringList.Create; - wbIgnoreRecords.Sorted := True; - wbIgnoreRecords.Duplicates := dupIgnore; - wbDoNotBuildRefsFor := TStringList.Create; - wbDoNotBuildRefsFor.Sorted := True; - wbDoNotBuildRefsFor.Duplicates := dupIgnore; - - wbProgramPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))); - - SetLength(wbPluginExtensions, 3); - wbPluginExtensions[0] := '.ESP'; - wbPluginExtensions[1] := '.ESM'; - wbPluginExtensions[2] := '.GHOST'; - -finalization - FreeAndNil(wbIgnoreRecords); - FreeAndNil(wbDoNotBuildRefsFor); - FreeAndNil(wbGroupOrder); - FreeAndNil(wbRecordDefMap); - wbRecordDefs := nil; - wbContainerHandler := nil; -end. - diff --git a/lib/xedit/wbLocalization.pas b/lib/xedit/wbLocalization.pas deleted file mode 100644 index dc9ed9f..0000000 --- a/lib/xedit/wbLocalization.pas +++ /dev/null @@ -1,646 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbLocalization; - -{$I wbDefines.inc} - -interface - -uses - Classes, SysUtils, StrUtils, Math, - wbInterface, wbBSA; - -const - sStringID = 'STRINGID:'; - -type - TwbLStringType = ( - lsDLString, - lsILString, - lsString - ); - - TwbLocalizationFile = class - private - fName : string; - fFileName : string; - fFileType : TwbLStringType; - fStrings : TStrings; - fModified : boolean; - fNextID : Cardinal; - - procedure Init; - function FileStringType(aFileName: string): TwbLStringType; - function ReadZString(aStream: TMemoryStream): AnsiString; - function ReadLenZString(aStream: TMemoryStream): AnsiString; - procedure WriteZString(aStream: TMemoryStream; aString: AnsiString); - procedure WriteLenZString(aStream: TMemoryStream; aString: AnsiString); - procedure ReadDirectory(aStream: TMemoryStream); - protected - function Get(Index: Cardinal): string; - procedure Put(Index: Cardinal; const S: string); - public - property Strings[Index: Cardinal]: string read Get write Put; default; - property Items: TStrings read fStrings; - property Name: string read fName; - property FileName: string read fFileName; - property Modified: boolean read fModified write fModified; - property NextID: Cardinal read fNextID; - constructor Create(const aFileName: string); overload; - constructor Create(const aFileName: string; aData: TBytes); overload; - destructor Destroy; override; - function Count: Integer; - function IndexToID(Index: Integer): Cardinal; - function IDExists(ID: Cardinal): boolean; - function AddString(ID: Integer; const S: string): boolean; - procedure WriteToStream(const aStream: TStream); - procedure ExportToFile(const aFileName: string); - end; - - TwbLocalizationHandler = class - private - lFiles : TStrings; - fReuseDup : boolean; - protected - function Get(Index: Integer): TwbLocalizationFile; - function GetStringsPath: string; - public - NoTranslate: boolean; - property _Files[Index: Integer]: TwbLocalizationFile read Get; default; - property StringsPath: string read GetStringsPath; - property ReuseDup: Boolean read fReuseDup write fReuseDup; - constructor Create; - destructor Destroy; override; - procedure Clear; - function Count: Integer; - function LocalizedValueDecider(aElement: IwbElement): TwbLStringType; - function AvailableLanguages: TStringList; - function AvailableLocalizationFiles: TStringList; - procedure LoadForFile(aFileName: string); - function AddLocalization(const aFileName: string): TwbLocalizationFile; overload; - function AddLocalization(const aFileName: string; aData: TBytes): TwbLocalizationFile; overload; - function GetValue(ID: Cardinal; aElement: IwbElement): string; - function SetValue(ID: Cardinal; aElement: IwbElement; aValue: string): Cardinal; - function AddValue(aValue: string; aElement: IwbElement): Cardinal; - function GetLocalizationFileNameByElement(aElement: IwbElement): string; - function GetLocalizationFileNameByType(aPluginFile: string; ls: TwbLStringType): string; - procedure GetStringsFromFile(aFileName: string; const aList: TStrings); - end; - -const - wbLocalizationExtension: array [TwbLStringType] of string = ( - '.DLSTRINGS', - '.ILSTRINGS', - '.STRINGS' - ); - -var - wbLocalizationHandler: TwbLocalizationHandler; - -implementation - -uses - WideStrUtils; - -constructor TwbLocalizationFile.Create(const aFileName: string); -var - fs: TFileStream; - fStream: TMemoryStream; - Buffer: PByte; -begin - fFileName := aFileName; - Init; - // cache file in mem - fStream := TMemoryStream.Create; - try - fs := TFileStream.Create(aFileName, fmOpenRead or fmShareDenyNone); - GetMem(Buffer, fs.Size); - try - fs.ReadBuffer(Buffer^, fs.Size); - fStream.WriteBuffer(Buffer^, fs.Size); - fStream.Position := 0; - ReadDirectory(fStream); - finally - if Assigned(Buffer) then FreeMem(Buffer); - end; - finally - FreeAndNil(fs); - FreeAndNil(fStream); - end; -end; - -constructor TwbLocalizationFile.Create(const aFileName: string; aData: TBytes); -var - fStream: TMemoryStream; -begin - fFileName := aFileName; - Init; - fStream := TMemoryStream.Create; - try - fStream.WriteBuffer(aData[0], length(aData)); - fStream.Position := 0; - ReadDirectory(fStream); - finally - FreeAndNil(fStream); - end; -end; - -destructor TwbLocalizationFile.Destroy; -begin - FreeAndNil(fStrings); - inherited; -end; - -procedure TwbLocalizationFile.Init; -begin - fModified := false; - fName := ExtractFileName(fFileName); - fFileType := FileStringType(fFileName); - fStrings := TwbFastStringList.Create; - fNextID := 1; -end; - -function TwbLocalizationFile.FileStringType(aFileName: string): TwbLStringType; -var - ext: string; - i: TwbLStringType; -begin - Result := lsString; - ext := ExtractFileExt(aFileName); - for i := Low(TwbLStringType) to High(TwbLStringType) do - if SameText(ext, wbLocalizationExtension[i]) then - Result := i; -end; - -function TwbLocalizationFile.ReadZString(aStream: TMemoryStream): AnsiString; -var - Position : Integer; -begin - Position := aStream.Position; - Result := PAnsiChar(@PByte(aStream.Memory)[Position]); - aStream.Position := aStream.Position + Succ(Length(Result)); -end; - -function TwbLocalizationFile.ReadLenZString(aStream: TMemoryStream): AnsiString; -var - Len: Cardinal; -begin - aStream.ReadBuffer(Len, 4); - Dec(Len); // trailing null - SetLength(Result, Len); - if Len > 0 then - aStream.ReadBuffer(Result[1], Len); -end; - -procedure TwbLocalizationFile.WriteZString(aStream: TMemoryStream; aString: AnsiString); -const - z: Byte = 0; -begin - aStream.WriteBuffer(aString[1], Length(aString)); - aStream.WriteBuffer(z, SizeOf(z)); -end; - -procedure TwbLocalizationFile.WriteLenZString(aStream: TMemoryStream; aString: AnsiString); -const - z: Byte = 0; -var - l: Cardinal; -begin - l := Length(aString) + SizeOf(z); - aStream.WriteBuffer(l, SizeOf(Cardinal)); - aStream.WriteBuffer(aString[1], Length(aString)); - aStream.WriteBuffer(z, SizeOf(z)); -end; - -procedure TwbLocalizationFile.ReadDirectory(aStream: TMemoryStream); -var - i: integer; - scount, id, offset: Cardinal; - oldPos: int64; - s: AnsiString; -begin - if aStream.Size < 8 then - Exit; - - aStream.Read(scount, 4); // number of strings - aStream.Position := aStream.Position + 4; // skip dataSize - if scount > 0 then - for i := 0 to scount - 1 do begin - aStream.Read(id, 4); // string ID - aStream.Read(offset, 4); // offset of string relative to data (header + dirsize) - oldPos := aStream.Position; - aStream.Position := 8 + scount*8 + offset; // header + dirsize + offset - if fFileType = lsString then - s := ReadZString(aStream) - else - s := ReadLenZString(aStream); - fStrings.AddObject(wbAnsiToString(s, nil), pointer(id)); - if Succ(id) > fNextID then - fNextID := Succ(id); - aStream.Position := oldPos; - end; -end; - -procedure TwbLocalizationFile.WriteToStream(const aStream: TStream); -var - dir, data: TMemoryStream; - i: integer; - c: Cardinal; -begin - dir := TMemoryStream.Create; - data := TMemoryStream.Create; - c := fStrings.Count; - dir.WriteBuffer(c, SizeOf(c)); // number of strings - dir.WriteBuffer(c, SizeOf(c)); // dataSize, will overwrite later - try - for i := 0 to Pred(fStrings.Count) do begin - c := Cardinal(fStrings.Objects[i]); - dir.WriteBuffer(c, SizeOf(c)); // ID - c := data.Position; - dir.WriteBuffer(c, SizeOf(c)); // relative position - if fFileType = lsString then - WriteZString(data, wbStringToAnsi(fStrings[i], nil)) - else - WriteLenZString(data, wbStringToAnsi(fStrings[i], nil)); - end; - c := data.Size; - dir.Position := 4; - dir.WriteBuffer(c, SizeOf(c)); // dataSize - - aStream.CopyFrom(dir, 0); - aStream.CopyFrom(data, 0); - finally - FreeAndNil(dir); - FreeAndNil(data); - end; -end; - -function TwbLocalizationFile.Count: Integer; -begin - Result := fStrings.Count; -end; - -function TwbLocalizationFile.IndexToID(Index: Integer): Cardinal; -begin - if Index < Count then - Result := Cardinal(fStrings.Objects[Index]) - else - Result := 0; -end; - -function TwbLocalizationFile.IDExists(ID: Cardinal): boolean; -begin - Result := fStrings.IndexOfObject(Pointer(ID)) <> -1; -end; - -function TwbLocalizationFile.Get(Index: Cardinal): string; -var - idx: integer; -begin - Result := ''; - idx := fStrings.IndexOfObject(Pointer(Index)); - if idx <> -1 then - Result := fStrings[idx] - else - Result := ''; -end; - -procedure TwbLocalizationFile.Put(Index: Cardinal; const S: string); -var - idx: integer; -begin - idx := fStrings.IndexOfObject(Pointer(Index)); - if idx <> -1 then - if fStrings[idx] <> S then begin - fStrings[idx] := S; - fModified := true; - end; -end; - -function TwbLocalizationFile.AddString(ID: Integer; const S: string): boolean; -begin - Result := false; - if ID < NextID then - Exit; - - fStrings.AddObject(S, Pointer(ID)); - fNextID := Succ(ID); - fModified := true; - - Result := true; -end; - -procedure TwbLocalizationFile.ExportToFile(const aFileName: string); -var - i: integer; - sl: TStringList; -begin - sl := TStringList.Create; - try - for i := 0 to Pred(fStrings.Count) do begin - sl.Add('[' + IntToHex(Integer(fStrings.Objects[i]), 8) + ']'); - sl.Add(fStrings[i]); - end; - sl.SaveToFile(aFileName); - finally - FreeAndNil(sl); - end; -end; - -constructor TwbLocalizationHandler.Create; -begin - lFiles := TwbFastStringListCS.CreateSorted; - fReuseDup := false; - NoTranslate := false; -end; - -destructor TwbLocalizationHandler.Destroy; -begin - Clear; - FreeAndNil(lFiles); -end; - -function TwbLocalizationHandler.Count: Integer; -begin - Result := lFiles.Count; -end; - -procedure TwbLocalizationHandler.Clear; -var - i: integer; -begin - for i := 0 to Pred(Count) do - _Files[i].Destroy; - lFiles.Clear; -end; - -function TwbLocalizationHandler.Get(Index: Integer): TwbLocalizationFile; -begin - if Index < Count then - Result := TwbLocalizationFile(lFiles.Objects[Index]) - else - Result := nil; -end; - -function TwbLocalizationHandler.AddLocalization(const aFileName: string): TwbLocalizationFile; -begin - Result := TwbLocalizationFile.Create(aFileName); - lFiles.AddObject(ExtractFileName(aFileName), Result); -end; - -function TwbLocalizationHandler.AddLocalization(const aFileName: string; aData: TBytes): TwbLocalizationFile; -begin - Result := TwbLocalizationFile.Create(aFileName, aData); - lFiles.AddObject(ExtractFileName(aFileName), Result); -end; - -function TwbLocalizationHandler.LocalizedValueDecider(aElement: IwbElement): TwbLStringType; -var - sigElement, sigRecord: TwbSignature; - aRecord: IwbSubRecord; -begin - if Supports(aElement, IwbSubRecord, aRecord) then - sigElement := aRecord.Signature - else - sigElement := ''; - - sigRecord := aElement.ContainingMainRecord.Signature; - - if (sigRecord <> 'LSCR') and (sigElement = 'DESC') then Result := lsDLString else // DESC always from dlstrings except LSCR - if (sigRecord = 'QUST') and (sigElement = 'CNAM') then Result := lsDLString else // quest log entry - if (sigRecord = 'BOOK') and (sigElement = 'CNAM') then Result := lsDLString else // Book CNAM description - if (sigRecord = 'INFO') and (sigElement <> 'RNAM') then Result := lsILString else // dialog, RNAM are lsString, others lsILString - Result := lsString; // others -end; - -function TwbLocalizationHandler.GetStringsPath: string; -begin - Result := wbDataPath + 'Strings\'; -end; - -function TwbLocalizationHandler.AvailableLanguages: TStringList; -var - F: TSearchRec; - p: integer; - s: string; -begin - Result := TStringList.Create; - if FindFirst(StringsPath + '*.*STRINGS', faAnyFile, F) = 0 then try - repeat - s := LowerCase(ChangeFileExt(F.Name, '')); - p := LastDelimiter('_', s); - if p > 0 then begin - s := Copy(s, p + 1, length(s)); - if s = '' then Continue; - s := AnsiUpperCase(s[1]) + Copy(s, 2, Length(s)); - if Result.IndexOf(s) = -1 then - Result.Add(s); - end; - until FindNext(F) <> 0; - finally - FindClose(F); - end; -end; - -function TwbLocalizationHandler.AvailableLocalizationFiles: TStringList; -var - F: TSearchRec; -begin - Result := TStringList.Create; - if FindFirst(StringsPath + '*.*STRINGS', faAnyFile, F) = 0 then try - repeat - Result.Add(F.Name); - until FindNext(F) <> 0; - finally - FindClose(F); - end; -end; - -procedure TwbLocalizationHandler.LoadForFile(aFileName: string); -var - ls: TwbLStringType; - s: string; - res: TDynResources; -begin - if not Assigned(wbContainerHandler) then - Exit; - - for ls := Low(TwbLStringType) to High(TwbLStringType) do begin - s := wbLocalizationHandler.GetLocalizationFileNameByType(aFileName, ls); - if lFiles.IndexOf(ExtractFileName(s)) = -1 then begin - res := wbContainerHandler.OpenResource(s); - if length(res) > 0 then begin - //wbProgressCallback('[' + s + '] Loading Localization.'); - wbLocalizationHandler.AddLocalization(wbDataPath + s, res[High(res)].GetData); - end; - end; - end; -end; - -function TwbLocalizationHandler.GetLocalizationFileNameByType(aPluginFile: string; ls: TwbLStringType): string; -begin - Result := Format('%s_%s%s', [ - ChangeFileExt(aPluginFile, ''), - wbLanguage, - wbLocalizationExtension[ls] - ]); - // relative path to Data folder - Result := 'Strings\' + Result; -end; - -function TwbLocalizationHandler.GetLocalizationFileNameByElement(aElement: IwbElement): string; -begin - Result := ''; - - if not Assigned(aElement) then - Exit; - - Result := GetLocalizationFileNameByType(aElement._File.FileName, LocalizedValueDecider(aElement)); -end; - -// create a new lstring from aValue for aElement -function TwbLocalizationHandler.AddValue(aValue: string; aElement: IwbElement): Cardinal; -var - ls: TwbLStringType; - FileName: string; - wblf: array [TwbLStringType] of TwbLocalizationFile; - idx: integer; - data: TBytes; - ID: Cardinal; -begin - Result := 0; - - if not Assigned(aElement) then - Exit; - - if aValue = '' then - Exit; - - // create localization files if absent - try - ID := 1; - for ls := Low(TwbLStringType) to High(TwbLStringType) do begin - FileName := GetLocalizationFileNameByType(aElement._File.FileName, ls); - idx := lFiles.IndexOf(ExtractFileName(FileName)); - if idx = -1 then begin - wblf[ls] := AddLocalization(wbDataPath + FileName, data); - wblf[ls].Modified := true; - end else - wblf[ls] := _Files[idx]; - - if wblf[ls].NextID > ID then - ID := wblf[ls].NextID; - end; - - ls := LocalizedValueDecider(aElement); - - // detect a duplicate string - if ReuseDup then begin - idx := wblf[ls].fStrings.IndexOf(aValue); - if idx <> -1 then ID := Cardinal(wblf[ls].fStrings.Objects[idx]) else - wblf[ls].AddString(ID, aValue); - end else - wblf[ls].AddString(ID, aValue); - - Result := ID; - finally - - end; -end; - -function TwbLocalizationHandler.SetValue(ID: Cardinal; aElement: IwbElement; aValue: string): Cardinal; -var - idx: integer; - FileName: string; -begin - Result := ID; - - if not Assigned(aElement) then - Exit; - - FileName := GetLocalizationFileNameByElement(aElement); - idx := lFiles.IndexOf(ExtractFileName(FileName)); - - if (idx = -1) or (ID = 0) then begin - // new string - Result := AddValue(aValue, aElement); - Exit; - end; - - if not _Files[idx].IDExists(ID) then - // string doesn't exist, create new - Result := AddValue(aValue, aElement) - else - // modify existing - _Files[idx][ID] := aValue; -end; - - -function TwbLocalizationHandler.GetValue(ID: Cardinal; aElement: IwbElement): string; -var - lFileName: string; - idx: integer; -begin - Result := ''; - - if NoTranslate then begin - Result := IntToHex(ID, 8); - Exit; - end; - - if ID = 0 then - Exit; - - lFileName := ExtractFileName(GetLocalizationFileNameByElement(aElement)); - - if lFileName = '' then - Exit; - - idx := lFiles.IndexOf(lFileName); - - // load strings files if absent - if idx = - 1 then - LoadForFile(aElement._File.FileName); - - // get file again - idx := lFiles.IndexOf(lFileName); - if idx = - 1 then begin - Result := ''; - Exit; - end; - - Result := _Files[idx][ID]; -end; - -procedure TwbLocalizationHandler.GetStringsFromFile(aFileName: string; const aList: TStrings); -var - i: integer; -begin - if not Assigned(aList) then - Exit; - - for i := 0 to Pred(lFiles.Count) do - if SameText(lFiles[i], aFileName) then begin - aList.Assign(_Files[i].fStrings); - Break; - end; -end; - - -initialization - wbLocalizationHandler := TwbLocalizationHandler.Create; -finalization - FreeAndNil(wbLocalizationHandler); -end. diff --git a/lib/xedit/wbSort.pas b/lib/xedit/wbSort.pas deleted file mode 100644 index eb3e9c7..0000000 --- a/lib/xedit/wbSort.pas +++ /dev/null @@ -1,1060 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} -unit wbSort; - -{$I wbDefines.inc} - -interface - -uses - Classes, wbInterface; - -procedure wbMergeSort(aList: Pointer; aCount: Integer; aCompare: TListSortCompare); - -implementation - -type - TwbMove = procedure(const Source; var Dest; Count : Integer); - -var - wbMove : TwbMove = nil; - -const - // x64 - use InsertionSort instead MergeSort for small arrays - MIN_SIZE = 32; - -{$IFDEF WIN32} -function wbMergeSortInternal(_A, _B: PwbPointerArray; _Count : Integer; _Compare: TListSortCompare): PwbPointerArray; register; -const - SizeOfPointer = SizeOf(Pointer); - SizeOf2Pointer = 2 * SizeOf(Pointer); - - EspOffset = $38; - - A = EspOffset - SizeOfPointer * 1; - B = EspOffset - SizeOfPointer * 2; - Compare = EspOffset+$08; //sometimes ebp - - Temp = EspOffset - SizeOfPointer * 3; - - Count = EspOffset - SizeOfPointer * 4; - SegmentSize = EspOffset - SizeOfPointer * 5; - - Temp2 = EspOffset - SizeOfPointer * 6; - - pRightEnd = EspOffset - SizeOfPointer * 7; - pLeftEnd = EspOffset - SizeOfPointer * 8; - - pListEnd = EspOffset - SizeOfPointer * 9; - - pNextLeft = EspOffset - SizeOfPointer * 10; - SavedCompares = EspOffset - SizeOfPointer * 11; -asm - { begin } - sub esp, EspOffset - mov [esp + 00], edi - mov [esp + 08], esi - mov [esp + 04], ebx - - mov [esp+Count], ecx - mov [esp+B], edx - mov [esp+A], eax - - {======== first run =========================================================} - xor ebp, ebp - - { pBuffer := @b; } - mov edi, [esp+B] - { pLeft := @a; } - mov esi, [esp+A] - { pListEnd := @a[Pred(Count)]; } - mov ebx, [esp+Count] - dec ebx - lea ebx, [esi+ebx*SizeOfPointer] - - mov dword ptr [esp+Temp], 0 - - jmp @@FirstRun_CompareLoop - - nop - nop - nop - nop - nop - nop - nop - - @@FirstRun_CompareLoop: - { if Compare(pLeft^, pRight^) <= 0 then begin } - mov eax, [esi] - mov edx, [esi + SizeOfPointer] - call [esp+Compare] - test eax, eax - jg @@FirstRun_MergeFromRight - jl @@FirstRun_MergeFromLeft - add dword ptr [esp+Temp], 1 - jmp @@FirstRun_MergeFromLeft - - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - - @@FirstRun_MergeFromLeft: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { pBuffer+1^ := pLeft+1^; } - mov eax, [esi + SizeOfPointer] - mov [edi + SizeOfPointer], eax - { Inc(pBuffer, 2); } - add edi, SizeOf2Pointer - { Inc(pLeft, 2); } - add esi, SizeOf2Pointer - - { until pLeft+1 >= pListEnd } - cmp esi, ebx - jb @@FirstRun_CompareLoop - ja @@FirstRun_NoRemaining - jmp @@FirstRun_CopyRemaining - - nop - nop - nop - nop - nop - nop - nop - nop - - @@FirstRun_MergeFromRight: - lea ebp, [ebp +1] - { pBuffer+1^ := pLeft^; } - mov eax, [esi] - mov [edi + SizeOfPointer], eax - { pBuffer^ := pLeft+1^; } - mov eax, [esi + SizeOfPointer] - mov [edi], eax - { Inc(pBuffer, 2); } - add edi, SizeOf2Pointer - { Inc(pLeft, 2); } - add esi, SizeOf2Pointer - - { until pLeft+1 >= pListEnd } - cmp esi, ebx - jb @@FirstRun_CompareLoop - ja @@FirstRun_NoRemaining - - @@FirstRun_CopyRemaining: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - - nop - nop - nop - - @@FirstRun_NoRemaining: - mov edx, ebp - mov ebp, [esp+Compare] - - { if never merged from left... } - test edx, edx - jz @@ShortCutFwd_Entry - - { if always merged from right... } - mov eax, [esp+Count] - shr eax, 1 - add edx, [esp+Temp] - cmp edx, eax - je @@ShortCutBwd_Entry - - { T := A; } - mov eax, [esp+A] - { A := B; } - mov edx, [esp+B] - mov [esp+A], edx - { B := T; } - mov [esp+B], eax - - jmp @@SmallRuns_Entry - - {======== shortcut forward run ==============================================} - nop - nop - nop - - @@ShortCutFwd_Entry: - { pLeft := @a; } - mov esi, [esp+A] - { pListEnd := @a[Pred(Count)]; - still valid} - - { skip first element } - add esi, SizeOfPointer - - cmp esi, ebx - jae @@Exit - - nop - - @@ShortCutFwd_CompareLoop: - { if Compare(pLeft^, pRight^) <= 0 then begin } - mov eax, [esi] - mov edx, [esi + SizeOfPointer] - call ebp - test eax, eax - { if any element didn't fit, do a full merge } - jg @@SmallRuns_Entry - - { Inc(pLeft, 2); } - add esi, SizeOf2Pointer - - { until pLeft+1 >= pListEnd } - cmp esi, ebx - jb @@ShortCutFwd_CompareLoop - jmp @@Exit - - {======== shortcut forward run ==============================================} - - nop - nop - nop - nop - nop - - @@ShortCutBwd_Entry: - mov esi, [esp+A] - mov ebx, [esp + Count] - cmp ebx, 2 - je @@ShortCutBwd_ExchangeLoop_Entry - - sub ebx, 3 - or ebx, 1 - lea ebx, [esi + ebx * 4] - - cmp esi, ebx - jae @@Exit - - nop - nop - - @@ShortCutBwd_CompareLoop: - { if Compare(pLeft^, pRight^) <= 0 then begin } - mov eax, [ebx] - mov edx, [ebx + SizeOfPointer] - call ebp - test eax, eax - { if any element didn't fit, do a full merge } - jl @@ShortCutBwd_Error - - { Inc(pLeft, 2); } - sub ebx, SizeOf2Pointer - - { until pLeft+1 >= pListEnd } - cmp esi, ebx - jb @@ShortCutBwd_CompareLoop - - @@ShortCutBwd_ExchangeLoop_Entry: - mov esi, [esp+A] - mov ebx, [esp + Count] - sub ebx, 1 - lea ebx, [esi + ebx * 4] - - @@ShortCutBwd_ExchangeLoop: - mov eax, [esi] - mov edx, [ebx] - mov [ebx], eax - mov [esi], edx - - add esi, SizeOfPointer - sub ebx, SizeOfPointer - - cmp esi, ebx - jb @@ShortCutBwd_ExchangeLoop - - jmp @@Exit - - nop - nop - nop - nop - nop - nop - nop - nop - nop - - @@ShortCutBwd_Error: - - { T := A; } - mov eax, [esp+A] - { A := B; } - mov edx, [esp+B] - mov [esp+A], edx - { B := T; } - mov [esp+B], eax - - jmp @@SmallRuns_Entry - - {======== small runs ====================================================} - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - - @@SmallRuns_Entry: - { SegmentSize := 2; } - mov eax, 2 - mov dword ptr [esp+SegmentSize], eax - - nop - nop - nop - nop - nop - nop - nop - @@SmallRuns_OuterLoop_Entry: - mov ebp, [esp + Compare] - @@SmallRuns_OuterLoop: // requires SegmentSize in eax - { pBuffer := @b; } - mov edi, [esp+B] - { pLeft := @a; } - mov esi, [esp+A] - { pRight := @a[SegmentSize]; } - lea ebx, [esi+eax*SizeOfPointer] - { pLeftEnd := pRight; } - mov [esp+pLeftEnd], ebx - { pListEnd := @a[Count]; } - mov edx, [esp+Count] - lea edx, [esi+ edx*SizeOfPointer] - mov [esp+pListEnd], edx - { pRightEnd := @a[SegmentSize + SegmentSize]; } - lea eax, [ebx+eax*SizeOfPointer] - mov [esp+pRightEnd], eax - - jmp @@SmallRuns_InnerLoopEntry //requires pRightEnd in eax and pListEnd in edx - - nop - nop - nop - nop - nop - nop - nop - nop - nop - - @@SmallRuns_InnerLoopSetRightEnd: - { pRightEnd := pListEnd; } - mov [esp+pRightEnd], edx - - @@SmallRuns_InnerLoop: - @@SmallRuns_CompareLoop: - { if Compare(pLeft^, pRight^) <= 0 then begin } - mov edx, [ebx] - mov eax, [esi] - call ebp - test eax, eax - jg @@SmallRuns_MergeFromRight - - @@SmallRuns_MergeFromLeft: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { if Cardinal(pLeft) >= Cardinal(pLeftEnd) then begin } - cmp esi, [esp+pLeftEnd] - jb @@SmallRuns_CompareLoop - - nop - nop - - @@SmallRuns_CopyRemainingFromRight_Entry: - mov edx, [esp+pRightEnd] //used in CopyRemainingFromRight - @@SmallRuns_CopyRemainingFromRight: - { pBuffer^ := pRight^; } - mov eax, [ebx] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pRight); } - add ebx, SizeOfPointer - { while Cardinal(pRight) < Cardinal(pRightEnd) do begin } - cmp ebx, edx - jb @@SmallRuns_CopyRemainingFromRight - { Break; } - jmp @@SmallRuns_BreakOutOfCompareLoop - - @@SmallRuns_MergeBoth: - { pBuffer^ := pRight^; } - mov eax, [esi] - mov [edi], eax - mov eax, [ebx] - mov [edi + SizeOfPointer], eax - { Inc(pBuffer); } - add edi, SizeOf2Pointer - { Inc(pRight); } - add ebx, SizeOfPointer - add esi, SizeOfPointer - - cmp esi, [esp+pLeftEnd] - jae @@SmallRuns_LeftDone - - cmp ebx, [esp+pRightEnd] - jb @@SmallRuns_CompareLoop - jmp @@SmallRuns_CopyRemainingFromLeft_Entry - - @@SmallRuns_LeftDone: - cmp ebx, [esp+pRightEnd] - jb @@SmallRuns_CopyRemainingFromRight_Entry - jmp @@SmallRuns_BreakOutOfCompareLoop - - @@SmallRuns_MergeFromRight: - { pBuffer^ := pRight^; } - mov eax, [ebx] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pRight); } - add ebx, SizeOfPointer - { if Cardinal(pRight) >= Cardinal(pRightEnd) then begin } - cmp ebx, [esp+pRightEnd] - jb @@SmallRuns_CompareLoop - - @@SmallRuns_CopyRemainingFromLeft_Entry: - mov edx, [esp+pLeftEnd] // used in CopyRemainingFromLeft - @@SmallRuns_CopyRemainingFromLeft: - - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { while Cardinal(pLeft) < Cardinal(pLeftEnd) do begin } - cmp esi, edx - jb @@SmallRuns_CopyRemainingFromLeft - - @@SmallRuns_BreakOutOfCompareLoop: - { Inc(pLeft, SegmentSize); } - mov eax, [esp+SegmentSize] - shl eax, 02h - add esi, eax - { Inc(pRight, SegmentSize); } - add ebx, eax - { pLeftEnd := pRight; } - mov [esp+pLeftEnd], ebx - { Inc(pRightEnd, SegmentSize + SegmentSize); } - lea eax, [ebx + eax] - mov [esp+pRightEnd], eax - - mov edx, [esp+pListEnd] - @@SmallRuns_InnerLoopEntry: //requires pRightEnd in eax and pListEnd in edx - { while Cardinal(pRightEnd) <= Cardinal(pListEnd) do begin } - cmp eax, edx - jbe @@SmallRuns_InnerLoop - - { if Cardinal(pLeft) < Cardinal(pListEnd) then begin } - cmp edx, esi - jbe @@SmallRuns_NoRemaining - { if Cardinal(pRight) < Cardinal(pListEnd) then begin } - cmp edx, ebx - ja @@SmallRuns_InnerLoopSetRightEnd - - @@SmallRuns_CopyRemaining: - - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { while Cardinal(pLeft) < Cardinal(pListEnd) do begin } - cmp esi, edx - jb @@SmallRuns_CopyRemaining - - @@SmallRuns_NoRemaining: - { T := A; } - mov eax, [esp+A] - { A := B; } - mov edx, [esp+B] - mov [esp+A], edx - { B := T; } - mov [esp+B], eax - { SegmentSize := SegmentSize shl 1; } - mov eax, [esp+SegmentSize] - shl eax, 1 - mov [esp+SegmentSize], eax - { while SegmentSize < Count do begin } - cmp eax, [esp+Count] - jge @@Exit - - cmp eax, 128 - jne @@SmallRuns_OuterLoop // requires SegmentSize in eax - - {======== large runs ====================================================} - @@LargeRuns_OuterLoop: // requires SegmentSize in eax - { pBuffer := @b; } - mov edi, [esp+B] - { pLeft := @a; } - mov esi, [esp+A] - { pRight := @a[SegmentSize]; } - lea ebx, [esi+eax*SizeOfPointer] - { pLeftEnd := pRight; } - mov [esp+pLeftEnd], ebx - { pListEnd := @a[Count]; } - mov edx, [esp+Count] - lea edx, [esi+ edx*SizeOfPointer] - mov [esp+pListEnd], edx - { pRightEnd := @a[SegmentSize + SegmentSize]; } - lea eax, [ebx+eax*SizeOfPointer] - mov [esp+pRightEnd], eax - mov [esp+pNextLeft], eax - - mov [esp+SavedCompares], 0 - - jmp @@LargeRuns_InnerLoopEntry //requires pRightEnd in eax and pListEnd in edx - - nop - nop - nop - - @@LargeRuns_InnerLoopSetRightEnd: - { pRightEnd := pListEnd; } - mov [esp+pRightEnd], edx - mov [esp+pNextLeft], edx - - @@LargeRuns_InnerLoop: - - { Compare(pLeft^, pRight^) } - mov edx, [ebx] - mov eax, [esi] - call [esp+Compare] - test eax, eax - { if equal -> perfect overlap, copy both, no need to waste a comparison... } - je @@LargeRuns_CopyBoth - - mov edx, [esp+pLeftEnd] - jl @@LargeRuns_MoveFromLeft // requires LeftEnd in edx - - @@LargeRuns_SwitchLeftAndRight: - - { if greater -> right one is smaller } - - { move it over to the buffer, no need to waste a comparison} - mov ecx, [ebx] - mov [edi], ecx - add ebx, SizeOfPointer - add edi, SizeOfPointer - - { switch left and right } - xchg ebx, esi - - mov eax, [esp+pRightEnd] - mov [esp+pLeftEnd], eax - mov [esp+pRightEnd], edx - - { if we reached the end, copy the rest } - cmp esi, eax - jae @@LargeRuns_CopyRemainingFromRight_Entry - - mov edx, eax - jmp @@LargeRuns_CompareLeftEndAndRight - - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - - @@LargeRuns_MoveFromLeft: // requires LeftEnd in edx - - { if lesser -> left one is smaller} - - { move it over to the buffer, no need to waste a comparison} - mov ecx, [esi] - mov [edi], ecx - add esi, SizeOfPointer - add edi, SizeOfPointer - - { if we reached the end, copy the rest } - cmp esi, edx{LeftEnd} - jae @@LargeRuns_CopyRemainingFromRight_Entry - - @@LargeRuns_CompareLeftEndAndRight: // requires LeftEnd in edx - - sub edx, SizeOfPointer - mov eax, [edx] - mov edx, [ebx] - call [esp+Compare] - test eax, eax - jg @@LargeRuns_BinarySearchLeft_Entry - - { LeftEnd <= Right, no need to continue merging, just copy and get out of here } - - { first copy just left } - mov eax, esi - mov edx, edi - mov ecx, [esp+pLeftEnd] - sub ecx, eax - add edi, ecx - add [esp+SavedCompares], ecx - call [wbMove] - - { then copy just right } - mov eax, ebx - mov edx, edi - mov ecx, [esp+pRightEnd] - sub ecx, eax - add edi, ecx - add [esp+SavedCompares], ecx - call [wbMove] - - { we are done here } - jmp @@LargeRuns_BreakOutOfCompareLoop - - nop - nop - nop - nop - nop - nop - - @@LargeRuns_CopyBoth: - mov eax, [ebx] - mov [edi], eax - mov eax, [esi] - mov [edi + SizeOfPointer], eax - - add ebx, SizeOfPointer - add esi, SizeOfPointer - add edi, SizeOf2Pointer - - cmp esi, [esp+pLeftEnd] - jae @@LargeRuns_CopyRemainingFromRight_Entry - cmp ebx, [esp+pRightEnd] - jae @@LargeRuns_CopyRemainingFromLeft_Entry - - jmp @@LargeRuns_InnerLoop - - nop - nop - nop - nop - nop - - @@LargeRuns_BinarySearchLeft_Entry: - { save our old Left } - mov [esp+Temp], esi - { save our old Buffer } - mov [esp+Temp2], edi - - mov edi, [esp+pLeftEnd] - sub edi, SizeOfPointer - - { we start with esi = Low and edi = High} - - nop - - @@LargeRuns_BinarySearchLeft_Loop: - { calculate the middle into ebp } - mov ebp, edi - sub ebp, esi - shr ebp, 3 - - lea ebp, [esi + ebp *4]; - - { compare middle with Right} - mov eax, [ebp] - mov edx, [ebx] - sub [esp+SavedCompares], 4 - call [esp+Compare] - test eax, eax - jg @@LargeRuns_BinarySearchLeft_Greater - - @@LargeRuns_BinarySearchLeft_LesserOrEqual: - { move the lower bound } - lea esi, [ebp + SizeOfPointer] - - cmp esi, edi - jbe @@LargeRuns_BinarySearchLeft_Loop - jmp @@LargeRuns_BinarySearchLeft_Exit - - @@LargeRuns_BinarySearchLeft_Greater: - { mov the higher bound } - lea edi, [ebp - SizeOfPointer] - - cmp esi, edi - jbe @@LargeRuns_BinarySearchLeft_Loop - jmp @@LargeRuns_BinarySearchLeft_Exit - - nop - nop - nop - nop - nop - nop - nop - - @@LargeRuns_BinarySearchLeft_Exit: - { edi is pointing to the last entry that's <= Right } - - { get our old left } - mov esi, [esp+Temp] - mov edx, edi - { restore Buffer} - mov edi, [esp+Temp2] - jmp @@LargeRuns_BinarySearchLeft_CopyLeadingLeft_Entry - - nop - nop - nop - nop - - @@LargeRuns_BinarySearchLeft_CopyLeadingLeft_Loop: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - add [esp+SavedCompares], 4 - { while Cardinal(pLeft) <= FoundItem do begin } - @@LargeRuns_BinarySearchLeft_CopyLeadingLeft_Entry: - cmp esi, edx - jbe @@LargeRuns_BinarySearchLeft_CopyLeadingLeft_Loop - - { we've copied all entries from Left that where <= Right } - - { are we done with Left? } - cmp esi, [esp+pLeftEnd] - jae @@LargeRuns_CopyRemainingFromRight_Entry - - { pBuffer^ := pRight^; } - mov eax, [ebx] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pRight); } - add ebx, SizeOfPointer - - { are we done with Right? } - cmp ebx, [esp+pRightEnd] - jae @@LargeRuns_CopyRemainingFromLeft_Entry - - { now we can start with the normal compare loop} - mov ebp, [esp+Compare] - - jmp @@LargeRuns_CompareLoop - - nop - nop - nop - nop - nop - nop - - @@LargeRuns_CompareLoop: - { if Compare(pLeft^, pRight^) <= 0 then begin } - mov edx, [ebx] - mov eax, [esi] - call ebp - test eax, eax - jg @@LargeRuns_MergeFromRight - - @@LargeRuns_MergeFromLeft: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { if Cardinal(pLeft) >= Cardinal(pLeftEnd) then begin } - cmp esi, [esp+pLeftEnd] - jb @@LargeRuns_CompareLoop - - nop - nop - - @@LargeRuns_CopyRemainingFromRight_Entry: - mov edx, [esp+pRightEnd] //used in CopyRemainingFromRight - @@LargeRuns_CopyRemainingFromRight: - { pBuffer^ := pRight^; } - mov eax, [ebx] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pRight); } - add ebx, SizeOfPointer - { while Cardinal(pRight) < Cardinal(pRightEnd) do begin } - cmp ebx, edx - jb @@LargeRuns_CopyRemainingFromRight - { Break; } - jmp @@LargeRuns_BreakOutOfCompareLoop - - @@LargeRuns_MergeFromRight: - { pBuffer^ := pRight^; } - mov eax, [ebx] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pRight); } - add ebx, SizeOfPointer - { if Cardinal(pRight) >= Cardinal(pRightEnd) then begin } - cmp ebx, [esp+pRightEnd] - jb @@LargeRuns_CompareLoop - - @@LargeRuns_CopyRemainingFromLeft_Entry: - mov edx, [esp+pLeftEnd] // used in CopyRemainingFromLeft - @@LargeRuns_CopyRemainingFromLeft: - - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { while Cardinal(pLeft) < Cardinal(pLeftEnd) do begin } - cmp esi, edx - jb @@LargeRuns_CopyRemainingFromLeft - - @@LargeRuns_BreakOutOfCompareLoop: - { Inc(pLeft, SegmentSize); } - mov eax, [esp+SegmentSize] - shl eax, 02h - - mov esi, [esp+pNextLeft] - { Inc(pRight, SegmentSize); } - lea ebx, [esi + eax] - { pLeftEnd := pRight; } - mov [esp+pLeftEnd], ebx - { Inc(pRightEnd, SegmentSize + SegmentSize); } - lea eax, [ebx + eax] - mov [esp+pRightEnd], eax - mov [esp+pNextLeft], eax - - mov edx, [esp+pListEnd] - @@LargeRuns_InnerLoopEntry: //requires pRightEnd in eax and pListEnd in edx - { while Cardinal(pRightEnd) <= Cardinal(pListEnd) do begin } - cmp eax, edx - jbe @@LargeRuns_InnerLoop - - { if Cardinal(pLeft) < Cardinal(pListEnd) then begin } - cmp edx, esi - jbe @@LargeRuns_NoRemaining - { if Cardinal(pRight) < Cardinal(pListEnd) then begin } - cmp edx, ebx - ja @@LargeRuns_InnerLoopSetRightEnd - - @@LargeRuns_CopyRemaining: - { pBuffer^ := pLeft^; } - mov eax, [esi] - mov [edi], eax - { Inc(pBuffer); } - add edi, SizeOfPointer - { Inc(pLeft); } - add esi, SizeOfPointer - { while Cardinal(pLeft) < Cardinal(pListEnd) do begin } - cmp esi, edx - jb @@LargeRuns_CopyRemaining - - @@LargeRuns_NoRemaining: - { T := A; } - mov eax, [esp+A] - { A := B; } - mov edx, [esp+B] - mov [esp+A], edx - { B := T; } - mov [esp+B], eax - { SegmentSize := SegmentSize shl 1; } - mov eax, [esp+SegmentSize] - shl eax, 1 - mov [esp+SegmentSize], eax - { while SegmentSize < Count do begin } - mov edx, [esp+Count] - cmp eax, edx - jge @@Exit - - cmp [esp+SavedCompares], edx - jl @@SmallRuns_OuterLoop_Entry - - jmp @@LargeRuns_OuterLoop // requires SegmentSize in eax - - @@Exit: - { Result := A; } - mov eax, [esp+A] - - { end; } - mov edi, [esp + 00] - mov esi, [esp + 08] - mov ebx, [esp + 04] - - add esp, EspOffset -end; - - -procedure wbMergeSort(aList: Pointer; aCount: Integer; aCompare: TListSortCompare); - - procedure UseStackBufferLarge; - var - Buffer: array[0..Pred(4 * 1024)] of Pointer; - begin - if wbMergeSortInternal(aList, @Buffer[0], aCount, aCompare) <> aList then - Move(Buffer, aList^, aCount * SizeOf(Pointer) ); - end; - - procedure UseStackBufferSmall; - var - Buffer: array[0..Pred(1024)] of Pointer; - begin - if wbMergeSortInternal(aList, @Buffer[0], aCount, aCompare) <> aList then - Move(Buffer, aList^, aCount * SizeOf(Pointer) ); - end; - -var - Buffer: Pointer; -begin - if (aCount < 2) or (not Assigned(aList)) then - Exit; - - if aCount > 4 * 1024 then begin - GetMem(Buffer, aCount * SizeOf(Pointer)); - if wbMergeSortInternal(aList, Buffer, aCount, aCompare) <> aList then - Move(Buffer^, aList^, aCount * SizeOf(Pointer)); - FreeMem(Buffer); - end else if aCount > 1024 then - UseStackBufferLarge - else - UseStackBufferSmall; - -end; -{$ENDIF WIN32} - -{$IFDEF WIN64} -procedure InsertionSort(aList: PwbPointerArray; left, right: integer; aCompare: TListSortCompare); -var - i: Integer; - j: integer; - temp: Pointer; -begin - for i := Succ(left) to right do begin - j := i; - temp := aList[j]; - while (j > left) AND (aCompare(temp, aList[Pred(j)]) < 0) do begin - aList[j] := aList[Pred(j)]; - dec(j); - end; - aList[j] := temp; - end; -end; - -procedure MergeSort(ptrList: PwbPointerArray; left: Integer; right: Integer; aCompare: TListSortCompare; Buffer: PwbPointerArray); -var - i, j, k, mid, aCount: Integer; -begin - mid := (left + right) div 2; - if (left < mid) then begin - if (mid - left) <= MIN_SIZE then begin - InsertionSort(ptrList, left, mid, aCompare) - end - else begin - MergeSort(ptrList, left, mid, aCompare, Buffer); - end; - end; - if (succ(mid) < right) then begin - if (right - succ(mid)) <= MIN_SIZE then begin - InsertionSort(ptrList, succ(mid), right, aCompare); - end - else begin - MergeSort(ptrList, succ(mid), right, aCompare, Buffer); - end; - end; - if aCompare(ptrList[mid], ptrList[Succ(mid)]) < 0 then - exit; - aCount := succ(mid - left); - Move(ptrList[left], Buffer[0], aCount * SizeOf(Pointer)); - i := 0; - j := succ(mid); - k := left; - while (i < aCount) and (j <= right) do begin - if (aCompare(Buffer[i], ptrList[j]) <= 0) then begin - ptrList[k] := Buffer[i]; - inc(i); - end else begin - ptrList[k] := ptrList[j]; - inc(j); - end; - inc(k); - end; - if (i < aCount) then begin - Move(Buffer[i], ptrList[k], (aCount - i) * SizeOf(Pointer)); - end; -end; - -procedure wbMergeSort(aList: Pointer; aCount: Integer; aCompare: TListSortCompare); -var - Buffer: Pointer; -begin - if (aCount < 2) or (not Assigned(aList)) then - Exit; - if aCount <= MIN_SIZE then begin - InsertionSort(aList, 0, Pred(aCount), aCompare); - end - else begin - GetMem(Buffer, aCount * SizeOf(Pointer)); - MergeSort(aList, 0, Pred(aCount), aCompare, Buffer); - FreeMem(Buffer, aCount * SizeOf(Pointer)); - end; -end; -{$ENDIF WIN64} - -initialization - wbMove := @Move; -finalization -end. - diff --git a/lib/xedit/wbStreams.pas b/lib/xedit/wbStreams.pas deleted file mode 100644 index 0245e36..0000000 --- a/lib/xedit/wbStreams.pas +++ /dev/null @@ -1,617 +0,0 @@ -{******************************************************************************* - - The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - -*******************************************************************************} - -unit wbStreams; - -{$I wbDefines.inc} - -interface - -uses - SysUtils, Math, Classes, Windows, - wbInterface; - -type - TwbBaseCachedFileStreamClass = class of TwbBaseCachedFileStream; - TwbBaseCachedFileStream = class(TStream) - private - function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; - function _AddRef: Integer; stdcall; - function _Release: Integer; stdcall; - protected - FHandle: THandle; - FOwnsHandle: Boolean; - FCache: PByte; - FCacheSize: Integer; - FPosition: Int64;//the current position in the file (relative to the beginning of the file) - FCacheStart: Int64;//the postion in the file of the start of the cache (relative to the beginning of the file) - FCacheEnd: Int64;//the postion in the file of the end of the cache (relative to the beginning of the file) - FFileName: string; - FLastError: DWORD; - procedure HandleError(const Msg: string); - procedure RaiseSystemError(const Msg: string; LastError: DWORD); overload; - procedure RaiseSystemError(const Msg: string); overload; - procedure RaiseSystemErrorFmt(const Msg: string; const Args: array of const); - function CreateHandle(FlagsAndAttributes: DWORD): THandle; virtual; abstract; - function GetFileSize: Int64; virtual; - procedure SetSize(NewSize: Longint); override; - procedure SetSize(const NewSize: Int64); override; - function FileRead(var Buffer; Count: Longword): Integer; - function FileWrite(const Buffer; Count: Longword): Integer; - function FileSeek(const Offset: Int64; Origin: TSeekOrigin): Int64; - public - constructor Create(const FileName: string); overload; - constructor Create(const FileName: string; CacheSize: Integer); overload; - constructor Create(const FileName: string; CacheSize: Integer; Handle: THandle); overload; virtual; - destructor Destroy; override; - property CacheSize: Integer read FCacheSize; - function Read(var Buffer; Count: Longint): Longint; override; - function Write(const Buffer; Count: Longint): Longint; override; - function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; - - function ReadSignature: TwbSignature; inline; - function ReadByte: Byte; inline; - function ReadWord: Word; inline; - function ReadCardinal: Cardinal; inline; - function ReadInt64: Int64; inline; - function ReadStringLen(Term: Boolean = True): string; inline; - function ReadStringLen16: string; inline; - function ReadStringTerm: string; inline; - - procedure WriteCardinal(aCardinal: Cardinal); inline; - procedure WriteSmallInt(aSmallInt: SmallInt); inline; - end; - - IDisableStreamReadCache = interface - ['{0B6D0004-88D1-42D5-BC0F-447911C0FC21}'] - procedure DisableStreamReadCache; - procedure EnableStreamReadCache; - end; - - TwbReadOnlyCachedFileStream = class(TwbBaseCachedFileStream, IDisableStreamReadCache) - (* This class works by filling the cache each time a call to Read is made and - FPosition is outside the existing cache. By filling the cache we mean - reading from the file into the temporary cache. Calls to Read when - FPosition is in the existing cache are then dealt with by filling the - buffer with bytes from the cache. - *) - private - FUseAlignedCache: Boolean; - FViewStart: Int64; - FViewLength: Int64; - FDisableStreamReadCacheRefCount: Integer; - procedure DisableStreamReadCache; - procedure EnableStreamReadCache; - procedure FlushCache; - protected - function CreateHandle(FlagsAndAttributes: DWORD): THandle; override; - function GetFileSize: Int64; override; - public - constructor Create(const FileName: string; CacheSize: Integer; Handle: THandle); overload; override; - property UseAlignedCache: Boolean read FUseAlignedCache write FUseAlignedCache; - function Read(var Buffer; Count: Longint): Longint; override; - procedure SetViewWindow(const ViewStart, ViewLength: Int64); - end; - - TwbWriteCachedFileStream = class(TwbBaseCachedFileStream, IDisableStreamReadCache) - (* This class works by caching calls to Write. By this we mean temporarily - storing the bytes to be written in the cache. As each call to Write is - processed the cache grows. The cache is written to file when: - 1. A call to Write is made when the cache is full. - 2. A call to Write is made and FPosition is outside the cache (this - must be as a result of a call to Seek). - 3. The class is destroyed. - - Note that data can be read from these streams but the reading is not - cached and in fact a read operation will flush the cache before - attempting to read the data. - *) - private - FFileSize: Int64; - FReadStream: TwbReadOnlyCachedFileStream; - FReadStreamCacheSize: Integer; - FReadStreamUseAlignedCache: Boolean; - procedure DisableStreamReadCache; - procedure EnableStreamReadCache; - procedure CreateReadStream; - procedure FlushCache; - protected - function CreateHandle(FlagsAndAttributes: DWORD): THandle; override; - function GetFileSize: Int64; override; - public - constructor Create(const FileName: string; CacheSize, ReadStreamCacheSize: Integer; ReadStreamUseAlignedCache: Boolean); overload; - destructor Destroy; override; - function Read(var Buffer; Count: Longint): Longint; override; - function Write(const Buffer; Count: Longint): Longint; override; - end; - - { - TwbFileStream = class(TFileStream) - function Duplicate: TwbFileStream; - end; - } - -implementation - -function GetFileSizeEx(hFile: THandle; var FileSize: Int64): BOOL; stdcall; external kernel32; -function SetFilePointerEx(hFile: THandle; DistanceToMove: Int64; lpNewFilePointer: PInt64; dwMoveMethod: DWORD): BOOL; stdcall; external kernel32; - -{ TwbBaseCachedFileStream } - -constructor TwbBaseCachedFileStream.Create(const FileName: string); -begin - Create(FileName, 0); -end; - -constructor TwbBaseCachedFileStream.Create(const FileName: string; CacheSize: Integer); -begin - Create(FileName, CacheSize, 0); -end; - -constructor TwbBaseCachedFileStream.Create(const FileName: string; CacheSize: Integer; Handle: THandle); -const - DefaultCacheSize = 16*1024; - //16kb - this was chosen empirically - don't make it too large otherwise the progress report is 'jerky' -begin - inherited Create; - FFileName := FileName; - FOwnsHandle := Handle=0; - if FOwnsHandle then begin - FHandle := CreateHandle(FILE_ATTRIBUTE_NORMAL); - end else begin - FHandle := Handle; - end; - FCacheSize := CacheSize; - if FCacheSize<=0 then begin - FCacheSize := DefaultCacheSize; - end; - GetMem(FCache, FCacheSize); -end; - -destructor TwbBaseCachedFileStream.Destroy; -begin - FreeMem(FCache); - if FOwnsHandle and (FHandle<>0) then begin - CloseHandle(FHandle); - end; - inherited; -end; - -function TwbBaseCachedFileStream.QueryInterface(const IID: TGUID; out Obj): HResult; -begin - if GetInterface(IID, Obj) then begin - Result := S_OK; - end else begin - Result := E_NOINTERFACE; - end; -end; - -function TwbBaseCachedFileStream._AddRef: Integer; -begin - Result := -1; -end; - -function TwbBaseCachedFileStream._Release: Integer; -begin - Result := -1; -end; - -procedure TwbBaseCachedFileStream.HandleError(const Msg: string); -begin - if FLastError<>0 then begin - RaiseSystemError(Msg, FLastError); - end; -end; - -procedure TwbBaseCachedFileStream.RaiseSystemError(const Msg: string; LastError: DWORD); -begin - raise EStreamError.Create(Trim(Msg+' ')+SysErrorMessage(LastError)); -end; - -procedure TwbBaseCachedFileStream.RaiseSystemError(const Msg: string); -begin - RaiseSystemError(Msg, GetLastError); -end; - -procedure TwbBaseCachedFileStream.RaiseSystemErrorFmt(const Msg: string; const Args: array of const); -begin - RaiseSystemError(Format(Msg, Args)); -end; - -function TwbBaseCachedFileStream.GetFileSize: Int64; -begin - if not GetFileSizeEx(FHandle, Result) then begin - RaiseSystemErrorFmt('GetFileSizeEx failed for %s.', [FFileName]); - end; -end; - -procedure TwbBaseCachedFileStream.SetSize(NewSize: Longint); -begin - SetSize(Int64(NewSize)); -end; - -procedure TwbBaseCachedFileStream.SetSize(const NewSize: Int64); -begin - Seek(NewSize, soBeginning); - if not Windows.SetEndOfFile(FHandle) then begin - RaiseSystemErrorFmt('SetEndOfFile for %s.', [FFileName]); - end; -end; - -function TwbBaseCachedFileStream.FileRead(var Buffer; Count: Longword): Integer; -begin - if Windows.ReadFile(FHandle, Buffer, Count, LongWord(Result), nil) then begin - FLastError := 0; - end else begin - FLastError := GetLastError; - Result := -1; - end; -end; - -function TwbBaseCachedFileStream.FileWrite(const Buffer; Count: Longword): Integer; -begin - if Windows.WriteFile(FHandle, Buffer, Count, LongWord(Result), nil) then begin - FLastError := 0; - end else begin - FLastError := GetLastError; - Result := -1; - end; -end; - -function TwbBaseCachedFileStream.FileSeek(const Offset: Int64; Origin: TSeekOrigin): Int64; -begin - if not SetFilePointerEx(FHandle, Offset, @Result, ord(Origin)) then begin - RaiseSystemErrorFmt('SetFilePointerEx failed for %s.', [FFileName]); - end; -end; - -function TwbBaseCachedFileStream.Read(var Buffer; Count: Integer): Longint; -begin - raise EAssertionFailed.Create('Cannot read from this stream'); -end; - -function TwbBaseCachedFileStream.ReadCardinal: Cardinal; -begin - ReadBuffer(Result, SizeOf(Result)); -end; - -function TwbBaseCachedFileStream.ReadInt64: Int64; -begin - ReadBuffer(Result, SizeOf(Result)); -end; - -function TwbBaseCachedFileStream.ReadSignature: TwbSignature; -begin - ReadBuffer(Result, SizeOf(Result)); -end; - -function TwbBaseCachedFileStream.ReadByte: Byte; -begin - ReadBuffer(Result, SizeOf(Result)); -end; - -function TwbBaseCachedFileStream.ReadWord: Word; -begin - ReadBuffer(Result, SizeOf(Result)); -end; - -function TwbBaseCachedFileStream.ReadStringLen(Term: Boolean = True): string; -var - Len : Byte; - s : AnsiString; -begin - ReadBuffer(Len, 1); - SetLength(s, Len); - if Len > 0 then begin - ReadBuffer(s[1], Len); - if Term then - SetLength(s, Pred(Length(s))); - end; - Result := s; -end; - -function TwbBaseCachedFileStream.ReadStringLen16: string; -var - Len : Word; - s : AnsiString; -begin - ReadBuffer(Len, 2); - SetLength(s, Len); - if Len > 0 then - ReadBuffer(s[1], Len); - Result := s; -end; - -function TwbBaseCachedFileStream.ReadStringTerm: string; -var - i: Integer; - s: AnsiString; -begin - if (FCacheEnd - FPosition >= 256) and (FCacheStart >= FPosition) then begin - s := PAnsiChar(@FCache[FPosition - FCacheStart]); - Inc(FPosition, Succ(Length(s))); - end else begin - SetLength(s, 256); - i := 0; - repeat - Inc(i); - ReadBuffer(s[i], 1); - until s[i] = #0; - SetLength(s, Pred(i)); - end; - Result := s; -end; - -function TwbBaseCachedFileStream.Write(const Buffer; Count: Integer): Longint; -begin - raise EAssertionFailed.Create('Cannot write to this stream'); -end; - -procedure TwbBaseCachedFileStream.WriteCardinal(aCardinal: Cardinal); -begin - WriteBuffer(aCardinal, SizeOf(aCardinal)); -end; - -procedure TwbBaseCachedFileStream.WriteSmallInt(aSmallInt: SmallInt); -begin - WriteBuffer(aSmallInt, SizeOf(aSmallInt)); -end; - -function TwbBaseCachedFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; -//Set FPosition to the value specified - if this has implications for the -//cache then overriden Write and Read methods must deal with those. -begin - case Origin of - soBeginning: - FPosition := Offset; - soEnd: - FPosition := GetFileSize+Offset; - soCurrent: - inc(FPosition, Offset); - end; - Result := FPosition; -end; - -{ TwbReadOnlyCachedFileStream } - -constructor TwbReadOnlyCachedFileStream.Create(const FileName: string; CacheSize: Integer; Handle: THandle); -begin - inherited; - SetViewWindow(0, inherited GetFileSize); -end; - -function TwbReadOnlyCachedFileStream.CreateHandle(FlagsAndAttributes: DWORD): THandle; -begin - Result := Windows.CreateFile( - PChar(FFileName), - GENERIC_READ, - FILE_SHARE_READ, - nil, - OPEN_EXISTING, - FlagsAndAttributes, - 0 - ); - if Result=INVALID_HANDLE_VALUE then begin - RaiseSystemErrorFmt('Cannot open %s.', [FFileName]); - end; -end; - -procedure TwbReadOnlyCachedFileStream.DisableStreamReadCache; -begin - inc(FDisableStreamReadCacheRefCount); -end; - -procedure TwbReadOnlyCachedFileStream.EnableStreamReadCache; -begin - dec(FDisableStreamReadCacheRefCount); -end; - -procedure TwbReadOnlyCachedFileStream.FlushCache; -begin - FCacheStart := 0; - FCacheEnd := 0; -end; - -function TwbReadOnlyCachedFileStream.GetFileSize: Int64; -begin - Result := FViewLength; -end; - -procedure TwbReadOnlyCachedFileStream.SetViewWindow(const ViewStart, ViewLength: Int64); -begin - if ViewStart<0 then begin - raise EAssertionFailed.Create('Invalid view window'); - end; - if (ViewStart+ViewLength)>inherited GetFileSize then begin - raise EAssertionFailed.Create('Invalid view window'); - end; - FViewStart := ViewStart; - FViewLength := ViewLength; - FPosition := 0; - FCacheStart := 0; - FCacheEnd := 0; -end; - -function TwbReadOnlyCachedFileStream.Read(var Buffer; Count: Longint): Longint; -var - NumOfBytesToCopy, NumOfBytesLeft, NumOfBytesRead: Longint; - CachePtr, BufferPtr: PByte; -begin - if (FDisableStreamReadCacheRefCount>0) or (Count > FCacheSize) then begin - FileSeek(FPosition+FViewStart, soBeginning); - Result := FileRead(Buffer, Count); - if Result=-1 then begin - Result := 0;//contract is to return number of bytes that were read - end; - inc(FPosition, Result); - end else begin - Result := 0; - NumOfBytesLeft := Count; - BufferPtr := @Buffer; - while NumOfBytesLeft>0 do begin - if (FPosition=FCacheEnd) then begin - //the current position is not available in the cache so we need to re-fill the cache - FCacheStart := FPosition; - if UseAlignedCache then begin - FCacheStart := FCacheStart - (FCacheStart mod CacheSize); - end; - FileSeek(FCacheStart+FViewStart, soBeginning); - NumOfBytesRead := FileRead(FCache^, CacheSize); - if NumOfBytesRead=-1 then begin - exit; - end; - Assert(NumOfBytesRead>=0); - FCacheEnd := FCacheStart+NumOfBytesRead; - if NumOfBytesRead=0 then begin - FLastError := ERROR_HANDLE_EOF;//must be at the end of the file - break; - end; - end; - - //read from cache to Buffer - NumOfBytesToCopy := Min(FCacheEnd-FPosition, NumOfBytesLeft); - CachePtr := FCache; - inc(CachePtr, FPosition-FCacheStart); - Move(CachePtr^, BufferPtr^, NumOfBytesToCopy); - inc(Result, NumOfBytesToCopy); - inc(FPosition, NumOfBytesToCopy); - inc(BufferPtr, NumOfBytesToCopy); - dec(NumOfBytesLeft, NumOfBytesToCopy); - end; - end; -end; - -{ TwbWriteCachedFileStream } - -constructor TwbWriteCachedFileStream.Create(const FileName: string; CacheSize, ReadStreamCacheSize: Integer; ReadStreamUseAlignedCache: Boolean); -begin - inherited Create(FileName, CacheSize); - FReadStreamCacheSize := ReadStreamCacheSize; - FReadStreamUseAlignedCache := ReadStreamUseAlignedCache; -end; - -destructor TwbWriteCachedFileStream.Destroy; -begin - FlushCache;//make sure that the final calls to Write get recorded in the file - FreeAndNil(FReadStream); - inherited; -end; - -function TwbWriteCachedFileStream.CreateHandle(FlagsAndAttributes: DWORD): THandle; -begin - Result := Windows.CreateFile( - PChar(FFileName), - GENERIC_READ or GENERIC_WRITE, - 0, - nil, - CREATE_ALWAYS, - FlagsAndAttributes, - 0 - ); - if Result=INVALID_HANDLE_VALUE then begin - RaiseSystemErrorFmt('Cannot create %s.', [FFileName]); - end; -end; - -procedure TwbWriteCachedFileStream.DisableStreamReadCache; -begin - CreateReadStream; - FReadStream.DisableStreamReadCache; -end; - -procedure TwbWriteCachedFileStream.EnableStreamReadCache; -begin - Assert(Assigned(FReadStream)); - FReadStream.EnableStreamReadCache; -end; - -function TwbWriteCachedFileStream.GetFileSize: Int64; -begin - Result := FFileSize; -end; - -procedure TwbWriteCachedFileStream.CreateReadStream; -begin - if not Assigned(FReadStream) then begin - FReadStream := TwbReadOnlyCachedFileStream.Create(FFileName, FReadStreamCacheSize, FHandle); - FReadStream.UseAlignedCache := FReadStreamUseAlignedCache; - end; -end; - -procedure TwbWriteCachedFileStream.FlushCache; -var - NumOfBytesToWrite: Longint; -begin - if Assigned(FCache) then begin - NumOfBytesToWrite := FCacheEnd-FCacheStart; - if NumOfBytesToWrite>0 then begin - FileSeek(FCacheStart, soBeginning); - if FileWrite(FCache^, NumOfBytesToWrite)<>NumOfBytesToWrite then begin - RaiseSystemErrorFmt('FileWrite failed for %s.', [FFileName]); - end; - if Assigned(FReadStream) then begin - FReadStream.FlushCache; - end; - end; - FCacheStart := FPosition; - FCacheEnd := FPosition; - end; -end; - -function TwbWriteCachedFileStream.Read(var Buffer; Count: Integer): Longint; -begin - FlushCache; - CreateReadStream; - Assert(FReadStream.FViewStart=0); - if FReadStream.FViewLength<>FFileSize then begin - FReadStream.SetViewWindow(0, FFileSize); - end; - FReadStream.Position := FPosition; - Result := FReadStream.Read(Buffer, Count); - inc(FPosition, Result); -end; - -function TwbWriteCachedFileStream.Write(const Buffer; Count: Longint): Longint; -var - NumOfBytesToCopy, NumOfBytesLeft: Longint; - CachePtr, BufferPtr: PByte; -begin - Result := 0; - NumOfBytesLeft := Count; - BufferPtr := @Buffer; - while NumOfBytesLeft>0 do begin - if ((FPositionFCacheEnd))//the current position is outside the cache - or (FPosition-FCacheStart=FCacheSize)//the cache is full - then begin - FlushCache; - Assert(FCacheStart=FPosition); - end; - - //write from Buffer to the cache - NumOfBytesToCopy := Min(FCacheSize-(FPosition-FCacheStart), NumOfBytesLeft); - CachePtr := FCache; - inc(CachePtr, FPosition-FCacheStart); - Move(BufferPtr^, CachePtr^, NumOfBytesToCopy); - inc(Result, NumOfBytesToCopy); - inc(FPosition, NumOfBytesToCopy); - FCacheEnd := Max(FCacheEnd, FPosition); - inc(BufferPtr, NumOfBytesToCopy); - dec(NumOfBytesLeft, NumOfBytesToCopy); - end; - FFileSize := Max(FFileSize, FPosition); -end; - -initialization -finalization -end. diff --git a/lib/xedit/zlib/ZLibEx.inc b/lib/xedit/zlib/ZLibEx.inc deleted file mode 100644 index da56252..0000000 --- a/lib/xedit/zlib/ZLibEx.inc +++ /dev/null @@ -1,182 +0,0 @@ -{************************************************************************************************* -* ZLibEx.inc * -* copyright (c) 2006-2013 base2 technologies * -* * -* version information for delphi/c++ builder * -* * -* revision history * -* 2013.05.23 updated for delphi xe3 (2013) * -* 2012.05.01 updated for delphi xe2 (2012) * -* 2010.09.18 updated for delphi xe (2011) * -* 2010.01.27 updated for delphi 2010 * -* 2009.04.11 updated to use CONDITIONALEXPRESSIONS and CompilerVersion * -* 2009.01.28 updated for delphi 2009 * -* 2007.10.01 updated for delphi 2007 * -* 2005.11.29 created * -* * -* acknowledgments * -* iztok kacin * -* 2009.04.11 CONDITIONALEXPRESSIONS and CompilerVersion changes * -*************************************************************************************************} - -{$ifndef CONDITIONALEXPRESSIONS} - - {** delphi ************************************************************************************} - - {$ifdef VER80} // delphi 1 - {$define Delphi} - - {$define Version1} - {$endif} - - {$ifdef VER90} // delphi 2 - {$define Delphi} - - {$define Version2} - {$endif} - - {$ifdef VER100} // delphi 3 - {$define Delphi} - - {$define Version3} - {$endif} - - {$ifdef VER120} // delphi 4 - {$define Delphi} - - {$define Version4} - {$endif} - - {** c++ builder *******************************************************************************} - - {$ifdef VER93} // c++ builder 1 - {$define CBuilder} - - {$define Version1} - {$endif} - - {$ifdef VER110} // c++ builder 3 - {$define CBuilder} - - {$define Version3} - {$endif} - - {$ifdef VER125} // c++ builder 4 - {$define CBuilder} - - {$define Version4} - {$endif} - - {** delphi/c++ builder (common) ***************************************************************} - - {$ifdef VER130} // delphi/c++ builder 5 - {$ifdef BCB} - {$define CBuilder} - {$ELSE} - {$define Delphi} - {$endif} - - {$define Version5} - - {$define Version5Plus} - {$endif} - -{$ELSE} - - {$ifdef BCB} - {$define CBuilder} - {$ELSE} - {$define Delphi} - {$endif} - - {$define Version5Plus} - - {$if CompilerVersion >= 14.0} // delphi 6 - {$ifdef VER140} - {$define Version6} - {$endif} - - {$define Version6Plus} - {$ifend} - - {$if CompilerVersion >= 15.0} // delphi 7 - {$ifdef VER150} - {$define Version7} - {$endif} - - {$define Version7Plus} - {$ifend} - - {$if CompilerVersion >= 16.0} // delphi 8 (.net) - {$ifdef VER160} - {$define Version8} - {$endif} - - {$define Version8Plus} - {$ifend} - - {$if CompilerVersion >= 17.0} // delphi 2005 - {$ifdef VER170} - {$define Version2005} - {$endif} - - {$define Version2005Plus} - {$ifend} - - {$if CompilerVersion >= 18.0} // bds 2006 - {$ifdef VER180} - {$define Version2006} - {$endif} - - {$define Version2006Plus} - {$ifend} - - {$if CompilerVersion >= 18.5} // bds 2007 - {$ifdef VER185} - {$define Version2007} - {$endif} - - {$define Version2007Plus} - {$ifend} - - {$if CompilerVersion >= 20.0} // bds 2009 - {$ifdef VER200} - {$define Version2009} - {$endif} - - {$define Version2009Plus} - {$ifend} - - {$if CompilerVersion >= 21.0} // bds 2010 - {$ifdef VER210} - {$define Version2010} - {$endif} - - {$define Version2010Plus} - {$ifend} - - {$if CompilerVersion >= 22.0} // bds xe (2011) - {$ifdef VER220} - {$define Version2011} - {$endif} - - {$define Version2011Plus} - {$ifend} - - {$if CompilerVersion >= 23.0} // bds xe2 (2012) - {$ifdef VER230} - {$define Version2012} - {$endif} - - {$define Version2012Plus} - {$ifend} - - {$if CompilerVersion >= 24.0} // bds xe3 (2013) - {$ifdef VER240} - {$define Version2013} - {$endif} - - {$define Version2013Plus} - {$ifend} - -{$endif} diff --git a/lib/xedit/zlib/ZLibExApi.pas b/lib/xedit/zlib/ZLibExApi.pas deleted file mode 100644 index c4f5092..0000000 --- a/lib/xedit/zlib/ZLibExApi.pas +++ /dev/null @@ -1,338 +0,0 @@ -{************************************************************************************************* -* ZLibExApi.pas * -* * -* copyright (c) 2000-2013 base2 technologies * -* copyright (c) 1995-2002 Borland Software Corporation * -* * -* revision history * -* 2013.05.23 updated to zlib version 1.2.8 * -* 2012.05.21 updated for win64 (delphi xe2) * -* moved win32 obj files to win32 subfolder * -* changed win32 obj options to exclude the underscore * -* 2012.05.07 updated to zlib version 1.2.7 * -* 2012.03.05 udpated to zlib version 1.2.6 * -* 2010.04.20 updated to zlib version 1.2.5 * -* 2010.04.15 updated to zlib version 1.2.4 * -* 2005.07.25 updated to zlib version 1.2.3 * -* 2005.01.11 updated to zlib version 1.2.2 * -* 2004.01.06 updated to zlib version 1.2.1 * -* 2002.03.15 updated to zlib version 1.1.4 * -* * -* acknowledgments * -* burak kalayci * -* 2002.03.15 informing me about the zlib 1.1.4 update * -* 2004.01.06 informing me about the zlib 1.2.1 update * -* * -* vicente sanchez-alarcos * -* 2005.01.11 informing me about the zlib 1.2.2 update * -* * -* mathijs van veluw * -* 2005.07.25 informing me about the zlib 1.2.3 update * -* * -* tommi prami * -* 2012.03.05 informing me about the zlib 1.2.6 update * -* * -* marian pascalau * -* 2012.05.21 providing the win64 obj files and your win64 modifications * -* * -* roman ganz * -* 2013.05.23 informing me about the zlib 1.2.8 update * -*************************************************************************************************} - -unit ZLibExApi; - -interface - -{$I ZLibEx.inc} - -const - {** version ids *******************************************************************************} - - ZLIB_VERSION: PAnsiChar = '1.2.8'; - - ZLIB_VERNUM = $1280; - - ZLIB_VER_MAJOR = 1; - ZLIB_VER_MINOR = 2; - ZLIB_VER_REVISION = 8; - ZLIB_VER_SUBREVISION = 0; - - {** compression methods ***********************************************************************} - - Z_DEFLATED = 8; - - {** information flags *************************************************************************} - - Z_INFO_FLAG_SIZE = $1; - Z_INFO_FLAG_CRC = $2; - Z_INFO_FLAG_ADLER = $4; - - Z_INFO_NONE = 0; - Z_INFO_DEFAULT = Z_INFO_FLAG_SIZE or Z_INFO_FLAG_CRC; - - {** flush constants ***************************************************************************} - - Z_NO_FLUSH = 0; - Z_PARTIAL_FLUSH = 1; - Z_SYNC_FLUSH = 2; - Z_FULL_FLUSH = 3; - Z_FINISH = 4; - Z_BLOCK = 5; - Z_TREES = 6; - - {** return codes ******************************************************************************} - - Z_OK = 0; - Z_STREAM_END = 1; - Z_NEED_DICT = 2; - Z_ERRNO = (-1); - Z_STREAM_ERROR = (-2); - Z_DATA_ERROR = (-3); - Z_MEM_ERROR = (-4); - Z_BUF_ERROR = (-5); - Z_VERSION_ERROR = (-6); - - {** compression levels ************************************************************************} - - Z_NO_COMPRESSION = 0; - Z_BEST_SPEED = 1; - Z_BEST_COMPRESSION = 9; - Z_DEFAULT_COMPRESSION = (-1); - - {** compression strategies ********************************************************************} - - Z_FILTERED = 1; - Z_HUFFMAN_ONLY = 2; - Z_RLE = 3; - Z_FIXED = 4; - Z_DEFAULT_STRATEGY = 0; - - {** data types ********************************************************************************} - - Z_BINARY = 0; - Z_TEXT = 1; - Z_ASCII = Z_TEXT; - Z_UNKNOWN = 2; - - {** return code messages **********************************************************************} - - z_errmsg: Array [0..9] of String = ( - 'Need dictionary', // Z_NEED_DICT (2) - 'Stream end', // Z_STREAM_END (1) - 'OK', // Z_OK (0) - 'File error', // Z_ERRNO (-1) - 'Stream error', // Z_STREAM_ERROR (-2) - 'Data error', // Z_DATA_ERROR (-3) - 'Insufficient memory', // Z_MEM_ERROR (-4) - 'Buffer error', // Z_BUF_ERROR (-5) - 'Incompatible version', // Z_VERSION_ERROR (-6) - '' - ); - -type - TZAlloc = function (opaque: Pointer; items, size: Integer): Pointer; cdecl; - TZFree = procedure (opaque, block: Pointer); cdecl; - - {** TZStreamRec *******************************************************************************} - - TZStreamRec = packed record - next_in : PByte; // next input byte - avail_in : Cardinal; // number of bytes available at next_in - total_in : Longword; // total nb of input bytes read so far - - next_out : PByte; // next output byte should be put here - avail_out: Cardinal; // remaining free space at next_out - total_out: Longword; // total nb of bytes output so far - - msg : PAnsiChar; // last error message, NULL if no error - state : Pointer; // not visible by applications - - zalloc : TZAlloc; // used to allocate the internal state - zfree : TZFree; // used to free the internal state - opaque : Pointer; // private data object passed to zalloc and zfree - - data_type: Integer; // best guess about the data type: ascii or binary - adler : Longword; // adler32 value of the uncompressed data - reserved : Longword; // reserved for future use - end; - -{** macros **************************************************************************************} - -function deflateInit(var strm: TZStreamRec; level: Integer): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function deflateInit2(var strm: TZStreamRec; level, method, windowBits, - memLevel, strategy: Integer): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function inflateInit(var strm: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function inflateInit2(var strm: TZStreamRec; windowBits: Integer): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -{** external routines ***************************************************************************} - -function deflateInit_(var strm: TZStreamRec; level: Integer; - version: PAnsiChar; recsize: Integer): Integer; - -function deflateInit2_(var strm: TZStreamRec; level, method, windowBits, - memLevel, strategy: Integer; version: PAnsiChar; recsize: Integer): Integer; - -function deflate(var strm: TZStreamRec; flush: Integer): Integer; - -function deflateEnd(var strm: TZStreamRec): Integer; - -function deflateReset(var strm: TZStreamRec): Integer; - -function inflateInit_(var strm: TZStreamRec; version: PAnsiChar; - recsize: Integer): Integer; - -function inflateInit2_(var strm: TZStreamRec; windowBits: Integer; - version: PAnsiChar; recsize: Integer): Integer; - -function inflate(var strm: TZStreamRec; flush: Integer): Integer; - -function inflateEnd(var strm: TZStreamRec): Integer; - -function inflateReset(var strm: TZStreamRec): Integer; - -function adler32(adler: Longint; const buf; len: Integer): Longint; - -function crc32(crc: Longint; const buf; len: Integer): Longint; - -implementation - -{************************************************************************************************* -* link zlib code * -* * -* bcc32 flags * -* -c -O2 -Ve -X -pr -a8 -b -d -k- -vi -tWM -u- * -* * -* note: do not reorder the following -- doing so will result in external * -* functions being undefined * -*************************************************************************************************} - -{$ifdef WIN64} -{$L win64\deflate.obj} -{$L win64\inflate.obj} -{$L win64\inftrees.obj} -{$L win64\infback.obj} -{$L win64\inffast.obj} -{$L win64\trees.obj} -{$L win64\compress.obj} -{$L win64\adler32.obj} -{$L win64\crc32.obj} -{$else} -{$L win32\deflate.obj} -{$L win32\inflate.obj} -{$L win32\inftrees.obj} -{$L win32\infback.obj} -{$L win32\inffast.obj} -{$L win32\trees.obj} -{$L win32\compress.obj} -{$L win32\adler32.obj} -{$L win32\crc32.obj} -{$endif} - -{** macros **************************************************************************************} - -function deflateInit(var strm: TZStreamRec; level: Integer): Integer; -begin - result := deflateInit_(strm, level, ZLIB_VERSION, SizeOf(TZStreamRec)); -end; - -function deflateInit2(var strm: TZStreamRec; level, method, windowBits, - memLevel, strategy: Integer): Integer; -begin - result := deflateInit2_(strm, level, method, windowBits, - memLevel, strategy, ZLIB_VERSION, SizeOf(TZStreamRec)); -end; - -function inflateInit(var strm: TZStreamRec): Integer; -begin - result := inflateInit_(strm, ZLIB_VERSION, SizeOf(TZStreamRec)); -end; - -function inflateInit2(var strm: TZStreamRec; windowBits: Integer): Integer; -begin - result := inflateInit2_(strm, windowBits, ZLIB_VERSION, - SizeOf(TZStreamRec)); -end; - -{** external routines ***************************************************************************} - -function deflateInit_(var strm: TZStreamRec; level: Integer; - version: PAnsiChar; recsize: Integer): Integer; - external; - -function deflateInit2_(var strm: TZStreamRec; level, method, windowBits, - memLevel, strategy: Integer; version: PAnsiChar; recsize: Integer): Integer; - external; - -function deflate(var strm: TZStreamRec; flush: Integer): Integer; - external; - -function deflateEnd(var strm: TZStreamRec): Integer; - external; - -function deflateReset(var strm: TZStreamRec): Integer; - external; - -function inflateInit_(var strm: TZStreamRec; version: PAnsiChar; - recsize: Integer): Integer; - external; - -function inflateInit2_(var strm: TZStreamRec; windowBits: Integer; - version: PAnsiChar; recsize: Integer): Integer; - external; - -function inflate(var strm: TZStreamRec; flush: Integer): Integer; - external; - -function inflateEnd(var strm: TZStreamRec): Integer; - external; - -function inflateReset(var strm: TZStreamRec): Integer; - external; - -function adler32(adler: Longint; const buf; len: Integer): Longint; - external; - -function crc32(crc: Longint; const buf; len: Integer): Longint; - external; - -{** zlib function implementations ***************************************************************} - -function zcalloc(opaque: Pointer; items, size: Integer): Pointer; -begin - GetMem(result,items * size); -end; - -procedure zcfree(opaque, block: Pointer); -begin - FreeMem(block); -end; - -{** c function implementations ******************************************************************} - -function memset(p: Pointer; b: Byte; count: Integer): Pointer; cdecl; -begin - FillChar(p^, count, b); - - result := p; -end; - -procedure memcpy(dest, source: Pointer; count: Integer); cdecl; -begin - Move(source^, dest^, count); -end; - -{$ifndef WIN64} -procedure _llmod; -asm - jmp System.@_llmod; -end; -{$endif} - -end. diff --git a/lib/xedit/zlib/win32/adler32.obj b/lib/xedit/zlib/win32/adler32.obj deleted file mode 100644 index c786a46..0000000 Binary files a/lib/xedit/zlib/win32/adler32.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/compress.obj b/lib/xedit/zlib/win32/compress.obj deleted file mode 100644 index 0b92062..0000000 Binary files a/lib/xedit/zlib/win32/compress.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/crc32.obj b/lib/xedit/zlib/win32/crc32.obj deleted file mode 100644 index 0485c00..0000000 Binary files a/lib/xedit/zlib/win32/crc32.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/deflate.obj b/lib/xedit/zlib/win32/deflate.obj deleted file mode 100644 index bced32c..0000000 Binary files a/lib/xedit/zlib/win32/deflate.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/infback.obj b/lib/xedit/zlib/win32/infback.obj deleted file mode 100644 index 2107f53..0000000 Binary files a/lib/xedit/zlib/win32/infback.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/inffast.obj b/lib/xedit/zlib/win32/inffast.obj deleted file mode 100644 index 3ae042e..0000000 Binary files a/lib/xedit/zlib/win32/inffast.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/inflate.obj b/lib/xedit/zlib/win32/inflate.obj deleted file mode 100644 index 4ffa3eb..0000000 Binary files a/lib/xedit/zlib/win32/inflate.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/inftrees.obj b/lib/xedit/zlib/win32/inftrees.obj deleted file mode 100644 index 97a11d6..0000000 Binary files a/lib/xedit/zlib/win32/inftrees.obj and /dev/null differ diff --git a/lib/xedit/zlib/win32/trees.obj b/lib/xedit/zlib/win32/trees.obj deleted file mode 100644 index fc42593..0000000 Binary files a/lib/xedit/zlib/win32/trees.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/adler32.obj b/lib/xedit/zlib/win64/adler32.obj deleted file mode 100644 index 4a2dfc2..0000000 Binary files a/lib/xedit/zlib/win64/adler32.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/compress.obj b/lib/xedit/zlib/win64/compress.obj deleted file mode 100644 index 5d41231..0000000 Binary files a/lib/xedit/zlib/win64/compress.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/crc32.obj b/lib/xedit/zlib/win64/crc32.obj deleted file mode 100644 index ec6b08c..0000000 Binary files a/lib/xedit/zlib/win64/crc32.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/deflate.obj b/lib/xedit/zlib/win64/deflate.obj deleted file mode 100644 index 973d2b2..0000000 Binary files a/lib/xedit/zlib/win64/deflate.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/infback.obj b/lib/xedit/zlib/win64/infback.obj deleted file mode 100644 index 8d77301..0000000 Binary files a/lib/xedit/zlib/win64/infback.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/inffast.obj b/lib/xedit/zlib/win64/inffast.obj deleted file mode 100644 index e5f372d..0000000 Binary files a/lib/xedit/zlib/win64/inffast.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/inflate.obj b/lib/xedit/zlib/win64/inflate.obj deleted file mode 100644 index 9b2207a..0000000 Binary files a/lib/xedit/zlib/win64/inflate.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/inftrees.obj b/lib/xedit/zlib/win64/inftrees.obj deleted file mode 100644 index bb4a3cc..0000000 Binary files a/lib/xedit/zlib/win64/inftrees.obj and /dev/null differ diff --git a/lib/xedit/zlib/win64/trees.obj b/lib/xedit/zlib/win64/trees.obj deleted file mode 100644 index afc48b8..0000000 Binary files a/lib/xedit/zlib/win64/trees.obj and /dev/null differ diff --git a/lib/xedit/zlib/zlibex.pas b/lib/xedit/zlib/zlibex.pas deleted file mode 100644 index f61dd9f..0000000 --- a/lib/xedit/zlib/zlibex.pas +++ /dev/null @@ -1,2324 +0,0 @@ -{************************************************************************************************* -* ZLibEx.pas * -* * -* copyright (c) 2000-2013 base2 technologies * -* copyright (c) 1995-2002 Borland Software Corporation * -* * -* revision history * -* 2012.05.21 updated for win64 (delphi xe2) * -* added NativeInt type for delphi 2007- * -* added NativeUInt type for delphi 2007- * -* 2011.07.21 fixed routines to validate size before calling Move * -* 2010.07.01 hide overloaded Z*String* routines for delphi 5 * -* 2010.05.02 added ZDelfateEx and ZInflateEx * -* 2010.04.20 added TZ*Buffer classes * -* 2010.04.15 moved core zlib routines to separate unit (ZLibExApi.pas) * -* added ZDeflate* and ZInflate* * -* 2010.04.14 fixed ZInternalCompress loops * -* fixed ZInternalDecompress loops * -* updated ZInternalCompressStream loops * -* updated ZInternalDecompressStream loops * -* 2010.01.27 updated for delphi 2010 * -* 2009.04.14 added overloaded string routines for AnsiString and UnicodeString * -* 2009.01.28 updated for delphi 2009 String (UnicodeString) * -* 2008.05.15 added TStreamPos type for Stream.Position variants * -* added TCustomZStream.Stream* methods * -* 2007.08.17 modified TZCompressionStream.Write to use Write instead of WriteBuffer * -* 2007.03.15 moved gzip routines to separate unit (ZLibExGZ.pas) * -* 2006.10.07 fixed EZLibError constructor for c++ builder compatibility * -* 2006.03.28 moved Z_DEFLATED to interface section * -* added custom compression levels zcLevel1 thru zcLevel9 * -* 2006.03.27 added ZCompressStreamWeb * -* 2006.03.24 added ZAdler32 and ZCrc32 * -* 2005.11.29 changed FStreamPos to Int64 for delphi 6+ * -* 2005.03.04 modified ZInternalCompressStream loops * -* modified ZInternalDecompressStream loops * -* 2005.02.07 fixed ZInternalCompressStream loop conditions * -* fixed ZInternalDecompressStream loop conditions * -* 2005.01.11 added ZCompressStrWeb * -* 2003.04.14 added ZCompress2 and ZDecompress2 * -* added ZCompressStr2 and ZDecompressStr2 * -* added ZCompressStream2 and ZDecompressStream2 * -* added overloaded T*Stream constructors to support InflateInit2 * -* and DeflateInit2 * -* fixed ZDecompressStream to use ZDecompressCheck instead of ZCompressCheck * -* 2001.11.27 enhanced TZDecompressionStream.Read to adjust source stream position upon end * -* of compression data * -* fixed endless loop in TZDecompressionStream.Read when destination count was * -* greater than uncompressed data * -* 2001.10.26 renamed unit to integrate "nicely" with delphi 6 * -* 2000.11.24 added soFromEnd condition to TZDecompressionStream.Seek * -* added ZCompressStream and ZDecompressStream * -* 2000.06.13 optimized, fixed, rewrote, and enhanced the zlib.pas unit included on the * -* delphi cd (zlib version 1.1.3) * -* * -* acknowledgments * -* erik turner * -* 2001.10.26 Z*Stream routines * -* * -* david bennion * -* 2001.11.27 finding the nasty little endless loop quirk with the * -* TZDecompressionStream.Read method * -* * -* luigi sandon * -* 2005.02.07 pointing out the missing loop condition (Z_STREAM_END) in * -* ZInternalCompressStream and ZInternalDecompressStream * -* * -* ferry van genderen * -* 2005.03.04 assisting me fine tune and beta test ZInternalCompressStream and * -* ZInternalDecompressStream * -* * -* j. rathlev * -* 2005.11.28 pointing out the FStreamPos and TStream.Position type inconsistency * -* * -* anders johansen * -* 2006.10.07 pointing out the ELibError constructor incompatibility with c++ builder * -* * -* marcin szafranski * -* 2009.01.28 beta testing the delphi 2009 changes * -* * -* iztok kacin * -* 2009.04.14 assisting me design and further improve support for delphi 2009 * -* * -* oleg matrozov * -* 2010.04.14 pointing out the missing loop condition (avail_in > 0) in ZInternalCompress * -* and ZInternalDecompress * -* 2010.04.20 prototyping and assisting with the TZ*Buffer classes * -* * -* edward koo * -* 2010.07.01 pointing out the delphi 5 incompatibility with the overloaded Z*String* * -* routines * -* * -* egron elbra * -* 2011.07.20 pointing out the range exception when moving empty strings * -* * -* marian pascalau * -* 2012.05.21 providing their win64 modifications * -* * -* donations * -* 2011.05.06 farshad mohajeri * -* 2012.06.07 marat safin * -* 2012.12.14 moacir schmidt * -* 2013.05.23 roman ganz * -*************************************************************************************************} - -unit ZLibEx; - -interface - -{$I ZLibEx.inc} - -uses - SysUtils, Classes, ZLibExApi; - -type - -{$ifndef UNICODE} - - RawByteString = AnsiString; - - UnicodeString = WideString; - UnicodeChar = WideChar; - -{$else ifdef Version2010Plus} - - UnicodeChar = WideChar; - -{$endif} - -{$ifndef Version2009Plus} - - NativeInt = Integer; - NativeUInt = Cardinal; - -{$endif} - - TStreamPos = {$ifdef Version6Plus} Int64 {$else} Longint {$endif}; - - TZCompressionLevel = ( - zcNone, - zcFastest, - zcDefault, - zcMax, - zcLevel1, - zcLevel2, - zcLevel3, - zcLevel4, - zcLevel5, - zcLevel6, - zcLevel7, - zcLevel8, - zcLevel9 - ); - - TZStrategy = ( - zsDefault, - zsFiltered, - zsHuffman, - zsRLE, - zsFixed - ); - - TZError = ( - zeError, - zeStreamError, - zeDataError, - zeMemoryError, - zeBufferError, - zeVersionError - ); - - TZFlush = ( - zfNoFlush, - zfPartialFlush, - zfSyncFlush, - zfFullFlush, - zfFinish, - zfBlock, - zfTrees - ); - -const - ZLevels: Array [TZCompressionLevel] of Integer = ( - Z_NO_COMPRESSION, // zcNone - Z_BEST_SPEED, // zcFastest - Z_DEFAULT_COMPRESSION, // zcDefault - Z_BEST_COMPRESSION, // zcMax - 1, // zcLevel1 - 2, // zcLevel2 - 3, // zcLevel3 - 4, // zcLevel4 - 5, // zcLevel5 - 6, // zcLevel6 - 7, // zcLevel7 - 8, // zcLevel8 - 9 // zcLevel9 - ); - - ZStrategies: Array [TZStrategy] of Integer = ( - Z_DEFAULT_STRATEGY, // zsDefault - Z_FILTERED, // zsFiltered - Z_HUFFMAN_ONLY, // zsHuffman - Z_RLE, // zsRLE - Z_FIXED // zsFixed - ); - - ZErrors: Array [TZError] of Integer = ( - Z_ERRNO, // zeError - Z_STREAM_ERROR, // zeStreamError - Z_DATA_ERROR, // zeDataError - Z_MEM_ERROR, // zeMemoryError - Z_BUF_ERROR, // zeBufferError - Z_VERSION_ERROR // zeVersionError - ); - - ZFlushes: Array [TZFlush] of Integer = ( - Z_NO_FLUSH, // zfNoFlush - Z_PARTIAL_FLUSH, // zfPartialFlush - Z_SYNC_FLUSH, // zfSyncFlush - Z_FULL_FLUSH, // zfFullFlush - Z_FINISH, // zfFinish - Z_BLOCK, // zfBlock - Z_TREES // zfTrees - ); - -type - {** TZ*Function *******************************************************************************} - - TZReadFunction = function (param: Pointer; var buffer; - size: Integer): Integer; - - TZWriteFunction = function (param: Pointer; const buffer; - size: Integer): Integer; - - {** TZInformation *****************************************************************************} - - TZInformation = packed record - CompressedFlags : Longint; - CompressedSize : TStreamPos; - CompressedCrc : Longint; - CompressedAdler : Longint; - - UncompressedFlags: Longint; - UncompressedSize : TStreamPos; - UncompressedCrc : Longint; - UncompressedAdler: Longint; - end; - - {** TCustomZStream ****************************************************************************} - - TCustomZStream = class(TStream) - private - FStream : TStream; - FStreamPos : TStreamPos; - FOnProgress: TNotifyEvent; - - FZStream : TZStreamRec; - FBuffer : Array [Word] of Byte; - - function GetStreamPosition: TStreamPos; - procedure SetStreamPosition(value: TStreamPos); - protected - constructor Create(stream: TStream); - - function StreamRead(var buffer; count: Longint): Longint; - function StreamWrite(const buffer; count: Longint): Longint; - function StreamSeek(offset: Longint; origin: Word): Longint; - - procedure StreamReadBuffer(var buffer; count: Longint); - procedure StreamWriteBuffer(const buffer; count: Longint); - - procedure DoProgress; dynamic; - - property StreamPosition: TStreamPos read GetStreamPosition write SetStreamPosition; - - property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; - end; - - {** TZCompressionStream ***********************************************************************} - - TZCompressionStream = class(TCustomZStream) - private - function GetCompressionRate: Single; - public - constructor Create(dest: TStream; - compressionLevel: TZCompressionLevel = zcDefault); overload; - - constructor Create(dest: TStream; compressionLevel: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy); overload; - - destructor Destroy; override; - - function Read(var buffer; count: Longint): Longint; override; - function Write(const buffer; count: Longint): Longint; override; - function Seek(offset: Longint; origin: Word): Longint; override; - - property CompressionRate: Single read GetCompressionRate; - property OnProgress; - end; - - {** TZDecompressionStream *********************************************************************} - - TZDecompressionStream = class(TCustomZStream) - public - constructor Create(source: TStream); overload; - constructor Create(source: TStream; windowBits: Integer); overload; - - destructor Destroy; override; - - function Read(var buffer; count: Longint): Longint; override; - function Write(const buffer; count: Longint): Longint; override; - function Seek(offset: Longint; origin: Word): Longint; override; - - property OnProgress; - end; - - {** TZCustomBuffer ****************************************************************************} - - TZCustomBuffer = class(TObject) - private - FBuffer : Pointer; - FBufferCapacity: Integer; - FBufferSize : Integer; - protected - FZStream: TZStreamRec; - - procedure BufferWrite(const buffer: Pointer; size: Integer); - procedure BufferRead(var buffer: Pointer; size: Integer); - - procedure BufferCapacity(capacity: Integer); - - property BufferSize: Integer read FBufferSize; - public - constructor Create; - destructor Destroy; override; - - procedure Clear; virtual; - - procedure Flush(flush: TZFlush); virtual; - - function Write(const buffer: Pointer; size: Integer): Integer; overload; - virtual; abstract; - - function Write(const s: AnsiString): Integer; overload; - - function Read(var buffer: Pointer; size: Integer): Integer; overload; - function Read(var s: AnsiString): Integer; overload; - end; - - {** TZCompressionBuffer ***********************************************************************} - - TZCompressionBuffer = class(TZCustomBuffer) - public - constructor Create(level: TZCompressionLevel = zcDefault); overload; - constructor Create(level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy); overload; - - destructor Destroy; override; - - procedure Clear; override; - - procedure Flush(flush: TZFlush); override; - - function Write(const buffer: Pointer; size: Integer): Integer; - override; - end; - - {** TZDecompressionBuffer *********************************************************************} - - TZDecompressionBuffer = class(TZCustomBuffer) - public - constructor Create; overload; - constructor Create(windowBits: Integer); overload; - - destructor Destroy; override; - - procedure Clear; override; - - function Write(const buffer: Pointer; size: Integer): Integer; override; - end; - -{** zlib deflate routines ***********************************************************************} - -function ZDeflateInit(var stream: TZStreamRec; - level: TZCompressionLevel): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZDeflateInit2(var stream: TZStreamRec; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZDeflate(var stream: TZStreamRec; flush: TZFlush): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZDeflateEnd(var stream: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZDeflateReset(var stream: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -{** zlib inflate routines ***********************************************************************} - -function ZInflateInit(var stream: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZInflateInit2(var stream: TZStreamRec; - windowBits: Integer): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZInflate(var stream: TZStreamRec; flush: TZFlush): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZInflateEnd(var stream: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -function ZInflateReset(var stream: TZStreamRec): Integer; - {$ifdef Version2005Plus} inline; {$endif} - -{** zlib checksum routines **********************************************************************} - -function ZAdler32(adler: Longint; const buffer; size: Integer): Longint; - {$ifdef Version2005Plus} inline; {$endif} - -function ZCrc32(crc: Longint; const buffer; size: Integer): Longint; - {$ifdef Version2005Plus} inline; {$endif} - -{** zlib custom routines ************************************************************************} - -procedure ZDeflateEx(var stream: TZStreamRec; param: Pointer; - read: TZReadFunction; write: TZWriteFunction; flush: TZFlush); - -procedure ZInflateEx(var stream: TZStreamRec; param: Pointer; - read: TZReadFunction; write: TZWriteFunction; flush: TZFlush); - -{************************************************************************************************* -* ZCompress * -* * -* pre-conditions * -* inBuffer = pointer to uncompressed data * -* inSize = size of inBuffer (bytes) * -* outBuffer = pointer (unallocated) * -* level = compression level * -* * -* post-conditions * -* outBuffer = pointer to compressed data (allocated) * -* outSize = size of outBuffer (bytes) * -*************************************************************************************************} - -procedure ZCompress(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; - level: TZCompressionLevel = zcDefault); - -{************************************************************************************************* -* ZCompress2 * -* * -* pre-conditions * -* inBuffer = pointer to uncompressed data * -* inSize = size of inBuffer (bytes) * -* outBuffer = pointer (unallocated) * -* level = compression level * -* method = compression method * -* windowBits = window bits * -* memLevel = memory level * -* strategy = compression strategy * -* * -* post-conditions * -* outBuffer = pointer to compressed data (allocated) * -* outSize = size of outBuffer (bytes) * -*************************************************************************************************} - -procedure ZCompress2(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy); - -{************************************************************************************************* -* ZDecompress * -* * -* pre-conditions * -* inBuffer = pointer to compressed data * -* inSize = size of inBuffer (bytes) * -* outBuffer = pointer (unallocated) * -* outEstimate = estimated size of uncompressed data (bytes) * -* * -* post-conditions * -* outBuffer = pointer to decompressed data (allocated) * -* outSize = size of outBuffer (bytes) * -*************************************************************************************************} - -procedure ZDecompress(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; outEstimate: Integer = 0); - -{************************************************************************************************* -* ZDecompress2 * -* * -* pre-conditions * -* inBuffer = pointer to compressed data * -* inSize = size of inBuffer (bytes) * -* outBuffer = pointer (unallocated) * -* windowBits = window bits * -* outEstimate = estimated size of uncompressed data (bytes) * -* * -* post-conditions * -* outBuffer = pointer to decompressed data (allocated) * -* outSize = size of outBuffer (bytes) * -*************************************************************************************************} - -procedure ZDecompress2(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; windowBits: Integer; - outEstimate: Integer = 0); - -{** string routines *****************************************************************************} - -{************************************************************************************************* -* ZCompressStr * -* * -* pre-conditions * -* s = uncompressed data string * -* level = compression level * -* * -* return * -* compressed data string * -*************************************************************************************************} - -function ZCompressStr(const s: AnsiString; - level: TZCompressionLevel = zcDefault): RawByteString; - -procedure ZCompressString(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel = zcDefault); overload; - -{$ifdef Version6Plus} -procedure ZCompressString(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel = zcDefault); overload; -{$endif} - -{************************************************************************************************* -* ZCompressStrEx * -* * -* pre-conditions * -* s = uncompressed data string * -* level = compression level * -* * -* return * -* compressed data string with 4 byte (integer) header indicating * -* original uncompressed data length * -*************************************************************************************************} - -function ZCompressStrEx(const s: AnsiString; - level: TZCompressionLevel = zcDefault): RawByteString; - -procedure ZCompressStringEx(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel = zcDefault); overload; - -{$ifdef Version6Plus} -procedure ZCompressStringEx(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel = zcDefault); overload; -{$endif} - -{************************************************************************************************* -* ZCompressStr2 * -* * -* pre-conditions * -* s = uncompressed data string * -* level = compression level * -* windowBits = window bits * -* memLevel = memory level * -* strategy = compression strategy * -* * -* return * -* compressed data string * -*************************************************************************************************} - -function ZCompressStr2(const s: AnsiString; level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy): RawByteString; - -procedure ZCompressString2(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); overload; - -{$ifdef Version6Plus} -procedure ZCompressString2(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); overload; -{$endif} - -{************************************************************************************************* -* ZCompressStrWeb * -* * -* pre-conditions * -* s = uncompressed data string * -* * -* return * -* compressed data string * -*************************************************************************************************} - -function ZCompressStrWeb(const s: AnsiString): RawByteString; - -procedure ZCompressStringWeb(var result: RawByteString; const s: AnsiString); - overload; - -{$ifdef Version6Plus} -procedure ZCompressStringWeb(var result: RawByteString; - const s: UnicodeString); overload; -{$endif} - -{************************************************************************************************* -* ZDecompressStr * -* * -* pre-conditions * -* s = compressed data string * -* * -* return * -* uncompressed data string * -*************************************************************************************************} - -function ZDecompressStr(const s: RawByteString): AnsiString; - -procedure ZDecompressString(var result: AnsiString; const s: RawByteString); - overload; - -{$ifdef Version6Plus} -procedure ZDecompressString(var result: UnicodeString; - const s: RawByteString); overload; -{$endif} - -{************************************************************************************************* -* ZDecompressStrEx * -* * -* pre-conditions * -* s = compressed data string with 4 byte (integer) header indicating * -* original uncompressed data length * -* * -* return * -* uncompressed data string * -*************************************************************************************************} - -function ZDecompressStrEx(const s: RawByteString): AnsiString; - -procedure ZDecompressStringEx(var result: AnsiString; const s: RawByteString); - overload; - -{$ifdef Version6Plus} -procedure ZDecompressStringEx(var result: UnicodeString; - const s: RawByteString); overload; -{$endif} - -{************************************************************************************************* -* ZDecompressStr2 * -* * -* pre-conditions * -* s = compressed data string * -* windowBits = window bits * -* * -* return * -* uncompressed data string * -*************************************************************************************************} - -function ZDecompressStr2(const s: RawByteString; - windowBits: Integer): AnsiString; - -procedure ZDecompressString2(var result: AnsiString; const s: RawByteString; - windowBits: Integer); overload; - -{$ifdef Version6Plus} -procedure ZDecompressString2(var result: UnicodeString; - const s: RawByteString; windowBits: Integer); overload; -{$endif} - -{** stream routines *****************************************************************************} - -procedure ZCompressStream(inStream, outStream: TStream; - level: TZCompressionLevel = zcDefault); - -procedure ZCompressStream2(inStream, outStream: TStream; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); - -procedure ZCompressStreamWeb(inStream, outStream: TStream); - -procedure ZDecompressStream(inStream, outStream: TStream); - -procedure ZDecompressStream2(inStream, outStream: TStream; - windowBits: Integer); - -{************************************************************************************************} - -type - EZLibErrorClass = class of EZlibError; - - EZLibError = class(Exception) - private - FErrorCode: Integer; - public - constructor Create(code: Integer; const dummy: String = ''); overload; - constructor Create(error: TZError; const dummy: String = ''); overload; - - property ErrorCode: Integer read FErrorCode write FErrorCode; - end; - - EZCompressionError = class(EZLibError); - EZDecompressionError = class(EZLibError); - - { DecompressToUserBuf decompresses data, buffer to buffer, in one call. - In: InBuf = ptr to compressed data - InBytes = number of bytes in InBuf - Out: OutBuf = ptr to user-allocated buffer to contain decompressed data - BufSize = number of bytes in OutBuf } -procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; - const OutBuf: Pointer; BufSize: Integer); - -implementation - -function DCheck(code: Integer): Integer; -begin - Result := code; - if code < 0 then - raise EZDecompressionError.Create(64673); //!! -end; - -const - SZInvalid = 'Invalid ZStream operation!'; - -{************************************************************************************************} - -function ZCompressCheck(code: Integer): Integer; -begin - result := code; - - if code < 0 then - begin - raise EZCompressionError.Create(code); - end; -end; - -function ZDecompressCheck(code: Integer; raiseBufferError: Boolean = True): Integer; -begin - Result := code; - - if code < 0 then - begin - if (code <> Z_BUF_ERROR) or raiseBufferError then - begin - raise EZDecompressionError.Create(code); - end; - end; -end; - -{** zlib deflate routines ***********************************************************************} - -function ZDeflateInit(var stream: TZStreamRec; - level: TZCompressionLevel): Integer; -begin - result := deflateInit_(stream, ZLevels[level], ZLIB_VERSION, - SizeOf(TZStreamRec)); -end; - -function ZDeflateInit2(var stream: TZStreamRec; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy): Integer; -begin - result := deflateInit2_(stream, ZLevels[level], Z_DEFLATED, windowBits, - memLevel, ZStrategies[strategy], ZLIB_VERSION, SizeOf(TZStreamRec)); -end; - -function ZDeflate(var stream: TZStreamRec; flush: TZFlush): Integer; -begin - result := deflate(stream, ZFlushes[flush]); -end; - -function ZDeflateEnd(var stream: TZStreamRec): Integer; -begin - result := deflateEnd(stream); -end; - -function ZDeflateReset(var stream: TZStreamRec): Integer; -begin - result := deflateReset(stream); -end; - -{** zlib inflate routines ***********************************************************************} - -function ZInflateInit(var stream: TZStreamRec): Integer; -begin - result := inflateInit_(stream, ZLIB_VERSION, SizeOf(TZStreamRec)); -end; - -function ZInflateInit2(var stream: TZStreamRec; - windowBits: Integer): Integer; -begin - result := inflateInit2_(stream, windowBits, ZLIB_VERSION, - SizeOf(TZStreamRec)); -end; - -function ZInflate(var stream: TZStreamRec; flush: TZFlush): Integer; -begin - result := inflate(stream, ZFlushes[flush]); -end; - -function ZInflateEnd(var stream: TZStreamRec): Integer; -begin - result := inflateEnd(stream); -end; - -function ZInflateReset(var stream: TZStreamRec): Integer; -begin - result := inflateReset(stream); -end; - -{** zlib checksum routines **********************************************************************} - -function ZAdler32(adler: Longint; const buffer; size: Integer): Longint; -begin - result := adler32(adler,buffer,size); -end; - -function ZCrc32(crc: Longint; const buffer; size: Integer): Longint; -begin - result := crc32(crc,buffer,size); -end; - -{** zlib extended routines **********************************************************************} - -procedure ZDeflateEx(var stream: TZStreamRec; param: Pointer; - read: TZReadFunction; write: TZWriteFunction; flush: TZFlush); -const - bufferSize = 8192; -var - zresult : Integer; - readBuffer : Array [0..bufferSize - 1] of Byte; - writeBuffer: Array [0..bufferSize - 1] of Byte; - writeSize : Integer; - flushEx : TZFlush; -begin - if Assigned(read) then - begin - stream.avail_in := read(param, readBuffer, bufferSize); - end - else stream.avail_in := 0; - - repeat - stream.next_in := @readBuffer; - - repeat - stream.avail_out := bufferSize; - stream.next_out := @writeBuffer; - - flushEx := flush; - - if (flushEx = zfFinish) and (stream.avail_in = bufferSize) then - begin - flushEx := zfNoFlush; - end; - - zresult := ZCompressCheck(ZDeflate(stream, flushEx)); - - writeSize := bufferSize - stream.avail_out; - - write(param, writeBuffer, writeSize); - until stream.avail_out > 0; - - //assert: stream.avail_in = 0 - - if (zresult <> Z_STREAM_END) and Assigned(read) then - begin - stream.avail_in := read(param, readBuffer, bufferSize); - end; - until (stream.avail_in = 0) and (flush = flushEx); -end; - -procedure ZInflateEx(var stream: TZStreamRec; param: Pointer; - read: TZReadFunction; write: TZWriteFunction; flush: TZFlush); -const - bufferSize = 8192; -var - zresult : Integer; - readBuffer : Array [0..bufferSize - 1] of Byte; - writeBuffer: Array [0..bufferSize - 1] of Byte; - writeSize : Integer; -begin - if Assigned(read) then - begin - stream.avail_in := read(param, readBuffer, bufferSize); - end - else stream.avail_in := 0; - - zresult := Z_OK; - - while (zresult <> Z_STREAM_END) and (stream.avail_in > 0) do - begin - stream.next_in := @readBuffer; - - repeat - stream.avail_out := bufferSize; - stream.next_out := @writeBuffer; - - zresult := ZDecompressCheck(ZInflate(stream, flush), False); - - writeSize := bufferSize - stream.avail_out; - - write(param, writeBuffer, writeSize); - until stream.avail_out > 0; - - if (zresult <> Z_STREAM_END) and Assigned(read) then - begin - stream.avail_in := read(param, readBuffer, bufferSize); - end; - end; -end; - -{** private buffer routines *********************************************************************} - -type - PZBufferParam = ^TZBufferParam; - TZBufferParam = packed record - InBuffer : Pointer; - InPosition : Integer; - InSize : Integer; - OutBuffer : Pointer; - OutPosition: Integer; - OutSize : Integer; - end; - -function ZBufferRead(p: Pointer; var buffer; size: Integer): Integer; -var - param: PZBufferParam; -begin - param := PZBufferParam(p); - - result := param^.InSize - param^.InPosition; - if result > size then result := size; - - Move(Pointer(Integer(param^.InBuffer) + param^.InPosition)^, buffer, result); - - Inc(param^.InPosition, result); -end; - -function ZBufferWrite(p: Pointer; const buffer; size: Integer): Integer; -var - param: PZBufferParam; -begin - param := PZBufferParam(p); - - if param^.OutPosition + size > param^.OutSize then - begin - param^.OutSize := param^.OutPosition + size; - - ReallocMem(Pointer(param^.OutBuffer), param^.OutSize); - end; - - Move(buffer, Pointer(Integer(param^.OutBuffer) + param^.OutPosition)^, size); - - Inc(param^.OutPosition, size); - - result := size; -end; - -procedure ZInternalCompressEx(var zstream: TZStreamRec; const inBuffer: Pointer; - inSize: Integer; out outBuffer: Pointer; out outSize: Integer); -var - param: TZBufferParam; -begin - FillChar(param, SizeOf(TZBufferParam), 0); - - outBuffer := Nil; - outSize := 0; - - param.InBuffer := inBuffer; - param.InSize := inSize; - - try - ZDeflateEx(zstream, @param, @ZBufferRead, @ZBufferWrite, zfFinish); - - ZCompressCheck(ZDeflateEnd(zstream)); - - outBuffer := param.OutBuffer; - outSize := param.OutSize; - except - FreeMem(param.OutBuffer); - - raise; - end; -end; - -procedure ZInternalDecompressEx(zstream: TZStreamRec; const inBuffer: Pointer; - inSize: Integer; out outBuffer: Pointer; out outSize: Integer; - outEstimate: Integer); -var - param: TZBufferParam; -begin - FillChar(param, SizeOf(TZBufferParam), 0); - - outBuffer := Nil; - outSize := 0; - - param.InBuffer := inBuffer; - param.InSize := inSize; - - if outEstimate > 0 then - begin - GetMem(param.OutBuffer, outEstimate); - - param.OutSize := outEstimate; - end; - - try - ZInflateEx(zstream, @param, @ZBufferRead, @ZBufferWrite, zfNoFlush); - - ZDecompressCheck(ZInflateEnd(zstream)); - - outBuffer := param.OutBuffer; - outSize := param.OutSize; - except - FreeMem(param.OutBuffer); - - raise; - end; -end; - -procedure ZInternalCompress(var zstream: TZStreamRec; const inBuffer: Pointer; - inSize: Integer; out outBuffer: Pointer; out outSize: Integer); -const - delta = 256; -var - zresult: Integer; -begin - outSize := ((inSize + (inSize div 10) + 12) + 255) and not 255; - - outBuffer := Nil; - - try - try - zstream.next_in := inBuffer; - zstream.avail_in := inSize; - - repeat - ReallocMem(outBuffer, outSize); - - zstream.next_out := PByte(NativeUInt(outBuffer) + zstream.total_out); - zstream.avail_out := NativeUInt(outSize) - zstream.total_out; - - zresult := ZCompressCheck(ZDeflate(zstream, zfNoFlush)); - - Inc(outSize, delta); - until (zresult = Z_STREAM_END) or (zstream.avail_in = 0); - - while zresult <> Z_STREAM_END do - begin - ReallocMem(outBuffer, outSize); - - zstream.next_out := PByte(NativeUInt(outBuffer) + zstream.total_out); - zstream.avail_out := NativeUInt(outSize) - zstream.total_out; - - zresult := ZCompressCheck(ZDeflate(zstream, zfFinish)); - - Inc(outSize, delta); - end; - finally - ZCompressCheck(ZDeflateEnd(zstream)); - end; - - ReallocMem(outBuffer, zstream.total_out); - - outSize := zstream.total_out; - except - FreeMem(outBuffer); - raise; - end; -end; - -procedure ZInternalDecompress(zstream: TZStreamRec; const inBuffer: Pointer; - inSize: Integer; out outBuffer: Pointer; out outSize: Integer; - outEstimate: Integer); -var - zresult: Integer; - delta : Integer; -begin - delta := (inSize + 255) and not 255; - - if outEstimate = 0 then outSize := delta - else outSize := outEstimate; - - outBuffer := Nil; - - try - try - zresult := Z_OK; - - zstream.avail_in := inSize; - zstream.next_in := inBuffer; - - while (zresult <> Z_STREAM_END) and (zstream.avail_in > 0) do - begin - repeat - ReallocMem(outBuffer, outSize); - - zstream.next_out := PByte(NativeUInt(outBuffer) + zstream.total_out); - zstream.avail_out := NativeUInt(outSize) - zstream.total_out; - - zresult := ZDecompressCheck(ZInflate(zstream, zfNoFlush), False); - - Inc(outSize, delta); - until (zresult = Z_STREAM_END) or (zstream.avail_out > 0); - end; - finally - ZDecompressCheck(ZInflateEnd(zstream)); - end; - - ReallocMem(outBuffer, zstream.total_out); - - outSize := zstream.total_out; - except - if Assigned(outBuffer) then FreeMem(outBuffer); - - raise; - end; -end; - -{** buffer routines *****************************************************************************} - -procedure ZCompress(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; - level: TZCompressionLevel); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZCompressCheck(ZDeflateInit(zstream, level)); - - ZInternalCompress(zstream, inBuffer, inSize, outBuffer, outSize); -end; - -procedure ZCompress2(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZCompressCheck(ZDeflateInit2(zstream, level, windowBits, memLevel, - strategy)); - - ZInternalCompress(zstream, inBuffer, inSize, outBuffer, outSize); -end; - -procedure ZDecompress(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; outEstimate: Integer); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZDecompressCheck(ZInflateInit(zstream)); - - ZInternalDecompress(zstream, inBuffer, inSize, outBuffer, outSize, - outEstimate); -end; - -procedure ZDecompress2(const inBuffer: Pointer; inSize: Integer; - out outBuffer: Pointer; out outSize: Integer; windowBits: Integer; - outEstimate: Integer); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZDecompressCheck(ZInflateInit2(zstream, windowBits)); - - ZInternalDecompress(zstream, inBuffer, inSize, outBuffer, outSize, - outEstimate); -end; - -{** string routines *****************************************************************************} - -function ZCompressStr(const s: AnsiString; - level: TZCompressionLevel): RawByteString; -begin - ZCompressString(result, s, level); -end; - -procedure ZCompressString(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel); -var - buffer: Pointer; - size : Integer; -begin - ZCompress(Pointer(s), Length(s), buffer, size, level); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; - -{$ifdef Version6Plus} -procedure ZCompressString(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel); -var - buffer: Pointer; - size : Integer; -begin - ZCompress(Pointer(s), Length(s) * SizeOf(UnicodeChar), buffer, size, level); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; -{$endif} - -function ZCompressStrEx(const s: AnsiString; - level: TZCompressionLevel): RawByteString; -begin - ZCompressStringEx(result, s, level); -end; - -procedure ZCompressStringEx(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel); -var - buffer: Pointer; - size : Integer; -begin - ZCompress(Pointer(s), Length(s), buffer, size, level); - - SetLength(result, size + SizeOf(Integer)); - - if size > 0 then - begin - Move(buffer^, result[1 + SizeOf(Integer)], size); - end; - - size := Length(s); - - Move(size, result[1], SizeOf(Integer)); - - FreeMem(buffer); -end; - -{$ifdef Version6Plus} -procedure ZCompressStringEx(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel); -var - buffer: Pointer; - size : Integer; -begin - ZCompress(Pointer(s), Length(s) * SizeOf(UnicodeChar), buffer, size, level); - - SetLength(result, size + SizeOf(Integer)); - - if size > 0 then - begin - Move(buffer^, result[1 + SizeOf(Integer)], size); - end; - - size := Length(s) * SizeOf(UnicodeChar); - - Move(size, result[1], SizeOf(Integer)); - - FreeMem(buffer); -end; -{$endif} - -function ZCompressStr2(const s: AnsiString; level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy): RawByteString; -begin - ZCompressString2(result, s, level, windowBits, memLevel, strategy); -end; - -procedure ZCompressString2(var result: RawByteString; const s: AnsiString; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); -var - buffer: Pointer; - size : Integer; -begin - ZCompress2(Pointer(s), Length(s), buffer, size, level, windowBits, - memLevel, strategy); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; - -{$ifdef Version6Plus} -procedure ZCompressString2(var result: RawByteString; const s: UnicodeString; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); -var - buffer: Pointer; - size : Integer; -begin - ZCompress2(Pointer(s), Length(s) * SizeOf(UnicodeChar), buffer, size, - level, windowBits, memLevel, strategy); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; -{$endif} - -function ZCompressStrWeb(const s: AnsiString): RawByteString; -begin - ZCompressStringWeb(result, s); -end; - -procedure ZCompressStringWeb(var result: RawByteString; const s: AnsiString); -begin - ZCompressString2(result, s, zcFastest, -15, 9, zsDefault); -end; - -{$ifdef Version6Plus} -procedure ZCompressStringWeb(var result: RawBytestring; - const s: UnicodeString); -begin - ZCompressString2(result, s, zcFastest, -15, 9, zsDefault); -end; -{$endif} - -function ZDecompressStr(const s: RawByteString): AnsiString; -begin - ZDecompressString(result, s); -end; - -procedure ZDecompressString(var result: AnsiString; - const s: RawByteString); -var - buffer: Pointer; - size : Integer; -begin - ZDecompress(Pointer(s), Length(s), buffer, size); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; - -{$ifdef Version6Plus} -procedure ZDecompressString(var result: UnicodeString; - const s: RawByteString); -var - buffer: Pointer; - size : Integer; -begin - ZDecompress(Pointer(s), Length(s), buffer, size); - - SetLength(result, size div SizeOf(UnicodeChar)); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; -{$endif} - -function ZDecompressStrEx(const s: RawByteString): AnsiString; -begin - ZDecompressStringEx(result, s); -end; - -procedure ZDecompressStringEx(var result: AnsiString; const s: RawByteString); -var - buffer : Pointer; - size : Integer; - data : AnsiString; - dataSize: Integer; -begin - Move(s[1], size, SizeOf(Integer)); - - dataSize := Length(s) - SizeOf(Integer); - - SetLength(data, dataSize); - - if dataSize > 0 then - begin - Move(s[1 + SizeOf(Integer)], data[1], dataSize); - - ZDecompress(Pointer(data), dataSize, buffer, size, size); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); - end - else - begin - SetLength(result, 0); - end; -end; - -{$ifdef Version6Plus} -procedure ZDecompressStringEx(var result: UnicodeString; - const s: RawByteString); -var - buffer : Pointer; - size : Integer; - data : AnsiString; - dataSize: Integer; -begin - Move(s[1], size, SizeOf(Integer)); - - dataSize := Length(s) - SizeOf(Integer); - - if dataSize > 0 then - begin - SetLength(data, dataSize); - - Move(s[1 + SizeOf(Integer)], data[1], dataSize); - - ZDecompress(Pointer(data), dataSize, buffer, size, size); - - SetLength(result, size div SizeOf(UnicodeChar)); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); - end - else - begin - SetLength(result, 0); - end; -end; -{$endif} - -function ZDecompressStr2(const s: RawByteString; - windowBits: Integer): AnsiString; -begin - ZDecompressString2(result, s, windowBits); -end; - -procedure ZDecompressString2(var result: AnsiString; const s: RawByteString; - windowBits: Integer); -var - buffer: Pointer; - size : Integer; -begin - ZDecompress2(Pointer(s), Length(s), buffer, size, windowBits); - - SetLength(result, size); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; - -{$ifdef Version6Plus} -procedure ZDecompressString2(var result: UnicodeString; - const s: RawByteString; windowBits: Integer); -var - buffer: Pointer; - size : Integer; -begin - ZDecompress2(Pointer(s), Length(s), buffer, size, windowBits); - - SetLength(result, size div SizeOf(UnicodeChar)); - - if size > 0 then - begin - Move(buffer^, result[1], size); - end; - - FreeMem(buffer); -end; -{$endif} - -{** private stream routines *********************************************************************} - -type - PZStreamParam = ^TZStreamParam; - TZStreamParam = packed record - InStream : TStream; - OutStream : TStream; - end; - -function ZStreamRead(p: Pointer; var buffer; size: Integer): Integer; -var - param: PZStreamParam; -begin - param := PZStreamParam(p); - - result := param^.InStream.Read(buffer, size); -end; - -function ZStreamWrite(p: Pointer; const buffer; size: Integer): Integer; -var - param: PZStreamParam; -begin - param := PZStreamParam(p); - - result := param^.OutStream.Write(buffer, size); -end; - -procedure ZInternalCompressStreamEx(zstream: TZStreamRec; inStream, - outStream: TStream); -var - param: TZStreamParam; -begin - FillChar(param, SizeOf(TZStreamParam), 0); - - param.InStream := inStream; - param.OutStream := outStream; - - ZDeflateEx(zstream, @param, @ZBufferRead, @ZBufferWrite, zfFinish); - - ZCompressCheck(ZDeflateEnd(zstream)); -end; - -procedure ZInternalDecompressStreamEx(zstream: TZStreamRec; inStream, - outStream: TStream); -var - param: TZStreamParam; -begin - FillChar(param, SizeOf(TZStreamParam), 0); - - param.InStream := inStream; - param.OutStream := outStream; - - ZInflateEx(zstream, @param, @ZBufferRead, @ZBufferWrite, zfNoFlush); - - ZDecompressCheck(ZInflateEnd(zstream)); -end; - -procedure ZInternalCompressStream(zstream: TZStreamRec; inStream, - outStream: TStream); -const - bufferSize = 32768; -var - zresult : Integer; - inBuffer : Array [0..bufferSize - 1] of Byte; - outBuffer: Array [0..bufferSize - 1] of Byte; - outSize : Integer; -begin - zresult := Z_STREAM_END; - - zstream.avail_in := inStream.Read(inBuffer, bufferSize); - - while zstream.avail_in > 0 do - begin - zstream.next_in := @inBuffer; - - repeat - zstream.next_out := @outBuffer; - zstream.avail_out := bufferSize; - - zresult := ZCompressCheck(ZDeflate(zstream, zfNoFlush)); - - outSize := bufferSize - zstream.avail_out; - - outStream.Write(outBuffer, outSize); - until (zresult = Z_STREAM_END) or (zstream.avail_in = 0); - - zstream.avail_in := inStream.Read(inBuffer, bufferSize); - end; - - while zresult <> Z_STREAM_END do - begin - zstream.next_out := @outBuffer; - zstream.avail_out := bufferSize; - - zresult := ZCompressCheck(ZDeflate(zstream, zfFinish)); - - outSize := bufferSize - zstream.avail_out; - - outStream.Write(outBuffer, outSize); - end; - - ZCompressCheck(ZDeflateEnd(zstream)); -end; - -procedure ZInternalDecompressStream(zstream: TZStreamRec; inStream, - outStream: TStream); -const - bufferSize = 32768; -var - zresult : Integer; - inBuffer : Array [0..bufferSize-1] of Byte; - outBuffer: Array [0..bufferSize-1] of Byte; - outSize : Integer; -begin - try - zresult := Z_OK; - - zstream.avail_in := inStream.Read(inBuffer, bufferSize); - - while (zresult <> Z_STREAM_END) and (zstream.avail_in > 0) do - begin - zstream.next_in := @inBuffer; - - repeat - zstream.next_out := @outBuffer; - zstream.avail_out := bufferSize; - - zresult := ZDecompressCheck(ZInflate(zstream, zfNoFlush), False); - - outSize := bufferSize - zstream.avail_out; - - outStream.Write(outBuffer, outSize); - until (zresult = Z_STREAM_END) or (zstream.avail_out > 0); - - if zstream.avail_in > 0 then - begin - inStream.Position := inStream.Position - zstream.avail_in; - end; - - if zresult <> Z_STREAM_END then - begin - zstream.avail_in := inStream.Read(inBuffer, bufferSize); - end; - end; - finally - ZDecompressCheck(ZInflateEnd(zstream)); - end; -end; - -{** stream routines *****************************************************************************} - -{procedure ZCompressStream(inStream, outStream: TStream; - level: TZCompressionLevel); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZCompressCheck(ZDeflateInit(zstream, level)); - - ZInternalCompressStream(zstream, inStream, outStream); -end;} - -procedure ZCompressStream(inStream, outStream: TStream; - level: TZCompressionLevel); -const - bufferSize = 32768; -var - zstream: TZStreamRec; - zresult: Integer; - inBuffer: array[0..bufferSize - 1] of Char; - outBuffer: array[0..bufferSize - 1] of Char; - inSize: Integer; - outSize: Integer; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZCompressCheck(DeflateInit(zstream, ZLevels[level])); - - inSize := inStream.Read(inBuffer, bufferSize); - - while inSize > 0 do - begin - zstream.next_in := @inBuffer[0]; - zstream.avail_in := inSize; - - repeat - zstream.next_out := @outBuffer[0]; - zstream.avail_out := bufferSize; - - ZCompressCheck(deflate(zstream, Z_NO_FLUSH)); - - // outSize := zstream.next_out - outBuffer; - outSize := bufferSize - zstream.avail_out; - - outStream.Write(outBuffer, outSize); - until (zstream.avail_in = 0) and (zstream.avail_out > 0); - - inSize := inStream.Read(inBuffer, bufferSize); - end; - - repeat - zstream.next_out := @outBuffer[0]; - zstream.avail_out := bufferSize; - - zresult := ZCompressCheck(deflate(zstream, Z_FINISH)); - - // outSize := zstream.next_out - outBuffer; - outSize := bufferSize - zstream.avail_out; - - outStream.Write(outBuffer, outSize); - until (zresult = Z_STREAM_END) and (zstream.avail_out > 0); - - ZCompressCheck(deflateEnd(zstream)); -end; - - -procedure ZCompressStream2(inStream, outStream: TStream; - level: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZCompressCheck(ZDeflateInit2(zstream, level, windowBits, memLevel, - strategy)); - - ZInternalCompressStream(zstream,inStream,outStream); -end; - -procedure ZCompressStreamWeb(inStream, outStream: TStream); -begin - ZCompressStream2(inStream, outStream, zcFastest, -15, 9, zsDefault); -end; - -procedure ZDecompressStream(inStream, outStream: TStream); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZDecompressCheck(ZInflateInit(zstream)); - - ZInternalDecompressStream(zstream, inStream, outStream); -end; - -procedure ZDecompressStream2(inStream, outStream: TStream; - windowBits: Integer); -var - zstream: TZStreamRec; -begin - FillChar(zstream, SizeOf(TZStreamRec), 0); - - ZDecompressCheck(ZInflateInit2(zstream, windowBits)); - - ZInternalDecompressStream(zstream, inStream, outStream); -end; - -{** TCustomZStream ******************************************************************************} - -constructor TCustomZStream.Create(stream: TStream); -begin - inherited Create; - - FStream := stream; - FStreamPos := stream.Position; -end; - -function TCustomZStream.StreamRead(var buffer; count: Longint): Longint; -begin - if FStream.Position <> FStreamPos then FStream.Position := FStreamPos; - - result := FStream.Read(buffer,count); - - FStreamPos := FStreamPos + result; -end; - -function TCustomZStream.StreamWrite(const buffer; count: Longint): Longint; -begin - if FStream.Position <> FStreamPos then FStream.Position := FStreamPos; - - result := FStream.Write(buffer,count); - - FStreamPos := FStreamPos + result; -end; - -function TCustomZStream.StreamSeek(offset: Longint; origin: Word): Longint; -begin - if FStream.Position <> FStreamPos then FStream.Position := FStreamPos; - - result := FStream.Seek(offset,origin); - - FStreamPos := FStream.Position; -end; - -procedure TCustomZStream.StreamReadBuffer(var buffer; count: Longint); -begin - if FStream.Position <> FStreamPos then FStream.Position := FStreamPos; - - FStream.ReadBuffer(buffer,count); - - FStreamPos := FStreamPos + count; -end; - -procedure TCustomZStream.StreamWriteBuffer(const buffer; count: Longint); -begin - if FStream.Position <> FStreamPos then FStream.Position := FStreamPos; - - FStream.WriteBuffer(buffer,count); - - FStreamPos := FStreamPos + count; -end; - -procedure TCustomZStream.DoProgress; -begin - if Assigned(FOnProgress) then FOnProgress(Self); -end; - -function TCustomZStream.GetStreamPosition: TStreamPos; -begin - result := FStream.Position; -end; - -procedure TCustomZStream.SetStreamPosition(value: TStreamPos); -begin - FStream.Position := value; - FStreamPos := FStream.Position; -end; - -{** TZCompressionStream *************************************************************************} - -constructor TZCompressionStream.Create(dest: TStream; - compressionLevel: TZCompressionLevel); -begin - inherited Create(dest); - - FZStream.next_out := @FBuffer; - FZStream.avail_out := SizeOf(FBuffer); - - ZCompressCheck(ZDeflateInit(FZStream, compressionLevel)); -end; - -constructor TZCompressionStream.Create(dest: TStream; - compressionLevel: TZCompressionLevel; windowBits, memLevel: Integer; - strategy: TZStrategy); -begin - inherited Create(dest); - - FZStream.next_out := @FBuffer; - FZStream.avail_out := SizeOf(FBuffer); - - ZCompressCheck(ZDeflateInit2(FZStream, compressionLevel, windowBits, - memLevel, strategy)); -end; - -destructor TZCompressionStream.Destroy; -begin - FZStream.next_in := Nil; - FZStream.avail_in := 0; - - try - while ZCompressCheck(ZDeflate(FZStream, zfFinish)) <> Z_STREAM_END do - begin - StreamWriteBuffer(FBuffer, SizeOf(FBuffer) - FZStream.avail_out); - - FZStream.next_out := @FBuffer; - FZStream.avail_out := SizeOf(FBuffer); - end; - - if FZStream.avail_out < SizeOf(FBuffer) then - begin - StreamWriteBuffer(FBuffer, SizeOf(FBuffer) - FZStream.avail_out); - end; - finally - ZDeflateEnd(FZStream); - end; - - inherited Destroy; -end; - -function TZCompressionStream.Read(var buffer; count: Longint): Longint; -begin - raise EZCompressionError.Create(SZInvalid); -end; - -function TZCompressionStream.Write(const buffer; count: Longint): Longint; -var - writeCount: Longint; -begin - result := count; - - FZStream.next_in := @buffer; - FZStream.avail_in := count; - - while FZStream.avail_in > 0 do - begin - ZCompressCheck(ZDeflate(FZStream, zfNoFlush)); - - if FZStream.avail_out = 0 then - begin - writeCount := StreamWrite(FBuffer,SizeOf(FBuffer)); - - if writeCount = SizeOf(FBuffer) then - begin - FZStream.next_out := @FBuffer; - FZStream.avail_out := SizeOf(FBuffer); - - DoProgress; - end - else - begin - StreamPosition := StreamPosition - writeCount; - - result := Cardinal(count) - FZStream.avail_in; - - FZStream.avail_in := 0; - end; - end; - end; -end; - -function TZCompressionStream.Seek(offset: Longint; origin: Word): Longint; -begin - if (offset = 0) and (origin = soFromCurrent) then - begin - result := FZStream.total_in; - end - else raise EZCompressionError.Create(SZInvalid); -end; - -function TZCompressionStream.GetCompressionRate: Single; -begin - if FZStream.total_in = 0 then result := 0 - else result := (1.0 - (FZStream.total_out / FZStream.total_in)) * 100.0; -end; - -{** TZDecompressionStream ***********************************************************************} - -constructor TZDecompressionStream.Create(source: TStream); -begin - inherited Create(source); - - FZStream.next_in := @FBuffer; - FZStream.avail_in := 0; - - ZDecompressCheck(ZInflateInit(FZStream)); -end; - -constructor TZDecompressionStream.Create(source: TStream; - windowBits: Integer); -begin - inherited Create(source); - - FZStream.next_in := @FBuffer; - FZStream.avail_in := 0; - - ZDecompressCheck(ZInflateInit2(FZStream, windowBits)); -end; - -destructor TZDecompressionStream.Destroy; -begin - ZInflateEnd(FZStream); - - inherited Destroy; -end; - -function TZDecompressionStream.Read(var buffer; count: Longint): Longint; -var - zresult: Integer; -begin - FZStream.next_out := @buffer; - FZStream.avail_out := count; - - zresult := Z_OK; - - while (FZStream.avail_out > 0) and (zresult <> Z_STREAM_END) do - begin - if FZStream.avail_in = 0 then - begin - FZStream.avail_in := StreamRead(FBuffer,SizeOf(FBuffer)); - - if FZStream.avail_in = 0 then - begin - result := Cardinal(count) - FZStream.avail_out; - - Exit; - end; - - FZStream.next_in := @FBuffer; - - DoProgress; - end; - - zresult := ZDecompressCheck(ZInflate(FZStream, zfNoFlush)); - end; - - if (zresult = Z_STREAM_END) and (FZStream.avail_in > 0) then - begin - StreamPosition := StreamPosition - FZStream.avail_in; - - FZStream.avail_in := 0; - end; - - result := Cardinal(count) - FZStream.avail_out; -end; - -function TZDecompressionStream.Write(const Buffer; Count: Longint): Longint; -begin - raise EZDecompressionError.Create(SZInvalid); -end; - -function TZDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; -var - buf: Array [0..8191] of Byte; - i : Integer; -begin - if (offset = 0) and (origin = soFromBeginning) then - begin - ZDecompressCheck(ZInflateReset(FZStream)); - - FZStream.next_in := @FBuffer; - FZStream.avail_in := 0; - - StreamPosition := 0; - end - else if ((offset >= 0) and (origin = soFromCurrent)) or - (((Cardinal(offset) - FZStream.total_out) > 0) and (origin = soFromBeginning)) then - begin - if origin = soFromBeginning then Dec(offset, FZStream.total_out); - - if offset > 0 then - begin - for i := 1 to offset div SizeOf(buf) do ReadBuffer(buf, SizeOf(buf)); - ReadBuffer(buf, offset mod SizeOf(buf)); - end; - end - else if (offset = 0) and (origin = soFromEnd) then - begin - while Read(buf, SizeOf(buf)) > 0 do ; - end - else raise EZDecompressionError.Create(SZInvalid); - - result := FZStream.total_out; -end; - -{** TZCustomBuffer ******************************************************************************} - -constructor TZCustomBuffer.Create; -begin - inherited Create; - - FillChar(FZStream, SizeOf(TZStreamRec), 0); - - FBuffer := Nil; - FBufferCapacity := 0; - - FBufferSize := 0; -end; - -destructor TZCustomBuffer.Destroy; -begin - BufferCapacity(0); - - inherited Destroy; -end; - -procedure TZCustomBuffer.Clear; -begin - BufferCapacity(0); - - FBufferSize := 0; -end; - -procedure TZCustomBuffer.Flush(flush: TZFlush); -begin - // to be implemented by descendents as needed -end; - -function TZCustomBuffer.Write(const s: AnsiString): Integer; -begin - result := Write(Pointer(s), Length(s)); -end; - -function TZCustomBuffer.Read(var buffer: Pointer; size: Integer): Integer; -begin - result := BufferSize; - if size < result then result := size; - - BufferRead(buffer, result); -end; - -function TZCustomBuffer.Read(var s: AnsiString): Integer; -begin - SetLength(s, BufferSize); - - result := Read(Pointer(s), Length(s)); -end; - -procedure TZCustomBuffer.BufferWrite(const buffer: Pointer; size: Integer); -begin - if size > 0 then - begin - BufferCapacity(FBufferSize + size); - - Move(buffer^, Pointer(Integer(FBuffer) + FBufferSize)^, size); - - Inc(FBufferSize, size); - end; -end; - -procedure TZCustomBuffer.BufferRead(var buffer: Pointer; size: Integer); -begin - if size > 0 then - begin - Move(FBuffer^, buffer^, size); - - Move(Pointer(Integer(FBuffer) + size)^, FBuffer^, FBufferSize - size); - - Dec(FBufferSize, size); - end; -end; - -procedure TZCustomBuffer.BufferCapacity(capacity: Integer); -const - delta = 8192; // must be a power of 2 -begin - if capacity > 0 then - begin - capacity := (capacity + (delta - 1)) and not (delta - 1); - end; - - if FBufferCapacity <> capacity then - begin - if capacity = 0 then FreeMem(FBuffer) - else if FBufferCapacity = 0 then GetMem(FBuffer, capacity) - else ReallocMem(FBuffer, capacity); - - FBufferCapacity := capacity; - end; -end; - -{** TZCompressionBuffer *************************************************************************} - -constructor TZCompressionBuffer.Create(level: TZCompressionLevel); -begin - inherited Create; - - ZCompressCheck(ZDeflateInit(FZStream, level)); -end; - -constructor TZCompressionBuffer.Create(level: TZCompressionLevel; - windowBits, memLevel: Integer; strategy: TZStrategy); -begin - inherited Create; - - ZCompressCheck(ZDeflateInit2(FZStream, level, windowBits, memLevel, - strategy)); -end; - -destructor TZCompressionBuffer.Destroy; -begin - ZCompressCheck(ZDeflateEnd(FZStream)); - - inherited Destroy; -end; - -procedure TZCompressionBuffer.Clear; -begin - inherited Clear; - - ZCompressCheck(ZDeflateReset(FZStream)); -end; - -procedure TZCompressionBuffer.Flush(flush: TZFlush); -const - outSize = 32768; -var - zresult : Integer; - outBuffer: Array [0..outSize - 1] of Byte; - outCount : Integer; -begin - FZStream.next_in := Nil; - FZStream.avail_in := 0; - - repeat - FZStream.next_out := @outBuffer; - FZStream.avail_out := outSize; - - zresult := ZCompressCheck(ZDeflate(FZStream, flush)); - - outCount := outSize - FZStream.avail_out; - - BufferWrite(@outBuffer, outCount); - until (zresult = Z_STREAM_END) or (FZStream.avail_out > 0); -end; - -function TZCompressionBuffer.Write(const buffer: Pointer; - size: Integer): Integer; -const - outSize = 32768; -var - zresult : Integer; - outBuffer: Array [0..outSize - 1] of Byte; - outCount : Integer; -begin - zresult := Z_OK; - - FZStream.next_in := buffer; - FZStream.avail_in := size; - - while (zresult <> Z_STREAM_END) and (FZStream.avail_in > 0) do - begin - repeat - FZStream.next_out := @outBuffer; - FZStream.avail_out := outSize; - - zresult := ZCompressCheck(ZDeflate(FZStream, zfNoFlush)); - - outCount := outSize - FZStream.avail_out; - - BufferWrite(@outBuffer, outCount); - until (zresult = Z_STREAM_END) or (FZStream.avail_out > 0); - end; - - result := Cardinal(size) - FZStream.avail_in; -end; - -{** TZDecompressionBuffer ***********************************************************************} - -constructor TZDecompressionBuffer.Create; -begin - inherited Create; - - ZDecompressCheck(ZInflateInit(FZStream)); -end; - -constructor TZDecompressionBuffer.Create(windowBits: Integer); -begin - inherited Create; - - ZDecompressCheck(ZInflateInit2(FZStream, windowBits)); -end; - -destructor TZDecompressionBuffer.Destroy; -begin - ZDecompressCheck(ZInflateEnd(FZStream)); - - inherited Destroy; -end; - -procedure TZDecompressionBuffer.Clear; -begin - inherited Clear; - - ZDecompressCheck(ZInflateReset(FZStream)); -end; - -function TZDecompressionBuffer.Write(const buffer: Pointer; - size: Integer): Integer; -const - outSize = 32768; -var - zresult : Integer; - outBuffer: Array [0..outSize - 1] of Byte; - outCount : Integer; -begin - zresult := Z_OK; - - FZStream.next_in := buffer; - FZStream.avail_in := size; - - while (zresult <> Z_STREAM_END) and (FZStream.avail_in > 0) do - begin - repeat - FZStream.next_out := @outBuffer; - FZStream.avail_out := outSize; - - zresult := ZDecompressCheck(ZInflate(FZStream, zfNoFlush), False); - - outCount := outSize - FZStream.avail_out; - - BufferWrite(@outBuffer, outCount); - until (zresult = Z_STREAM_END) or (FZStream.avail_out > 0); - end; - - result := Cardinal(size) - FZStream.avail_in; -end; - -{** EZLibError **********************************************************************************} - -constructor EZLibError.Create(code: Integer; const dummy: String); -begin - inherited Create(z_errmsg[2 - code]); - - FErrorCode := code; -end; - -constructor EZLibError.Create(error: TZError; const dummy: String); -begin - Create(ZErrors[error], dummy); -end; - -procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; - const OutBuf: Pointer; BufSize: Integer); -var - strm: TZStreamRec; -begin - FillChar(strm, sizeof(strm), 0); -// strm.zalloc := zlibAllocMem; -// strm.zfree := zlibFreeMem; - strm.next_in := InBuf; - strm.avail_in := InBytes; - strm.next_out := OutBuf; - strm.avail_out := BufSize; - DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); - try - if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then - raise EZlibError.CreateRes(64672); - finally - DCheck(inflateEnd(strm)); - end; -end; - -end.