wolftrans 0.0.2 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc48e4d190cfaf39833cdf6018e8e81bda4db9cb
4
- data.tar.gz: 145782eb683c76dfcf20a91ee31538afe0b8f128
3
+ metadata.gz: e5810f165d8477fd00571f8cf4c0b599f4ee2bd7
4
+ data.tar.gz: d3fb00f064a84ef6f740329fe26ea98158522ecc
5
5
  SHA512:
6
- metadata.gz: 569e7ce66fe6503d8d2c08a7bdadfb36a86687cdf23688ba8cd712c34383a763c56e27e8641812402dc1d9f956314d0e26c591058f7405740143a7f5e53e61fc
7
- data.tar.gz: 6390d794310b3aa6fb0f23a4cf499e6bba638a5f84659e0eb5dd30ba2265371630ba4b5c61b7db4c3421a01c08cb48585fd9dde9a2c2b1619bda72dafac4bb24
6
+ metadata.gz: 11fa3045617bc45a79ca011ee8f42f44e5d05e1bc0b11917395936b2f22e12471e4010aabf623a1a775db050013d4a29b583e468c82b9ee6e9e737d4a1e5f7a4
7
+ data.tar.gz: 8741262f4c7622bb688554f2e65bcb6273c5cbb7d6b917e6d3770ce24b94f6010f87d59813da42d02bf02b3a53fb0fda92f860f3fcccafd1c7faff45c5b2ef0f
data/Rakefile CHANGED
@@ -1,8 +1,28 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+
1
3
  require 'rake/testtask'
4
+ require 'wolftrans/version'
5
+
6
+ GEM_FILENAME = "wolftrans-#{WolfTrans::VERSION}.gem"
7
+
8
+ task :build do
9
+ system "gem build wolftrans.gemspec"
10
+ end
11
+
12
+ task :release => :build do
13
+ system "gem push #{GEM_FILENAME}"
14
+ end
15
+
16
+ task :install => :build do
17
+ system "gem install #{GEM_FILENAME}"
18
+ end
19
+
20
+ task :clean do
21
+ File.delete(GEM_FILENAME) if File.exist? GEM_FILENAME
22
+ end
2
23
 
3
24
  Rake::TestTask.new do |t|
4
25
  t.libs << 'test'
5
26
  end
6
27
 
7
- desc 'Run tests'
8
- task :default => :test
28
+ task :default => :build
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+
3
4
  require 'wolftrans'
4
5
 
5
6
  if ARGV.size != 3
@@ -1,65 +1,11 @@
1
+ require 'wolfrpg/filecoder'
2
+
3
+ require 'wolfrpg/route'
4
+ require 'wolfrpg/command'
5
+
1
6
  require 'wolfrpg/map'
2
7
  require 'wolfrpg/game_dat'
3
8
  require 'wolfrpg/database'
4
9
  require 'wolfrpg/common_events'
5
10
 
6
- module WolfRpg
7
- # Find strings in binary string and return them inline in an array
8
- def self.parse_strings(data)
9
- result = []
10
-
11
- # Scan for strings
12
- str_len = 0
13
- can_seek_multibyte = false
14
- data.each_byte.with_index do |c, i|
15
- result << c
16
-
17
- if can_seek_multibyte
18
- if (c >= 0x40 && c <= 0x9E && c != 0x7F) ||
19
- (c >= 0xA0 && c <= 0xFC)
20
- str_len += 1
21
- next
22
- end
23
- end
24
- if (c >= 0x81 && c <= 0x84) || (c >= 0x87 && c <= 0x9F) ||
25
- (c >= 0xE0 && c <= 0xEA) || (c >= 0xED && c <= 0xEE) ||
26
- (c >= 0xFA && c <= 0xFC)
27
- # head of multibyte character
28
- str_len += 1
29
- can_seek_multibyte = true
30
- next
31
- end
32
-
33
- can_seek_multibyte = false
34
- if c == 0x0A || c == 0x0D || c == 0x09 || # newline, CR, tab
35
- (c >= 0x20 && c <= 0x7E) || # printable ascii
36
- (c >= 0xA1 && c <= 0xDF) # half-width katakana
37
- str_len += 1
38
- else
39
- str = ''
40
- if c == 0 && str_len > 0
41
- # End of the string. Make sure it's valid by checking for
42
- # a length prefix.
43
- str_len_check = data[i - str_len - 4,4].unpack('V').first
44
- if str_len_check == str_len + 1
45
- begin
46
- str = data[i - str_len,str_len].encode(Encoding::UTF_8, Encoding::WINDOWS_31J)
47
- rescue
48
- #do nothing
49
- end
50
- end
51
- end
52
-
53
- # Either append the string or hex bytes
54
- unless str.empty?
55
- result.slice!(-(4 + str_len + 1)..-1)
56
- result << str
57
- end
58
-
59
- # Reset str length
60
- str_len = 0
61
- end
62
- end
63
- return result
64
- end
65
- end
11
+ require 'wolfrpg/debug'
@@ -131,55 +131,55 @@ module WolfRpg
131
131
 
132
132
  public
133
133
  class Move < Command
134
- def initialize(cid, args, string_args, indent, file)
134
+ def initialize(cid, args, string_args, indent, coder)
135
135
  super(cid, args, string_args, indent)
136
136
  # Read unknown data
137
137
  @unknown = Array.new(5)
138
138
  @unknown.each_index do |i|
139
- @unknown[i] = IO.read_byte(file)
139
+ @unknown[i] = coder.read_byte
140
140
  end
141
141
  # Read known data
142
142
  #TODO further abstract this
143
- @flags = IO.read_byte(file)
143
+ @flags = coder.read_byte
144
144
 
145
145
  # Read route
146
- @route = Array.new(IO.read_int(file))
146
+ @route = Array.new(coder.read_int)
147
147
  @route.each_index do |i|
148
- @route[i] = RouteCommand.create(file)
148
+ @route[i] = RouteCommand.create(coder)
149
149
  end
150
150
  end
151
151
 
152
- def dump_terminator(file)
153
- IO.write_byte(file, 1)
152
+ def dump_terminator(coder)
153
+ coder.write_byte(1)
154
154
  @unknown.each do |byte|
155
- IO.write_byte(file, byte)
155
+ coder.write_byte(byte)
156
156
  end
157
- IO.write_byte(file, @flags)
158
- IO.write_int(file, @route.size)
157
+ coder.write_byte(@flags)
158
+ coder.write_int(@route.size)
159
159
  @route.each do |cmd|
160
- cmd.dump(file)
160
+ cmd.dump(coder)
161
161
  end
162
162
  end
163
163
  end
164
164
 
165
165
  # Load from the file and create the appropriate class object
166
- def self.create(file)
166
+ def self.create(coder)
167
167
  # Read all data for this command from file
168
- args = Array.new(IO.read_byte(file) - 1)
169
- cid = IO.read_int(file)
168
+ args = Array.new(coder.read_byte - 1)
169
+ cid = coder.read_int
170
170
  args.each_index do |i|
171
- args[i] = IO.read_int(file)
171
+ args[i] = coder.read_int
172
172
  end
173
- indent = IO.read_byte(file)
174
- string_args = Array.new(IO.read_byte(file))
173
+ indent = coder.read_byte
174
+ string_args = Array.new(coder.read_byte)
175
175
  string_args.each_index do |i|
176
- string_args[i] = IO.read_string(file)
176
+ string_args[i] = coder.read_string
177
177
  end
178
178
 
179
179
  # Read the move list if necessary
180
- terminator = IO.read_byte(file)
180
+ terminator = coder.read_byte
181
181
  if terminator == 0x01
182
- return Command::Move.new(cid, args, string_args, indent, file)
182
+ return Command::Move.new(cid, args, string_args, indent, coder)
183
183
  elsif terminator != 0x00
184
184
  raise "command terminator is an unexpected value (#{terminator})"
185
185
  end
@@ -188,19 +188,19 @@ module WolfRpg
188
188
  return CID_TO_CLASS[cid].new(cid, args, string_args, indent)
189
189
  end
190
190
 
191
- def dump(file)
192
- IO.write_byte(file, @args.size + 1)
193
- IO.write_int(file, @cid)
191
+ def dump(coder)
192
+ coder.write_byte(@args.size + 1)
193
+ coder.write_int(@cid)
194
194
  @args.each do |arg|
195
- IO.write_int(file, arg)
195
+ coder.write_int(arg)
196
196
  end
197
- IO.write_byte(file, indent)
198
- IO.write_byte(file, @string_args.size)
197
+ coder.write_byte(indent)
198
+ coder.write_byte(@string_args.size)
199
199
  @string_args.each do |arg|
200
- IO.write_string(file, arg)
200
+ coder.write_string(arg)
201
201
  end
202
202
 
203
- dump_terminator(file)
203
+ dump_terminator(coder)
204
204
  end
205
205
 
206
206
  private
@@ -211,8 +211,8 @@ module WolfRpg
211
211
  @indent = indent
212
212
  end
213
213
 
214
- def dump_terminator(file)
215
- IO.write_byte(file, 0)
214
+ def dump_terminator(coder)
215
+ coder.write_byte(0)
216
216
  end
217
217
  end
218
218
  end
@@ -1,31 +1,29 @@
1
- require 'wolfrpg/command'
2
-
3
1
  module WolfRpg
4
2
  class CommonEvents
5
3
  attr_accessor :events
6
4
 
7
5
  def initialize(filename)
8
- File.open(filename, 'rb') do |file|
9
- IO.verify(file, MAGIC_NUMBER)
10
- @events = Array.new(IO.read_int(file))
6
+ FileCoder.open(filename, :read) do |coder|
7
+ coder.verify(MAGIC_NUMBER)
8
+ @events = Array.new(coder.read_int)
11
9
  @events.each_index do |i|
12
- event = Event.new(file)
10
+ event = Event.new(coder)
13
11
  events[event.id] = event
14
12
  end
15
- if (terminator = IO.read_byte(file)) != 0x8F
13
+ if (terminator = coder.read_byte) != 0x8F
16
14
  raise "CommonEvents terminator not 0x8F (got 0x#{terminator.to_s(16)})"
17
15
  end
18
16
  end
19
17
  end
20
18
 
21
19
  def dump(filename)
22
- File.open(filename, 'wb') do |file|
23
- IO.write(file, MAGIC_NUMBER)
24
- IO.write_int(file, @events.size)
20
+ FileCoder.open(filename, :write) do |coder|
21
+ coder.write(MAGIC_NUMBER)
22
+ coder.write_int(@events.size)
25
23
  @events.each do |event|
26
- event.dump(file)
24
+ event.dump(coder)
27
25
  end
28
- IO.write_byte(file, 0x8F)
26
+ coder.write_byte(0x8F)
29
27
  end
30
28
  end
31
29
 
@@ -37,113 +35,113 @@ module WolfRpg
37
35
  attr_accessor :name
38
36
  attr_accessor :commands
39
37
 
40
- def initialize(file)
41
- if (indicator = IO.read_byte(file)) != 0x8E
38
+ def initialize(coder)
39
+ if (indicator = coder.read_byte) != 0x8E
42
40
  raise "CommonEvent header indicator not 0x8E (got 0x#{indicator.to_s(16)})"
43
41
  end
44
- @id = IO.read_int(file)
45
- @unknown1 = IO.read_int(file)
46
- @unknown2 = IO.read(file, 7)
47
- @name = IO.read_string(file)
48
- @commands = Array.new(IO.read_int(file))
42
+ @id = coder.read_int
43
+ @unknown1 = coder.read_int
44
+ @unknown2 = coder.read(7)
45
+ @name = coder.read_string
46
+ @commands = Array.new(coder.read_int)
49
47
  @commands.each_index do |i|
50
- @commands[i] = Command.create(file)
48
+ @commands[i] = Command.create(coder)
51
49
  end
52
- @unknown11 = IO.read_string(file)
53
- @description = IO.read_string(file)
54
- if (indicator = IO.read_byte(file)) != 0x8F
50
+ @unknown11 = coder.read_string
51
+ @description = coder.read_string
52
+ if (indicator = coder.read_byte) != 0x8F
55
53
  raise "CommonEvent data indicator not 0x8F (got 0x#{indicator.to_s(16)})"
56
54
  end
57
- IO.verify(file, MAGIC_NUMBER)
55
+ coder.verify(MAGIC_NUMBER)
58
56
  @unknown3 = Array.new(10)
59
57
  @unknown3.each_index do |i|
60
- @unknown3[i] = IO.read_string(file)
58
+ @unknown3[i] = coder.read_string
61
59
  end
62
- IO.verify(file, MAGIC_NUMBER)
60
+ coder.verify(MAGIC_NUMBER)
63
61
  @unknown4 = Array.new(10)
64
62
  @unknown4.each_index do |i|
65
- @unknown4[i] = IO.read_byte(file)
63
+ @unknown4[i] = coder.read_byte
66
64
  end
67
- IO.verify(file, MAGIC_NUMBER)
65
+ coder.verify(MAGIC_NUMBER)
68
66
  @unknown5 = Array.new(10)
69
67
  @unknown5.each_index do |i|
70
- @unknown5[i] = Array.new(IO.read_int(file))
68
+ @unknown5[i] = Array.new(coder.read_int)
71
69
  @unknown5[i].each_index do |j|
72
- @unknown5[i][j] = IO.read_string(file)
70
+ @unknown5[i][j] = coder.read_string
73
71
  end
74
72
  end
75
- IO.verify(file, MAGIC_NUMBER)
73
+ coder.verify(MAGIC_NUMBER)
76
74
  @unknown6 = Array.new(10)
77
75
  @unknown6.each_index do |i|
78
- @unknown6[i] = Array.new(IO.read_int(file))
76
+ @unknown6[i] = Array.new(coder.read_int)
79
77
  @unknown6[i].each_index do |j|
80
- @unknown6[i][j] = IO.read_int(file)
78
+ @unknown6[i][j] = coder.read_int
81
79
  end
82
80
  end
83
- @unknown7 = IO.read(file, 0x1D)
81
+ @unknown7 = coder.read(0x1D)
84
82
  @unknown8 = Array.new(100)
85
83
  @unknown8.each_index do |i|
86
- @unknown8[i] = IO.read_string(file)
84
+ @unknown8[i] = coder.read_string
87
85
  end
88
- if (indicator = IO.read_byte(file)) != 0x91
86
+ if (indicator = coder.read_byte) != 0x91
89
87
  raise "expected 0x91, got 0x#{indicator.to_s(16)}"
90
88
  end
91
- @unknown9 = IO.read_string(file)
92
- if (indicator = IO.read_byte(file)) != 0x92
89
+ @unknown9 = coder.read_string
90
+ if (indicator = coder.read_byte) != 0x92
93
91
  raise "expected 0x92, got 0x#{indicator.to_s(16)}"
94
92
  end
95
- @unknown10 = IO.read_string(file)
96
- @unknown12 = IO.read_int(file)
97
- if (indicator = IO.read_byte(file)) != 0x92
93
+ @unknown10 = coder.read_string
94
+ @unknown12 = coder.read_int
95
+ if (indicator = coder.read_byte) != 0x92
98
96
  raise "expected 0x92, got 0x#{indicator.to_s(16)}"
99
97
  end
100
98
  end
101
99
 
102
- def dump(file)
103
- IO.write_byte(file, 0x8E)
104
- IO.write_int(file, @id)
105
- IO.write_int(file, @unknown1)
106
- IO.write(file, @unknown2)
107
- IO.write_string(file, @name)
108
- IO.write_int(file, @commands.size)
100
+ def dump(coder)
101
+ coder.write_byte(0x8E)
102
+ coder.write_int(@id)
103
+ coder.write_int(@unknown1)
104
+ coder.write(@unknown2)
105
+ coder.write_string(@name)
106
+ coder.write_int(@commands.size)
109
107
  @commands.each do |cmd|
110
- cmd.dump(file)
108
+ cmd.dump(coder)
111
109
  end
112
- IO.write_string(file, @unknown11)
113
- IO.write_string(file, @description)
114
- IO.write_byte(file, 0x8F)
115
- IO.write(file, MAGIC_NUMBER)
110
+ coder.write_string(@unknown11)
111
+ coder.write_string(@description)
112
+ coder.write_byte(0x8F)
113
+ coder.write(MAGIC_NUMBER)
116
114
  @unknown3.each do |i|
117
- IO.write_string(file, i)
115
+ coder.write_string(i)
118
116
  end
119
- IO.write(file, MAGIC_NUMBER)
117
+ coder.write(MAGIC_NUMBER)
120
118
  @unknown4.each do |i|
121
- IO.write_byte(file, i)
119
+ coder.write_byte(i)
122
120
  end
123
- IO.write(file, MAGIC_NUMBER)
121
+ coder.write(MAGIC_NUMBER)
124
122
  @unknown5.each do |i|
125
- IO.write_int(file, i.size)
123
+ coder.write_int(i.size)
126
124
  i.each do |j|
127
- IO.write_string(file, j)
125
+ coder.write_string(j)
128
126
  end
129
127
  end
130
- IO.write(file, MAGIC_NUMBER)
128
+ coder.write(MAGIC_NUMBER)
131
129
  @unknown6.each do |i|
132
- IO.write_int(file, i.size)
130
+ coder.write_int(i.size)
133
131
  i.each do |j|
134
- IO.write_int(file, j)
132
+ coder.write_int(j)
135
133
  end
136
134
  end
137
- IO.write(file, @unknown7)
135
+ coder.write(@unknown7)
138
136
  @unknown8.each do |i|
139
- IO.write_string(file, i)
140
- end
141
- IO.write_byte(file, 0x91)
142
- IO.write_string(file, @unknown9)
143
- IO.write_byte(file, 0x92)
144
- IO.write_string(file, @unknown10)
145
- IO.write_int(file, @unknown12)
146
- IO.write_byte(file, 0x92)
137
+ coder.write_string(i)
138
+ end
139
+ coder.write_byte(0x91)
140
+ coder.write_string(@unknown9)
141
+ coder.write_byte(0x92)
142
+ coder.write_string(@unknown10)
143
+ coder.write_int(@unknown12)
144
+ coder.write_byte(0x92)
147
145
  end
148
146
 
149
147
  private