По ходу работы над игрой с быстрой RTBS, задался вопросом уменьшения кода и защиты скриптов. Сделал небольшую скрипт - утилиту, интересно ваше мнение.
Название: ScriptLoader
Версия: 1.0
(Тестовая)
Описание: Данный скрипт позволяет загружать скрипты из файлов (текстовых (.txt и .rb) и
бинарных (.xs))
Зачем это нам нужно?
При помощи этого скрипта и утилиты, вы сможете сохранить целостность вашего кода, разделив ваш скрипт на две части interface и implementation (интерфейс и реализация). В часть интерфейса вынести все константы и значения, которые по вашей задумке пользователь может менять, чтобы настроить ваш скрипт под себя, а в часть реализации собственно весь код. Часть реализации с помощью утилиты превращается в бинарный файл и загружается в игру одной строчкой под частью интерфейса, а сам интерфейс как обычный скрипт вставляем в RPG VXA. Реализация находится в бинарном виде и никто не может увидеть ваш код, а он в свою очередь будет выполняться в игре.
Как использовать?
Допустим у вас есть скрипт
module MY_SCRYPT
#Хочу чтобы пользователь менял эти параметры
FONT_SIZE = 62
TEXT = "ScriptLoader"
#По каким-либо причинам не хочу чтобы пользователь видел этот код и менял его. Может ему это и не нужно, а нагромождать будет.
class MyScene < Scene_Base
#--------------------------------------------------------------------------
# * Start Processing
#--------------------------------------------------------------------------
def start
super
create_background
create_test
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_test
#EXIT
if(Input.trigger?(:B))
SceneManager.return
end
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_background
dispose_test
end
#--------------------------------------------------------------------------
# * Create Background
#--------------------------------------------------------------------------
def create_background
@background_sprite = Sprite.new
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
end
#--------------------------------------------------------------------------
# * Free Background
#--------------------------------------------------------------------------
def dispose_background
@background_sprite.dispose
end
def create_test
@s = Sprite.new()
@s.bitmap = Bitmap.new(Graphics.width,Graphics.height)
@s.bitmap.font.size = MY_SCRYPT::FONT_SIZE
@s.bitmap.draw_text(0,(Graphics.height/2)-100,Graphics.width,100,MY_SCRYPT::TEXT,1)
end
def update_test
@s.update
end
def dispose_test
@s.dispose
end
end
Разделяем скрипт на две части
ЧАСТЬ 1module MY_SCRYPT
#Хочу чтобы пользователь менял эти параметры
FONT_SIZE = 62
TEXT = "ScriptLoader"
end
ЧАСТЬ 2
module MY_SCRYPT
class MyScene < Scene_Base
#--------------------------------------------------------------------------
# * Start Processing
#--------------------------------------------------------------------------
def start
super
create_background
create_test
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_test
#EXIT
if(Input.trigger?(:B))
SceneManager.return
end
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_background
dispose_test
end
#--------------------------------------------------------------------------
# * Create Background
#--------------------------------------------------------------------------
def create_background
@background_sprite = Sprite.new
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
end
#--------------------------------------------------------------------------
# * Free Background
#--------------------------------------------------------------------------
def dispose_background
@background_sprite.dispose
end
def create_test
@s = Sprite.new()
@s.bitmap = Bitmap.new(Graphics.width,Graphics.height)
@s.bitmap.font.size = MY_SCRYPT::FONT_SIZE
@s.bitmap.draw_text(0,(Graphics.height/2)-100,Graphics.width,100,MY_SCRYPT::TEXT,1)
end
def update_test
@s.update
end
def dispose_test
@s.dispose
end
end
end
ЧАСТЬ 2 переводим в бинарный вид, а часть один вставляем в редактор, как обычный скрипт + вызываем метод загрузки второй части.
Вот так будет в результате:
module MY_SCRYPT
FONT_SIZE = 62
TEXT = "ScriptLoader"
end
ScriptLoader.loadX("Имя файла с ЧАСТЬ2");
Это весь код.
Также можно не переводить свой скрипт в бинарный формат, а просто вынести в файл и загрузить (Например просто чтобы код не мешался). Подробнее в демке.
Описание ScriptLoader:Утилита RGSS_ScriptToBin.exe переводит ваш в код в бинарный файл с разрешение .xs. (Просто перетащите на неё текстовый файл с кодом вашего скрипта)
Сам скрипт ScriptLoader должен иметь строгое (строгое!) имя "PKD_ScriptLoader" и быть самым первым в вашей базе скриптов (причём иметь строгий код!)
В демке всё есть и написано подробнее. Загружать же свои скрипты при помощи ScriptLoader можно где угодно.
В данной версии есть ограничения по переводу скриптов в бинарный формат
1) Русские символы в коде (в строке например) будут как "?" - решается, если вынести слова в константы в часть интерфейса
2) Регулярные выражения в коде и некоторые escape последовательности - скрипт не загрузиться - решается аналогично, выносим в константы (интерфейс)
Программа тестировалась на всех стандартных скриптах, запустились и работали все за исключением Windows_Base, по причине наличия регулярных выражений в коде.
Для работы требуется:
.NET Framework 4
Visual C++ Redistributable Packages 2013
Демка с пояснениями и утилита.
Ссылки:
DropBox
Яндекс.Диск