nwn-lib 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +11 -0
- data/Rakefile +1 -1
- data/bin/nwn-erf +7 -5
- data/bin/nwn-gff +8 -2
- data/lib/nwn/erf.rb +9 -7
- data/lib/nwn/gff/field.rb +8 -0
- data/lib/nwn/gff/list.rb +51 -0
- data/lib/nwn/gff/struct.rb +52 -1
- data/lib/nwn/scripting.rb +5 -1
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -136,3 +136,14 @@ Bernhard Stoeckner <elven@swordcoast.net> (2):
|
|
136
136
|
NWN::Erf: basic reading/writing library + tar-like binary
|
137
137
|
add tlk.rb to nwn/all.rb
|
138
138
|
0.4.3-rel
|
139
|
+
|
140
|
+
=== 0.4.4
|
141
|
+
Bernhard Stoeckner (7):
|
142
|
+
bin/nwn-gff: guess outfile format based on extension
|
143
|
+
erf: do not fail on misaligned strings, print warning instead
|
144
|
+
bin/nwn-erf: compat mode with tar, options can be without dashes
|
145
|
+
API: Add some helpers for creating Gff elements
|
146
|
+
scripting: satisfy: return object as-is when no conditions are given
|
147
|
+
bin/nwn-erf: -vt: move column type before filename
|
148
|
+
erf: fix loctable reading breaking on more than one locstr
|
149
|
+
0.4.4-rel
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ include FileUtils
|
|
9
9
|
# Configuration
|
10
10
|
##############################################################################
|
11
11
|
NAME = "nwn-lib"
|
12
|
-
VERS = "0.4.
|
12
|
+
VERS = "0.4.4"
|
13
13
|
CLEAN.include ["**/.*.sw?", "pkg", ".config", "rdoc", "coverage"]
|
14
14
|
RDOC_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', \
|
15
15
|
'nwn-lib: a ruby library for accessing NWN resource files', \
|
data/bin/nwn-erf
CHANGED
@@ -10,6 +10,9 @@ $type = 'ERF'
|
|
10
10
|
$allow_duplicates = false
|
11
11
|
$descriptions = {}
|
12
12
|
|
13
|
+
# tar-compat mode: first argument is options if no dash is specified.
|
14
|
+
ARGV[0] = "-" + ARGV[0] if ARGV.size > 0 && ARGV[0][0] != ?-
|
15
|
+
|
13
16
|
begin OptionParser.new do |o|
|
14
17
|
o.banner = "Usage: nwn-erf <options> [FILEs] ..."
|
15
18
|
|
@@ -80,7 +83,6 @@ begin OptionParser.new do |o|
|
|
80
83
|
end.parse!
|
81
84
|
rescue => ee
|
82
85
|
$stderr.puts ee.to_s
|
83
|
-
$stderr.puts ee.backtrace.join("\n")
|
84
86
|
exit 1
|
85
87
|
end
|
86
88
|
|
@@ -105,15 +107,15 @@ case $action
|
|
105
107
|
when :t
|
106
108
|
input {|f|
|
107
109
|
erf = NWN::Erf::Erf.new(f)
|
108
|
-
$stderr.puts "#
|
110
|
+
$stderr.puts "# %14s %16s %-10s %-4s %s" % %w{offset size date type filename} if $verbose
|
109
111
|
erf.content.each {|c|
|
110
112
|
if !$verbose
|
111
113
|
$stderr.puts "%s" % [c.filename]
|
112
114
|
else
|
113
|
-
$stderr.puts "%
|
114
|
-
c.
|
115
|
+
$stderr.puts "%16d %16d %10s %4d %s" % [
|
116
|
+
c.offset, c.size,
|
115
117
|
Date.ordinal(1900 + erf.year, erf.day_of_year).strftime("%Y-%m-%d"),
|
116
|
-
c.filename
|
118
|
+
c.res_type, c.filename
|
117
119
|
]
|
118
120
|
end
|
119
121
|
}
|
data/bin/nwn-gff
CHANGED
@@ -36,7 +36,7 @@ begin OptionParser.new do |o|
|
|
36
36
|
end
|
37
37
|
o.on "-k", "--outfile-format FORMAT", [:in, :none] + NWN::Gff::FileFormats,
|
38
38
|
"Output format (#{([:none, :in] + NWN::Gff::FileFormats).join(', ')})",
|
39
|
-
"(default: in
|
39
|
+
"(default: in when stdout, try to guess based on extension otherwise)" do |f|
|
40
40
|
$options[:outformat] = f
|
41
41
|
end
|
42
42
|
|
@@ -107,7 +107,13 @@ if :auto == $options[:informat]
|
|
107
107
|
$options[:informat]
|
108
108
|
end
|
109
109
|
|
110
|
-
|
110
|
+
if $options[:outfile] == "-"
|
111
|
+
$options[:outformat] = $options[:informat] if :in == $options[:outformat]
|
112
|
+
elsif :in == $options[:outformat]
|
113
|
+
$options[:outformat] = NWN::Gff.guess_file_format($options[:outfile])
|
114
|
+
fail "Cannot guess outfile format from filename, specify with -k." unless
|
115
|
+
$options[:outformat]
|
116
|
+
end
|
111
117
|
|
112
118
|
vputs "Reading: #{$options[:infile]}"
|
113
119
|
data_in = $options[:infile] == '-' ? $stdin.read : IO.read($options[:infile])
|
data/lib/nwn/erf.rb
CHANGED
@@ -235,14 +235,16 @@ module NWN
|
|
235
235
|
raise IOError, "Cannot read locstr list" unless
|
236
236
|
locstr.size == locstr_size
|
237
237
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
238
|
+
for lstr in 0...locstr_count do
|
239
|
+
lid, strsz = locstr.unpack("V V")
|
240
|
+
str = locstr.unpack("a#{strsz}")[0]
|
241
|
+
$stderr.puts "Expected string size does not match actual string size (want: #{strsz}, got #{str.size} of #{str.inspect})" if
|
242
|
+
strsz != str.size
|
243
243
|
@localized_strings[lid] = str
|
244
|
-
|
245
|
-
|
244
|
+
locstr = locstr[8 + str.size .. -1]
|
245
|
+
raise IOError, "locstr table does not contain enough entries (want: #{locstr_count}, got: #{lstr + 1})" if locstr.nil? &&
|
246
|
+
lstr + 1 < locstr_count
|
247
|
+
end
|
246
248
|
|
247
249
|
keylist_entry_size = @filename_length + 4 + 2 + 2
|
248
250
|
keylist = @io.read(keylist_entry_size * entry_count)
|
data/lib/nwn/gff/field.rb
CHANGED
@@ -16,6 +16,14 @@ module NWN::Gff::Field
|
|
16
16
|
# This is set internally by Gff::Reader on load.
|
17
17
|
attr_accessor :parent
|
18
18
|
|
19
|
+
# Create a new NWN::Gff::Field
|
20
|
+
def self.new label, type, value
|
21
|
+
s = {}.extend(self)
|
22
|
+
s['label'], s['type'], s['value'] = label, type, value
|
23
|
+
s.extend_meta_classes
|
24
|
+
s
|
25
|
+
end
|
26
|
+
|
19
27
|
def field_type
|
20
28
|
self['type']
|
21
29
|
end
|
data/lib/nwn/gff/list.rb
CHANGED
@@ -1,2 +1,53 @@
|
|
1
1
|
module NWN::Gff::List
|
2
|
+
|
3
|
+
# Add a new struct member to this list.
|
4
|
+
# You can either add an existing struct to this list
|
5
|
+
# (which will reparent it by setting .element), or specify
|
6
|
+
# a new struct with a block, or both:
|
7
|
+
#
|
8
|
+
# root = Gff::Struct.new 0xffffffff, "UTI", "V3.2"
|
9
|
+
# list = root.add_list 'test', []
|
10
|
+
# list.add_struct 1 do |l|
|
11
|
+
# l.add_byte 'inner_test', 5
|
12
|
+
# l.add_cexolocstr 'exolocstr', { 0 => 'Hello', 4 => 'Hallo' }
|
13
|
+
# end
|
14
|
+
# y root
|
15
|
+
#
|
16
|
+
# results in:
|
17
|
+
# --- !nwn-lib.elv.es,2008-12/struct
|
18
|
+
# __data_type: UTI
|
19
|
+
# __struct_id: 4294967295
|
20
|
+
# test:
|
21
|
+
# type: :list
|
22
|
+
# value:
|
23
|
+
# - !nwn-lib.elv.es,2008-12/struct
|
24
|
+
# __data_type: UTI/test
|
25
|
+
# __struct_id: 1
|
26
|
+
# exolocstr:
|
27
|
+
# type: :cexolocstr
|
28
|
+
# value:
|
29
|
+
# 0: Hello
|
30
|
+
# 4: Hallo
|
31
|
+
# inner_test: {type: :byte, value: 5}}
|
32
|
+
def add_struct struct_id_or_struct = 0, &block
|
33
|
+
struct = case struct_id_or_struct
|
34
|
+
when Integer
|
35
|
+
s = NWN::Gff::Struct.new
|
36
|
+
s.struct_id = struct_id_or_struct
|
37
|
+
s
|
38
|
+
|
39
|
+
when NWN::Gff::Struct
|
40
|
+
struct_id_or_struct
|
41
|
+
|
42
|
+
else
|
43
|
+
raise ArgumentError, "specify either a struct_id or an existing struct"
|
44
|
+
end
|
45
|
+
|
46
|
+
struct.element = self
|
47
|
+
|
48
|
+
yield(struct) if block_given?
|
49
|
+
|
50
|
+
self.v << struct
|
51
|
+
struct
|
52
|
+
end
|
2
53
|
end
|
data/lib/nwn/gff/struct.rb
CHANGED
@@ -18,17 +18,68 @@ module NWN::Gff::Struct
|
|
18
18
|
# The field this struct is value of.
|
19
19
|
# It is most likely a Field of :list, or
|
20
20
|
# :nil if it is the root struct.
|
21
|
-
|
21
|
+
# Setting this to a value detaches this struct from
|
22
|
+
# the old parent (though the old parent Field may still
|
23
|
+
# point to this object).
|
24
|
+
attr_reader :element
|
22
25
|
|
23
26
|
# Returns the path to this struct (which is usually __data_type)
|
24
27
|
def path
|
25
28
|
@data_type.to_s
|
26
29
|
end
|
27
30
|
|
31
|
+
def element= e #:nodoc:
|
32
|
+
@element = e
|
33
|
+
@data_type = self.element.parent.path + "/" + self.element.l
|
34
|
+
end
|
35
|
+
|
28
36
|
# Dump this struct as GFF binary data.
|
29
37
|
#
|
30
38
|
# Optionally specify data_type and data_version
|
31
39
|
def to_gff data_type = nil
|
32
40
|
NWN::Gff::Writer.dump(self, data_type)
|
33
41
|
end
|
42
|
+
|
43
|
+
# Create a new struct.
|
44
|
+
# Usually, you can leave out data_type and data_version for non-root structs,
|
45
|
+
# because that will be guess-inherited based on the existing associations.
|
46
|
+
def self.new struct_id = 0xffffffff, data_type = nil, data_version = nil
|
47
|
+
s = {}.extend(self)
|
48
|
+
s.struct_id = struct_id
|
49
|
+
s.data_type = data_type
|
50
|
+
s.data_version = data_version
|
51
|
+
s
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create a new field.
|
55
|
+
# Alternatively, you can use the shorthand methods:
|
56
|
+
# add_#{type} - add_int, add_byte, ..
|
57
|
+
# For example:
|
58
|
+
# some_struct.add_field 'ID', :byte, 5
|
59
|
+
# is equivalent to:
|
60
|
+
# some_struct.add_byte 'ID', 5
|
61
|
+
def add_field label, type, value, &block
|
62
|
+
self[label] = NWN::Gff::Field.new(label, type, value)
|
63
|
+
self[label].parent = self
|
64
|
+
if block_given?
|
65
|
+
yield(self[label])
|
66
|
+
end
|
67
|
+
self[label]
|
68
|
+
end
|
69
|
+
|
70
|
+
#:nodoc:
|
71
|
+
def method_missing meth, *av, &block
|
72
|
+
if meth.to_s =~ /^add_(.+)$/
|
73
|
+
if NWN::Gff::Types.index($1.to_sym)
|
74
|
+
av.size == 2 or super
|
75
|
+
t = $1.to_sym
|
76
|
+
f = add_field(av[0], t, av[1], &block)
|
77
|
+
return f
|
78
|
+
else
|
79
|
+
super
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
super
|
84
|
+
end
|
34
85
|
end
|
data/lib/nwn/scripting.rb
CHANGED
@@ -76,6 +76,9 @@ module NWN::Gff::Scripting
|
|
76
76
|
#
|
77
77
|
# Returns the object that satisfies the asked-for conditions,
|
78
78
|
# or nil if none can be given.
|
79
|
+
#
|
80
|
+
# If only a filename/string is given and no further arguments,
|
81
|
+
# the read object will be returned as-is.
|
79
82
|
def satisfy *what
|
80
83
|
if $standalone
|
81
84
|
fn = what.shift
|
@@ -95,6 +98,8 @@ module NWN::Gff::Scripting
|
|
95
98
|
obj = self
|
96
99
|
end
|
97
100
|
|
101
|
+
return obj if what.size == 1
|
102
|
+
|
98
103
|
what.each {|w|
|
99
104
|
case w
|
100
105
|
when Class, Module
|
@@ -108,7 +113,6 @@ module NWN::Gff::Scripting
|
|
108
113
|
return obj if obj.field_type.to_sdowncase == w.to_s.downcase
|
109
114
|
end
|
110
115
|
end
|
111
|
-
|
112
116
|
}
|
113
117
|
|
114
118
|
return nil
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nwn-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernhard Stoeckner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-09 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|