def self.write_map(original_files_paths, maps_path, output_path, shuffle_level, romanize, logging, game_type)
Parameters:
-
game_type
(String
)
-- Game type for custom parsing
-
logging
(Boolean
)
-- Whether to log
-
romanize
(Boolean
)
-- If files were read with romanize, this option will romanize original game text to compare with parsed
-
shuffle_level
(Integer
)
-- Level of shuffle
-
output_path
(String
)
-- Path to output directory
-
maps_path
(String
)
-- Path to directory containing .txt maps files
-
original_files_paths
(Array
)
-- Array of paths to original files
def self.write_map(original_files_paths, maps_path, output_path, shuffle_level, romanize, logging, game_type)
maps_object_map = Hash[original_files_paths.map { |f| [File.basename(f), Marshal.load(File.binread(f))] }]
# @type [Array<String>]
maps_original_text =
File
.readlines(File.join(maps_path, 'maps.txt'), encoding: 'UTF-8', chomp: true)
.map { |line| line.gsub('\#', "\n").strip }
.freeze
# @type [Array<String>]
names_original_text =
File
.readlines(File.join(maps_path, 'names.txt'), encoding: 'UTF-8', chomp: true)
.map { |line| line.gsub('\#', "\n").strip }
.freeze
# @type [Array<String>]
maps_translated_text =
File
.readlines(File.join(maps_path, 'maps_trans.txt'), encoding: 'UTF-8', chomp: true)
.map { |line| line.gsub('\#', "\n").strip }
# @type [Array<String>]
names_translated_text =
File
.readlines(File.join(maps_path, 'names_trans.txt'), encoding: 'UTF-8', chomp: true)
.map { |line| line.gsub('\#', "\n").strip }
if shuffle_level.positive?
maps_translated_text.shuffle!
names_translated_text.shuffle!
if shuffle_level == 2
maps_translated_text = shuffle_words(maps_translated_text)
names_translated_text = shuffle_words(names_translated_text)
end
end
# @type [Hash{String => String}]
maps_translation_map = Hash[maps_original_text.zip(maps_translated_text)].freeze
# @type [Hash{String => String}]
names_translation_map = Hash[names_original_text.zip(names_translated_text)].freeze
# @type [Array<Integer>]
# 401 - dialogue lines
# 102 - dialogue choices array
# 402 - one of the dialogue choices from the array
# 356 - system lines/special texts (do they even exist before mv?)
allowed_codes = [102, 320, 324, 356, 401, 402].freeze
maps_object_map.each do |filename, object|
# @type [String]
display_name = object.display_name
display_name_translated = names_translation_map[display_name]
object.display_name = display_name_translated if display_name_translated
events = object.events
next unless events
events.each do |ev, event|
pages = event.pages
next unless pages
pages.each_with_index do |page, pg|
list = page.list
next unless list
in_sequence = false
# @type [Array<String>]
line = []
# @type [Array<Integer>]
item_indices = []
list.each_with_index do |item, it|
# @type [Integer]
code = item.code
if in_sequence && code != 401
unless line.empty?
joined = line.join("\n").strip
joined = romanize_string(joined) if romanize
translated = get_parameter_translated(401, joined, maps_translation_map, game_type)
if translated && !translated.empty?
split = translated.split('\#')
split_length = split.length
line_length = line.length
item_indices.each_with_index { |index, i| list[index].parameters[0] = i < split_length ? split[i] : '' }
if split_length > line_length
list[item_indices.last].parameters[0] = split[line_length - 1..].join("\n")
end
end
line.clear
end
in_sequence = false
end
next unless allowed_codes.include?(code)
# @type [Array<String>]
parameters = item.parameters
case code
when 401
# @type [String]
parameter = parameters[0]
next unless parameter.is_a?(String)
parameter = convert_to_utf8(parameter)
in_sequence = true
line.push(parameter.gsub(' ', ' ').strip)
item_indices.push(it)
when 102
parameters[0].each_with_index do |subparameter, sp|
next unless subparameter.is_a?(String)
subparameter = subparameter.strip
next if subparameter.empty?
subparameter = convert_to_utf8(subparameter)
subparameter = romanize_string(subparameter.strip) if romanize
translated = get_parameter_translated(code, subparameter, maps_translation_map, game_type)
parameters[0][sp] = translated if translated && !translated.empty?
end
when 356
# @type [String]
parameter = parameters[0]
next unless parameter.is_a?(String)
parameter = parameter.strip
next if parameter.empty?
parameter = convert_to_utf8(parameter)
parameter = romanize_string(parameter) if romanize
translated = get_parameter_translated(code, parameter, maps_translation_map, game_type)
parameters[0] = translated if translated && !translated.empty?
when 320, 324, 402
# @type [String]
parameter = parameters[1]
next unless parameter.is_a?(String)
parameter = parameter.strip
next if parameter.empty?
parameter = convert_to_utf8(parameter)
parameter = romanize_string(parameters[1].strip) if romanize
translated = get_parameter_translated(code, parameter, maps_translation_map, game_type)
parameters[1] = translated if translated && !translated.empty?
end
item.parameters = parameters
list[it] = item
end
page.list = list
pages[pg] = page
end
event.pages = pages
events[ev] = event
end
object.events = events
File.binwrite(File.join(output_path, filename), Marshal.dump(object))
puts "Written #{filename}" if logging
end
end