global

def self.write_system(system_file_path, ini_file_path, other_path, output_path, shuffle_level, logging)

Parameters:
  • logging (Boolean) --
  • shuffle_level (Integer) --
  • output_path (String) --
  • other_path (String) --
  • ini_file_path (String) --
  • system_file_path (String) --
def self.write_system(system_file_path, ini_file_path, other_path, output_path, shuffle_level, logging)
    system_basename = File.basename(system_file_path)
    system_object = Marshal.load(File.binread(system_file_path))

    system_original_text = File.readlines(File.join(other_path, 'system.txt'), encoding: 'UTF-8', chomp: true)
                               .map(&:strip)
                               .freeze

    system_translated_text = File.readlines(File.join(other_path, 'system_trans.txt'), encoding: 'UTF-8', chomp: true)
                                 .map(&:strip)

    if shuffle_level.positive?
        system_translated_text.shuffle!
        system_translated_text = shuffle_words(system_translated_text) if shuffle_level == 2
    end

    system_translation_map = Hash[system_original_text.zip(system_translated_text)].freeze

    elements = system_object.elements
    skill_types = system_object.skill_types
    weapon_types = system_object.weapon_types
    armor_types = system_object.armor_types
    currency_unit = system_object.currency_unit
    terms = system_object.terms || system_object.words

    [elements, skill_types, weapon_types, armor_types].each_with_index.each do |array, i|
        next unless array.is_a?(Array)

        array.map! do |string|
            stripped = string.strip
            return string if stripped.empty?

            translated = system_translation_map[stripped]
            !translated.nil? && !translated.empty? ? translated : stripped
        end

        if i.zero?
            system_object.elements = array
        elsif i == 1
            system_object.skill_types = array
        elsif i == 2
            system_object.weapon_types = array
        else
            system_object.armor_types = array
        end
    end

    currency_unit_translated = system_translation_map[currency_unit]
    system_object.currency_unit = currency_unit_translated if currency_unit.is_a?(String) &&
        (!currency_unit_translated.nil? && !currency_unit_translated.empty?)

    terms.instance_variables.each do |variable|
        value = terms.instance_variable_get(variable)

        if value.is_a?(String)
            stripped = value.strip
            next if value.empty?

            translated = system_translation_map[stripped]
            value = !translated.nil? && !translated.empty? ? translated : value
        elsif value.is_a?(Array)
            value.map! do |string|
                stripped = string.strip
                return string if stripped.empty?

                translated = system_translation_map[stripped]
                value = !translated.nil? && !translated.empty? ? translated : value
            end
        end

        terms.instance_variable_set(variable, value)
    end

    system_object.terms.nil? ?
        system_object.words = terms :
        system_object.terms = terms

    game_title_translated = system_translated_text[-1]
    system_object.game_title = game_title_translated
    write_ini_title(ini_file_path, game_title_translated)

    puts "Written #{system_basename}" if logging

    File.binwrite(File.join(output_path, system_basename), Marshal.dump(system_object))
end