nwn-lib 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,93 @@
1
+ == Go infer yourself, wacko
2
+
3
+ nwn-lib is smart enough to infer data types when it is pointed to a
4
+ file containing information on what is to be expected.
5
+
6
+ This also works for default values.
7
+
8
+ For these libaries, this is called type and value inferring.
9
+
10
+ To use it, simply set the environment variable NWN_LIB_INFER_DATA_FILE
11
+ to a YAML file location, or use the --infer-data-file argument most
12
+ command-line scripts will take.
13
+
14
+ Some sample files have been provided with nwn-lib, look for them within
15
+ the distribution unter data/.
16
+
17
+ Here is an example to see what the fuss is about: From both representations
18
+ will exactly the same gff represenation generated.
19
+
20
+ Please be advised that inferring support for YAML is <b>EXPERIMENTAL</b> and may result in
21
+ <b>module and gff file corruption</b>.
22
+
23
+ === Without inferring
24
+
25
+ --- !nwn-lib.elv.es,2008-12/struct
26
+ __data_type: UTI
27
+ __struct_id: 4294967295
28
+ AddCost: {type: :dword, value: 0}
29
+ BaseItem: {type: :int, value: 80}
30
+ Charges: {type: :byte, value: 0}
31
+ Cloth1Color: {type: :byte, value: 0}
32
+ Cloth2Color: {type: :byte, value: 0}
33
+ Comment: {type: :cexostr, value: ""}
34
+ Cost: {type: :dword, value: 200}
35
+ Cursed: {type: :byte, value: 0}
36
+ DescIdentified:
37
+ type: :cexolocstr
38
+ value: {}
39
+
40
+ Description:
41
+ type: :cexolocstr
42
+ value: {}
43
+
44
+ Identified: {type: :byte, value: 1}
45
+ Leather1Color: {type: :byte, value: 0}
46
+ Leather2Color: {type: :byte, value: 0}
47
+ LocalizedName:
48
+ type: :cexolocstr
49
+ value:
50
+ 4: Einfacher Umhang
51
+ Metal1Color: {type: :byte, value: 0}
52
+ Metal2Color: {type: :byte, value: 0}
53
+ ModelPart1: {type: :byte, value: 1}
54
+ PaletteID: {type: :byte, value: 18}
55
+ Plot: {type: :byte, value: 0}
56
+ PropertiesList:
57
+ type: :list
58
+ value: []
59
+
60
+ StackSize: {type: :word, value: 1}
61
+ Stolen: {type: :byte, value: 0}
62
+ Tag: {type: :cexostr, value: Umhang}
63
+ TemplateResRef: {type: :resref, value: umhang}
64
+ VarTable:
65
+ type: :list
66
+ value:
67
+ - !nwn-lib.elv.es,2008-12/struct
68
+ __data_type: UTI/VarTable
69
+ __struct_id: 0
70
+ Name: {type: :cexostr, value: cloak_model}
71
+ Type: {type: :dword, value: 1}
72
+ Value: {type: :int, value: 10}
73
+
74
+ === With type and default-value inferring
75
+
76
+ --- !nwn-lib.elv.es,2008-12/struct
77
+ __data_type: UTI
78
+ BaseItem: 80
79
+ Cost: 200
80
+ Identified: 1
81
+ LocalizedName:
82
+ value:
83
+ 4: Einfacher Umhang
84
+ ModelPart1: 1
85
+ PaletteID: 18
86
+ Tag: Umhang
87
+ TemplateResRef: umhang
88
+ VarTable:
89
+ - !nwn-lib.elv.es,2008-12/struct
90
+ __data_type: UTI/VarTable
91
+ Name: cloak_model
92
+ Type: 1
93
+ Value: {type: :int, value: 10}
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'nwn/all'
5
+
6
+ $backtrace = false
7
+ OptionParser.new do |o|
8
+ o.banner = "Usage: nwn-dsl [options] <script> -- [arguments to script]"
9
+ o.on "-b", "--backtrace", "Show a backtrace on error" do
10
+ $backtrace = true
11
+ end
12
+ end.parse!
13
+
14
+ fail "Not enough arguments (try -h)." unless ARGV.size > 0
15
+
16
+ $base_script = ARGV.shift
17
+
18
+ begin
19
+ NWN::Gff::Scripting.run_script(IO.read($base_script), nil, ARGV)
20
+ rescue => e
21
+ message = e.message.split(':', 4)[3].strip
22
+ $stderr.puts message
23
+ if $backtrace
24
+ $stderr.puts ""
25
+ $stderr.puts " " + e.backtrace.join("\n")
26
+ end
27
+ exit 1
28
+ end
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/ruby
2
+ require 'rubygems'
3
+ require 'optparse'
4
+ require 'nwn/all'
5
+
6
+ Thread.abort_on_exception = true
7
+
8
+ $options = {
9
+ :backup => nil,
10
+ :force => false,
11
+ :infile => '-',
12
+ :outfile => '-',
13
+ :informat => :auto,
14
+ :outformat => :in,
15
+ :verbose => false,
16
+ :run => [],
17
+ }
18
+
19
+ begin OptionParser.new do |o|
20
+ o.banner = "Usage: nwn-gff <options>"
21
+
22
+ o.separator " "
23
+ o.separator "File selection:"
24
+
25
+ o.on "-i", "--infile FILE", "Input file (default: stdin)" do |f|
26
+ $options[:infile] = f
27
+ end
28
+ o.on "-l, ""--infile-format FORMAT", [:auto] + NWN::Gff::FileFormats,
29
+ "Input format (#{([:auto] + NWN::Gff::FileFormats).join(', ')})",
30
+ "(default: auto - try to guess based on extension)" do |f|
31
+ $options[:informat] = f
32
+ end
33
+
34
+ o.on "-o", "--outfile FILE", "Output file (default: stdout)" do |f|
35
+ $options[:outfile] = f
36
+ end
37
+ o.on "-k", "--outfile-format FORMAT", [:in, :none] + NWN::Gff::FileFormats,
38
+ "Output format (#{([:none, :in] + NWN::Gff::FileFormats).join(', ')})",
39
+ "(default: in - same as input)" do |f|
40
+ $options[:outformat] = f
41
+ end
42
+
43
+ o.on "-t", "--types", "Show field types (kivinen format only)" do
44
+ $options[:types] = true
45
+ end
46
+ o.on "-b", "--backup [CONTROL]", "make a backup of existing destination file",
47
+ "acts the same as GNU file utilities",
48
+ "(see `man cp' for a description)" do |b|
49
+ $options[:backup] = b.nil? ? true : b
50
+ end
51
+
52
+ o.on "--force", "Force write even when the resulting data would be the same" do
53
+ $options[:force] = true
54
+ end
55
+
56
+ o.separator " "
57
+ o.separator "Selection, Transformation:"
58
+
59
+ o.on "-p", "--path PATH", "Only operate on the given path" do |path|
60
+ $options[:path] = path
61
+ end
62
+ o.on "-r", "--run FILE", "Invoke a filter script",
63
+ "Please note that running 3rd party scripts is",
64
+ " * * * * * * * * ",
65
+ " D A N G E R O U S",
66
+ " * * * * * * * *",
67
+ "Do NOT RUN code you do not understand.",
68
+ "Multiple filter scripts will be evaluated",
69
+ "in the order they were given in." do |path|
70
+ raise "Specified file (-r) does not exist: #{path}" unless
71
+ FileTest.file?(path) && FileTest.readable?(path)
72
+ $options[:run] << path
73
+ end
74
+
75
+ o.separator " "
76
+ o.separator "Common options:"
77
+
78
+ o.on_tail "-h", "--help", "Show this crud" do
79
+ puts o
80
+ exit 1
81
+ end
82
+
83
+ o.on_tail "-v", "--verbose", "be verbose" do |v|
84
+ $options[:verbose] = v
85
+ end
86
+ end.parse!
87
+ rescue => ee
88
+ $stderr.puts ee.to_s
89
+ exit 1
90
+ end
91
+
92
+ ARGV.size == 0 or begin
93
+ $stderr.puts "Too many arguments (try -h)."
94
+ exit 1
95
+ end
96
+
97
+ def vputs *text
98
+ $stderr.puts *text if $options[:verbose]
99
+ end
100
+
101
+ $options[:informat] or fail "No input format specified."
102
+ $options[:outformat] or fail "No output format specified."
103
+
104
+ if :auto == $options[:informat]
105
+ $options[:informat] = NWN::Gff.guess_file_format($options[:infile])
106
+ fail "Cannot guess infile format from filename, specify with -l." unless
107
+ $options[:informat]
108
+ end
109
+
110
+ $options[:outformat] = $options[:informat] if :in == $options[:outformat]
111
+
112
+ vputs "Reading: #{$options[:infile]}"
113
+ data_in = $options[:infile] == '-' ? $stdin.read : IO.read($options[:infile])
114
+ data_in = NWN::Gff.read(data_in, $options[:informat])
115
+
116
+ # verify that we read a GFF struct
117
+ raise ArgumentError, "Input stream is NOT a valid gff struct" unless
118
+ data_in.is_a?(NWN::Gff::Struct)
119
+
120
+ if path = $options[:path]
121
+ vputs "Selecting path: #{path}"
122
+ data_in = data_in.by_path(path)
123
+ end
124
+
125
+ original_hash = data_in.hash
126
+
127
+ $options.freeze
128
+
129
+ $stop_output = $options[:outformat] == :none
130
+
131
+ $options[:run].each {|file|
132
+ vputs "Running script file: #{file}"
133
+ FileTest.exists?(file) or file = file + ".rb"
134
+ $script = File.expand_path(file)
135
+ $base_script = File.basename($script)
136
+ include NWN
137
+ include NWN::Gff::Scripting
138
+ NWN::Gff::Scripting.run_script(IO.read(file), data_in)
139
+ }
140
+
141
+ if $options[:outformat] == :none || $stop_output
142
+ vputs "not emitting any data by user or script choice."
143
+ exit
144
+ end
145
+
146
+ modified_hash = data_in.hash
147
+
148
+ if !$options[:force] && original_hash == modified_hash && $options[:outformat] == $options[:informat] &&
149
+ File.expand_path($options[:outfile]) == File.expand_path($options[:infile]) && $options[:outfile] != "-"
150
+ $stderr.puts "#{$options[:outfile]}: No need to write, data and filename would be the same."
151
+ exit 0
152
+ end
153
+
154
+ if $options[:backup] && FileTest.exists?($options[:outfile])
155
+ bdest = case $options[:backup] != true ? $options[:backup] : ENV['VERSION_CONTROL']
156
+
157
+ when 'numbered', 't'
158
+ # make numbered backups
159
+ last_numbered_backup = 0
160
+ last_numbered_backup += 1 while
161
+ FileTest.exists?($options[:outfile] + "~#{last_numbered_backup}")
162
+
163
+ $options[:outfile] + "~#{last_numbered_backup}"
164
+
165
+ when 'existing', 'nil'
166
+ # numbered if numbered backups exist, simple otherwise
167
+ last_numbered_backup = 0
168
+ last_numbered_backup += 1 while
169
+ FileTest.exists?($options[:outfile] + "~#{last_numbered_backup}")
170
+ $options[:outfile]
171
+
172
+ last_numbered_backup > 0 ?
173
+ $options[:outfile] + "~#{last_numbered_backup}" :
174
+ $options[:outfile] + '~'
175
+
176
+ when 'simple', 'never'
177
+ # always make simple backups
178
+ $options[:outfile] + '~'
179
+
180
+ # when 'none', 'off'
181
+ # never make backups (even if --backup is given)
182
+ # nil
183
+ else
184
+ # Do nothing
185
+ end
186
+
187
+ FileUtils.cp($options[:outfile], bdest) if bdest
188
+ end
189
+
190
+ write_to = $options[:outfile] == '-' ? $stdout : File.open($options[:outfile], 'w')
191
+
192
+ NWN::Gff.write(write_to, $options[:outformat], data_in)
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/ruby
2
+ require 'rubygems'
3
+ require 'optparse'
4
+ require 'nwn/all'
5
+ require 'irb'
6
+ require 'irb/completion'
7
+
8
+ OptionParser.new do |o|
9
+ o.banner = "Usage: nwn-gff-irb [file]"
10
+ end.parse!
11
+
12
+ $file = ARGV.shift
13
+ $gff = nil
14
+
15
+ def save destination = nil
16
+ raise ArgumentError,
17
+ "Cannot use save shortcut unless you opened irb with a parameter. Use write instead." unless
18
+ $file || destination
19
+
20
+ File.expand_path(destination ||= $file)
21
+ $stderr.puts "Saving to `#{destination}' .."
22
+ File.open(destination, "w") {|d|
23
+ NWN::Gff.write(d, NWN::Gff.guess_file_format(destination), $gff)
24
+ }
25
+ $stderr.puts "saved."
26
+ end
27
+
28
+
29
+ def read file
30
+ file = File.expand_path(file || $file)
31
+ $stderr.puts "Reading `#{file}' .."
32
+ fmt = NWN::Gff.guess_file_format(file)
33
+ $gff = NWN::Gff.read(IO.read(file), fmt)
34
+
35
+ $stderr.puts "Your GFF file is in `$gff' (data_type: #{$gff.data_type.inspect})."
36
+ $stderr.puts "Type `save' to save to the filename it came from (make a backup!), `exit' (or Ctrl+D) to exit (without saving)."
37
+ $stderr.puts "To save to a different location, type `save \"path/to/new/location.ext\"'."
38
+ nil
39
+ end
40
+
41
+ include NWN::Gff
42
+ include NWN::TwoDA
43
+
44
+ if $file
45
+ read($file)
46
+ else
47
+ $stderr.puts "Type `read \"file\"' to load `file' into `$gff' (or use the API: var = NWN::Gff.read(...)."
48
+ end
49
+ $stderr.puts ""
50
+
51
+ IRB.start
@@ -0,0 +1,982 @@
1
+ # This file contains default infer data for common
2
+ # bioware structs. They're identified by their path,
3
+ # which is usually contained in the yml data file.
4
+ #
5
+ # Values for each label are: [type, default_value, str_ref]
6
+ # If no str_ref is specified, 0xffffffff is assumed (the
7
+ # bioware default for "no text entered").
8
+ # If a default_value is specified (!= nil), dumping to
9
+ # yaml will omit values which match the default value.
10
+ #
11
+ # Some safe default values have been prepopulated with
12
+ # defaults that nwserver will use as if no GFF field had
13
+ # been specified.
14
+ #
15
+ # You can use regular expressions in pathes, but not in
16
+ # field names.
17
+ #
18
+ # Special field labels:
19
+ # __inline: "yes" to dump this struct inline (YAML only)
20
+ # __struct_id:
21
+ # "iterative" to assign struct ids iteratively (only for
22
+ # compacted struct lists!)
23
+ # "inline" struct_id is first field in compacted struct
24
+ # list
25
+ # some number: as-is
26
+ ---
27
+ __OBJECT_INVALID: &OBJECT_INVALID 0x7f000000
28
+ __OBJECT_SELF: &OBJECT_SELF 0xffffffff
29
+
30
+ # Generic structs first.
31
+ '.*/VarTable':
32
+ __compact: [ Name, Type, Value ]
33
+ __inline: yes
34
+ __struct_id: 0
35
+ Name: :cexostr
36
+ Type: :dword
37
+ Comment: [ :cexostr, "" ]
38
+
39
+ '[A-Z]{3}':
40
+ __struct_id: *OBJECT_SELF
41
+
42
+ __ref: &ref
43
+ Tag: :cexostr
44
+ ResRef: :resref
45
+ TemplateResRef: :resref
46
+ Comment: [ :cexostr, "" ]
47
+ Comments: [ :cexostr, "" ]
48
+ PaletteID: :byte
49
+
50
+ __events: &events
51
+ OnEnter: [ :resref, "" ]
52
+ OnExit: [ :resref, "" ]
53
+ OnClick: [ :resref, "" ]
54
+ OnClosed: [ :resref, "" ]
55
+ OnDamaged: [ :resref, "" ]
56
+ OnDeath: [ :resref, "" ]
57
+ OnDisarm: [ :resref, "" ]
58
+ OnHeartbeat: [ :resref, "" ]
59
+ OnInvDisturbed: [ :resref, "" ]
60
+ OnLock: [ :resref, "" ]
61
+ OnMeleeAttacked: [ :resref, "" ]
62
+ OnOpen: [ :resref, "" ]
63
+ OnFailToOpen: [ :resref, "" ]
64
+ OnSpellCastAt: [ :resref, "" ]
65
+ OnTrapTriggered: [ :resref, "" ]
66
+ OnUnlock: [ :resref, "" ]
67
+ OnUsed: [ :resref, "" ]
68
+ OnUserDefined: [ :resref, "" ]
69
+
70
+ ScriptAttacked: [ :resref, "" ]
71
+ ScriptDamaged: [ :resref, "" ]
72
+ ScriptDeath: [ :resref, "" ]
73
+ ScriptDialogue: [ :resref, "" ]
74
+ ScriptDisturbed: [ :resref, "" ]
75
+ ScriptEndRound: [ :resref, "" ]
76
+ ScriptHeartbeat: [ :resref, "" ]
77
+ ScriptOnBlocked: [ :resref, "" ]
78
+ ScriptOnEnter: [ :resref, "" ]
79
+ ScriptOnExit: [ :resref, "" ]
80
+ ScriptOnNotice: [ :resref, "" ]
81
+ ScriptRested: [ :resref, "" ]
82
+ ScriptSpawn: [ :resref, "" ]
83
+ ScriptSpellAt: [ :resref, "" ]
84
+ ScriptUserDefine: [ :resref, "" ]
85
+
86
+ __game_object: &gameobject
87
+ <<: *events
88
+ Interruptable: [ :byte, 1 ]
89
+ BodyBag: [ :byte, 0 ]
90
+ BodyBagId: [ :dword, *OBJECT_SELF ]
91
+ AmbientAnimState: [ :byte, 0 ]
92
+ AnimationDay: [ :dword, 0 ]
93
+ AnimationTime: [ :dword, 0 ]
94
+ AnimationState: [ :byte, 0 ]
95
+ FortSaveThrow: :char
96
+ RefSaveThrow: :char
97
+ WillSaveThrow: :char
98
+ fortbonus: [ :short, 0 ]
99
+ refbonus: [ :short, 0 ]
100
+ willbonus: [ :short, 0 ]
101
+ Fort: [ :byte, 0]
102
+ Ref: [ :byte, 0]
103
+ Will: [ :byte, 0]
104
+ ActionList: [ :list, [] ]
105
+ EffectList: [ :list, [] ]
106
+ ObjectId: :dword
107
+ Plot: [ :byte, 0 ]
108
+ HitPoints: :short
109
+ Hardness: :byte
110
+ CurrentHitPoints: :short
111
+ MaxHitPoints: :short
112
+ CurrentHP: :short
113
+ HP: :short
114
+ FactionID: :word
115
+ Faction: :dword
116
+ Conversation: [ :resref, "" ]
117
+ PortraitId: [ :word, 0 ]
118
+ Portrait: [ :resref, "" ]
119
+
120
+ __location: &location
121
+ Bearing: [ :float, 0.0 ]
122
+ Orientation: [ :float, 0 ]
123
+ X: [ :float, 0.0 ]
124
+ Y: [ :float, 0.0 ]
125
+ Z: [ :float, 0.0 ]
126
+ XOrientation: [ :float, 1.0 ]
127
+ XPosition: [ :float, 0.0 ]
128
+ YOrientation: [ :float, 0.0 ]
129
+ YPosition: [ :float, 0.0 ]
130
+ ZOrientation: [ :float, 0.0 ]
131
+ ZPosition: [ :float, 0.0 ]
132
+
133
+ __geometry: &geometry
134
+ __compact: [ PointX, PointY, PointZ ]
135
+ __inline: yes
136
+ PointX: :float
137
+ PointY: :float
138
+ PointZ: :float
139
+
140
+ __naming: &naming
141
+ DisplayName: [ :cexostr, "" ]
142
+ FirstName: [ :cexolocstr, {} ]
143
+ LastName: [ :cexolocstr, {} ]
144
+ DescIdentified: [ :cexolocstr, {} ]
145
+ Description: [ :cexolocstr, {} ]
146
+ LocName: [ :cexolocstr, {} ]
147
+ LocalizedName: [ :cexolocstr, {} ]
148
+ DescIdentifiedOv: [ :cexostr, "" ]
149
+ DescriptionOverr: [ :cexostr, "" ]
150
+
151
+ __mapnote: &mapnote
152
+ HasMapNote: [ :byte, 0 ]
153
+ MapNote: [ :cexolocstr, {} ]
154
+ MapNoteEnabled: [ :byte, 0 ]
155
+
156
+ __lock: &lock
157
+ KeyName: [ :cexostr, "" ]
158
+ KeyRequired: [ :byte, 0 ]
159
+ LocName: [ :cexolocstr, {} ]
160
+ Lockable: :byte
161
+ Locked: [ :byte, 0 ]
162
+ OpenLockDC: [ :byte, 0 ]
163
+ CloseLockDC: [ :byte, 0 ]
164
+ AutoRemoveKey: [ :byte, 0 ]
165
+
166
+ __trap: &trap
167
+ DisarmDC: [ :byte, 0 ]
168
+ TrapDetectDC: [ :byte, 0 ]
169
+ TrapDetectable: :byte
170
+ TrapDisarmable: :byte
171
+ TrapFlag: [ :byte, 0 ]
172
+ TrapOneShot: [ :byte, 1 ]
173
+ TrapType: [ :byte, 0 ]
174
+
175
+ __trigger: &trigger
176
+ Cursor: [ :byte, 0 ]
177
+ HighlightHeight: [ :float, 0.0 ]
178
+
179
+ __transition: &transition
180
+ <<: *trigger
181
+ LoadScreenID: [ :word, 0 ]
182
+ LinkedTo: [ :cexostr, "" ]
183
+ LinkedToFlags: [ :byte, 0 ]
184
+ GenericType: :byte
185
+
186
+ __armorpart: &armorpart
187
+ ArmorPart_Belt: [ :byte, 0 ]
188
+ ArmorPart_LBicep: [ :byte, 0 ]
189
+ ArmorPart_LFArm: [ :byte, 0 ]
190
+ ArmorPart_LFoot: [ :byte, 0 ]
191
+ ArmorPart_LHand: [ :byte, 0 ]
192
+ ArmorPart_LShin: [ :byte, 0 ]
193
+ ArmorPart_LShoul: [ :byte, 0 ]
194
+ ArmorPart_LThigh: [ :byte, 0 ]
195
+ ArmorPart_Neck: [ :byte, 0 ]
196
+ ArmorPart_Pelvis: [ :byte, 0 ]
197
+ ArmorPart_RBicep: [ :byte, 0 ]
198
+ ArmorPart_RFArm: [ :byte, 0 ]
199
+ ArmorPart_RFoot: [ :byte, 0 ]
200
+ ArmorPart_RHand: [ :byte, 0 ]
201
+ ArmorPart_RShin: [ :byte, 0 ]
202
+ ArmorPart_RShoul: [ :byte, 0 ]
203
+ ArmorPart_RThigh: [ :byte, 0 ]
204
+ ArmorPart_Torso: [ :byte, 0 ]
205
+ ArmorPart_Robe: [ :byte, 0 ]
206
+ UArmorPart_Belt: [ :byte, 0 ]
207
+ UArmorPart_LBice: [ :byte, 0 ]
208
+ UArmorPart_LFArm: [ :byte, 0 ]
209
+ UArmorPart_LFoot: [ :byte, 0 ]
210
+ UArmorPart_LHand: [ :byte, 0 ]
211
+ UArmorPart_LShin: [ :byte, 0 ]
212
+ UArmorPart_LShou: [ :byte, 0 ]
213
+ UArmorPart_LThig: [ :byte, 0 ]
214
+ UArmorPart_Neck: [ :byte, 0 ]
215
+ UArmorPart_Pelvi: [ :byte, 0 ]
216
+ UArmorPart_RBice: [ :byte, 0 ]
217
+ UArmorPart_RFArm: [ :byte, 0 ]
218
+ UArmorPart_RFoot: [ :byte, 0 ]
219
+ UArmorPart_RHand: [ :byte, 0 ]
220
+ UArmorPart_RShin: [ :byte, 0 ]
221
+ UArmorPart_RShou: [ :byte, 0 ]
222
+ UArmorPart_RThig: [ :byte, 0 ]
223
+ UArmorPart_Torso: [ :byte, 0 ]
224
+ UArmorPart_Robe: [ :byte, 0 ]
225
+
226
+
227
+ UTI: &uti
228
+ <<: *ref
229
+ <<: *gameobject
230
+ <<: *location
231
+ <<: *naming
232
+ <<: *armorpart
233
+ AddCost: [ :dword, 0 ]
234
+ BaseItem: :int
235
+ Charges: [ :byte, 0 ]
236
+ Cloth1Color: [ :byte, 0 ]
237
+ Cloth2Color: [ :byte, 0 ]
238
+ Cost: [ :dword, 0 ]
239
+ Cursed: [ :byte, 0 ]
240
+ Dropable: [ :byte, 1 ]
241
+ Identified: [ :byte, 0 ]
242
+ Leather1Color: [ :byte, 0 ]
243
+ Leather2Color: [ :byte, 0 ]
244
+ Metal1Color: [ :byte, 0 ]
245
+ Metal2Color: [ :byte, 0 ]
246
+ ModelPart1: :byte
247
+ ModelPart2: :byte
248
+ ModelPart3: :byte
249
+ Pickpocketable: [ :byte, 1 ]
250
+ PropertiesList: [ :list, [] ]
251
+ StackSize: [ :word, 1 ]
252
+ Stolen: [ :byte, 0 ]
253
+ VarTable: [ :list, [] ]
254
+
255
+ '(UTI|BIC|UTC|UTP|Creature List)/(ItemList/)?ItemList':
256
+ <<: *uti
257
+ __struct_id: iterative
258
+ InventoryRes: :resref
259
+
260
+ # Containers dont have as many pages
261
+ # as an inventory, sooo .. a byte was
262
+ # enough for everyone, eh, Bioware?
263
+ '(UTI|BIC|UTC|UTP|Creature List)/ItemList':
264
+ Repos_PosX: [ :word, 0 ]
265
+ Repos_Posy: [ :word, 0 ]
266
+ '(UTI|BIC|UTC|UTP|Creature List)/ItemList/ItemList':
267
+ Repos_PosX: [ :byte, 0 ]
268
+ Repos_Posy: [ :byte, 0 ]
269
+
270
+ '(BIC|UTC|UTC|Creature List)/Equip_ItemList':
271
+ <<: *uti
272
+ EquippedRes: :resref
273
+
274
+ # Looks weird, but:
275
+ # UTI/ItemList/Properties: Inventory
276
+ # UTI/ItemList/ItemList/Properties: container
277
+ # UTI/Equip_ItemList/Properties: equipped stuff
278
+ '(UTI|BIC|UTC|Creature List)/(ItemList/)?((Equip_)?ItemList/)?PropertiesList':
279
+ __compact: [ PropertyName, Subtype, CostTable, CostValue, Param1, Param1Value, UsesPerDay ]
280
+ __always: [ ChanceAppear, Useable ]
281
+ __inline: yes
282
+ __struct_id: 0
283
+
284
+ ChanceAppear: [ :byte, 100 ]
285
+ Useable: [ :byte, 1 ]
286
+ UsesPerDay: [ :byte, 255 ]
287
+
288
+ PropertyName: :word
289
+ __2da_PropertyName: [ itempropdef, Label ]
290
+ Subtype: [ :word, 0 ]
291
+ __2da_Subtype: [ :PropertyName, SubTypeResRef, Label ]
292
+
293
+ CostTable: :byte
294
+ __2da_CostTable: [ iprp_costtable, Name ]
295
+ CostValue: [ :word, -1 ]
296
+ __2da_CostValue: [ :CostTable, Name, Label ]
297
+
298
+ Param1: [ :byte, 255 ]
299
+ __2da_Param1: [ iprp_paramtable, Lable ]
300
+ Param1Value: [ :byte, 0 ]
301
+ __2da_Param1Value: [ :Param1, TableResRef, Label ]
302
+
303
+
304
+ UTC: &utc
305
+ <<: *ref
306
+ <<: *gameobject
307
+ <<: *location
308
+ <<: *naming
309
+ # Yeah, I know, its weird .. but UTC
310
+ # seems to write armorpart values sometimes.
311
+ # Im adding it here for completeness' sake.
312
+ <<: *armorpart
313
+ Age: :int
314
+ Appearance_Head: :byte
315
+ Appearance_Type: :word
316
+ AreaId: :dword
317
+ ArmorClass: :short
318
+ BaseAttackBonus: :byte
319
+ BodyPart_Belt: :byte
320
+ BodyPart_LBicep: :byte
321
+ BodyPart_LFArm: :byte
322
+ BodyPart_LFoot: :byte
323
+ BodyPart_LHand: :byte
324
+ BodyPart_LShin: :byte
325
+ BodyPart_LShoul: :byte
326
+ BodyPart_LThigh: :byte
327
+ BodyPart_Neck: :byte
328
+ BodyPart_Pelvis: :byte
329
+ BodyPart_RBicep: :byte
330
+ BodyPart_RFArm: :byte
331
+ BodyPart_RHand: :byte
332
+ BodyPart_RShin: :byte
333
+ BodyPart_RShoul: :byte
334
+ BodyPart_RThigh: :byte
335
+ BodyPart_Torso: :byte
336
+ CRAdjust: [ :int, 0 ]
337
+ Cha: :byte
338
+ ChallengeRating: [ :float, 1.0 ]
339
+ Color_Hair: [ :byte, 0 ]
340
+ Color_Skin: [ :byte, 0 ]
341
+ Color_Tattoo1: [ :byte, 0 ]
342
+ Color_Tattoo2: [ :byte, 0 ]
343
+ CreatnScrptFird: [ :byte, 1 ]
344
+ CreatureSize: :int
345
+ DeadSelectable: [ :byte, 1 ]
346
+ Con: :byte
347
+ DecayTime: [ :dword, 5000 ]
348
+ Deity: [ :cexostr, "" ]
349
+ Dex: :byte
350
+ DetectMode: [ :byte, 0 ]
351
+ Disarmable: [ :byte, 1 ]
352
+ EncounterObject: [ :dword, *OBJECT_INVALID ]
353
+ Experience: [ :dword, 0 ]
354
+ FamiliarName: [ :cexostr, "" ]
355
+ FamiliarType: :int
356
+ FootstepType: [ :int, -1 ]
357
+ Gender: [ :byte, 0 ]
358
+ Gold: [ :dword, 0 ]
359
+ GoodEvil: [ :byte, 50 ]
360
+ LawfulChaotic: [ :byte, 50 ]
361
+ Int: :byte
362
+ IsCommandable: [ :byte, 1 ]
363
+ IsImmortal: [ :byte, 0 ]
364
+ IsPC: [ :byte, 0 ]
365
+ IsDM: [ :byte, 0 ]
366
+ IsDestroyable: [ :byte, 1 ]
367
+ IsRaiseable: [ :byte, 1 ]
368
+ Listening: [ :byte, 0 ]
369
+ Lootable: :byte
370
+ MClassLevUpIn: [ :byte, 0 ]
371
+ MasterID: [ :dword, *OBJECT_INVALID ]
372
+ MovementRate: [ :byte, 0 ]
373
+ OverrideBAB: [ :byte, 0 ]
374
+ PM_IsPolymorphed: [ :byte, 0 ]
375
+ NaturalAC: :byte
376
+ NoPermDeath: [ :byte, 0 ]
377
+ PerceptionRange: :byte
378
+ Phenotype: [ :int, 0 ]
379
+ PregameCurrent: :short
380
+ Race: :byte
381
+ SitObject: [ :dword, *OBJECT_INVALID ]
382
+ SkillPoints: [ :word, 0 ]
383
+ SoundSetFile: :word
384
+ StartingPackage: [ :byte, 0 ]
385
+ StealthMode: [ :byte, 0 ]
386
+ Str: :byte
387
+ Subrace: [ :cexostr, "" ]
388
+ Tail: [ :byte, 0 ]
389
+ Tail_New: [ :dword, 0 ]
390
+ WalkRate: :int
391
+ Wings: [ :byte, 0 ]
392
+ Wings_New: [ :dword, 0 ]
393
+ Wis: :byte
394
+
395
+ CombatInfo: :struct
396
+ CombatRoundData: :struct
397
+
398
+ TemplateList: [ :list, [] ]
399
+ SpecAbilityList: [ :list, [] ]
400
+ Equip_ItemList: [ :list, [] ]
401
+ ItemList: [ :list, [] ]
402
+ ClassList: :list
403
+ SkillList: :list
404
+ FeatList: :list
405
+ LvlStatList: [ :list, [] ]
406
+ PerceptionList: [ :list, [] ]
407
+ QBList: [ :list, [] ]
408
+
409
+ '(BIC|UTC|Creature List)/LvlStatList':
410
+ __struct_id: 0
411
+ EpicLevel: [ :byte, 0 ]
412
+ FeatList: :list
413
+ LvlStatClass: :byte
414
+ LvlStatHitDie: :byte
415
+ LvlStatAbility: :byte
416
+ SkillList: :list
417
+ SkillPoints: [ :word, 0 ]
418
+
419
+ '(BIC|UTC|Creature List)/PerceptionList':
420
+ __struct_id: 0
421
+ __compact: [ ObjectId, PerceptionData ]
422
+ __inline: yes
423
+ ObjectId: :dword
424
+ PerceptionData: :byte
425
+
426
+ '(BIC|UTC|Creature List)/QBList':
427
+ __struct_id: 0
428
+ __compact: [ QBObjectType, QBCommandLabel, QBCommandLine, QBCastPropIndex, QBCastSubPropIdx,
429
+ QBContReposX, QBContReposY, QBItemInvSlot, QBDomainLevel, QBINTParam1,
430
+ QBMetaType, QBMultiClass, QBItemReposX, QBItemReposY ]
431
+ __inline: yes
432
+ QBCommandLabel: [ :cexostr, "" ]
433
+ QBCommandLine: [ :cexostr, "" ]
434
+ QBCastPropIndex: [ :byte, 0 ]
435
+ QBCastSubPropIdx: [ :byte, 255 ]
436
+ QBContReposX: [ :byte, 255 ]
437
+ QBContReposY: [ :byte, 255 ]
438
+ QBItemInvSlot: [ :dword, *OBJECT_SELF ]
439
+ QBDomainLevel: [ :byte, 0 ]
440
+ QBINTParam1: [ :int, 0 ]
441
+ QBMetaType: [ :byte, 0 ]
442
+ QBMultiClass: [ :byte, 0 ]
443
+ QBObjectType: [ :byte, 0 ]
444
+ QBItemReposX: [ :byte, 0xff ]
445
+ QBItemReposY: [ :byte, 0xff ]
446
+
447
+ '(BIC|UTC|Creature List)/CombatInfo':
448
+ __struct_id: 51882
449
+ ArcaneSpellFail: [ :byte, 0 ]
450
+ ArmorCheckPen: [ :byte, 0 ]
451
+ AttackList: [ :list, [] ]
452
+ CreatureDice: [ :byte, 0 ]
453
+ CreatureDie: [ :byte, 0 ]
454
+ DamageDice: [ :byte, 0 ]
455
+ DamageDie: [ :byte, 0 ]
456
+ DamageList: [ :list, [] ]
457
+ LeftEquip: [ :dword, *OBJECT_INVALID ]
458
+ LeftString: [ :cexostr, "" ]
459
+ NumAttacks: [ :byte, 1 ]
460
+ OffHandAttackMod: [ :char, 0 ]
461
+ OffHandCritMult: [ :byte, 2 ]
462
+ OffHandCritRng: [ :byte, 1 ]
463
+ OffHandDamageMod: [ :char, 0 ]
464
+ OffHandWeaponEq: [ :byte, 0 ]
465
+ OnHandAttackMod: [ :char, 1 ]
466
+ OnHandCritMult: [ :byte, 2 ]
467
+ OnHandCritRng: [ :byte, 1 ]
468
+ OnHandDamageMod: [ :char, 1 ]
469
+ RightEquip: [ :dword, *OBJECT_INVALID ]
470
+ RightString: [ :cexostr, "" ]
471
+ SpellResistance: [ :byte, 0 ]
472
+ UnarmedDamDice: [ :byte, 1 ]
473
+ UnarmedDamDie: [ :byte, 3 ]
474
+ eatureDice: [ :byte, 0 ]
475
+ eatureDie: [ :byte, 0 ]
476
+ reatureDice: [ :byte, 0 ]
477
+ reatureDie: [ :byte, 0 ]
478
+
479
+ '(BIC|UTC|Creature List)/CombatRoundData':
480
+ __struct_id: 51930
481
+
482
+ '(BIC|UTC|Creature List)/ClassList':
483
+ # __compact: [ Class, ClassLevel ]
484
+ # __inline: yes
485
+ __struct_id: 2
486
+ Class: :int
487
+ __2da_Class: [ classes, Label ]
488
+ ClassLevel: :short
489
+ KnownList0: [ :list, [] ]
490
+ KnownList1: [ :list, [] ]
491
+ KnownList2: [ :list, [] ]
492
+ KnownList3: [ :list, [] ]
493
+ KnownList4: [ :list, [] ]
494
+ KnownList5: [ :list, [] ]
495
+ KnownList6: [ :list, [] ]
496
+ KnownList7: [ :list, [] ]
497
+ KnownList8: [ :list, [] ]
498
+ KnownList9: [ :list, [] ]
499
+ MemorizedList0: [ :list, [] ]
500
+ MemorizedList1: [ :list, [] ]
501
+ MemorizedList2: [ :list, [] ]
502
+ MemorizedList3: [ :list, [] ]
503
+ MemorizedList4: [ :list, [] ]
504
+ MemorizedList5: [ :list, [] ]
505
+ MemorizedList6: [ :list, [] ]
506
+ MemorizedList7: [ :list, [] ]
507
+ MemorizedList8: [ :list, [] ]
508
+ MemorizedList9: [ :list, [] ]
509
+ School: :byte
510
+
511
+ '(BIC|UTC|Creature List)/ClassList/KnownList[0-9]':
512
+ __compact: Spell
513
+ __inline: no
514
+ __struct_id: 3
515
+ Spell: :word
516
+ __2da_Spell: [ spells, Label ]
517
+
518
+ '(BIC|UTC|Creature List)/ClassList/MemorizedList[0-9]':
519
+ __compact: [ Spell, SpellMetaMagic, SpellFlags, Ready ]
520
+ __inline: yes
521
+ __struct_id: 3
522
+ Spell: :word
523
+ __2da_Spell: [ spells, Label ]
524
+ SpellMetaMagic: [ :byte, 0x00 ]
525
+ SpellFlags: [ :byte, 0x01 ]
526
+ Ready: [ :byte, 1 ]
527
+
528
+ '(BIC|UTC|Creature List)/FeatList':
529
+ __struct_id: 1
530
+
531
+ '(BIC|UTC|Creature List)/(LvlStatList/)?FeatList':
532
+ __compact: [ Feat, Uses ]
533
+ __inline: yes
534
+ __struct_id: 0
535
+ Feat: :word
536
+ __2da_Feat: [ feat, LABEL ]
537
+ Uses: [ :byte, 0 ]
538
+
539
+ '(BIC|UTC|Creature List)/(LvlStatList/)?SkillList':
540
+ __compact: Rank
541
+ __struct_id: 0
542
+ Rank: :byte
543
+
544
+ '(BIC|UTC)/(LvlStatList/)?KnownList[0-9]':
545
+ __compact: Spell
546
+ __struct_id: 0
547
+ Spell: :word
548
+ __2da_Spell: [ spells, Label ]
549
+
550
+ BIC: &bic
551
+ <<: *utc
552
+
553
+ UTP: &utp
554
+ <<: *ref
555
+ <<: *gameobject
556
+ <<: *lock
557
+ <<: *trap
558
+ <<: *location
559
+ Appearance: :dword
560
+ Description: [ :cexolocstr, {} ]
561
+ HasInventory: [ :byte, 0 ]
562
+ Static: [ :byte, 0 ]
563
+ Type: [ :byte, 0 ]
564
+ Useable: [ :byte, 0 ]
565
+
566
+
567
+ UTD: &utd
568
+ <<: *ref
569
+ <<: *gameobject
570
+ <<: *lock
571
+ <<: *trap
572
+ <<: *naming
573
+ <<: *transition
574
+ <<: *location
575
+ Appearance: :dword
576
+
577
+ UTE: &ute
578
+ <<: *ref
579
+ <<: *gameobject
580
+ <<: *naming
581
+ <<: *location
582
+ Active: :byte
583
+ 'CreatureList': :list
584
+ Difficulty: :int
585
+ DifficultyIndex: :int
586
+ MaxCreatures: :int
587
+ OnEntered: :resref
588
+ OnExhausted: :resref
589
+ PlayerOnly: :byte
590
+ RecCreatures: :int
591
+ Reset: :byte
592
+ ResetTime: :int
593
+ Respawns: :int
594
+ SpawnOption: :int
595
+
596
+ UTE/CreatureList:
597
+ __struct_id: 0
598
+ Appearance: :int
599
+ CR: :float
600
+ ResRef: :resref
601
+ SingleSpawn: :byte
602
+
603
+ UTE/Geometry:
604
+ __struct_id: 1
605
+ <<: *geometry
606
+
607
+ UTM: &utm
608
+ <<: *ref
609
+ <<: *naming
610
+ <<: *location
611
+ ID: :byte
612
+ OnOpenStore: [ :resref, "" ]
613
+ OnStoreClosed: [ :resref, "" ]
614
+ StoreGold: [ :int, -1 ]
615
+ MaxBuyPrice: [ :int, -1 ]
616
+ WillOnlyBuy: [ :list, [] ]
617
+ WillNotBuy: [ :list, [] ]
618
+ MarkUp: [ :int ]
619
+ MarkDown: [ :int ]
620
+ BlackMarket: [ :byte, 0 ]
621
+ BM_MarkDown: [ :int ]
622
+ IdentifyPrice: [ :int, -1 ]
623
+ StoreList: [ :list, [] ]
624
+
625
+ UTM/WillOnlyBuy:
626
+ __struct_id: 97869
627
+ __compact: BaseItem
628
+ BaseItem: :int
629
+
630
+ UTM/StoreList:
631
+ __struct_id: 0
632
+ __inline: no
633
+ ItemList: [ :list, [] ]
634
+
635
+ UTM/StoreList/ItemList:
636
+ <<: *uti
637
+ __struct_id: 0
638
+ __compact: [ InventoryRes, Infinite, Repos_PosX, Repos_Posy ]
639
+ __inline: yes
640
+ Infinite: [ :byte, 0 ]
641
+ InventoryRes: :resref
642
+ Repos_PosX: [ :word ]
643
+ Repos_Posy: [ :word ]
644
+
645
+ UTS: &uts
646
+ <<: *ref
647
+ <<: *gameobject
648
+ <<: *naming
649
+ <<: *location
650
+ Active: :byte
651
+ Continuous: :byte
652
+ Elevation: :float
653
+ GeneratedType: [ :dword, 0 ]
654
+ Hours: :dword
655
+ Interval: :dword
656
+ IntervalVrtn: :dword
657
+ Looping: :byte
658
+ MaxDistance: :float
659
+ MinDistance: :float
660
+ PitchVariation: :float
661
+ Positional: :byte
662
+ Priority: :byte
663
+ Random: :byte
664
+ RandomPosition: :byte
665
+ RandomRangeX: :float
666
+ RandomRangeY: :float
667
+ Times: :byte
668
+ Volume: :byte
669
+ VolumeVrtn: :byte
670
+
671
+ Sounds: :list
672
+
673
+ __sound_list: &sound_list
674
+ __compact: Sound
675
+ __struct_id: 0
676
+ Sound: :resref
677
+
678
+ UTS/Sounds:
679
+ <<: *sound_list
680
+
681
+ UTT: &utt
682
+ <<: *ref
683
+ <<: *gameobject
684
+ <<: *naming
685
+ <<: *trap
686
+ <<: *lock
687
+ <<: *transition
688
+ <<: *location
689
+ Type: [ :int, 0 ]
690
+
691
+ UTW: &utw
692
+ <<: *ref
693
+ <<: *gameobject
694
+ <<: *naming
695
+ <<: *transition
696
+ <<: *mapnote
697
+ <<: *location
698
+ Appearance: :byte
699
+
700
+
701
+ ARE: &are
702
+ <<: *ref
703
+ <<: *events
704
+ ChanceLightning: :int
705
+ ChanceRain: :int
706
+ ChanceSnow: :int
707
+ Creator_ID: :int
708
+ DayNightCycle: :byte
709
+ Expansion_List: [ :list, [] ]
710
+ Flags: :dword
711
+ FogClipDist: :float
712
+ Height: :int
713
+ ID: :int
714
+ IsNight: :byte
715
+ LightingScheme: :byte
716
+ LoadScreenID: :word
717
+ ModListenCheck: :int
718
+ ModSpotCheck: :int
719
+ MoonAmbientColor: :dword
720
+ MoonDiffuseColor: :dword
721
+ MoonFogAmount: :byte
722
+ MoonFogColor: :dword
723
+ MoonShadows: :byte
724
+ Name: :cexolocstr
725
+ NoRest: :byte
726
+ PlayerVsPlayer: :byte
727
+ ShadowOpacity: :byte
728
+ SkyBox: :byte
729
+ SunAmbientColor: :dword
730
+ SunDiffuseColor: :dword
731
+ SunFogAmount: :byte
732
+ SunFogColor: :dword
733
+ SunShadows: :byte
734
+ Tileset: :resref
735
+ Version: :dword
736
+ Width: :int
737
+ WindPower: :int
738
+
739
+ Tile_List: :list
740
+
741
+ ARE/Tile_List:
742
+ __struct_id: 1
743
+ __compact: [ Tile_AnimLoop1, Tile_AnimLoop2, Tile_AnimLoop3,
744
+ Tile_Height, Tile_ID, Tile_MainLight1, Tile_MainLight2,
745
+ Tile_Orientation, Tile_SrcLight1, Tile_SrcLight2 ]
746
+ __inline: yes
747
+ Tile_AnimLoop1: :byte
748
+ Tile_AnimLoop2: :byte
749
+ Tile_AnimLoop3: :byte
750
+ Tile_Height: :int
751
+ Tile_ID: :int
752
+ Tile_MainLight1: :byte
753
+ Tile_MainLight2: :byte
754
+ Tile_Orientation: :int
755
+ Tile_SrcLight1: :byte
756
+ Tile_SrcLight2: :byte
757
+
758
+ GIT: &git
759
+ 'Creature List': [ :list, [] ]
760
+ 'Door List': [ :list, [] ]
761
+ 'Encounter List': [ :list, [] ]
762
+ 'Placeable List': [ :list, [] ]
763
+ 'SoundList': [ :list, [] ]
764
+ 'StoreList': [ :list, [] ]
765
+ 'TriggerList': [ :list, [] ]
766
+ 'WaypointList': [ :list, [] ]
767
+ # What is THAT, Bioware?
768
+ List: [ :list, [] ]
769
+
770
+ GIT/AreaProperties:
771
+ __struct_id: 100
772
+ AmbientSndDay: :int
773
+ AmbientSndDayVol: :int
774
+ AmbientSndNight: :int
775
+ AmbientSndNitVol: :int
776
+ EnvAudio: :int
777
+ MusicBattle: :int
778
+ MusicDay: :int
779
+ MusicDelay: :int
780
+ MusicNight: :int
781
+
782
+ 'GIT/Creature List':
783
+ <<: *utc
784
+ 'GIT/Door List':
785
+ <<: *utd
786
+ 'GIT/Encounter List':
787
+ <<: *ute
788
+ SpawnPointList: [ :list, [] ]
789
+
790
+ 'GIT/Encounter List/Geometry':
791
+ __struct_id: 1
792
+ __compact: [ X, Y, Z ]
793
+ __inline: yes
794
+ X: :float
795
+ Y: :float
796
+ Z: :float
797
+
798
+ 'GIT/Encounter List/SpawnPointList':
799
+ __struct_id: 2
800
+ __inline: yes
801
+ __compact: [ X, Y, Z, Orientation ]
802
+ <<: *location
803
+
804
+ 'GIT/Placeable List':
805
+ <<: *utp
806
+
807
+ 'GIT/SoundList':
808
+ <<: *uts
809
+
810
+ 'GIT/SoundList/Sounds':
811
+ <<: *sound_list
812
+
813
+ 'GIT/StoreList':
814
+ <<: *utm
815
+
816
+ 'GIT/TriggerList':
817
+ <<: *utt
818
+ Geometry: [ :list, [] ]
819
+
820
+ 'GIT/TriggerList/Geometry':
821
+ __struct_id: 3
822
+ <<: *geometry
823
+
824
+ 'GIT/WaypointList':
825
+ <<: *utw
826
+
827
+ IFO:
828
+ Expansion_Pack: :word
829
+ Mod_Area_list: :list
830
+ Mod_CacheNSSList: :list
831
+ Mod_Creator_ID: :int
832
+ Mod_CustomTlk: :cexostr
833
+ Mod_CutSceneList: [ :list, [] ]
834
+ Mod_DawnHour: :byte
835
+ Mod_Description: :cexolocstr
836
+ Mod_DuskHour: :byte
837
+ Mod_Entry_Area: :resref
838
+ Mod_Entry_Dir_X: :float
839
+ Mod_Entry_Dir_Y: :float
840
+ Mod_Entry_X: :float
841
+ Mod_Entry_Y: :float
842
+ Mod_Entry_Z: :float
843
+ Mod_Expan_List: [ :list, [] ]
844
+ Mod_GVar_List: [ :list, [] ]
845
+ Mod_ID: :void
846
+ Mod_IsSaveGame: [ :byte, 0 ]
847
+ Mod_MinGameVer: :cexostr
848
+ Mod_MinPerHour: :byte
849
+ Mod_Name: :cexolocstr
850
+ Mod_OnAcquirItem: :resref
851
+ Mod_OnActvtItem: :resref
852
+ Mod_OnClientEntr: :resref
853
+ Mod_OnClientLeav: :resref
854
+ Mod_OnCutsnAbort: :resref
855
+ Mod_OnHeartbeat: :resref
856
+ Mod_OnModLoad: :resref
857
+ Mod_OnModStart: :resref
858
+ Mod_OnPlrDeath: :resref
859
+ Mod_OnPlrDying: :resref
860
+ Mod_OnPlrEqItm: :resref
861
+ Mod_OnPlrLvlUp: :resref
862
+ Mod_OnPlrRest: :resref
863
+ Mod_OnPlrUnEqItm: :resref
864
+ Mod_OnSpawnBtnDn: :resref
865
+ Mod_OnUnAqreItem: :resref
866
+ Mod_OnUsrDefined: :resref
867
+ Mod_StartDay: :byte
868
+ Mod_StartHour: :byte
869
+ Mod_StartMonth: :byte
870
+ Mod_StartMovie: :resref
871
+ Mod_StartYear: :dword
872
+ Mod_Tag: [ :cexostr, "MODULE" ]
873
+ Mod_Version: :dword
874
+ Mod_XPScale: :byte
875
+ VarTable: [ :list, [] ]
876
+ Mod_HakList: [ :list, [] ]
877
+
878
+ IFO/Mod_Area_list:
879
+ __struct_id: 6
880
+ __compact: Area_Name
881
+ __inline: no
882
+ Area_Name: :resref
883
+
884
+ IFO/Mod_CacheNSSList:
885
+ __struct_id: 9
886
+ __compact: ResRef
887
+ __inline: no
888
+ ResRef: :resref
889
+
890
+ IFO/Mod_HakList:
891
+ __struct_id: 8
892
+ __compact: Mod_Hak
893
+ __inline: no
894
+ Mod_Hak: :cexostr
895
+
896
+ FAC:
897
+ FactionList: :list
898
+ RepList: :list
899
+
900
+ FAC/FactionList:
901
+ __struct_id: iterative
902
+ __compact: [ FactionGlobal, FactionName, FactionParentID ]
903
+ __inline: yes
904
+ FactionGlobal: :word
905
+ FactionName: :cexostr
906
+ FactionParentID: :dword
907
+
908
+ FAC/RepList:
909
+ __struct_id: iterative
910
+ __compact: [ FactionID1, FactionID2, FactionRep ]
911
+ __inline: yes
912
+ FactionID1: :dword
913
+ FactionID2: :dword
914
+ FactionRep: :dword
915
+
916
+ JRL:
917
+ Categories: :list
918
+
919
+ JRL/Categories:
920
+ __struct_id: iterative
921
+ Name: :cexolocstr
922
+ Comment: [ :cexostr, "" ]
923
+ EntryList: :list
924
+ Picture: [ :word, 0xffff ]
925
+ Priority: :dword
926
+ Tag: [ :cexostr, "" ]
927
+ XP: [ :dword, 0 ]
928
+
929
+ JRL/Categories/EntryList:
930
+ __struct_id: iterative
931
+ # __compact: [ End, ID, Text ]
932
+ # __inline: yes
933
+ End: :word
934
+ ID: :dword
935
+ Text: :cexolocstr
936
+
937
+ DLG:
938
+ DelayEntry: [ :dword, 0 ]
939
+ DelayReply: [ :dword, 0 ]
940
+ EndConverAbort: :resref
941
+ EndConversation: :resref
942
+ NumWords: :dword
943
+ PreventZoomIn: :byte
944
+
945
+ EntryList: :list
946
+ ReplyList: :list
947
+ StartingList: :list
948
+
949
+
950
+ 'DLG/(Entry|Reply)List':
951
+ __struct_id: iterative
952
+ AnimLoop: [ :byte, 1 ]
953
+ Animation: [ :dword, 0 ]
954
+ Comment: [ :cexostr, "" ]
955
+ Delay: [ :dword, *OBJECT_SELF ]
956
+ Quest: [ :cexostr, "" ]
957
+ Script: [ :resref, "" ]
958
+ Sound: [ :resref, "" ]
959
+ Text: [ :cexolocstr, {} ]
960
+
961
+ DLG/EntryList:
962
+ ReplistList: :list
963
+ Speaker: [ :cexostr, "" ]
964
+
965
+ DLG/ReplyList:
966
+ EntriesList: :list
967
+
968
+ 'DLG/(Entry|Reply)List/(Replies|Entries)List':
969
+ __compact: [ Active, Index, IsChild, LinkComment ]
970
+ __inline: yes
971
+ __struct_id: iterative
972
+ Active: :resref
973
+ Index: :dword
974
+ IsChild: :byte
975
+ LinkComment: [ :cexostr, "" ]
976
+
977
+ DLG/StartingList:
978
+ __compact: [ Active, Index ]
979
+ __inline: yes
980
+ __struct_id: iterative
981
+ Active: :resref
982
+ Index: :dword