RolePlay-S

RolePlay-S 0.4.7

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Поставь там msgbox в конце и погляди.
Картинка вроде переписывается, но перестает работать, если поменять папку с "Graphics" на "Graphics/System/Menu/07equip".
И что такое 8 в args[0][0, 8]?
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Это
G-0
r-1
a-2
p-3
h-4
i-5
c-6
s-7
Типа первые восемь букв из пути до файла должны быть Graphics.
Потом код добавляет перед Graphics - путь до папки мода, и смотрит есть ли в папке мода такой файл (вылезла ли ошибка, типа если попробовать с файлом поработать). Если есть, то заменяет, если нету, то использует игровой.
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Замена вот такая, точечная, в draw_text пригодится, когда нужно не просто игровой текст из переводов заменить, а поменять что-то на другое. То есть, заменить в каком-то месте, что-то одно на другое, не трогая сам перевод.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Для этого в папке мода должна быть папка Graphics, и в ней - все заменяемые файлы должны лежать в идентичных игровым папкам.
В общем, пока код вот такой, лежит без изменений,

Ruby:
class << Bitmap
    alias_method :alias_new_transparent, :new unless method_defined?(:alias_new_transparent)
    def new(*args)
        modPath = "#{$trnsmod_modFolder}/"
        defultPath = args[0]
        args[0] = modPath+defultPath if args[0][0, 8] == "Graphics"
        alias_new_transparent(*args)
        rescue
        args[0] = defultPath
        alias_new_transparent(*args)
    end
end

там ничего трогать не надо, кроме переименования функции для alias_method. И указания на свою папку мода.
То все файлы в папка_мода/Graphics, автоматически попадают в папку Graphics игры, так будто их заменило. Ну, виртуально, для кода игры. ВСЕ ФАЙЛЫ. В том числе с учетом вложенных папок и подпапок.
 

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
И!!!!!!!!!!!!
Я придумал!!!!!!!!!!!!!!!!!!!
Получилось!!!!!!!!!
Ruby:
class Text
  
    alias_method :alias_load_file_transp, :load_file unless method_defined?(:alias_load_file_transp)
  
  
    def load_file(file)
        hashh = alias_load_file_transp(file).merge(load_file_Corsys(file))
        return hashh
    end
  
    def load_file_Corsys(file)
        begin
            sth=File.read("#{$corsys_modFolder}/#{@base_folder}/#{file}.txt")
            return parse(sth.to_s.encode("utf-8"))
        rescue => ex
            # msgbox "ERROR: missing translation file #{$corsys_modFolder}/#{@base_folder}/#{file}.txt"
            return Hash.new
        end
    end

end



1730400965843.png


1730400993075.png

Проверил. Вроде хорошо работает. Намного лучше выглядит, нежели предыдущий вариант.))
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Предыдущий вариант для уникальных случаев.
У меня же там не перевод потребовалось заменить. А поменять одно на другое, причем старое в других местах должно было остаться прежним.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Проверил. Вроде хорошо работает. Намного лучше выглядит, нежели предыдущий вариант.))
Фишка этого метода еще и в том, что файлы перевода игрой воспринимаются так, будто лежат в ее родной папке текст.
 

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
1
Сообщения
341
Реакции
265
Для этого в папке мода должна быть папка Graphics, и в ней - все заменяемые файлы должны лежать в идентичных игровым папкам.
В общем, пока код вот такой, лежит без изменений,

Ruby:
class << Bitmap
    alias_method :alias_new_transparent, :new unless method_defined?(:alias_new_transparent)
    def new(*args)
        modPath = "#{$trnsmod_modFolder}/"
        defultPath = args[0]
        args[0] = modPath+defultPath if args[0][0, 8] == "Graphics"
        alias_new_transparent(*args)
        rescue
        args[0] = defultPath
        alias_new_transparent(*args)
    end
end

там ничего трогать не надо, кроме переименования функции для alias_method. И указания на свою папку мода.
То все файлы в папка_мода/Graphics, автоматически попадают в папку Graphics игры, так будто их заменило. Ну, виртуально, для кода игры. ВСЕ ФАЙЛЫ. В том числе с учетом вложенных папок и подпапок.
Хм... Ну наверное ничего страшного, что все файлы заменяться. Потом еще погляжу, что там у меня и поудаляю лишнее. Я накидал много всякого в графику, но если она сканирует и переписывает, хочу, чтобы там было только то, что необходимо переписать.

Спасибо за помощь! А args[] это такое вообще? Общий хеш или типо того?
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Это типа, поступивший аргумент в функцию. *args - означает что они все, сколько бы их ни было превратятся в массив... args[0] - первый, args[1] второй… итд.
В графике, первый аргумент содержит путь до файла. И вот его и меняют. Если первые буквы в пути до файла - Graphics. Потому что мало ли, кто-то вручную начал внедрять графику, скажем из папки мода, и тогда, первые 8 букв будут не Graphics, и изменение пути не будет сделано.
Или как-то так. Я могу быть не точен. Потому что это мои предположения.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Вот. Улучшил код перезаписи строк.
Ruby:
class Text

    alias_method :alias_load_file_ORIGINAL, :load_file

    def load_file(file)
        mod_file = File.exists?("#{$modName_modFolder}/#{@base_folder}/#{file}.txt")
        orig_file = File.exists?("#{@base_folder}/#{file}.txt")

        if mod_file && orig_file
            hashh = alias_load_file_ORIGINAL(file).merge(load_file_ModName(file))
        elsif mod_file
            hashh = load_file_ModName(file)
        else
            hashh = alias_load_file_ORIGINAL(file)
        end

        return hashh
    end

    def load_file_ModName(file)
        begin
            sth=File.read("#{$modName_modFolder}/#{@base_folder}/#{file}.txt")
            return parse(sth.to_s.encode("utf-8"))
        rescue => ex
            msgbox "ERROR: missing translation file #{$modName_modFolder}/#{@base_folder}/#{file}.txt"
            return Hash.new
        end
    end

end
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
Теперь ко всем файлам в папке Text мода можно обращаться так, будто они в папке Text игры.
Даже если у них уникальные названия и прочее.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
464
Реакции
221
Возраст
32
И по итогам.
Есть код, который делает так, что графика из папки мода становится как бы графикой в папке игры.
Есть код который делает то же самое для текстовых файлов.
Скрипты и сами подгружаются.
У нас уже был код для прогрузки предметов, навыков, статов…
Есть еще парочка методов, вот для НПЦ:
Ruby:
        modnpcs = FileGetter.load_NPCs_from_dir("#{$corsys_modFolder}/Data/NPCdata/")
        $data_npcs = $data_npcs.merge(modnpcs)
И вот для ивентов:
Код:
FileGetter.load_mod_EventLib("#{$corsys_modFolder}/Data/Map211.rvdata2")
Вот для особых скриптов:
Ruby:
        FileGetter.getFileList("#{$corsys_modFolder}/Data/HCGframes/*.rb").each{|file|
            $mod_load_script[file.split("#{$corsys_mod_name}/")[1]] = file
        }
        FileGetter.getFileList("#{$corsys_modFolder}/Data/Batch/*.rb").each{|file|
            $mod_load_script[file.split("#{$corsys_mod_name}/")[1]] = file
        }
        FileGetter.getFileList("#{$corsys_modFolder}/Data/HCGframes/event/*.rb").each{|file|
            $mod_load_script[file.split("#{$corsys_mod_name}/")[1]] = file
        }

Вот для портретов:

Ruby:
        if !@portrait_CorSys #only execute one time each launch
            @portrait_CorSys = true #make sure only execute 1 time
            #Sample ---- import lona portrait data from a mod POSE1
           
            poses = ["pose1", "pose4", "pose5", "chcg1", "chcg2", "chcg3", "chcg4", "chcg5"]
           
            poses.each{|pose|
                target = FileGetter.load_mod_lona_portrait_parts_dir(folder="#{$corsys_modFolder}/Data/Pconfig/Pconfig_lona/poses/#{pose}/",pose_name=pose)
                $data_lona_portrait[0] = $data_lona_portrait[0].merge(target[0])
                next if target[1][pose] == nil
                target[1][pose].each{|data| $data_lona_portrait[1][pose] << data}
            }
        end

Вот для анимаций на карте:
Ruby:
        tmpLonaCHS = FileGetter.load_lona_chs_settings_from_dir(folder="#{$trnsmod_modFolder}/Data/CHSConfig/CHSconfigs_ActorLayer/",chsh=false)
        tmpLonaCHSH = FileGetter.load_lona_chs_settings_from_dir(folder="#{$trnsmod_modFolder}/Data/CHSConfig/CHSconfigs_ActorHLayer/",chsh=true)
        tmpLonaCHS["Lona"].parts[0].each{|data| $chs_data["Lona"].parts[0] << data}
        tmpLonaCHSH["Lona_H"].parts[0].each{|data| $chs_data["Lona_H"].parts[0] << data}
        $chs_data["Lona"].parts[0] = $chs_data["Lona"].parts[0].sort_by { |obj| obj.layer } #sort new chs by layer
        $chs_data["Lona_H"].parts[0] = $chs_data["Lona_H"].parts[0].sort_by { |obj| obj.layer }
 
Сверху Снизу