Поддерживаемый движок · Artemis
Artemis (от iMel Inc. / Mikage) — Windows-движок на Lua-скриптах, стоящий за большой долей современных японских визуальных новелл — примерно 730 релизов на VNDB. RuneTranslate читает ресурсные архивы .pfs движка на чистом TypeScript, без внешних инструментов и сайдкаров: он обрабатывает форматы PF8, PF6 и PF2, включая XOR-шифрование PF8 на ключе SHA-1 (ключ на каждую запись — SHA-1 индекса архива), так что упакованные скрипты открываются без GARbro. Изнутри архива он извлекает диалоги, имена персонажей и варианты выбора как из читаемых скриптов .ast (Lua-таблицы) / .txt (построчных), ТАК И из скомпилированных бинарных сценариев ASB, которые многие игры реально поставляют — формы, начинающейся с маркера ASB, часто переименованной в кастомное расширение (Crystal Rain, например, использует .iet). RuneTranslate определяет скомпилированный сценарий по его сигнатуре, а не по расширению, декодирует его диалоги и перечисляет каждую строку. Он сохраняет инлайн-команды движка — руби / фуригана, таблички имён, цвет, клик-ожидания — и переводы строк при переводе, так что разметка выживает нетронутой. Для экспорта Artemis читает свои скрипты из смонтированных архивов .pfs, поэтому RuneTranslate собирает небольшой патч-архив переопределения — root.pfs.NNN — для каждого исходного .pfs, содержащий только ваши переведённые скрипты; Artemis монтирует нумерованные архивы .pfs последними, так что патч затеняет оригиналы и игра загружает ваш перевод без полной переупаковки базового архива (скрипты также записываются россыпью как безвредное дополнение). Это та же идея патча-переопределения, что и в потоке patch.xp3 Kirikiri. Этот движок ещё проверяется на реальных играх, поэтому протестируйте экспортированную сборку перед распространением.
Визуальные новеллы опираются на фиксированный состав и повторяющуюся терминологию на протяжении тысяч строк, и машинный перевод напишет имя героини тремя разными способами в трёх главах. Внесите ваших персонажей, названия мест и повторяющиеся термины в глоссарий заранее, чтобы каждая строка диалога и каждый вариант выбора отображали их одинаково. Глоссарий: основы →
Укажите RuneTranslate на каталог игры — папку с .exe игры и её ресурсными архивами .pfs (часто root.pfs / data.pfs и им подобные). Определение движка распознаёт раскладку Artemis автоматически; ваша исходная папка никогда не изменяется.
RuneTranslate открывает архивы .pfs на чистом TypeScript — PF8, PF6 и PF2 — и прозрачно расшифровывает XOR-данные PF8 на ключе SHA-1, без GARbro или сайдкара. Затем он парсит скрипты .ast (Lua-таблицы) и .txt (построчные) внутри, извлекая диалоги, имена персонажей и варианты выбора, и перечисляет каждую переводимую строку в редакторе, сгруппированную по файлам. Инлайн-команды движка и переводы строк маскируются за числовыми плейсхолдерами, чтобы провайдер их не искажал.
Эти игры насыщены диалогами и чувствительны к тону, поэтому LLM (OpenAI GPT-4o / Anthropic Claude) или DeepL обычно читаются лучше всего; бесплатный Google Translate или локальная модель (Ollama / LM Studio) покрывают короткие строки меню и варианты выбора, а OpenAI-совместимого провайдера можно направить на OpenRouter или NanoGPT. Необязательный второй проход AI-доработчика подтягивает буквальные формулировки.
Скрипты Artemis вплетают команды руби / фуригана, табличек имён, цвета и клик-ожиданий в диалоги. RuneTranslate замораживает каждую из них — плюс исходные переводы строк — как плейсхолдеры при переводе и восстанавливает на выходе, так что переведённая строка сохраняет ту же фуригану, ту же табличку имени и тот же ритм, что и оригинал.
При экспорте RuneTranslate копирует игру и собирает небольшой патч-архив переопределения — root.pfs.NNN — на каждый исходный .pfs, содержащий только ваши переведённые скрипты .ast / .txt (они также записываются россыпью как безвредное дополнение). Artemis монтирует нумерованные архивы .pfs последними, так что патч затеняет оригиналы и игра просто читает ваш перевод — без полной переупаковки, и базовые архивы остаются нетронутыми. Запустите экспортированную копию — и она играется на вашем языке.