From 57bc9b380809ffbc8393f646de261c4c3fdbb5c9 Mon Sep 17 00:00:00 2001
From: chuck <>
Date: Fri, 14 Aug 2020 11:19:09 -0400
Subject: [PATCH 01/76] Add missing bash tag settings
---
frontend/settings/Skyrim/Bash.Actors.ACBS.json | 0
frontend/settings/Skyrim/Bash.Actors.AIData.json | 0
frontend/settings/Skyrim/Bash.Actors.AIPackages.json | 0
frontend/settings/Skyrim/Bash.Actors.AIPackagesMerge.json | 0
frontend/settings/Skyrim/Bash.Actors.CombatStyle.json | 0
frontend/settings/Skyrim/Bash.Actors.DeathItem.json | 0
frontend/settings/Skyrim/Bash.Actors.Spells.json | 0
frontend/settings/Skyrim/Bash.Actors.SpellsMerge.json | 0
frontend/settings/Skyrim/Bash.Actors.Stats.json | 0
frontend/settings/Skyrim/Bash.All.json | 0
frontend/settings/Skyrim/Bash.Body-F.json | 0
frontend/settings/Skyrim/Bash.Body-M.json | 0
frontend/settings/Skyrim/Bash.Body-Size-F.json | 0
frontend/settings/Skyrim/Bash.Body-Size-M.json | 0
frontend/settings/Skyrim/Bash.C.Acoustic.json | 0
frontend/settings/Skyrim/Bash.C.Climate.json | 2 +-
frontend/settings/Skyrim/Bash.C.Encounter.json | 0
frontend/settings/Skyrim/Bash.C.ForceHideLand.json | 1 +
frontend/settings/Skyrim/Bash.C.ImageSpace.json | 2 +-
frontend/settings/Skyrim/Bash.C.Light.json | 2 +-
frontend/settings/Skyrim/Bash.C.Location.json | 0
frontend/settings/Skyrim/Bash.C.LockList.json | 1 +
frontend/settings/Skyrim/Bash.C.Music.json | 0
frontend/settings/Skyrim/Bash.C.Name.json | 0
frontend/settings/Skyrim/Bash.C.Owner.json | 2 +-
frontend/settings/Skyrim/Bash.C.RecordFlags.json | 0
frontend/settings/Skyrim/Bash.C.Regions.json | 0
frontend/settings/Skyrim/Bash.C.Water.json | 2 +-
frontend/settings/Skyrim/Bash.Delev.json | 0
frontend/settings/Skyrim/Bash.Destructable.json | 1 +
frontend/settings/Skyrim/Bash.Eyes.json | 0
frontend/settings/Skyrim/Bash.Factions.json | 0
frontend/settings/Skyrim/Bash.Graphics.json | 2 +-
frontend/settings/Skyrim/Bash.Hairs.json | 0
frontend/settings/Skyrim/Bash.Invent.json | 0
frontend/settings/Skyrim/Bash.Keywords.json | 1 +
frontend/settings/Skyrim/Bash.Lev.json | 0
frontend/settings/Skyrim/Bash.NPC.Class.json | 0
frontend/settings/Skyrim/Bash.NPC.Race.json | 0
frontend/settings/Skyrim/Bash.Names.json | 2 +-
frontend/settings/Skyrim/Bash.NpcFaces.json | 0
frontend/settings/Skyrim/Bash.NpcFacesForceFullImport.json | 0
frontend/settings/Skyrim/Bash.ObjectBounds.json | 1 +
frontend/settings/Skyrim/Bash.R.AddSpells.json | 0
frontend/settings/Skyrim/Bash.R.ChangeSpells.json | 0
frontend/settings/Skyrim/Bash.R.Description.json | 0
frontend/settings/Skyrim/Bash.R.Head.json | 0
frontend/settings/Skyrim/Bash.R.Skills.json | 0
frontend/settings/Skyrim/Bash.Relations.json | 0
frontend/settings/Skyrim/Bash.Relev.json | 0
frontend/settings/Skyrim/Bash.Scripts.json | 0
frontend/settings/Skyrim/Bash.Sound.json | 0
frontend/settings/Skyrim/Bash.SpellStats.json | 2 +-
frontend/settings/Skyrim/Bash.Stats.json | 2 +-
frontend/settings/Skyrim/Bash.Text.json | 1 +
frontend/settings/Skyrim/Bash.Voice-F.json | 0
frontend/settings/Skyrim/Bash.Voice-M.json | 0
57 files changed, 15 insertions(+), 9 deletions(-)
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.ACBS.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.AIData.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.AIPackages.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.AIPackagesMerge.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.CombatStyle.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.DeathItem.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.Spells.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.SpellsMerge.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Actors.Stats.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.All.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Body-F.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Body-M.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Body-Size-F.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Body-Size-M.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Acoustic.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Climate.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Encounter.json
create mode 100755 frontend/settings/Skyrim/Bash.C.ForceHideLand.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.ImageSpace.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Light.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Location.json
create mode 100755 frontend/settings/Skyrim/Bash.C.LockList.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Music.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Name.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Owner.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.RecordFlags.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Regions.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.C.Water.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Delev.json
create mode 100755 frontend/settings/Skyrim/Bash.Destructable.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Eyes.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Factions.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Graphics.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Hairs.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Invent.json
create mode 100755 frontend/settings/Skyrim/Bash.Keywords.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Lev.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.NPC.Class.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.NPC.Race.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Names.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.NpcFaces.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.NpcFacesForceFullImport.json
create mode 100755 frontend/settings/Skyrim/Bash.ObjectBounds.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.R.AddSpells.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.R.ChangeSpells.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.R.Description.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.R.Head.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.R.Skills.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Relations.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Relev.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Scripts.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Sound.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.SpellStats.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Stats.json
create mode 100755 frontend/settings/Skyrim/Bash.Text.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Voice-F.json
mode change 100644 => 100755 frontend/settings/Skyrim/Bash.Voice-M.json
diff --git a/frontend/settings/Skyrim/Bash.Actors.ACBS.json b/frontend/settings/Skyrim/Bash.Actors.ACBS.json
old mode 100644
new mode 100755
diff --git a/frontend/settings/Skyrim/Bash.Actors.AIData.json b/frontend/settings/Skyrim/Bash.Actors.AIData.json
old mode 100644
new mode 100755
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
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..93c6d3b
--- 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":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,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"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":"865E01E8","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..e3b619a
--- 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","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
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..b4e2a93
--- 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":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,"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":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,"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 - Unknown"},{"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":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":"F7AC4C60","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..93e40dd
--- 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":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,"p":1,"n":"DATA - Flags","c":[{"t":4,"p":1,"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":"B47B0FA0","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.Water.json b/frontend/settings/Skyrim/Bash.C.Water.json
old mode 100644
new mode 100755
index 6ff1581..e1b4490
--- 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":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,"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":"53C4F93D","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.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.json b/frontend/settings/Skyrim/Bash.Invent.json
old mode 100644
new mode 100755
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.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.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.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..9204796
--- 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":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,"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":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":"9FE95589","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..960d209
--- 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,MISC,PROJ,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":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,"p":1,"n":"ENIT - Effect Data","c":[{"t":3,"p":1,"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":"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,"p":1,"n":"DNAM - Armor Rating"},{"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,"p":1,"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":"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"}]}]},"name":"Bash.Stats","hash":"C6AE5502","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
From fe01ec9c77c6747a3aff130b1530d724b3ed07ab Mon Sep 17 00:00:00 2001
From: chuck <>
Date: Fri, 14 Aug 2020 11:19:36 -0400
Subject: [PATCH 02/76] Update to xedit 4.0.3
---
.gitmodules | 3 +
frontend/MatorSmash.dpr | 4 +-
frontend/MatorSmash.dproj | 1249 ++-
frontend/MatorSmash_Icon.ico | Bin 0 -> 4286 bytes
frontend/msAlgorithm.pas | 2 +-
frontend/msConflict.pas | 12 +-
frontend/msCore.pas | 13 +-
frontend/msLoader.pas | 13 +-
frontend/msSmash.pas | 2 +-
frontend/msSmashForm.dfm | 2 +-
frontend/msSmashForm.pas | 4 +-
frontend/msThreads.pas | 10 +-
frontend/smash.res | Bin
lib/mte/mteBase.pas | 15 +-
lib/xedit | 1 +
lib/xedit/lz4/lz4.pas | 1079 --
lib/xedit/lz4/lz4Common.pas | 250 -
lib/xedit/lz4/lz4HC.pas | 804 --
lib/xedit/lz4/lz4frame.pas | 1299 ---
lib/xedit/lz4/lz4frame_static.pas | 81 -
lib/xedit/lz4/lz4io.pas | 488 -
lib/xedit/lz4/xxHash.pas | 637 --
lib/xedit/wbBSA.pas | 974 --
lib/xedit/wbDefines.inc | 15 -
lib/xedit/wbDefinitionsFNV.pas | 11803 --------------------
lib/xedit/wbDefinitionsFO3.pas | 10758 ------------------
lib/xedit/wbDefinitionsFO4.pas | 16450 ---------------------------
lib/xedit/wbDefinitionsTES3.pas | 4962 --------
lib/xedit/wbDefinitionsTES4.pas | 5174 ---------
lib/xedit/wbDefinitionsTES5.pas | 13667 -----------------------
lib/xedit/wbHelpers.pas | 1233 --
lib/xedit/wbImplementation.pas | 16752 ----------------------------
lib/xedit/wbInit.pas | 887 --
lib/xedit/wbInterface.pas | 14801 ------------------------
lib/xedit/wbLocalization.pas | 646 --
lib/xedit/wbSort.pas | 1060 --
lib/xedit/wbStreams.pas | 617 -
lib/xedit/zlib/ZLibEx.inc | 182 -
lib/xedit/zlib/ZLibExApi.pas | 338 -
lib/xedit/zlib/win32/adler32.obj | Bin 1131 -> 0 bytes
lib/xedit/zlib/win32/compress.obj | Bin 520 -> 0 bytes
lib/xedit/zlib/win32/crc32.obj | Bin 10771 -> 0 bytes
lib/xedit/zlib/win32/deflate.obj | Bin 10702 -> 0 bytes
lib/xedit/zlib/win32/infback.obj | Bin 6935 -> 0 bytes
lib/xedit/zlib/win32/inffast.obj | Bin 1595 -> 0 bytes
lib/xedit/zlib/win32/inflate.obj | Bin 11320 -> 0 bytes
lib/xedit/zlib/win32/inftrees.obj | Bin 1639 -> 0 bytes
lib/xedit/zlib/win32/trees.obj | Bin 10472 -> 0 bytes
lib/xedit/zlib/win64/adler32.obj | Bin 3778 -> 0 bytes
lib/xedit/zlib/win64/compress.obj | Bin 1635 -> 0 bytes
lib/xedit/zlib/win64/crc32.obj | Bin 17008 -> 0 bytes
lib/xedit/zlib/win64/deflate.obj | Bin 30275 -> 0 bytes
lib/xedit/zlib/win64/infback.obj | Bin 12792 -> 0 bytes
lib/xedit/zlib/win64/inffast.obj | Bin 3975 -> 0 bytes
lib/xedit/zlib/win64/inflate.obj | Bin 25090 -> 0 bytes
lib/xedit/zlib/win64/inftrees.obj | Bin 3479 -> 0 bytes
lib/xedit/zlib/win64/trees.obj | Bin 23410 -> 0 bytes
lib/xedit/zlib/zlibex.pas | 2324 ----
58 files changed, 1075 insertions(+), 107536 deletions(-)
create mode 100644 .gitmodules
mode change 100644 => 100755 frontend/MatorSmash.dpr
mode change 100644 => 100755 frontend/MatorSmash.dproj
create mode 100644 frontend/MatorSmash_Icon.ico
mode change 100644 => 100755 frontend/msAlgorithm.pas
mode change 100644 => 100755 frontend/msConflict.pas
mode change 100644 => 100755 frontend/msCore.pas
mode change 100644 => 100755 frontend/msLoader.pas
mode change 100644 => 100755 frontend/msSmash.pas
mode change 100644 => 100755 frontend/msSmashForm.dfm
mode change 100644 => 100755 frontend/msSmashForm.pas
mode change 100644 => 100755 frontend/msThreads.pas
mode change 100644 => 100755 frontend/smash.res
mode change 100644 => 100755 lib/mte/mteBase.pas
create mode 160000 lib/xedit
delete mode 100644 lib/xedit/lz4/lz4.pas
delete mode 100644 lib/xedit/lz4/lz4Common.pas
delete mode 100644 lib/xedit/lz4/lz4HC.pas
delete mode 100644 lib/xedit/lz4/lz4frame.pas
delete mode 100644 lib/xedit/lz4/lz4frame_static.pas
delete mode 100644 lib/xedit/lz4/lz4io.pas
delete mode 100644 lib/xedit/lz4/xxHash.pas
delete mode 100644 lib/xedit/wbBSA.pas
delete mode 100644 lib/xedit/wbDefines.inc
delete mode 100644 lib/xedit/wbDefinitionsFNV.pas
delete mode 100644 lib/xedit/wbDefinitionsFO3.pas
delete mode 100644 lib/xedit/wbDefinitionsFO4.pas
delete mode 100644 lib/xedit/wbDefinitionsTES3.pas
delete mode 100644 lib/xedit/wbDefinitionsTES4.pas
delete mode 100644 lib/xedit/wbDefinitionsTES5.pas
delete mode 100644 lib/xedit/wbHelpers.pas
delete mode 100644 lib/xedit/wbImplementation.pas
delete mode 100644 lib/xedit/wbInit.pas
delete mode 100644 lib/xedit/wbInterface.pas
delete mode 100644 lib/xedit/wbLocalization.pas
delete mode 100644 lib/xedit/wbSort.pas
delete mode 100644 lib/xedit/wbStreams.pas
delete mode 100644 lib/xedit/zlib/ZLibEx.inc
delete mode 100644 lib/xedit/zlib/ZLibExApi.pas
delete mode 100644 lib/xedit/zlib/win32/adler32.obj
delete mode 100644 lib/xedit/zlib/win32/compress.obj
delete mode 100644 lib/xedit/zlib/win32/crc32.obj
delete mode 100644 lib/xedit/zlib/win32/deflate.obj
delete mode 100644 lib/xedit/zlib/win32/infback.obj
delete mode 100644 lib/xedit/zlib/win32/inffast.obj
delete mode 100644 lib/xedit/zlib/win32/inflate.obj
delete mode 100644 lib/xedit/zlib/win32/inftrees.obj
delete mode 100644 lib/xedit/zlib/win32/trees.obj
delete mode 100644 lib/xedit/zlib/win64/adler32.obj
delete mode 100644 lib/xedit/zlib/win64/compress.obj
delete mode 100644 lib/xedit/zlib/win64/crc32.obj
delete mode 100644 lib/xedit/zlib/win64/deflate.obj
delete mode 100644 lib/xedit/zlib/win64/infback.obj
delete mode 100644 lib/xedit/zlib/win64/inffast.obj
delete mode 100644 lib/xedit/zlib/win64/inflate.obj
delete mode 100644 lib/xedit/zlib/win64/inftrees.obj
delete mode 100644 lib/xedit/zlib/win64/trees.obj
delete mode 100644 lib/xedit/zlib/zlibex.pas
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..5d337da
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/xedit"]
+ path = lib/xedit
+ url = git@github.com:TES5Edit/TES5Edit.git
diff --git a/frontend/MatorSmash.dpr b/frontend/MatorSmash.dpr
old mode 100644
new mode 100755
index ade3a49..4242a6f
--- a/frontend/MatorSmash.dpr
+++ b/frontend/MatorSmash.dpr
@@ -36,7 +36,7 @@ uses
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',
@@ -97,7 +97,7 @@ begin
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]);
diff --git a/frontend/MatorSmash.dproj b/frontend/MatorSmash.dproj
old mode 100644
new mode 100755
index 5dc8112..b5091e5
--- a/frontend/MatorSmash.dproj
+++ b/frontend/MatorSmash.dproj
@@ -1,220 +1,1029 @@
-
-
- {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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
+ Debug
+ Application
+ VCL
+ DCC32
+ 18.8
+ Win32
+ 1
+ Win32
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ 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;$(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
+ MatorSmash
+
+
+ Resources\smash.png
+ Resources\smash.png
+ MatorSmash_Icon.ico
+
+
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
+ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
+
+
+ true
+ DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;$(DCC_Define)
+ 3
+ DetailedSegments
+
+
+ MatorSmash_Icon.ico
+ Debug
+
+
+ .\DebugLite
+ DEBUG;NX_EXCEPTION_LOG_IN_APP_FOLDER;LiteVersion;$(DCC_Define)
+ 3
+ DetailedSegments
+ true
+
+
+ 0
+ false
+ false
+ false
+ false
+ 0
+
+
+ Debug
+ MatorSmash_Icon.ico
+
+
+
+ MainSource
+
+
+ RC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+ False
+
+ True
+
+
+
+ MatorSmash.exe
+ true
+
+
+
+
+ Assets\
+ Logo44x44.png
+ true
+
+
+
+
+ .\
+ 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-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
+
+
+
+
+ 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
+
+
+ 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
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 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_Icon.ico b/frontend/MatorSmash_Icon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..c0f9ea85097d5fbb2d0ae03f1aea1ea3e5269b33
GIT binary patch
literal 4286
zcmbVPS!`8R6kX@s*FHLewFM1^)~JcZXmE@}w0!u3M59DMj7CWu5(gY&V)#(0lIVvK
zJ{+R)!-!)v8ixQX3av&u2t*7r$Y4u=G8FqtrIZ#puC>p7ueT+}#5VigbM8I&tUau~
z_ql-Me^V3mi;t%OQvqB^;VsOj=>EU{h2TR#5+xvTz#q?_YL9KN!SxQooeCy6b^;hV
z32;tv7(L~2QZJm+JdWctxIITv79QiX3T`=>QpK^ynvmnzMDrF3=Z0^%(g(pc5Fgm`
zDzNux3Ev$%2{%lch+o8%E*$$&>brB0_zN&CRB``F!X#b}E#vWp#b+k}2VXuY`a||R
zoQU{-_fg_KHVuX^9m+HK<na2{5VhJHgG
zGv*8r_cp8)Pxf-2#(*B+SZnysWcbbR0{h4KHv!*#@6wnX{t4rx`Nudbeb?>dUd=ei
zco=ym9b()$k2>KF#v<}C&-FP}g=s*?I-q~J$T#DaxRv_9#CP4x+&8}%2V;%^$3MZ8
zFopZqP?QJ8MUKVGg!5utG#7p~e0T)dF)-fW8J=hCjyaL>yX6VvpXRN@`d%V6a_>4y
zE%z^za9l}AIcUDm(GL}5$2|D02a0ye&sm;N^ut6RM16)>E2yvW;P-wcd+$qqo)_;i
z+w!nH!v{y5Do{b}Wc|MX%=41{!E`Id!eS#HGB1VgrNc1iJ>Q*&z|vUCezaU_TS*y8Z*7S{8pnh?Y>@vu_3yiVq|$|F1x
z`Buc%m9-?hzs8xl?9I+gV`Ve?hJl{ttiiKXOC*f#bYc~GmuKvSub9*l|0SM$MjSTo;Jz~{6_|9-43sUoLOGb?E7#?7#lD_b_PVgZ<5{5?FZTDUac12@`De<_Mp^(xc`Y
z>4&j{Vk2${Om=J?j#Lc^*3-
zXNFx&mY+%fJqq?>2jw*Ju~9u~q4-GrdfF{MN*C3Fd3J6wd$q5)z&e`R>u{Xo!YCMH
zJ@XhK&-M?MAv_>_&KEeWI~03X=PvU7I-C(^&_AuVukEA${L9u!uzFmH^FyB4XHe=`
zqi3+^@qPJP_K(@@aHK%}zF~a7X2o8?@p2v(zVdkQt#Z)T+E534_PO~l(YqACXPG#k
zpzl_P-~NK`%Ub1`-|>{NQ+)M>X_gOD3<-UIfu6xjMOovW#K3vr#Ubt;PS}o2|hve`GeCu0$#xtJzU+0rLs}Z@dSZ5B4
zSFx6ZW-lM=F^9Na^8u`jkg%j$YJhv30y~Sw4FHU8BDPHgDQlx=(Aga
zwR^<{f%XUaK=aUk#Esy~pfb?x}svPW9*Hn?D)1bCuI}
zX7xjF!1r@K@yT8Jot(T)@hQWmD?OG!$@$Icd7x4~h_6Z#)kBM;Yh6A5+@rlH>Sfl?
zvSZejT)19-q*RfMvw-&9AU7kAhFBAKtz>_bkJay86MF#HD)+@ZtAm`Y7TWok<7S7o
z-D9~Ye7&jbM0s`*U#w*Vkn_h6(d8DYTL)RhNJhvrc3b$yp>V(e4-p<18
ziJYr1<#Rf-B?BLl3mud$`lHLCe*+w)Y|nb~shzp_3C?VrNnZ;8Cg89awigI^R@{)84W*+G~Bl&irXl$eu~$C-w@KM$Ba&
zd#24{^(MI0zr!u*0G7@tZXU^x9|4^QHt3
zo;S_@v?u7flWyQ=BggfW>B~C2AJ3_G@qPpR
zD%!dEuUMz)bNAclysvZCIh00l9&r&@3KT2wU%1fG|HM6OMM0K)0oDKJDmwI6I
zb=v{1xk35M>$ON$^w?QTecl%y;yrO&b#*F5y{2SmiEnz>Y)rq0IZpFHddN5OhlC}p
z#gmK8teu?>M|)V0pBA6^O#G{5WN+chrM%uttJw=eu0=j1N9Kqpw1;c$yN_4yZ`?~*
z9Qg5G6#J0Z$NVBnvxG&knFqN>HlN1sD1pr^usAI3Ml!h@&3Vd81w6U9fcZZan!DQy
lDBL%UCl(E3A>Uufefk)K4UOTa^5)RCID{TadkBO5;UDVpHkkkb
literal 0
HcmV?d00001
diff --git a/frontend/msAlgorithm.pas b/frontend/msAlgorithm.pas
old mode 100644
new mode 100755
index e028206..58a4e00
--- a/frontend/msAlgorithm.pas
+++ b/frontend/msAlgorithm.pas
@@ -397,7 +397,7 @@ procedure CopyLinkedElement(srcCont, dstCont: IwbContainerElementRef;
if Assigned(de) then
de.Assign(Low(Integer), le, false)
else
- dstCont.AddIfMissing(le, true, true, '', '', '');
+ dstCont.AddIfMissing(le, true, true, '', '', '', '', false);
// follow chain
cLink := cObj.S['lf'];
if cLink <> '' then
diff --git a/frontend/msConflict.pas b/frontend/msConflict.pas
old mode 100644
new mode 100755
index 31b2aa0..e906e59
--- a/frontend/msConflict.pas
+++ b/frontend/msConflict.pas
@@ -153,7 +153,7 @@ function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord): TDynViewNodeD
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;
@@ -163,7 +163,7 @@ function NodeDatasForMainRecord(const aMainRecord: IwbMainRecord): TDynViewNodeD
if aFile.LoadOrder = LoadOrder then begin
Group := aFile.GroupBySignature[Signature];
if Assigned(Group) then begin
- Rec := Group.MainRecordByFormID[FormID];
+ Rec := Group.MainRecordByFormID[TwbFormID.fromCardinal(FormID)];
if Assigned(Rec) then begin
j := Length(Result);
SetLength(Result, j+1);
@@ -391,7 +391,7 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer;
i, j, k : Integer;
SortedCount : Integer;
NonSortedCount : Integer;
- SortedKeys : array of TnxFastStringListCS;
+ SortedKeys : array of TStringList;
Sortables : array of IwbSortableContainer;
SortKey : string;
LastSortKey : string;
@@ -423,7 +423,7 @@ procedure InitChilds(const aNodeDatas: PViewNodeDatas; aNodeCount: Integer;
SetLength(SortedKeys, Succ(aNodeCount));
for i := Low(SortedKeys) to High(SortedKeys) do begin
- SortedKeys[i] := TnxFastStringListCS.Create;
+ SortedKeys[i] := TStringList.Create;
SortedKeys[i].Sorted := True;
SortedKeys[i].Duplicates := dupError;
end;
@@ -638,7 +638,7 @@ function ConflictLevelForNodeDatas(const aNodeDatas: PViewNodeDatas;
Element : IwbElement;
CompareElement : IwbElement;
i, j : Integer;
- UniqueValues : TnxFastStringListCS;
+ UniqueValues : TStringList;
MasterPosition : Integer;
FirstElement : IwbElement;
@@ -676,7 +676,7 @@ 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;
diff --git a/frontend/msCore.pas b/frontend/msCore.pas
old mode 100644
new mode 100755
index 56300a5..ad270c5
--- 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
@@ -188,7 +190,6 @@ TPatchHelpers = class
// IMPORTANT CONSTANTS
ProgramTesters = ' ';
ProgramTranslators = ' ';
- xEditVersion = '3.1.1';
// CHECKBOX STATES
csUnknown = 0;
@@ -225,6 +226,7 @@ TPatchHelpers = class
FailedStatuses = [psFailed];
var
+ xEditVersion: string;
PatchesList, SmashSettings, pluginsToHandle, patchesToBuild: TList;
ActiveMods, SavedPluginPaths: TStringList;
ActiveModProfile, xEditLogGroup, xEditLogLabel, DictionaryFilename: string;
@@ -238,12 +240,13 @@ implementation
// mp units
msConfiguration,
// xEdit units
- wbInterface, wbImplementation;
+ wbImplementation;
{ TPlugin Constructor }
constructor TPlugin.Create;
begin
patch := ' ';
+ xEditVersion := VersionString;
inherited;
end;
@@ -443,7 +446,7 @@ procedure TPlugin.Save;
FileStream := nil;
try
FileStream := TFileStream.Create(path, fmCreate);
- _File.WriteToStream(FileStream, False);
+ _File.WriteToStream(FileStream, TwbResetModified.rmNo);
if SavedPluginPaths.IndexOf(path) = -1 then
SavedPluginPaths.Add(dataPath + filename);
except
@@ -1534,7 +1537,7 @@ procedure BuildTreeFromPlugins(var tv: TTreeView; var sl: TStringList;
i, j: Integer;
plugin: TPlugin;
rec: IwbMainRecord;
- RecordDef: PwbRecordDef;
+ RecordDef: PwbMainRecordDef;
def: TwbRecordDefEntry;
sName, sSignature: string;
slRecordSignatures: TStringList;
diff --git a/frontend/msLoader.pas b/frontend/msLoader.pas
old mode 100644
new mode 100755
index e9de76c..e0134ce
--- a/frontend/msLoader.pas
+++ b/frontend/msLoader.pas
@@ -247,12 +247,11 @@ function GetGamePath(mode: TGameMode): string;
procedure LoadDefinitions;
begin
case wbGameMode of
- gmTES5: DefineTES5;
+ gmTES5, gmTES5VR, gmSSE: DefineTES5;
gmFNV: DefineFNV;
gmTES4: DefineTES4;
gmFO3: DefineFO3;
gmFO4: DefineFO4;
- gmSSE: DefineTES5;
end;
end;
@@ -427,8 +426,8 @@ function PluginListCompare(List: TStringList; Index1, Index2: Integer): 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
FileSK1 := Cardinal(List.Objects[Index1]);
@@ -460,7 +459,7 @@ procedure AddMissingFiles(var sl: TStringList);
// 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
+ if not (wbIsPlugin(F.Name)) then
continue;
if sl.IndexOf(F.Name) = -1 then begin
fileSortKey := GetPluginDate(wbDataPath + F.Name);
@@ -481,13 +480,13 @@ 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
+ if (slNew[i].EndsWith(csDotESM)) then begin
sl.InsertObject(j, slNew[i], slNew.Objects[i]);
Inc(j);
end else
diff --git a/frontend/msSmash.pas b/frontend/msSmash.pas
old mode 100644
new mode 100755
index dc5e225..ab6052d
--- a/frontend/msSmash.pas
+++ b/frontend/msSmash.pas
@@ -306,7 +306,7 @@ procedure SmashRecords(var patch: TPatch; var records: TInterfaceList);
else
e := WinningOverrideInFiles(rec, patch.plugins);
Tracker.Write(Format(' [%d] Copying record %s', [i + 1, e.Name]));
- eCopy := wbCopyElementToFile(e, patchFile, false, true, '', '' ,'');
+ eCopy := wbCopyElementToFile(e, patchFile, false, true, '', '' ,'', '', false);
patchRec := eCopy as IwbMainRecord;
if bForce then continue;
except
diff --git a/frontend/msSmashForm.dfm b/frontend/msSmashForm.dfm
old mode 100644
new mode 100755
index c6f2153..c7a9c3b
--- a/frontend/msSmashForm.dfm
+++ b/frontend/msSmashForm.dfm
@@ -525,7 +525,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..42e79b0
--- a/frontend/msSmashForm.pas
+++ b/frontend/msSmashForm.pas
@@ -18,7 +18,7 @@ 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)
@@ -337,7 +337,7 @@ procedure TSmashForm.FormCreate(Sender: TObject);
SetTaskbarProgressState(tbpsIndeterminate);
xEditLogGroup := 'LOAD';
xEditLogLabel := 'Plugins';
- wbProgressCallback := ProgressMessage;
+ _wbProgressCallback := ProgressMessage;
StatusCallback := LoaderStatus;
if not InitBase then begin
diff --git a/frontend/msThreads.pas b/frontend/msThreads.pas
old mode 100644
new mode 100755
index 24558dc..ff371fb
--- a/frontend/msThreads.pas
+++ b/frontend/msThreads.pas
@@ -12,7 +12,7 @@ interface
// ms units
msCore, msConfiguration, msLoader, msSmash,
// xedit units
- wbBSA, wbInterface, wbImplementation;
+ wbBSA, wbHardcoded, wbInterface, wbImplementation;
type
@@ -64,6 +64,7 @@ procedure TInitThread.Execute;
var
i: integer;
plugin: TPlugin;
+ b: TBytes;
aFile: IwbFile;
begin
try
@@ -82,7 +83,7 @@ procedure TInitThread.Execute;
try
plugin := TPlugin.Create;
plugin.filename := slPlugins[i];
- plugin._File := wbFile(wbDataPath + slPlugins[i], i, '', False, False);
+ plugin._File := wbFile(wbDataPath + slPlugins[i], i, '');
plugin._File._AddRef;
plugin.GetMsData;
PluginsList.Add(Pointer(plugin));
@@ -96,11 +97,12 @@ procedure TInitThread.Execute;
// load hardcoded dat
if i = 0 then try
- aFile := wbFile(wbProgramPath + wbGameName + wbHardcodedDat, 0);
+ b := TwbHardCodedContainer.GetHardCodedDat;
+ aFile := wbFile(wbGameExeName, 0, '', [fsIsHardcoded], b);
aFile._AddRef;
except
on x: Exception do begin
- Logger.Write('ERROR', 'Load', 'Exception loading '+wbGameName+wbHardcodedDat);
+ Logger.Write('ERROR', 'Load', 'Exception loading '+wbGameName+' hardcoded dat');
Logger.Write('ERROR', 'Load', 'Please download and install this dat file!');
raise x;
end;
diff --git a/frontend/smash.res b/frontend/smash.res
old mode 100644
new mode 100755
diff --git a/lib/mte/mteBase.pas b/lib/mte/mteBase.pas
old mode 100644
new mode 100755
index 42676a6..730ee0f
--- a/lib/mte/mteBase.pas
+++ b/lib/mte/mteBase.pas
@@ -9,7 +9,7 @@ interface
// mte units
mteTracker,
// xEdit units
- wbHelpers, wbInterface, wbImplementation;
+ wbHelpers, wbLoadOrder, wbInterface, wbImplementation;
type
TSmashType = ( stUnknown, stRecord, stString, stInteger, stFlag, stFloat,
@@ -209,7 +209,7 @@ class function TPluginHelpers.CreateNewBasePlugin(var list: TList; filename: str
// create new plugin file
SysUtils.FormatSettings.DecimalSeparator := '.';
- aFile := wbNewFile(wbDataPath + filename, LoadOrder);
+ aFile := wbNewFile(wbDataPath + filename, LoadOrder, false);
aFile._AddRef;
// create new plugin object
@@ -262,7 +262,10 @@ class procedure THeaderHelpers.LoadPluginHeaders(var sl: TStringList);
// 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);
+ wbModuleByName(sl[i]); // Hack to fix crash
+ // TODO: Figure out why above is needed (probably using API wrong)
+ //aFile := wbFile(wbDataPath + sl[i], -1, '', []);
+ aFile := wbFile(sl[i], i, '', []);
plugin := TBasePlugin.Create;
plugin._File := aFile;
HeaderList.Add(plugin);
@@ -653,13 +656,13 @@ function RemoveFileIndex(formID: string): string;
{ Gets the local formID of a record (so no load order prefix) }
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;
begin
- Result := aRecord.LoadOrderFormID and $FF000000;
+ Result := aRecord.LoadOrderFormID.ToCardinal and $FF000000;
end;
{ Returns the number of override records in a file }
@@ -1514,7 +1517,7 @@ function GetEditableFileContainer: IwbContainerElementRef;
procedure PopulateAddList(var AddItem: TMenuItem; Event: TNotifyEvent);
var
i: Integer;
- RecordDef: PwbRecordDef;
+ RecordDef: PwbMainRecordDef;
item: TMenuItem;
begin
// populate wbGroupOrder to additem
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 := '