wolftrans 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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