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 +4 -4
- data/Rakefile +22 -2
- data/bin/wolftrans +2 -1
- data/lib/wolfrpg.rb +6 -60
- data/lib/wolfrpg/command.rb +30 -30
- data/lib/wolfrpg/common_events.rb +69 -71
- data/lib/wolfrpg/database.rb +89 -91
- data/lib/wolfrpg/debug.rb +60 -0
- data/lib/wolfrpg/filecoder.rb +114 -0
- data/lib/wolfrpg/game_dat.rb +93 -31
- data/lib/wolfrpg/map.rb +81 -85
- data/lib/wolfrpg/route.rb +10 -10
- data/lib/wolftrans.rb +4 -64
- data/lib/wolftrans/context.rb +3 -3
- data/lib/wolftrans/debug.rb +35 -0
- data/lib/wolftrans/patch_data.rb +10 -8
- data/lib/wolftrans/patch_text.rb +2 -2
- data/lib/wolftrans/util.rb +29 -0
- data/lib/wolftrans/version.rb +3 -0
- data/test/test_wolftrans.rb +2 -1
- data/wolftrans.gemspec +6 -4
- metadata +8 -4
- data/lib/wolfrpg/io.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5810f165d8477fd00571f8cf4c0b599f4ee2bd7
|
4
|
+
data.tar.gz: d3fb00f064a84ef6f740329fe26ea98158522ecc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
8
|
-
task :default => :test
|
28
|
+
task :default => :build
|
data/bin/wolftrans
CHANGED
data/lib/wolfrpg.rb
CHANGED
@@ -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
|
-
|
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'
|
data/lib/wolfrpg/command.rb
CHANGED
@@ -131,55 +131,55 @@ module WolfRpg
|
|
131
131
|
|
132
132
|
public
|
133
133
|
class Move < Command
|
134
|
-
def initialize(cid, args, string_args, indent,
|
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] =
|
139
|
+
@unknown[i] = coder.read_byte
|
140
140
|
end
|
141
141
|
# Read known data
|
142
142
|
#TODO further abstract this
|
143
|
-
@flags =
|
143
|
+
@flags = coder.read_byte
|
144
144
|
|
145
145
|
# Read route
|
146
|
-
@route = Array.new(
|
146
|
+
@route = Array.new(coder.read_int)
|
147
147
|
@route.each_index do |i|
|
148
|
-
@route[i] = RouteCommand.create(
|
148
|
+
@route[i] = RouteCommand.create(coder)
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
def dump_terminator(
|
153
|
-
|
152
|
+
def dump_terminator(coder)
|
153
|
+
coder.write_byte(1)
|
154
154
|
@unknown.each do |byte|
|
155
|
-
|
155
|
+
coder.write_byte(byte)
|
156
156
|
end
|
157
|
-
|
158
|
-
|
157
|
+
coder.write_byte(@flags)
|
158
|
+
coder.write_int(@route.size)
|
159
159
|
@route.each do |cmd|
|
160
|
-
cmd.dump(
|
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(
|
166
|
+
def self.create(coder)
|
167
167
|
# Read all data for this command from file
|
168
|
-
args = Array.new(
|
169
|
-
cid =
|
168
|
+
args = Array.new(coder.read_byte - 1)
|
169
|
+
cid = coder.read_int
|
170
170
|
args.each_index do |i|
|
171
|
-
args[i] =
|
171
|
+
args[i] = coder.read_int
|
172
172
|
end
|
173
|
-
indent =
|
174
|
-
string_args = Array.new(
|
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] =
|
176
|
+
string_args[i] = coder.read_string
|
177
177
|
end
|
178
178
|
|
179
179
|
# Read the move list if necessary
|
180
|
-
terminator =
|
180
|
+
terminator = coder.read_byte
|
181
181
|
if terminator == 0x01
|
182
|
-
return Command::Move.new(cid, args, string_args, indent,
|
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(
|
192
|
-
|
193
|
-
|
191
|
+
def dump(coder)
|
192
|
+
coder.write_byte(@args.size + 1)
|
193
|
+
coder.write_int(@cid)
|
194
194
|
@args.each do |arg|
|
195
|
-
|
195
|
+
coder.write_int(arg)
|
196
196
|
end
|
197
|
-
|
198
|
-
|
197
|
+
coder.write_byte(indent)
|
198
|
+
coder.write_byte(@string_args.size)
|
199
199
|
@string_args.each do |arg|
|
200
|
-
|
200
|
+
coder.write_string(arg)
|
201
201
|
end
|
202
202
|
|
203
|
-
dump_terminator(
|
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(
|
215
|
-
|
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
|
-
|
9
|
-
|
10
|
-
@events = Array.new(
|
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(
|
10
|
+
event = Event.new(coder)
|
13
11
|
events[event.id] = event
|
14
12
|
end
|
15
|
-
if (terminator =
|
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
|
-
|
23
|
-
|
24
|
-
|
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(
|
24
|
+
event.dump(coder)
|
27
25
|
end
|
28
|
-
|
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(
|
41
|
-
if (indicator =
|
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 =
|
45
|
-
@unknown1 =
|
46
|
-
@unknown2 =
|
47
|
-
@name =
|
48
|
-
@commands = Array.new(
|
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(
|
48
|
+
@commands[i] = Command.create(coder)
|
51
49
|
end
|
52
|
-
@unknown11 =
|
53
|
-
@description =
|
54
|
-
if (indicator =
|
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
|
-
|
55
|
+
coder.verify(MAGIC_NUMBER)
|
58
56
|
@unknown3 = Array.new(10)
|
59
57
|
@unknown3.each_index do |i|
|
60
|
-
@unknown3[i] =
|
58
|
+
@unknown3[i] = coder.read_string
|
61
59
|
end
|
62
|
-
|
60
|
+
coder.verify(MAGIC_NUMBER)
|
63
61
|
@unknown4 = Array.new(10)
|
64
62
|
@unknown4.each_index do |i|
|
65
|
-
@unknown4[i] =
|
63
|
+
@unknown4[i] = coder.read_byte
|
66
64
|
end
|
67
|
-
|
65
|
+
coder.verify(MAGIC_NUMBER)
|
68
66
|
@unknown5 = Array.new(10)
|
69
67
|
@unknown5.each_index do |i|
|
70
|
-
@unknown5[i] = Array.new(
|
68
|
+
@unknown5[i] = Array.new(coder.read_int)
|
71
69
|
@unknown5[i].each_index do |j|
|
72
|
-
@unknown5[i][j] =
|
70
|
+
@unknown5[i][j] = coder.read_string
|
73
71
|
end
|
74
72
|
end
|
75
|
-
|
73
|
+
coder.verify(MAGIC_NUMBER)
|
76
74
|
@unknown6 = Array.new(10)
|
77
75
|
@unknown6.each_index do |i|
|
78
|
-
@unknown6[i] = Array.new(
|
76
|
+
@unknown6[i] = Array.new(coder.read_int)
|
79
77
|
@unknown6[i].each_index do |j|
|
80
|
-
@unknown6[i][j] =
|
78
|
+
@unknown6[i][j] = coder.read_int
|
81
79
|
end
|
82
80
|
end
|
83
|
-
@unknown7 =
|
81
|
+
@unknown7 = coder.read(0x1D)
|
84
82
|
@unknown8 = Array.new(100)
|
85
83
|
@unknown8.each_index do |i|
|
86
|
-
@unknown8[i] =
|
84
|
+
@unknown8[i] = coder.read_string
|
87
85
|
end
|
88
|
-
if (indicator =
|
86
|
+
if (indicator = coder.read_byte) != 0x91
|
89
87
|
raise "expected 0x91, got 0x#{indicator.to_s(16)}"
|
90
88
|
end
|
91
|
-
@unknown9 =
|
92
|
-
if (indicator =
|
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 =
|
96
|
-
@unknown12 =
|
97
|
-
if (indicator =
|
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(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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(
|
108
|
+
cmd.dump(coder)
|
111
109
|
end
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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
|
-
|
115
|
+
coder.write_string(i)
|
118
116
|
end
|
119
|
-
|
117
|
+
coder.write(MAGIC_NUMBER)
|
120
118
|
@unknown4.each do |i|
|
121
|
-
|
119
|
+
coder.write_byte(i)
|
122
120
|
end
|
123
|
-
|
121
|
+
coder.write(MAGIC_NUMBER)
|
124
122
|
@unknown5.each do |i|
|
125
|
-
|
123
|
+
coder.write_int(i.size)
|
126
124
|
i.each do |j|
|
127
|
-
|
125
|
+
coder.write_string(j)
|
128
126
|
end
|
129
127
|
end
|
130
|
-
|
128
|
+
coder.write(MAGIC_NUMBER)
|
131
129
|
@unknown6.each do |i|
|
132
|
-
|
130
|
+
coder.write_int(i.size)
|
133
131
|
i.each do |j|
|
134
|
-
|
132
|
+
coder.write_int(j)
|
135
133
|
end
|
136
134
|
end
|
137
|
-
|
135
|
+
coder.write(@unknown7)
|
138
136
|
@unknown8.each do |i|
|
139
|
-
|
140
|
-
end
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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
|