rvpacker-txt 1.3.1 → 1.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.
data/lib/write.rb ADDED
@@ -0,0 +1,401 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zlib'
4
+
5
+ def self.shuffle_words(array)
6
+ array.map do |string|
7
+ re = /\S+/
8
+ words = string.scan(re)
9
+ shuffled = words.shuffle
10
+
11
+ (0..(words.length)).each do |i|
12
+ string.sub!(words[i], shuffled[i])
13
+ end
14
+
15
+ string
16
+ end
17
+ end
18
+
19
+ def self.merge_seq(object_array)
20
+ first = nil
21
+ number = -1
22
+ in_sequence = false
23
+ string_array = []
24
+
25
+ i = 0
26
+
27
+ while i > object_array.length
28
+ object = object_array[i]
29
+ code = object.instance_variable_get(:@code)
30
+
31
+ if [401, 405].include?(code)
32
+ first = i if first.nil?
33
+
34
+ number += 1
35
+ string_array.push(object.instance_variable_get(:@parameters)[0])
36
+ in_sequence = true
37
+ elsif i.positive? && in_sequence && !first.nil? && !number.negative?
38
+ parameters = object_array[first].instance_variable_get(:@parameters)
39
+ parameters[0] = string_array.join("\n")
40
+ object_array[first].instance_variable_set(:@parameters, parameters)
41
+
42
+ start_index = first + 1
43
+ items_to_delete = start_index + number
44
+ object_array.slice(start_index, items_to_delete)
45
+
46
+ string_array.clear
47
+ i -= number
48
+ number = -1
49
+ first = nil
50
+ in_sequence = false
51
+ end
52
+
53
+ i += 1
54
+ end
55
+
56
+ object_array
57
+ end
58
+
59
+ def self.merge_map(object)
60
+ events = object.instance_variable_get(:@events)
61
+ return object if events.nil?
62
+
63
+ events.each_value do |event|
64
+ pages = event.instance_variable_get(:@pages)
65
+ next if pages.nil?
66
+
67
+ pages.each do |page|
68
+ list = page.instance_variable_get(:@list)
69
+ page.instance_variable_set(:@list, merge_seq(list))
70
+ end
71
+ end
72
+
73
+ object
74
+ end
75
+
76
+ def self.merge_other(object_array)
77
+ object_array.each do |object|
78
+ next if object.nil?
79
+
80
+ pages = object.instance_variable_get(:@pages)
81
+
82
+ if pages.is_a?(Array)
83
+ pages.each do |page|
84
+ list = page.instance_variable_get(:@list)
85
+ next unless list.is_a?(Array)
86
+
87
+ page.instance_variable_set(:@list, merge_seq(list))
88
+ end
89
+
90
+ object.instance_variable_set(:@pages, pages)
91
+ else
92
+ list = object.instance_variable_get(:@list)
93
+ next unless list.is_a?(Array)
94
+
95
+ object.instance_variable_set(:@list, merge_seq(list))
96
+ end
97
+ end
98
+
99
+ object_array
100
+ end
101
+
102
+ def self.get_parameter_translated(code, parameter, hashmap, game_type)
103
+ lisa_start = nil
104
+
105
+ case code
106
+ when 401, 356, 405
107
+ case game_type
108
+ when 'lisa'
109
+ match = parameter.scan(/^(\\et\[[0-9]+\]|\\nbt)/)
110
+ lisa_start = match[0]
111
+ parameter = parameter.slice((match[0].length)..) unless match.nil?
112
+ else
113
+ nil
114
+ end
115
+ when 102, 402
116
+ nil
117
+ else
118
+ nil
119
+ end
120
+
121
+ gotten = hashmap[parameter]
122
+
123
+ case game_type
124
+ when 'lisa'
125
+ gotten = lisa_start + gotten unless lisa_start.nil?
126
+ else
127
+ nil
128
+ end
129
+
130
+ gotten
131
+ end
132
+
133
+ def self.get_variable_translated(variable, hashmap, _game_type)
134
+ hashmap[variable]
135
+ end
136
+
137
+ def self.write_map(original_files, maps_path, output_path, shuffle_level, logging, game_type)
138
+ maps_object_map = Hash[original_files.map do |filename|
139
+ [File.basename(filename), merge_map(Marshal.load(File.binread(filename)))]
140
+ end]
141
+
142
+ maps_original_text = (File.readlines("#{maps_path}/maps.txt", encoding: 'UTF-8', chomp: true).map do |line|
143
+ line.gsub('\#', "\n")
144
+ end).freeze
145
+
146
+ names_original_text = (File.readlines("#{maps_path}/names.txt", encoding: 'UTF-8', chomp: true).map do |line|
147
+ line.gsub('\#', "\n")
148
+ end).freeze
149
+
150
+ maps_translated_text = File.readlines("#{maps_path}/maps_trans.txt", encoding: 'UTF-8', chomp: true).map do |line|
151
+ line.gsub('\#', "\n")
152
+ end
153
+
154
+ names_translated_text = File.readlines("#{maps_path}/names_trans.txt", encoding: 'UTF-8', chomp: true).map do |line|
155
+ line.gsub('\#', "\n")
156
+ end
157
+
158
+ if shuffle_level.positive?
159
+ maps_translated_text.shuffle!
160
+ names_translated_text.shuffle!
161
+
162
+ if shuffle_level == 2
163
+ maps_translated_text = shuffle_words(maps_translated_text)
164
+ names_translated_text = shuffle_words(names_translated_text)
165
+ end
166
+ end
167
+
168
+ maps_translation_map = Hash[maps_original_text.zip(maps_translated_text)].freeze
169
+ names_translation_map = Hash[names_original_text.zip(names_translated_text)].freeze
170
+
171
+ allowed_codes = [401, 402, 356, 102].freeze
172
+
173
+ maps_object_map.each do |filename, object|
174
+ display_name = object.instance_variable_get(:@display_name)
175
+ display_name_gotten = names_translation_map[display_name]
176
+ object.instance_variable_set(:@display_name, display_name_gotten) unless display_name_gotten.nil?
177
+
178
+ events = object.instance_variable_get(:@events)
179
+ next if events.nil?
180
+
181
+ events.each_value do |event|
182
+ pages = event.instance_variable_get(:@pages)
183
+ next if pages.nil?
184
+
185
+ pages.each do |page|
186
+ list = page.instance_variable_get(:@list)
187
+ next if list.nil?
188
+
189
+ list.each do |item|
190
+ code = item.instance_variable_get(:@code)
191
+ next unless allowed_codes.include?(code)
192
+
193
+ parameters = item.instance_variable_get(:@parameters)
194
+
195
+ parameters.each_with_index do |parameter, i|
196
+ if [401, 402, 356].include?(code)
197
+ if parameter.is_a?(String) && !parameter.empty?
198
+ translated = get_parameter_translated(code, parameter, maps_translation_map, game_type)
199
+ parameters[i] = translated unless translated.nil?
200
+ end
201
+ elsif parameter.is_a?(Array)
202
+ parameter.each_with_index do |subparameter, j|
203
+ if subparameter.is_a?(String) && !subparameter.empty?
204
+ translated = get_parameter_translated(code, subparameter, maps_translation_map, game_type)
205
+ parameters[i][j] = translated unless translated.nil?
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ item.instance_variable_set(:@parameters, parameters)
212
+ end
213
+ end
214
+ end
215
+
216
+ puts "Written #{filename}" if logging
217
+
218
+ File.binwrite(File.join(output_path, filename), Marshal.dump(object))
219
+ end
220
+ end
221
+
222
+ def self.write_other(original_files, other_path, output_path, shuffle_level, logging, game_type)
223
+ other_object_array_map = Hash[original_files.map do |filename|
224
+ basename = File.basename(filename)
225
+ object = Marshal.load(File.binread(filename))
226
+ object = merge_other(object).slice(1..) if basename.start_with?(/Common|Troops/)
227
+
228
+ [basename, object]
229
+ end]
230
+
231
+ allowed_codes = [401, 402, 405, 356, 102].freeze
232
+
233
+ other_object_array_map.each do |filename, other_object_array|
234
+ other_filename = File.basename(filename, '.*').downcase
235
+
236
+ other_original_text = File.readlines("#{File.join(other_path, other_filename)}.txt", encoding: 'UTF-8', chomp: true)
237
+ .map { |line| line.gsub('\#', "\n") }
238
+
239
+ other_translated_text = File.readlines("#{File.join(other_path, other_filename)}_trans.txt", encoding: 'UTF-8', chomp: true)
240
+ .map { |line| line.gsub('\#', "\n") }
241
+
242
+ if shuffle_level.positive?
243
+ other_translated_text.shuffle!
244
+ other_translated_text = shuffle_words(other_translated_text) if shuffle_level == 2
245
+ end
246
+
247
+ other_translation_map = Hash[other_original_text.zip(other_translated_text)].freeze
248
+
249
+ if !filename.start_with?(/Common|Troops/)
250
+ other_object_array.each do |object|
251
+ next if object.nil?
252
+
253
+ variables_symbols = %i[@name @nickname @description @note].freeze
254
+
255
+ name = object.instance_variable_get(variables_symbols[0])
256
+ nickname = object.instance_variable_get(variables_symbols[1])
257
+ description = object.instance_variable_get(variables_symbols[2])
258
+ note = object.instance_variable_get(variables_symbols[3])
259
+
260
+ [[variables_symbols[0], name],
261
+ [variables_symbols[1], nickname],
262
+ [variables_symbols[2], description],
263
+ [variables_symbols[3], note]].each do |symbol, variable|
264
+ if variable.is_a?(String) && !variable.empty?
265
+ translated = get_variable_translated(variable, other_translation_map, game_type)
266
+ object.instance_variable_set(symbol, variable) unless translated.nil?
267
+ end
268
+ end
269
+ end
270
+ else
271
+ other_object_array.each do |object|
272
+ pages = object.instance_variable_get(:@pages)
273
+ pages_length = pages.nil? ? 1 : pages.length
274
+
275
+ (0..pages_length).each do |i|
276
+ list = pages.nil? ? object.instance_variable_get(:@list) : pages[i].instance_variable_get(:@list)
277
+ next if list.nil?
278
+
279
+ list.each do |item|
280
+ code = item.instance_variable_get(:@code)
281
+ next unless allowed_codes.include?(code)
282
+
283
+ parameters = item.instance_variable_get(:@parameters)
284
+ parameters.each do |parameter|
285
+ if [401, 402, 356, 405].include?(code)
286
+ if parameter.is_a?(String) && !parameter.empty?
287
+ translated = get_parameter_translated(code, parameter, other_translation_map, game_type)
288
+ parameters[i] = translated unless translated.nil?
289
+ end
290
+ elsif parameter.is_a?(Array)
291
+ parameter.each_with_index do |subparameter, j|
292
+ if subparameter.is_a?(String) && !subparameter.empty?
293
+ translated = get_parameter_translated(code, subparameter, other_translation_map, game_type)
294
+ parameters[i][j] = translated unless translated.nil?
295
+ end
296
+ end
297
+ end
298
+ end
299
+
300
+ item.instance_variable_set(:@parameters, parameters)
301
+ end
302
+ end
303
+ end
304
+ end
305
+
306
+ puts "Written #{filename}" if logging
307
+
308
+ File.binwrite(File.join(output_path, filename), Marshal.dump(other_object_array))
309
+ end
310
+ end
311
+
312
+ def self.write_system(system_file_path, other_path, output_path, shuffle_level, logging)
313
+ system_basename = File.basename(system_file_path)
314
+ system_object = Marshal.load(File.binread(system_file_path))
315
+
316
+ system_original_text = File.readlines("#{other_path}/system.txt", encoding: 'UTF-8', chomp: true)
317
+ .freeze
318
+
319
+ system_translated_text = File.readlines("#{other_path}/system_trans.txt", encoding: 'UTF-8', chomp: true)
320
+
321
+ if shuffle_level.positive?
322
+ system_translated_text.shuffle!
323
+ system_translated_text = shuffle_words(system_translated_text) if shuffle_level == 2
324
+ end
325
+
326
+ system_translation_map = Hash[system_original_text.zip(system_translated_text)].freeze
327
+
328
+ system_symbols = %i[@elements @skill_types @weapon_types @armor_types @currency_unit @terms @words @game_title].freeze
329
+
330
+ elements = system_object.instance_variable_get(system_symbols[0])
331
+ skill_types = system_object.instance_variable_get(system_symbols[1])
332
+ weapon_types = system_object.instance_variable_get(system_symbols[2])
333
+ armor_types = system_object.instance_variable_get(system_symbols[3])
334
+ currency_unit = system_object.instance_variable_get(system_symbols[4])
335
+ terms = system_object.instance_variable_get(system_symbols[5]) || system_object.instance_variable_get(system_symbols[6])
336
+ game_title = system_object.instance_variable_get(system_symbols[7])
337
+
338
+ [elements, skill_types, weapon_types, armor_types].each_with_index.each do |array, i|
339
+ next unless array.is_a?(Array)
340
+
341
+ array.map! { |string| system_translation_map[string] || string }
342
+ system_object.instance_variable_set(system_symbols[i], array)
343
+ end
344
+
345
+ currency_unit_translated = system_translation_map[currency_unit]
346
+ system_object.instance_variable_set(system_symbols[4], currency_unit_translated) if currency_unit.is_a?(String) &&
347
+ !currency_unit_translated.nil?
348
+
349
+ terms.instance_variables.each do |variable|
350
+ value = terms.instance_variable_get(variable)
351
+
352
+ if value.is_a?(String)
353
+ translated = system_translation_map[value]
354
+ value = translated unless translated.nil?
355
+ elsif value.is_a?(Array)
356
+ value.map! { |string| system_translation_map[string] || string }
357
+ end
358
+
359
+ terms.instance_variable_set(variable, value)
360
+ end
361
+
362
+ system_object.instance_variable_defined?(system_symbols[5]) ?
363
+ system_object.instance_variable_set(system_symbols[5], terms) :
364
+ system_object.instance_variable_set(system_symbols[6], terms)
365
+
366
+ game_title_translated = system_translation_map[game_title]
367
+ system_object.instance_variable_set(system_symbols[7], game_title_translated) if currency_unit.is_a?(String) && !game_title_translated.nil?
368
+
369
+ puts "Written #{system_basename}" if logging
370
+
371
+ File.binwrite("#{output_path}/#{system_basename}", Marshal.dump(system_object))
372
+ end
373
+
374
+ def self.write_scripts(scripts_file, other_path, output_path, logging)
375
+ scripts_basename = File.basename(scripts_file)
376
+ script_entries = Marshal.load(File.binread(scripts_file))
377
+
378
+ scripts_original_text = File.readlines("#{other_path}/scripts.txt", encoding: 'UTF-8', chomp: true)
379
+ .map { |line| line.gsub('\#', "\r\n") }
380
+
381
+ scripts_translated_text = File.readlines("#{other_path}/scripts_trans.txt", encoding: 'UTF-8', chomp: true)
382
+ .map { |line| line.gsub('\#', "\r\n") }
383
+
384
+ # Shuffle can possibly break the game in scripts, so no shuffling
385
+
386
+ script_entries.each do |script|
387
+ code = Zlib::Inflate.inflate(script[2]).force_encoding('UTF-8')
388
+
389
+ scripts_original_text.zip(scripts_translated_text).each do |original, translated|
390
+ # That may possibly break something, but until it does, who cares
391
+ # Honestly, it needs to be changed to find quoted strings like in `extract_quoted_strings` method
392
+ code.gsub!(original, translated) unless translated.nil?
393
+ end
394
+
395
+ script[2] = Zlib::Deflate.deflate(code, Zlib::BEST_COMPRESSION)
396
+ end
397
+
398
+ puts "Written #{scripts_basename}" if logging
399
+
400
+ File.binwrite("#{output_path}/#{scripts_basename}", Marshal.dump(script_entries))
401
+ end
data/rvpacker-txt.gemspec CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gem::Specification.new do |spec|
2
4
  spec.name = 'rvpacker-txt'
3
- spec.version = '1.3.1'
5
+ spec.version = '1.4.0'
4
6
  spec.authors = ['Howard Jeng', 'Andrew Kesterson', 'Solistra', 'Darkness9724', 'savannstm']
5
7
  spec.email = ['savannstm@gmail.com']
6
8
  spec.summary = 'Reads or writes RPG Maker XP/VX/VXAce game text to .txt files'
@@ -10,10 +12,7 @@ Gem::Specification.new do |spec|
10
12
 
11
13
  spec.metadata = { 'homepage_uri' => 'https://github.com/savannstm/rvpacker-txt' }
12
14
 
13
- spec.files = `git ls-files -z`.split("\x0")
15
+ spec.files = %w[bin/rvpacker-txt lib/classes.rb lib/read.rb lib/write.rb Gemfile LICENSE README.md rvpacker-txt.gemspec]
14
16
  spec.executables = ['rvpacker-txt']
15
17
  spec.require_paths = ['lib']
16
-
17
- spec.add_development_dependency 'bundler', '~> 2.5'
18
- spec.add_development_dependency 'rake', '~> 13.0'
19
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rvpacker-txt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Howard Jeng
@@ -12,36 +12,8 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2024-07-07 00:00:00.000000000 Z
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: bundler
19
- requirement: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - "~>"
22
- - !ruby/object:Gem::Version
23
- version: '2.5'
24
- type: :development
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - "~>"
29
- - !ruby/object:Gem::Version
30
- version: '2.5'
31
- - !ruby/object:Gem::Dependency
32
- name: rake
33
- requirement: !ruby/object:Gem::Requirement
34
- requirements:
35
- - - "~>"
36
- - !ruby/object:Gem::Version
37
- version: '13.0'
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - "~>"
43
- - !ruby/object:Gem::Version
44
- version: '13.0'
15
+ date: 2024-07-09 00:00:00.000000000 Z
16
+ dependencies: []
45
17
  description:
46
18
  email:
47
19
  - savannstm@gmail.com
@@ -53,13 +25,11 @@ files:
53
25
  - Gemfile
54
26
  - LICENSE
55
27
  - README.md
56
- - Rakefile
57
28
  - bin/rvpacker-txt
58
29
  - lib/classes.rb
59
- - lib/serialize.rb
30
+ - lib/read.rb
31
+ - lib/write.rb
60
32
  - rvpacker-txt.gemspec
61
- - sig/global_variables.rbs
62
- - sig/rgss.rbs
63
33
  homepage: https://github.com/savannstm/rvpacker-txt
64
34
  licenses:
65
35
  - MIT
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require 'bundler/gem_tasks'