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.
- data/BINARIES +40 -45
- data/CHANGELOG +4 -0
- data/CHEATSHEET +7 -73
- data/COPYING +1 -1
- data/DATA_STRUCTURES +50 -0
- data/README +27 -37
- data/Rakefile +7 -5
- data/SCRIPTING +44 -0
- data/SETTINGS +80 -0
- data/TYPE_VALUE_INFERRING +93 -0
- data/bin/nwn-dsl +28 -0
- data/bin/nwn-gff +192 -0
- data/bin/nwn-irb +51 -0
- data/data/gff-common-nwn1.yaml +982 -0
- data/lib/nwn/all.rb +7 -0
- data/lib/nwn/gff.rb +47 -861
- data/lib/nwn/gff/api.rb +88 -0
- data/lib/nwn/gff/cexolocstr.rb +28 -0
- data/lib/nwn/gff/field.rb +105 -0
- data/lib/nwn/gff/list.rb +2 -0
- data/lib/nwn/gff/reader.rb +220 -0
- data/lib/nwn/gff/struct.rb +34 -0
- data/lib/nwn/gff/writer.rb +201 -0
- data/lib/nwn/helpers.rb +1 -30
- data/lib/nwn/infer.rb +125 -0
- data/lib/nwn/kivinen.rb +55 -0
- data/lib/nwn/scripting.rb +129 -0
- data/lib/nwn/settings.rb +7 -0
- data/lib/nwn/twoda.rb +105 -7
- data/lib/nwn/yaml.rb +276 -5
- data/scripts/clean_locstrs.rb +46 -0
- data/scripts/extract_all_items.rb +19 -0
- data/scripts/fix_facings.rb +22 -0
- data/scripts/truncate_floats.rb +18 -0
- data/tools/migrate_03x_to_04x.sh +17 -0
- data/tools/verify.sh +35 -0
- metadata +36 -8
- data/bin/nwn-gff-import +0 -69
- data/bin/nwn-gff-irb +0 -62
- data/bin/nwn-gff-print +0 -133
@@ -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}
|
data/bin/nwn-dsl
ADDED
@@ -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
|
data/bin/nwn-gff
ADDED
@@ -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)
|
data/bin/nwn-irb
ADDED
@@ -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
|