|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Chime[RUS]
Зарегистрирован: 31.08.2014 Сообщения: 11
|
Добавлено: Ср Сен 02, 2015 11:43 pm Заголовок сообщения: Основные возможности. Создание проектов. |
|
|
Kruptar7
Цель работы – описание основ работы с редактором скриптов Kruptar.
1.Основные элементы и главное меню
Рассмотрим, поскольку есть нюансы, три версии данной программы: 7.0.0.85, 7.1.1.10 и 7.1.1.17 (различия будут выделяться цветом: только для версии 7.0.0.85 - зелёный, для версий 7.1.1.10 и 7.1.1.17 будет синий цвет, красный будет в том случае когда возможность реализована только в 7.1.1.17).
Рисунок 1 – Внешний вид программы Kruptar 7: версии 7.0 и 7.1
Основные элементы: 1 Главное меню; 2 Панель инструментов; 3 Панель состояния; 4 Элементы проекта; 5 Параметры проекта;
6 Список текстовых элементов; 7 Оригинальный текст; 8 Редактируемый текст; 9 Окно сообщений (Скрыто).
Горячие клавиши.
Ctrl+N – создать проект.
Ctrl+O – открыть проект.
Ctrl+S – сохранить проект.
Ctrl+Alt+S – сохранить всё (сохранить как).
Ctrl+Alt+X – закрыть.
Ctrl+Alt+A – добавить элемент.
Ctrl+T – добавить таблицу.
Ctrl+Alt+T – загрузить таблицу из файла (переустановить ссылки таблиц).
Ctrl+Q – импорт указателей из файла.
Ctrl+G – добавить группу.
Ctrl+F7 – перезагрузить текст.
Ctrl+F8 – вернуть исходный текст.
Ctrl+Alt+D – параметры словаря.
Ctrl+Alt+G – генерировать словарь.
Shift+Ctrl+F6 – словарь в таблицу.
Ctrl+Alt+P – добавить указатели.
Ctrl+Del – очистить.
Ctrl+Alt+W – вернуть таблицы списка.
Ctrl+Alt+V – переменные.
Ctrl+U – переместить вверх.
Ctrl+H – переместить вниз.
Ctrl+D – удалить элемент.
F9 – пересчитать и вставить указатели и текст из текущей группы в ROM.
Ctrl+F9 – пересчитать и вставить указатели и текст из каждой группы в ROM.
F11 – запустить исходный ROM в эмуляторе.
F12 – запустить выходной ROM в эмуляторе.
Ctrl+F – найти.
Ctrl+R – заменить.
F3 – найти далее.
*** Можно увидель во вкладке Правка главного меню (только в контекстном меню Окна «Редактируемый текст»)
Ctrl+Z – отменить.
Ctrl+Alt+Z – повторить.
Ctrl+X – вырезать.
Ctrl+C – копировать.
Ctrl+V – вставить.
Ctrl+A – выделить всё.
***
F2 – переименовать.
Ctrl+Alt+O – добавить из файла.
Ctrl+Alt+L – загрузить из файла (и в чём отличие от предыдущей команды или это просто переименованные Ctrl+Alt+T и Ctrl+Q?).
Ctrl+F2 – сохранить в файл.
Ctrl+Alt+E – добавить/удалить свойства для вставки.
Ctrl+Alt+F – исправить позиции указателей.
Ctrl+F1 – о программе.
Некоторые пункты главного меню не имеют горячих клавиш.
Файл:
Cохранить как.
Cохранить всё.
Закрыть всё.
Выход.
Проект:
Выбрать эмулятор.
Таблицы:
Сохранить в файл.
Заполнить ANSI-символами.
Группы:
Загрузить список адресов для вставки текста…
Списки пойнтеров:
Сортировать по возрастанию.
Сортировать по убыванию.
Настройки:
Язык.
Шрифт.
Справка:
Библиотеки (Плагины).
2.Создание проекта и контекстное меню
Рассмотрим создание проекта на примере игры The Legend of Zelda - Links Awakening DX (GBC).
Подготовка
Здесь показан только один из множества возможных путей решения задачи по нахождению всех нужных циферок для создания проекта. Со взглядом на всё это дело от автора программы можно ознакомиться тут: 1 2 3 4 или там.
Шрифты можно увидеть при помощи понравившегося тайлового редактора, а тексты при помощи понравившегося Hex-редактора, они тут не запакованы и объёмы ROM не столь велики, чтобы чего-то не найти. Как видим, текст читается и имеет кодировку похожую на ASCII.
Рисунок 2 – Предварительное исследование. Поиск шрифтов и текстов
Как находить указатели на эту платформу(Game Boy / Game Boy Color) можно прочитать здесь.
Мне удобнее разбирать ROM на блоки (либо файлы), выбрать те, где есть текст и указатели, и работать уже конкретно с ними. Здесь, в связи с особенностями архитектуры консоли, будут блоки по 16 килобайт, они получены при помощи простой и понятной программки Cracker’а и небольшого батника.
Теперь можно записать куда-нибудь адреса начала и окончания текстов (нули, идущие после текста, в данном случае можно считать текстом). Мне удобно делать это при помощи Hex-редактора (здесь Hex Workshop) и электронных таблиц (здесь Excel).
Рисунок 3 – Копируем адреса начала текстов из каждого блока
В блоке 28_00070000.bin, начиная c адреса 0x0001 и заканчивая 0x0560, содержатся указатели.
Копируем их в отдельный файл и удалим первый байт: 01 - нам он не нужен, т.к. указателем на текст явно не является, а для чего был нужен разработчикам меня не интересовало.
Рисунок 4 – Копируем указатели
Приведём к удобному виду и скопируем указатели в текстовый редактор (здесь AkelPad). Удалим лишние пробелы и увидим, сколько же у нас всего указателей и предположительное количество строк.
Рисунок 5 – Удаляем лишнее
Выделяем всё и опять копируем. В Excel выделяем столбец, выбираем текстовый формат ячеек и вставляем сюда полученные указатели. Далее можно их перевернуть (LE -> BE) и сравнить с адресами начала текстов (+ 0x4000).
Теперь и указатели можно разбить на 5 групп, т.к. для титров тут указателей не нашлось. Получим начальный и конечный адреса для каждой группы указателей. Всё это конечно можно найти и посчитать при помощи Hex-редактора и калькулятора, но мне лень.
Таблицы для перекодировки текста тоже удобно хранить подобным образом. А лишние знаки табуляции удалять в текстовом редакторе, непосредственно перед сохранением в файл(*.tbl).
Рисунок 6 – Все циферки, необходимые для создания проекта, в одном месте
Таблицу можно получить различными способами. В данном случае карта символов шрифта не была найдена. Чтобы составить полную таблицу символов все тексты, кроме титров, копировались в один отдельный файл.
Рисунок 7 – Тексты из всех блоков кроме титров скопированы в один файл
Когда весь диалоговый текст находится в одном файле, то можно определить все коды символов и специальные коды, которые в нём содержатся. Сразу же видим FF в конце текста, предположим, что это символ конца строки и тут же это проверим.
Рисунок 8 – Проверяем FF
Количество символов получилось меньше чем количество указателей, что может говорить как о наличии нескольких указателей на одну строку, так и о наличии других символов конца строки(Здесь ещё можно обратить внимание на то, что адреса всех найденных FF можно скопировать в блокнот и опять же использовать для проверки сравнив с указателями). Проверим теперь все возможные коды c F?. Пролистаем немножко и найдём ещё один код похожий на конец строки – FE. И ещё коды F0, F1, F2 и F3, которые впоследствии окажутся стрелочками.
Рисунок 9 – Проверяем F?
Скопируем эти коды в текстовый редактор, а здесь заменим на 00, чтобы больше к ним не возвращаться. Повторяем до нахождения всех нужных кодов. Коды букв известны, т.к. текст читается, а вот апостроф явно имеет код отличный от стандартного.
Рисунок 10 – Заменяем все F?, переходим к следующей группе кодов E? и т.д.
Коды оставшихся символов алфавита (умляуты), которые есть в шрифте, но в этом тексте не используются, можно узнать уже после составления проекта с помощью Kruptar и эмулятора.
Для того чтобы читались все символы, в том числе японские, какие либо значки или европейские умляуты всегда рекомендую сохранять таблицу в кодировке Unicode (UTF-16 LE); коды отличные от символов заключать в скобки (тут квадратные), если известно что код обозначает – именовать, если нет – нумеровать (либо писать сам код когда он короткий). После ends идут символы конца строки. Здесь таковых получилось два.
Теперь мы знаем абсолютные адреса текстов и указателей. Есть таблица с оригинальным алфавитом и служебными кодами (иконки, звуки, имена и прочие функции бывают за ними скрыты). Можно возвращаться к созданию проекта в Kruptar.
Создание проекта
Проект
Ctrl+N и в окне “Элементы проекта” появляется древовидная структура пустого проекта и его элементов:
Без имени 1(Project1)
Вкладка “Параметры проекта” при выборе элемента Без имени 1(Project1) примет вид:
kpInputRom (kpSourceROM)
Здесь нужно выбрать файл откуда будет загружаться скрипт. (ROM либо бинарный файл)
kpOutputRom (kpDestinationROM)
Здесь нужно выбрать файл куда скрипт будет записываться. (ROM либо бинарный файл).
Удобнее когда каждый файл находится в своей папке, например исходный в папке Original, а редактируемый в Russian.
kpCoding (kpCodePage)
Кодировка таблиц используемых в проекте определяется здесь, по умолчанию стоит ANSI (1251 (ANSI - кириллица)), выбираем UNICODE (1200 (UTF-16 LE)) т.к. таблица у нас сохранена именно в нём. Есть ещё SHIFT-JIS, а в версии 7.1 ещё больше кодировок, но для чего они все нужны, я не знаю.
kpFlags
Пункт для хранения различных флагов настроек. Имеет один флаг, равный 1(h01), который устанавливает первый в списке переносов таблицы код, как невидимый. Если кодов переноса строки много, то это выглядит не очень здорово. Возможно, здесь предполагалось расширение гибкости программы, посредством системы флагов.
Контекстное меню
Т.к. проектов может быть много в версии 7.0 несколько проектов идут списком в окне “Элементы проекта”, в 7.1. создаются вкладки и, соответственно, переместить вверх/вниз здесь уже избыточно.
Рисунок 11 – Новый проект в версиях 7.0 и 7.1.
Таблицы
Ctrl+T и появляется пустая таблица с такими элементами:
Table1
В версии 7.0 при загрузке таблицы из файла Ctrl+Alt+T меняется имя таблицы (Table1) на имя файла, в версии 7.1 такой эффект достигается если таблицу добавлять не через Ctrl+T, а через Ctrl+Alt+O, при загрузке из файла – Ctrl+Alt+L имя таблицы остаётся Table1. Есть возможность переименовать этот элемент: выделить его и нажать ПКМ или F2. Можно создать много таблиц, добавить как уже готовую, так и пустую, и составлять её прямо в Kruptar.
А ещё можно сохранить таблицу в той кодировке, которая была указана ранее в проекте: Сохранить в файл (Ctrl+F2).
Рекомендую добавлять две таблицы: для чтения текста – свою, для вставки текста – свою, даже если они одинаковые, т.к. если понадобится одну из них заменить, это сделать окажется проще, чем в случае с общей таблицей. Если двум разным символам в таблице соответствует один код, то читаться и записываться в скрипт будет символ, который находится в таблице выше. Это следует учитывать, если понадобится читать английские символы, а записывать русские, которые в шрифте нарисованы поверх английских, а также при поиске ошибок во время проверки правильности составления проекта.
Коды окончания строки
Здесь можно добавить нулевой элемент при помощи Ctrl+Alt+A и переименовать его в код окончания строки либо прочитать, если таблица уже была добавлена.
Коды разрыва строки
Здесь можно добавить нулевой элемент при помощи Ctrl+Alt+A и можно переименовать его в код разрыва строки либо прочитать, если таблица уже была добавлена. В данном скрипте кодов переноса (разрыва) строки не нашлось, но, для удобства восприятия текста, такой код будет добавлен при помощи плагина.
Символы
Здесь можно добавить нулевой элемент при помощи Ctrl+Alt+A (в версии 7.1.1.10 есть баг, в 7.1.1.17 он исправлен) либо прочитать (переименовать), если таблица уже была добавлена.
Либо заполнить таблицу ANSI-символами.
Контекстное меню
Рисунок 12 – Загрузка таблицы из файла в версии 7.0
Функционал контекстного меню элементов таблицы в версии 7.1 значительно расширен и это следует рассмотреть отдельно.
Рисунок 13 – Сохранение проекта и контекстные меню элементов таблицы в версии 7.0
Проект был сохранён в версии 7.0.0.85 и открыт в 7.1.1.17, что тоже является одной из важных особенностей.
Обратной совместимости нет: создав либо сохранив проект в версии 7.1 в 7.0 его уже не открыть, т.к. код загрузки и сохранения проектов был переписан и оптимизирован.
Рисунок 14 – Контекстные меню элементов таблицы в версии 7.1
Появилась возможность сохранять (Ctrl+F2) не только саму таблицу, но и её элементы:
LA_Table_En_TRMN.tbl,
LA_Table_En_CLRF.tbl,
LA_Table_En_CHR.tbl.
К появившимся в этой версии стандартным операциям редактирования, добавилась работа с файлами:
Ctrl+Alt+O – добавляет к уже существующим элементам те, что содержатся в выбранном файле;
Ctrl+Alt+L – загружает элементы из файла, удаляя существующие, если они есть.
Группы
Ctrl+G и появляется пустая группа с такими элементами:
Group1
Вкладка “Параметры проекта” при выборе элемента Group1 примет вид:
grLibrary (grPlugin)
Т.к. Kruptar всегда использует плагины для извлечения и вставки скрипта здесь нужно выбрать один из существующих плагинов, либо если они не подходят выбрать свой, предварительно написав его и положив в папку Lib.
Плагин Standard.kpl подходит для скриптов в которых строки оканчиваются символом конца строки, по умолчанию используется именно он.
Плагин NULL.kpl для скриптов в которых символ конца строки – 00, тогда он в проекте становится невидимым (вернее не считывается при чтении символов, но записывается при записи).
Описание, если конечно писавший плагин потрудился его написать, можно почитать в Справке.
Тема написания плагинов будет освещена отдельно, в дополнение к существующей.
grDictionary (grIsDictionary)
Этот параметр по умолчанию равен FALSE и означает, что группа не является словарём, если же в тексте присутствует DTE/MTE оптимизация, одна из групп обязательно должна им являться. Когда этот параметр TRUE в контекстном меню элемента Group1 становятся доступны опции:
Ctrl+Alt+D – Параметры словаря (Словарь DTE/MTE),
Ctrl+Alt+G – Генерировать словарь.
Но поскольку в этом проекте нет словаря, то и рассматривать данный момент не будем.
Хотя в версии 7.1 появилось важное отличие: возможность использовать в таблицах символ разрыва строки “\n” что позволяет добавлять в словарь слова или части слов разделённые CLRF.
Возможно, будет приложение и там частично рассмотрены ещё несколько проектов, в том числе и с MTE.
Также контекстное меню данного элемента содержит пункты:
Ctrl+F7 – Перезагрузить оригинальный текст (Перезагрузить текст). Обновляет окно с оригинальным текстом.
Ctrl+F8 – Вернуть оригинальный текст (Вернуть исходный текст). Загружает текст из окна “оригинальный текст” в окно “редактируемый текст”. Весьма полезная опция.
Shift+Ctrl+F6 – Словарь в таблицу. Добавляет словарь в выбранную таблицу. Опция активна только когда настроены Параметры словаря.
Загрузить список адресов для вставки текста… В последующих версиях этот пункт переименован и перемещён в контекстное меню элемента Диапазоны адресов. Загружает адреса из файла.
F9 – Пересчитать пойнтеры и вставить текст в ROM (Пересчитать и вставить). В версиях 7.0.0.85 и 7.1.1.10 есть баг (когда кнопка активна, а указателей уже нет), в 7.1.1.17 он частично исправлен (уже нет зависания, но всё же, если указать диапазон адресов для записи текста, то в выходном файле этот диапазон будет заполнен нулями).
Рисунок 15 – Контекстное меню элемента Group1
“Список текстовых элементов” реагирует на создание новой группы появлением вкладки с её названием, в версии 7.0 есть только подсветка, а вот в 7.1 появилось удобное контекстное меню, но подсветка исчезла. Групп, также как проектов и таблиц может быть много, соответственно версия 7.1 в плане работы с группами удобнее. В данном проекте групп будет 6, т.к. тексты, включая титры, разбиты на 6 частей (см. Рисунок 6).
Блоки для текста (Диапазоны адресов)
Тут задаются границы в пределах которых будет находиться записываемый текст для данной группы, подобных диапазонов может быть несколько. Обычно текст пишется в тот же диапазон что и оригинальный, но бывает необходимость перенести переведённый текст, например, в конец рома, если позволяют указатели.
Здесь, казалось бы, ничего сложного нет, но может возникнуть ошибка с неправильно введённым значением.
Возьмём пример приведённый автором в версии 7.1 (для 7.0 всё аналогично): 002A3C00-002AFFFF. Если попытаться ввести этот диапазон (Ctrl+Alt+A и вставить), то увидим ошибку, в которой данный пример и показан. Если этот же диапазон записать в файл и Загрузить список адресов для вставки текста… (Ctrl+Alt+O (Добавить из файла) или Ctrl+Alt+L (Загрузить из файла) здесь разницы в командах нет), то диапазон будет добавлен как 02A3C00-02AFFFF. Т.е. для ввода в программе нужно использовать 7 разрядов на число для записи диапазона, а когда программа берёт диапазон из файла, работает и с 8. В данном проекте в каждой группе будет по 1 диапазону.
Рисунок 16 – Добавление элемента
Пойнтеры (Списки пойнтеров)
Ctrl+Alt+A и начинается самое интересное.
List1
Самое запутанное, неоднозначное и непонятное тоже тут.
Вкладка “Параметры проекта” при выборе элемента List1 отличается для каждой рассматриваемой версии количеством, именами и расположением элементов. Контекстное меню List1 довольно большое и тоже отличается в каждой версии.
Рисунок 17 – List1 в версиях 7.0.0.85, 7.1.1.10 и 7.1.1.17
Правда системный подход есть и здесь. Все параметры можно разделить на три группы: со списком выбора, числовые и логические.
ptInputTable (ptSrcTable)
Выбираем таблицу, которую ранее добавили, по ней будем извлекать текст в этом листе.
ptOutputTable (ptDestTable)
Выбираем таблицу, которую ранее добавили, по ней будем вставлять текст в этом листе.
ptDictionary
Здесь можно выбрать группу которая является словарём, когда таковая имеется.
ptPointerSize
Тут выбираем размер указателей: 0,1,2,3,4. В версии 7.1 появилась ещё пара типов: 1(signed) и 2(signed), значения таких пойнтеров могут быть отрицательными.
Числовые параметры могут быть записаны в десятичной либо шестнадцатеричной системе счисления, во втором случае нужно писать префикс “h”. В версии 7.0 имеются недоработки по переводу одних значений в другие: не всё переводится автоматически. В 7.1 это исправлено.
ptReference Очень важный параметр!
Это число которое устанавливает однозначное соответствие указателя(значение указателя) и текста(фактический адрес текста), т.к. указатели могут быть относительными, этот параметр позволяет считать любые указатели как абсолютные (возможно путаю). Такая точка отсчёта или разница смещений, кому какая терминология ближе. Запишется в шестнадцатеричном виде.
Если не задан или задан неверно, нормально отобразить текст в проекте вряд ли получится! В некоторых играх(Fragile Dreams) каждый указатель такой точкой отсчёта считает адрес идентификатора строки(4 байта перед самим указателем). Т.е. даже это не панацея...
ptInterval
Когда указатели идут блоком, но после каждого из них есть дополнительные байты идентифицирующие строку или указывающие её размер, задействуется этот элемент. В версии 7.1.1.17 могут быть отрицательные интервалы. Запишется в десятичном виде.
ptShiftLeft
Сдвиг, может быть в диапазоне от 0 до 31. Видимо бывают указатели, сдвинутые на какое-то количество бит. Запишется в десятичном виде.
ptMultiply (ptAlignment)
Этот параметр позволяет показать, что указатели выровнены, т.е. кратны какому либо числу. В тексте в таком случае, после знака окончания строки добавляются нули. Здесь диапазон от 1 до 8. В версии 7.1 запишется в десятичном виде.
ptAlign (ptCharSize)
Этот параметр один из самых забываемых. Когда в игре используется двухбайтовая кодировка текста нужно поставить 2. Вспоминаю только в случае выявления ошибок. Диапазон значений от 1 до 8. В версии 7.1 запишется в десятичном виде.
ptStringLength
Здесь можно задать длину строки, например, когда нужно вытащить текст без использования указателей. Диапазон от 0 до 32768. Запишется в десятичном виде.
Почти все логические параметры по умолчанию не активны.
ptMotorola (ptBIG_ENDIAN)
Порядок байтов. Вечный спор тупоконечников с остроконечниками.
ptSigned (ptAutoPtrStart)
???
ptPunType (ptSplittedPtrs)
Когда указатель разбит на части. В версии 7.1.1.17 изменено поведение этого свойства в зависимости от размера указателя.
ptAutoStart (ptAutoReference)
Можно вместо указания ptReference активировать эту опцию, когда адрес начала блока указателей(первого указателя) и ptReference совпадают.
ptSeekSame
Оптимизация такая. Когда в тексте несколько одинаковых строк, то при пересчёте они будут вставляться в одно и то же место, т.е. останется одна. По умолчанию эта опция включена, но иногда её требуется отключать. Например, отключаю при проверке правильности составления проектов.
ptPtrToPtr
Указатели указывают на указатели, которые указывают на текст. Я пытался сделать проект на GBA с такими указателями, но не получилось, т.к. там была группа указателей, каждый из которых указывал на другую группу указателей. Т.е. у меня здесь лыжи явно не едут. Ежели здесь можно указывать только на один указатель указывающий на текст, то не понятно где это может использоваться.
ptNotInSource
Не извлекать текст из исходного файла.
ptSNESlorom
Формат указателей SNES Lo-ROM.
Контекстное меню
Добавить блок пойнтеров… (Добавить пойнтеры…) Ctrl+Alt+P.
Если в ptInputTable (ptSrcTable) не выбрана таблица будет ошибка.
Если ptPointerSize = 0, то будет предоставлена возможность указать адреса на блок текста который необходимо извлечь без применения указателей.
Если ptPointerSize отличен от 0, то нужно указать адрес первого и адрес последнего указателя. Писать эти значения нужно с префиксом “h” в шестнадцатеричной системе счисления, либо в десятичной без всяких префиксов.
Рисунок 18 – Три варианта сообщения в 7.0.0.85
Импорт пойнтеров из файла… Ctrl+Q Позволяет загружать адреса указателей из текстового файла. Это бывает нужно в том случае, когда они расположены не таблицей либо, когда в таблице есть указатели-пустышки и нам не нужно работать с ними. На Рисунке 6 в столбце H считаются адреса указателей, впоследствии этот столбец можно просто скопировать в текстовый файл и использовать для импорта.
В версиях 7.1. эта опция была разделена на две:
Добавить из файла… Ctrl+Alt+L. Добавляет из файла адреса указателей, которых нет в списке. Одинаковые не добавляются.
Загрузить из файла… Ctrl+Alt+O. Загружает список из файла.
Также появилась возможность сохранять список указателей в файл, чего нет в 7.0 и стандартные команды редактирования:
Сохранить в файл… Ctrl+F2
Очистить Ctrl+Del. Удаляет все элементы текущего списка List.
Перезагрузить оригинальный текст (Перезагрузить текст) Ctrl+F7. Обновляет окно “Оригинальный текст” с использованием текущей таблицы.
Вернуть оригинальный текст (Вернуть исходный текст) Ctrl+F8. Копирует содержимое окна “Оригинальный текст” в окно “Редактируемый текст”. Т.е. в окне с переводом мы вновь увидим оригинальный текст. Оригиналом естественно может быть и русский… Если проект при этом не сохранять, txt файл в его архиве останется таким же, как до применения этой функции. От такой же команды в Group отличается лишь тем, что изменения коснутся только текущего листа, а не всей группы, которая может содержать их большое количество.
Вернуть таблицы списка Ctrl+Alt+W. Каждый элемент списка List, т.е. каждая строка может быть извлечена(вставлена) по своей таблице. При изменении таблицы для всего List таблицы в каждой строке остаются такими же, как были при первом извлечении, либо установлены впоследствии, чтобы применить это глобальное изменение к каждой строке и существует эта команда.
В моём понимании программы таблицы нужно менять только в элементе Таблицы, поэтому я создаю их избыточное количество, если проект того требует, но зато если что-то меняется, то меняется сразу и везде. Возможно, это связано с непониманием некоторых тонкостей работы с каждым указателем-строкой.
В 7.1. эта опция была переименована и сгруппирована с функционально похожими собратьями для указателей:
Добавить/удалить свойства для вставки Ctrl+Alt+E. Добавляет/удаляет на панель параметры проекта довольно много свойств указателей по которым текст можно вставлять:
ptDestPtrSize
ptDestReference
ptDestStrLen
ptDestMultiple (ptDestAlignment)
ptDestAlign (ptDestCharSize)
ptDestShiftLeft
ptDestAutoPtrStart
ptDestSplittedPtrs
ptDestSNESlorom
Т.е. есть возможность очень многое изменить относительно оригинала.
Исправить позиции пойнтеров Ctrl+Alt+F. Не знаю. Но видимо именно для правильной работы изменённой вставки.
Переустановить ссылки таблиц Ctrl+Alt+T. Аналогична команде “Вернуть таблицы списка”.
Переменные (Околопоинтерные переменные) Ctrl+Alt+V. Работает только в случае ненулевого значения ptInterval, т.е. в проекте где адреса указателей импортируются из файла, видимо работать не будет. Добавляет возможность автоматически пересчитывать, как минимум, длину строки. Не скажу, что работает идеально, но добиться правильного результата пересчёта таки можно.
В некоторых играх, длина строки может учитывать символы окончания, может не учитывать, ещё бывает выравнивание окончаний до чётной длины. Это уже можно сделать плагинами.
Рисунок 19 – Переменные
Есть ещё пара функций сортировки указателей в элементе List, они появились в версии 7.1.1.17:
Сортировать по возрастанию
Сортировать по убыванию
Концепция их применения для меня остаётся загадкой. Т.к. в конечном итоге в этой версии присутствует специальная сортировка текста(видимо по размеру строк) , что лишает возможности проверить правильность составления проекта, путём сравнения выходного файла с оригинальным и сводит на нет ВСЕ её плюсы.
Строки и указатели. Чтение и правка.
Настало время посмотреть, где все элементы сходятся.
На рисунке 20 показана завершающая фаза создания проекта со стандартным плагином (Standard.kpl) и отключённым ptSeekSame (мне это необходимо для проверки правильности составления проекта).
Group1 переименовываем в Block_20, выбираем стандартный плагин, указываем диапазон адресов: 0051934-0053FFF, выбираем размер пойнтеров ptPtrSize=2, указываем ptReference=h4C000, устанавливаем ptSeekSame=False, добавляем адреса пойнтеров: h00070001 и h00070147.
Видим, что Список текстовых элементов содержит 164 строки, окна Оригинальный текст и Редактируемый текст содержат выделенную в списке строку 000001, а Параметры проекта свойства последней строки: исходную и выходную таблицу для этой строки, адрес указателя на эту строку, ptReference (в 7.1 добавлены выходные адрес указателя и ptReference) и последний логический параметр pnFixed, что он делает в версиях 7.0.0.85 и 7.1.1.10 для меня так и осталось загадкой, но в текстовом файле для 7.1.1.10 написано: Исправлена вставка при pnFixed = True…
Если это исключение для ptSeekSame то оно не работает.
Ещё можно заметить, что окна Оригинальный текст и Редактируемый текст имеют строчку с информацией:
1. Позиция курсора и размер строки (количество символов). В 7.1 показывает, ширину окна если вдруг нет символа переноса (как раз наш случай), что не есть хорошо. А вот в 7.0 именно количество символов в строке, плюс тут есть столбец с нумерацией строк, где хорошо видно закончилась ли строка или просто не поместилась в окне и вообще это очень удобная вещь SynEdit (в принципе только из-за неё и живёт версия 7.0.0.85 ; ));
2. Номер строки и количество строк (номер начинается с нуля и никогда не сравняется с числом строк) ;
3. Размер текста (количество байт). Размер первой строки 89 байт.
Ещё можно заметить подсветку кодов и панелей List1 и Block_20 в версии 7.0. (Опять SynEdit, но как, Карл!)
В версии 7.1 нет подсветки кодов, но панели List1 и Block_20(Ex Group1) имеют свои контекстные меню, что видимо, делает работу с ними несколько более удобной.
По F9 можно увидеть сообщение о том, что весь текст не уместился, после чего сравнить оригинальный и русифицируемый файл(вставляется всё в данный момент по оригинальной таблице) и выявить ошибки допущенные при составлении проекта. Они могут быть самыми разными, оставленные разработчиками в том числе, но в данном случае, это отключённый ptSeekSame. Я отключал его именно для того, чтобы сравнить оригинальный и изменённый файлы, т.к. довольно часто разработчики не пользуются подобным способом оптимизации. Но в данном случае можно увидеть (если гифку разобрать), что после строки о покупке лука у нас идёт её повтор, чего нет в оригинале.
Рисунок 20 – Первый блин комом
Ставим ptSeekSame=True и повторяем процедуру записи и сравнения.
Рисунок 21 – Проект составлен правильно и даже работает
Ах да, если мы попытаемся проделать подобное сравнение в версии 7.1.1.17, получится такая картинка.
Рисунок 22 – Вставка того же блока в версии 7.1.1.17
Т.е. тут остаётся только верить автору и надеяться, что всё сложилось правильно. Как в этой версии находить свои ошибки я не знаю...
Теперь можно уже было бы приступить непосредственно к процессу перевода, но текст без переноса строки править весьма неудобно. Поэтому здесь чуть забежим вперёд и покажем, что это довольно просто исправить, используя свой плагин вместо стандартного. Правилась только функция GetStrings.
Код: | library Zelda_GB;
uses
ShareMem,
Needs;
{$E .kpl}
resourcestring
SKPLDescription = 'The Legend of Zelda:' + #13#10 +
'Link''s Awakening';
var
ROM: PBytes = NIL;
RomSize: Integer = 0;
EndsRoot: PTableItem = NIL;
MaxCodes: Integer = 0;
Align: Integer = 1;
function Description: AnsiString; stdcall;
begin
Result := SKPLDescription
end;
function NeedEnd: Boolean; stdcall;
begin
Result := False
end;
function GetMethod: TMethod; stdcall;
begin
Result := tmNone
end;
procedure SetVariables(X: PBytes; Sz: Integer; ER: PTableItem; MC, AL: Integer); stdcall;
begin
ROM := X;
RomSize := Sz;
EndsRoot := ER;
MaxCodes := MC;
Align := AL
end;
function GetData(TextStrings: PTextStrings): AnsiString; stdcall;
var //Функция писателя.
R: PTextString;
begin
Result := '';
If TextStrings = NIL then Exit;
With TextStrings^ do
begin
R := Root;
While R <> NIL do
begin
Result := Result + R^.Str;
R := R^.Next
end
end
end;
function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
var //Функция читателя.
Cnt: Word; P: PByte; PC: PChar absolute P;
begin
New(Result, Init);
with Result.Add^ do
begin
P := Addr(ROM[X]);
Cnt:=0; //Счётчик символов. Тип byte мало, т.к. строка может быть и длиннее 255, потому Word.
while P^ <> 0 do
if (P^ = $FE) or (P^ = $FF) then
begin Str := Str + PC^; break end //Тут просто лень
else begin
Cnt:=Cnt + 1;
Str := Str + PC^;
Inc(P);
if Cnt mod 16 = 0 then Str := Str + #1 //Строку разрываем, когда она достигает
end //длины 16 байт, 01 добавляя в таблицу.
end
end;
exports
GetMethod,
SetVariables,
GetData,
GetStrings,
DisposeStrings,
NeedEnd,
Description;
end. |
Сначала очищаем List1 от того, что получили и выбираем в списке плагинов Zelda_GB.kpl. Тут я немножко воспользовался послезнанием. Т.к. нельзя сменить плагин не очистив старый лист от старого текста, но нельзя и загрузить только написанный плагин в уже запущенный Kruptar. Т.е. требуется положить в папку Lib плагин Zelda_GB.kpl и перезапустить Kruptar. Я же написал плагин, до того как решил написать эту доку и он уже был в папке Lib. Т.е. мне осталось только очистить List и выбрать его. Далее опять Ctrl+Alt+P и вот тут нужно было бы писать адреса начального и конечного указателей заново, но они сохранились т.к. я всего лишь правлю проект и Kruptar не перезагружал.
Видим, что появился нераспознанный код /01. Его добавляет плагин в качестве символа разрыва строки.
Вносим его в таблицу, которая используется для извлечения скрипта. В таблице для вставки текста обратно в ром этот код не нужен, т.к. его не было в оригинале. Поэтому просто возвращаем оригинальный текст (Ctrl+F8). Обратите внимание, что размер строки в окне Оригинального и Редактируемого текста отличается: 94 вынимаем и 89 вставляем обратно (т.е. столько же сколько и без использования этого плагина см. Рис. 20). Но редактировать текст теперь значительно удобней.
Рисунок 23 – Плагин добавляет символ разрыва строки
С остальными блоками всё аналогично, кроме Block_23_staff. Но об этом чуть позже. Рассмотрим ещё раз коды символов. С помощью Hex-редактора были найдены все символы, встречающиеся в скрипте, но не в шрифте. Вот эту разницу и настало время обнаружить. Для этого была составлена тестовая таблица от 00 до FD и по ней по порядку заменён один из первых текстов встречающихся в игре, таким образом были получены все коды и соответствующие им тайлы в шрифте (крестики пришлось нумеровать). Наверняка есть более продвинутые способы поиска, но мне был интересен самый простой.
Рисунок 24 – Символы и их коды
По наиболее очевидной дельте, находится карта тайлов шрифта(т.к. тут ничего не пожато) и появляется возможность использовать все неиспользуемые символы в целях перевода.
Чтение и правка без указателей. Титры.
Для титров тоже использовался плагин, но т.к. в них не было плашки для текста и использовалась вся ширина экрана, строка кратна 18.
Вся разница в плагине:
Код: | library Zelda_GB_staff;
...
function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
var //Функция читателя.
Cnt: Word; P: PByte; PC: PChar absolute P;
begin
New(Result, Init);
with Result.Add^ do
begin
P := Addr(ROM[X]);
Cnt:=0;
while P^ <> $FA do
begin
Cnt:=Cnt + 1;
Str := Str + PC^;
Inc(P);
if Cnt mod 18 = 0 then Str := Str + #1
end
end
end;
... |
или счётчик взять размером в байт и просто ужесточить условие:
Код: | library Zelda_GB_staff;
...
function GetStrings(X, Sz: Integer): PTextStrings; stdcall;
var //Функция читателя.
Cnt: Byte; P: PByte; PC: PChar absolute P;
begin
New(Result, Init);
with Result.Add^ do
begin
P := Addr(ROM[X]);
Cnt:=0;
while P^ <> $FA do
begin
Cnt:=Cnt + 1;
Str := Str + PC^;
Inc(P);
if Cnt mod 18 = 0 then begin Str := Str + #1; Cnt:=0 end
end
end
end;
... |
Тут FA символ окончания строки, но мы до него всё равно не дойдём... Здесь на двух примерах просто показана разница, как можно его задать в плагине (можно не указывать в таблице), возможно, пригодится кому.
Отличие данной записи от той что в плагине Zelda_GB.kpl:
Код: | ...
if (P^ = $FE) or (P^ = $FF) then
begin Str := Str + PC^;
break
end
... |
в том, что текст просто перестанет читаться встретив этот символ, а сам он записан не будет. Если необходимо записать символ конца строки, а это нужно практически всегда, правится функция GetData. В случае FA это могло выглядеть так:
Код: | ...
function GetData(TextStrings: PTextStrings): AnsiString; stdcall;
var //Функция писателя.
R: PTextString;
begin
Result := '';
If TextStrings = NIL then Exit;
With TextStrings^ do
begin
R := Root;
While R <> NIL do
begin
Result := Result + R^.Str + #250; //Вся правка!
R := R^.Next
end
end
end;
... |
Тогда знака конца строки в проекте даже видно не будет. Что и реализовано в плагине NULL.kpl для символа 00.
Собственно, сам блок титров вынимается, как и предыдущий, за исключением того, что ptPointerSize=0, а вместо адресов первого и последнего указателей записываются адреса первого и последнего символов текста(см. диапазон адресов для блока текста). В версии 7.0 нужно обязательно указать ptStringLength(что не всегда удобно). Если этого не сделать(т.е. оставить 0) Kruptar примется искать ответ на "Самый Главный Вопрос Жизни, Вселенной и Вообще". Если же ptStringLength меньше разницы между концом и началом текста, строку порежет на кусочки.
В данном случае символ окончания строки был сознательно проигнорирован в таблице, но он есть в плагине, т.е. можно выбрать больший диапазон для текста и увидеть где строка закончится. На самом деле, в этом режиме строки можно вынимать и с учётом символа-терминатора и без него, регулируя это границами диапазона.
В версии 7.1 баг(деление на 0?) исправлен.
Рисунок 25 Работа со строкой без указателей в версии 7.0
Рисунок 26 Работа со строкой без указателей в версии 7.1
Я обычно делаю проверки, сравнивая оригинальный и изменённый файлы, дважды.
1 Для первого блока в самом начале, выявляя все возможные свои мелкие, но неприятные ошибки, коими могут быть неверно понятые значения в разбираемом скрипте, либо обычная невнимательность: невыставленное выравнивание указателей до какой либо кратности (в текст добавляются нули), вкл.\выкл. SeekSame, неправильно определённые диапазоны адресов для вставки текста, разница в таблицах.
2 В итоге, когда уже извлечён весь скрипт. Опять же проверяется внимательность, иногда находятся некоторые моменты, о которых до этого информации не имелось. Например, здесь в одной строке разработчики, видимо, удалили лишнюю точку, заменив ее терминатором FF. А строка "IN SOIL SLEEPS SECRETS, BENEATH YOUR SOLES..." по версии разработчиков имела иммунитет к SeekSame. В Kruptar такой возможности не обнаружил и пришёл к использованию замены одного байта в подобных случаях. Это даёт возможность закончить проверку с минимальным количеством различий. (см. рис. 27)
Рисунок 27 Последняя проверка правильности составления проекта
Это рисунок старый и делался тогда, когда про данный документ мыслей ещё не было. Проект составлялся для вырезанных текстовых блоков(ну и указателей конечно) соединённых в один файл, а не для рома. Такой способ применяется мной довольно часто, во время исследования, а чтобы потом заново не пересчитывать все, если понадобится сделать проект для рома, необходимые циферки считаются и хранятся в электронных таблицах.
Подумал немножко и решил проверить, можно ли сделать иммунитет к SeekSame разделив лист на два. Оказалось, что нет… Но появилась картинка с различиями до замены "SOLES" на "SOLEZ".
Рисунок 28 Те же секреты до Z-правки
На этом, наверное, основные возможности и баги более-менее рассмотрены. Документ и так получился довольно большой.
Возможно, будет ещё дополнение в этой теме, т.к. осталось, как минимум, два момента которые следует рассмотреть подробнее, а может это останется на самостоятельное изучение(там тоже есть баги). Дополнительные возможности(про плагины), надеюсь, будут лаконичнее. Полезные ссылки, на версии программы в том числе, в теме ссылки. Надеюсь, кого-то эта новость обрадует...
Fin
Последний раз редактировалось: Chime[RUS] (Сб Сен 16, 2017 8:12 am), всего редактировалось 17 раз(а) |
|
Вернуться к началу |
|
|
Mefistotel RRC2008
Зарегистрирован: 08.03.2008 Сообщения: 294 Откуда: МАГАДАН
|
Добавлено: Чт Сен 03, 2015 3:43 pm Заголовок сообщения: |
|
|
Я знал, что когда-нибудь найдётся человек, обладающий достаточным временем и желанием, подготовить гайд по Круптару. Сам я так и не поборол лень.
Респект тебе. _________________ Перевод приставочных игр
База переводов |
|
Вернуться к началу |
|
|
Anton
Зарегистрирован: 10.11.2003 Сообщения: 727 Откуда: Киев
|
Добавлено: Чт Сен 24, 2015 8:20 pm Заголовок сообщения: |
|
|
Отлично! |
|
Вернуться к началу |
|
|
ZetpeR
Зарегистрирован: 09.11.2013 Сообщения: 8 Откуда: Москва
|
Добавлено: Сб Окт 03, 2015 4:27 pm Заголовок сообщения: |
|
|
Спасибо за проделанную работу!!! |
|
Вернуться к началу |
|
|
Chime[RUS]
Зарегистрирован: 31.08.2014 Сообщения: 11
|
Добавлено: Чт Ноя 12, 2015 6:59 pm Заголовок сообщения: |
|
|
Slam таки сделал часть доки по исходникам, пока только самое начало: про то как правильно скачать из репозитория версию которая компилируется в D7 на примере 7.0.0.85, но всё же... Т.е. ещё один аспект таки получится прояснить.
Тут уже совсем чуть-чуть осталось дописать:
Последний элемент.
Примеры экранов с текстом: чёт подзавис я в этом пробуждении (таки всё победил и нашёлся ещё один неприятный баг в 7.0.0.85 со вставкой без указателей).
И проверка правильности составления проекта.
+ Ещё чуть-чуть к тому что уже есть от Griever'а про плагины. Т.к. тут они хоть и простые, но таки нужны.
Вся критика по работе программы получилась в этой ветке.
Последний раз редактировалось: Chime[RUS] (Пн Окт 09, 2017 6:00 pm), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
Djinn RRC2008
Зарегистрирован: 16.03.2004 Сообщения: 633 Откуда: Москва
|
Добавлено: Пт Ноя 13, 2015 10:32 pm Заголовок сообщения: |
|
|
Отлично, молодец. Здорово, что после стольких лет это всё ещё кому-то интересно
Цитата: | ptSigned (ptAutoPtrStart)
???
|
Эта опция создана для автоматического дополнения ptReference для каждого пойнтера, когда точка отсчёта - это начало одного пойнтера. Часто встречается в играх на SMD.
Формула:
СМЕЩЕНИЕ_СТРОКИ_В_РОМЕ = ptReference + ЗНАЧЕНИЕ_ПОЙНТЕРА + СМЕЩЕНИЕ_ПОЙНТЕРА_В_РОМЕ
В доке Гривера перепутано описание ptAutoPtrStart и ptAutoReference. Думаю, по моей ошибке.
Последний раз редактировалось: Djinn (Пн Ноя 23, 2015 10:42 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Anton
Зарегистрирован: 10.11.2003 Сообщения: 727 Откуда: Киев
|
Добавлено: Пн Ноя 23, 2015 10:17 pm Заголовок сообщения: |
|
|
Djinn писал(а): | Здорово, что после стольких лет это всё ещё кому-то интересно |
Конечно, интересно! Программа просто великолепная! Но документации толком нет (но вот появляется, наконец), и все узнаётся только посредством опыта работы с прогой. Зельд всех в ней делали - и в версии 7.0.0.85, т.к. очень полюбились циферьки, нумерующие строки в диалогах. Это реально очень удобно при диалогах большого объёма.
Последний раз редактировалось: Anton (Вс Мар 10, 2019 7:44 pm), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Mefistotel RRC2008
Зарегистрирован: 08.03.2008 Сообщения: 294 Откуда: МАГАДАН
|
Добавлено: Чт Ноя 26, 2015 12:31 pm Заголовок сообщения: |
|
|
Некоторые ссылки на рисунки битые.
Неплохо бы обновить. Такую документацию не жалко облагородить, добавить примеры проектов, плагинов и залить на сайт Magic Team. _________________ Перевод приставочных игр
База переводов |
|
Вернуться к началу |
|
|
Anton
Зарегистрирован: 10.11.2003 Сообщения: 727 Откуда: Киев
|
Добавлено: Чт Ноя 26, 2015 8:42 pm Заголовок сообщения: |
|
|
Mefistotel писал(а): | Некоторые ссылки на рисунки битые.
Неплохо бы обновить. Такую документацию не жалко облагородить, добавить примеры проектов, плагинов и залить на сайт Magic Team. |
Все картинки показываются. Они лежат на серваке Шедевра, у меня на Zelda64rus в папке "zelda64rus/kruptar_tutorial/img". Всё показывает... Это у тебя что-то с интернетами, наверное. |
|
Вернуться к началу |
|
|
Anton
Зарегистрирован: 10.11.2003 Сообщения: 727 Откуда: Киев
|
Добавлено: Вс Фев 28, 2016 11:23 am Заголовок сообщения: Re: Основные возможности. Создание проектов. |
|
|
Отличный туториал получился. Поздравляю с завершением. |
|
Вернуться к началу |
|
|
Chime[RUS]
Зарегистрирован: 31.08.2014 Сообщения: 11
|
Добавлено: Сб Ноя 26, 2016 9:02 pm Заголовок сообщения: |
|
|
Теперь и в PDF. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|