global

def self.write_map(original_files_paths, maps_path, output_path, shuffle_level, logging, game_type)

Parameters:
  • game_type (String) --
  • logging (Boolean) --
  • shuffle_level (Integer) --
  • output_path (String) --
  • maps_path (String) --
  • original_files_paths (Array) --
def self.write_map(original_files_paths, maps_path, output_path, shuffle_level, logging, game_type)
    maps_object_map = Hash[original_files_paths.map do |filename|
        [File.basename(filename), Marshal.load(File.binread(filename))]
    end]

    maps_original_text = File.readlines(File.join(maps_path, 'maps.txt'), encoding: 'UTF-8', chomp: true).map do |line|
        line.gsub('\#', "\n").strip
    end.freeze

    names_original_text = File.readlines(File.join(maps_path, 'names.txt'), encoding: 'UTF-8', chomp: true).map do |line|
        line.gsub('\#', "\n").strip
    end.freeze

    maps_translated_text = File.readlines(File.join(maps_path, 'maps.txt'), encoding: 'UTF-8', chomp: true).map do |line|
        line.gsub('\#', "\n").strip
    end

    names_translated_text = File.readlines(File.join(maps_path, 'names_trans.txt'), encoding: 'UTF-8', chomp: true).map do |line|
        line.gsub('\#', "\n").strip
    end

    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

    maps_translation_map = Hash[maps_original_text.zip(maps_translated_text)].freeze
    names_translation_map = Hash[names_original_text.zip(names_translated_text)].freeze

    # 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 = [401, 102, 402, 356].freeze

    maps_object_map.each do |filename, object|
        display_name = object.display_name
        display_name_gotten = names_translation_map[display_name]
        object.display_name = display_name_gotten unless display_name_gotten.nil?

        events = object.events
        next if events.nil?

        events.each_value do |event|
            pages = event.pages
            next if pages.nil?

            pages.each do |page|
                list = page.list
                next if list.nil?

                in_sequence = false
                line = []
                item_indices = []

                list.each_with_index do |item, it|
                    code = item.code

                    unless allowed_codes.include?(code)
                        if in_sequence
                            joined = line.join('\#').strip
                            translated = get_parameter_translated(401, joined, maps_translation_map, game_type)

                            unless translated.nil? || translated.empty?
                                split = translated.split('\#')

                                split_length = split.length
                                line_length = line.length

                                item_indices.each_with_index do |index, i|
                                    list[index].parameters[0] = i < split_length ? split[i] : ''
                                end

                                list[item_indices.last].parameters[0] = split[line_length..].join("\n") if split_length > line_length
                            end
                        end
                        next
                    end

                    parameters = item.parameters

                    if code == 401
                        next unless parameters[0].is_a?(String) && !parameters[0].empty?

                        in_sequence = true
                        line.push(parameters[0])
                        item_indices.push(it)
                    elsif parameters[0].is_a?(Array)
                        parameters[0].each_with_index do |subparameter, sp|
                            next unless subparameter.is_a?(String)

                            subparameter = subparameter.strip
                            next if subparameter.empty?

                            translated = get_parameter_translated(code, subparameter, maps_translation_map, game_type)
                            parameters[0][sp] = translated unless translated.nil? || translated.empty?
                        end
                    elsif parameters[0].is_a?(String)
                        parameter = parameters[0].strip
                        next if parameter.empty?

                        translated = get_parameter_translated(code, parameter, maps_translation_map, game_type)
                        parameters[0] = translated unless translated.nil? || translated.empty?
                    elsif parameters[1].is_a?(String)
                        parameter = parameters[1].strip
                        next if parameter.empty?

                        translated = get_parameter_translated(code, parameter, maps_translation_map, game_type)
                        parameters[1] = translated unless translated.nil? || translated.empty?
                    end

                    item.parameters = parameters
                end
            end
        end

        puts "Written #{filename}" if logging

        File.binwrite(File.join(output_path, filename), Marshal.dump(object))
    end
end