nwn-lib 0.3.6 → 0.4.0

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.
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env nwn-dsl
2
+
3
+ # This FILTER walks all cexolocstrs and makes sure
4
+ # that there are no stray language-ids.
5
+ #
6
+ # This is obviously only useful for single-language projects.
7
+
8
+ want Gff::Struct
9
+
10
+ count = 0
11
+
12
+ self.each_by_flat_path do |label, field|
13
+ next unless field.is_a?(Gff::Cexolocstr)
14
+ next if field.v.size == 0
15
+
16
+ compactable = field.v.values.reject {|x| x == ""}.uniq.size < 2
17
+
18
+ unless will_output?
19
+ unless compactable
20
+ log "%s: need interactive." % [label]
21
+ log " %s" % [field.v.inspect]
22
+ else
23
+ log "%s: can fix for myself." % label
24
+ end
25
+
26
+ else
27
+ str = nil
28
+ unless compactable
29
+ log "Cannot compact #{label}, because the contained strings are not unique."
30
+ selection = ask "Use what string?", field.v
31
+ log "Using: #{selection.inspect}"
32
+ str = field.v[selection.to_i]
33
+ else
34
+ str = field.v[field.v.keys.sort[0]]
35
+ end
36
+ field.v.clear
37
+ field.v[0] = str
38
+
39
+ field.str_ref = Gff::Field::DEFAULT_STR_REF
40
+
41
+ count += 1
42
+ end
43
+
44
+ end
45
+
46
+ log "#{count} str-refs modified." if will_output?
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env nwn-dsl
2
+
3
+ # This script will extract all items the worked-on
4
+ # struct is currently in possession of.
5
+ o = need ARGV.shift, :bic, :utc, :uti
6
+
7
+ log "Extracting .."
8
+ list = []
9
+ list += o['Equip_ItemList'].field_value if o['Equip_ItemList']
10
+ list += o['ItemList'].field_value if o['ItemList']
11
+ log "#{list.size} items found."
12
+ list.each_with_index {|item, index|
13
+ File.open(fname = "item_#{index}.uti", "w") {|file|
14
+ file.write item.to_gff("UTI")
15
+ log "Written item: #{item['Tag'].field_value} as #{fname}"
16
+ }
17
+ }
18
+
19
+ log "All done."
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env nwn-dsl
2
+
3
+ # The nwn toolset sometimes does weird things with facings;
4
+ # they flip signedness for no apparent reason.
5
+
6
+ # This script fixes that by forcing all facings to be unsigned.
7
+
8
+ want Gff::Struct
9
+
10
+ count = 0
11
+
12
+ self.each_by_flat_path do |label, field|
13
+ next unless field.is_a?(Gff::Field)
14
+ next unless field.field_type == :float
15
+ next unless label =~ %r{\[\d+\]/(Facing|Bearing)$}
16
+ if field.field_value < 0
17
+ field.field_value = field.field_value.abs
18
+ count += 1
19
+ end
20
+ end
21
+
22
+ log "#{count} bearings modified."
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env nwn-dsl
2
+
3
+ # This truncates position floats to a sane width, thus avoiding
4
+ # miniscule floating point differences in version control diffs.
5
+
6
+ PRECISION = 4
7
+
8
+ count = 0
9
+
10
+ self.each_by_flat_path do |label, field|
11
+ next unless field.is_a?(Gff::Field)
12
+ next unless field.field_type == :float
13
+ field.field_value =
14
+ ("%.#{PRECISION}f" % field.field_value).to_f
15
+ count += 1
16
+ end
17
+
18
+ log "#{count} floats truncated."
@@ -0,0 +1,17 @@
1
+ #!/bin/sh
2
+ # This script automages migrating <= 0.3.6-formatted YAML
3
+ # dumps to the current format.
4
+ # You need both versions of nwn-lib installed.
5
+ set -e
6
+
7
+ for in_yml in $@; do
8
+ if [ ! -e "$in_yml" ]; then
9
+ echo "$in_yml: does not exist"
10
+ exit 1
11
+ fi
12
+ tmp=$1.gff
13
+
14
+ echo -n "$in_yml: "
15
+ ( nwn-gff-import _0.3.6_ -y $in_yml | nwn-gff -lg -ky > $tmp ) && mv $tmp $in_yml
16
+ echo "ok."
17
+ done
@@ -0,0 +1,35 @@
1
+ #!/bin/sh
2
+
3
+ cmp() {
4
+ gffcmp.pl -d $1 $2 | \
5
+ fgrep -v "File $2 do not match" | \
6
+ egrep -v "^Number of items in localized string array .* differ, " | \
7
+ egrep -v "^Localized string array .* differ, key .* missing$" | \
8
+ egrep -v "^Key .* missing from" | \
9
+ fgrep -v "Number of keys at level" | \
10
+ fgrep -v "First gff has extra key"
11
+ }
12
+
13
+ tmp=/tmp/nwn-gff-tmp
14
+
15
+ for x in $@; do
16
+
17
+ echo "| $x: test kivinen printer: y -> k | cmp" | ts
18
+ nwn-gff -i$x -kk -t | gffencode.pl - -o $tmp
19
+ cmp $x $tmp
20
+
21
+ echo "| $x: test gff printer: y -> g | cmp" | ts
22
+ nwn-gff -i$x -kg > $tmp
23
+ cmp $x $tmp
24
+
25
+ echo "| $x: test marshal re-read: m -> m -> k | cmp" | ts
26
+ nwn-gff -i$x -km | nwn-gff -lm -kk -t | gffencode.pl - -o $tmp
27
+ cmp $x $tmp
28
+
29
+ echo "| $x: test yaml re-read: y -> y -> k | cmp" | ts
30
+ nwn-gff -i$x -ky | nwn-gff -ly -ky | tee /tmp/blah | \
31
+ nwn-gff -ly -kk -t | gffencode.pl - -o $tmp
32
+ cmp $x $tmp
33
+ done
34
+
35
+ exit 0
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.3.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernhard Stoeckner
@@ -9,21 +9,25 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-10 00:00:00 +01:00
12
+ date: 2009-02-03 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
16
  description: a ruby library for accessing Neverwinter Nights resource files
17
17
  email: elven@swordcoast.net
18
18
  executables:
19
- - nwn-gff-print
20
- - nwn-gff-irb
21
- - nwn-gff-import
19
+ - nwn-gff
20
+ - nwn-dsl
21
+ - nwn-irb
22
22
  extensions: []
23
23
 
24
24
  extra_rdoc_files:
25
25
  - README
26
26
  - BINARIES
27
+ - DATA_STRUCTURES
28
+ - SCRIPTING
29
+ - SETTINGS
30
+ - TYPE_VALUE_INFERRING
27
31
  - CHEATSHEET
28
32
  - CHANGELOG
29
33
  - COPYING
@@ -32,17 +36,41 @@ files:
32
36
  - CHANGELOG
33
37
  - README
34
38
  - Rakefile
35
- - bin/nwn-gff-irb
36
- - bin/nwn-gff-print
37
- - bin/nwn-gff-import
39
+ - bin/nwn-dsl
40
+ - bin/nwn-gff
41
+ - bin/nwn-irb
38
42
  - spec/spec.opts
39
43
  - spec/rcov.opts
40
44
  - lib/nwn
45
+ - lib/nwn/scripting.rb
41
46
  - lib/nwn/yaml.rb
42
47
  - lib/nwn/twoda.rb
48
+ - lib/nwn/settings.rb
43
49
  - lib/nwn/gff.rb
50
+ - lib/nwn/infer.rb
51
+ - lib/nwn/kivinen.rb
52
+ - lib/nwn/all.rb
44
53
  - lib/nwn/helpers.rb
54
+ - lib/nwn/gff
55
+ - lib/nwn/gff/field.rb
56
+ - lib/nwn/gff/reader.rb
57
+ - lib/nwn/gff/cexolocstr.rb
58
+ - lib/nwn/gff/struct.rb
59
+ - lib/nwn/gff/list.rb
60
+ - lib/nwn/gff/writer.rb
61
+ - lib/nwn/gff/api.rb
62
+ - tools/verify.sh
63
+ - tools/migrate_03x_to_04x.sh
64
+ - scripts/truncate_floats.rb
65
+ - scripts/fix_facings.rb
66
+ - scripts/clean_locstrs.rb
67
+ - scripts/extract_all_items.rb
68
+ - data/gff-common-nwn1.yaml
45
69
  - BINARIES
70
+ - DATA_STRUCTURES
71
+ - SCRIPTING
72
+ - SETTINGS
73
+ - TYPE_VALUE_INFERRING
46
74
  - CHEATSHEET
47
75
  has_rdoc: true
48
76
  homepage: http://nwn-lib.elv.es
@@ -1,69 +0,0 @@
1
- #!/usr/bin/ruby
2
- require 'rubygems'
3
- require 'optparse'
4
- require 'nwn/gff'
5
- require 'nwn/helpers'
6
- require 'yaml'
7
-
8
- format = nil
9
- postfix = nil
10
- outfile = nil
11
-
12
- OptionParser.new do |o|
13
- o.banner = "Usage: nwn-gff-import [options] file/- [file, file, file]"
14
-
15
- o.on "-y", "--yaml", "Import as yaml" do
16
- format = :yaml
17
- end
18
- o.on "-m", "--marshal", "Import as native ruby marshal data" do
19
- format = :marshal
20
- end
21
-
22
- o.on "-o", "--outfile F", "Write to outfile instead of stdout" do |out|
23
- outfile = out
24
- end
25
-
26
- o.on "--postfix P", "Strip the given postfix from file and write to that instead of stdout (overrides -o)" do |p|
27
- postfix = p
28
- end
29
-
30
- end.parse!
31
-
32
- ARGV.size > 0 or begin
33
- $stderr.puts "Required argument: filename to read, or - for stdin (try -h)."
34
- exit 1
35
- end
36
-
37
- ARGV.each do |infile|
38
- data = nil
39
-
40
- if !postfix && !outfile
41
- outfile = $stdout
42
- elsif postfix && outfile
43
- outfile = outfile.gsub(/#{Regexp.escape(postfix)}$/, "")
44
- outfile = File.new(outfile, "w")
45
- elsif outfile && !postfix
46
- outfile = File.new(outfile, "w")
47
- end
48
-
49
- inbytes = infile == "-" ? $stdin.read : IO.read(infile)
50
-
51
- case format
52
- when :yaml
53
- data = YAML.load(inbytes)
54
- when :marshal
55
- data = Marshal.load(inbytes)
56
- else
57
- raise ArgumentError, "Unknown format; try -h"
58
- end
59
-
60
- raise ArgumentError, "Input stream is NOT a valid gff object" unless
61
- data.is_a?(NWN::Gff::Gff)
62
-
63
- outbytes = NWN::Gff::Writer.dump(data)
64
-
65
-
66
- outfile.write(outbytes)
67
-
68
- outfile.close
69
- end
@@ -1,62 +0,0 @@
1
- #!/usr/bin/ruby
2
- require 'rubygems'
3
- require 'optparse'
4
- require 'nwn/gff'
5
- require 'nwn/twoda'
6
- require 'yaml'
7
- require 'irb'
8
- require 'irb/completion'
9
-
10
- OptionParser.new do |o|
11
- o.banner = "Usage: nwn-gff-irb file"
12
- end.parse!
13
-
14
- file = ARGV.shift or begin
15
- $stderr.puts "Required argument: filename to process, or - for stdin (try -h)."
16
- exit 1
17
- end
18
-
19
- if file == "-"
20
- bytes = $stdin.read
21
- else
22
- bytes = IO.read(file)
23
- end
24
- $file = File.expand_path(file)
25
-
26
- if File.extname($file) == ".yml"
27
- GFF = YAML.load(bytes)
28
- else
29
- GFF = NWN::Gff::Reader.read(bytes)
30
- end
31
-
32
- def save destination = nil
33
- destination ||= $file
34
- puts "Saving to ´#{destination}' .."
35
- if File.extname($file) == ".yml"
36
- bytes = GFF.to_yaml
37
- else
38
- bytes = NWN::Gff::Writer.dump(GFF)
39
- end
40
- File.open(destination, "w") {|f|
41
- f.write(bytes)
42
- }
43
- puts "saved."
44
- end
45
-
46
- if __cache_location = ENV['NWN2DAHOME']
47
- require 'nwn/helpers'
48
- puts "Setting up 2da cache at #{__cache_location} .."
49
- NWN::TwoDA::Cache.setup __cache_location
50
- else
51
- puts "Warning: Environment variable `NWN2DAHOME' is not available, not using 2da cache (helpers not available)."
52
- end
53
-
54
- include NWN::Gff
55
- include NWN::TwoDA
56
-
57
- puts "Your GFF file is in `GFF' (type: #{GFF.type.inspect})."
58
- puts "Type `save' to save to the filename it came from (make a backup!), `exit' (or Ctrl+D) to exit (without saving)."
59
- puts "To save to a different location, type `save \"path/to/new/location.ext\"'."
60
- puts ""
61
-
62
- IRB.start
@@ -1,133 +0,0 @@
1
- #!/usr/bin/ruby
2
- require 'rubygems'
3
- require 'optparse'
4
- require 'nwn/gff'
5
- require 'nwn/helpers'
6
- require 'yaml'
7
- require 'nwn/yaml'
8
-
9
- format = nil
10
- types_too = false
11
- full = false
12
- file_type = nil
13
- struct_id = nil
14
- path = nil
15
- prefix = :none
16
- postfix = nil
17
- verbose = false
18
- options = {}
19
-
20
- OptionParser.new do |o|
21
- o.banner = "Usage: nwn-gff-print [options] file/- [file, file, ..]"
22
-
23
- o.on "-y", "--yaml", "Dump as yaml" do
24
- format = :yaml
25
- end
26
-
27
- o.on "-k", "--kivinen", "Dump as kivinens dump format (like the perl tools)" do
28
- format = :kivinen
29
- end
30
- o.on "--kivinen-full-path", "Print the full path (implies -k)" do
31
- format = :kivinen
32
- full = true
33
- end
34
-
35
- o.on "-b", "--print-basename", "Prefix the file basename to the output" do |b|
36
- prefix = :base
37
- end
38
- o.on "-f", "--print-filename", "Prefix the full filename to the output" do |b|
39
- prefix = :full
40
- end
41
-
42
- o.on "-t", "--print-types", "Print types as well" do
43
- types_too = true
44
- end
45
-
46
- o.on "-m", "--marshal", "Native ruby marshalling. Warning: raw bytes" do
47
- format = :marshal
48
- end
49
-
50
- o.on "--postfix P", "Write output to file postfixed with P instead of stdout" do |p|
51
- postfix = p
52
- end
53
-
54
- o.on "--float_rounding F", "Round floating point numbers to the specified number of righthand digits" do |fr|
55
- options[:float_rounding] = fr.to_i
56
- end
57
-
58
- o.on "--type filetype", "Override the file type (implies --struct 0xffffffff)" do |t|
59
- if t.size != 3
60
- $stderr.puts "Invalid type #{t} passwd."
61
- exit 1
62
- end
63
- file_type = t.upcase + " "
64
- struct_id = 0xffffffff
65
- end
66
-
67
- o.on "--struct id", "Override struct id (as hex, please)" do |s|
68
- struct_id = s.hex
69
- end
70
- o.on "-p=path", "--path path", "Only print the given path" do |p|
71
- path = p
72
- end
73
-
74
- o.on "-v", "--verbose", "Be verbose" do
75
- verbose = true
76
- end
77
- end.parse!
78
-
79
- ARGV.size > 0 or begin
80
- $stderr.puts "Required argument: filename to read, or - for stdin (try -h)."
81
- exit 1
82
- end
83
-
84
- ARGV.each {|file|
85
-
86
- if file == "-"
87
- bytes = $stdin.read
88
- else
89
- bytes = IO.read(file)
90
- end
91
-
92
- g = NWN::Gff::Reader.read(bytes, options)
93
-
94
- if path
95
- begin
96
- g = g[path]
97
- rescue Exception => e
98
- $stderr.puts "Error: " + e.to_s
99
- exit 1
100
- end
101
- end
102
-
103
- my_prefix = case prefix
104
- when :none
105
- ""
106
- when :base
107
- File.basename(file) + ": "
108
- when :full
109
- File.expand_path(file) + ": "
110
- end
111
-
112
- write_to = postfix ? File.new(file + postfix, "w") : $stdout
113
- $stderr.puts "Processing `#{file}`" if verbose
114
- case format
115
- when :yaml
116
- if prefix == :none
117
- write_to.puts g.to_yaml
118
- else
119
- write_to.puts g.to_yaml.split("\n").map {|ln| my_prefix + ln }.join("\n")
120
- end
121
- when :kivinen
122
- NWN::Gff.kivinen_format g, my_prefix + "/", types_too, full, file_type, struct_id do |label, value|
123
- write_to.puts "%s:\t%s" % [label, value]
124
- end
125
- when :marshal
126
- write_to.print Marshal.dump(g)
127
- else
128
- $stderr.puts "Unknown format; try -h"
129
- exit 1
130
- end
131
-
132
- write_to.close if postfix
133
- }