RPG Maker - плагин Phileas's Title Credits
Разработал новый плагин.
Добавляет кнопку на титульном экране. По нажатию открывается простое прокручиваемое окно с текстом благодарностей из параметров.
Также можно добавить кнопку выхода из игры.



Разработал новый плагин.
Добавляет кнопку на титульном экране. По нажатию открывается простое прокручиваемое окно с текстом благодарностей из параметров.
Также можно добавить кнопку выхода из игры.



Плагин назначает общие события и переключатели клавишам клавиатуры, геймпада и мыши.
У плагина 2 параметра: Common Events и Switches. Они отличаются только одним полем: в Common Events задаётся номер общего события, а в Switches - переключатель. Остальные поля общие:
Device type - устройство, нажатия на которое нужно отслеживать.
Key name - строковый идентификатор кнопки.
Key number - числовой идентификатор кнопки.
В общих событиях можно включить блокировку. Если она включена, то повторно стриггерить событие можно будет только после того, как оно завершит выполнение.
Плагин предоставляет одну команду:
Контроллер - позволяет включить и отключить горячие клавиши.
Сначала плагин ищет Key name в стандартных словарях движка. Если вы их не переопределяли, то они выглядят так:
keyBoard:
9: "tab", // tab
13: "ok", // enter
16: "shift", // shift
17: "control", // control
18: "control", // alt
27: "escape", // escape
32: "ok", // space
33: "pageup", // pageup
34: "pagedown", // pagedown
37: "left", // left arrow
38: "up", // up arrow
39: "right", // right arrow
40: "down", // down arrow
45: "escape", // insert
81: "pageup", // Q
87: "pagedown", // W
88: "escape", // X
90: "ok", // Z
96: "escape", // numpad 0
98: "down", // numpad 2
100: "left", // numpad 4
102: "right", // numpad 6
104: "up", // numpad 8
120: "debug" // F9
gamepad:
0: "ok", // A
1: "cancel", // B
2: "shift", // X
3: "menu", // Y
4: "pageup", // LB
5: "pagedown", // RB
12: "up", // D-pad up
13: "down", // D-pad down
14: "left", // D-pad left
15: "right" // D-pad right
mouse:
0: "left"
1: "middle"
2: "right"
Если плагин не нашёл Key name, то он берёт значение Key number.
Если во время игры произошло нажатие на клавиатуру, геймпад или мышь, плагин проверяет, не назначено ли на клавишу общее событие или переключатель. Если назначено общее событие, оно исполняется. Не рекомендуется указывать параллельное или автоматическое событие. Если назначен переключатель, его значение меняется на противоположное.
Этот плагин распространяется по лицензии MIT.
Это означает, что вы можете свободно использовать плагин в некоммерческих и коммерческих играх и даже редактировать его.
Но обязательно укажите меня в титрах!
Плагин позволяет пропускать сообщения диалогов нажатием любой клавиши (задаётся в настройках плагина).
Можно выбрать скорость пропуска: медленную или быструю.
Можно включить режим, который разрешит пропускать только прочитанный текст.
Параметры возможно изменить в ходе игры с помощью команд плагина.
Первый параметр - строковый код клавиши, при нажатии на которую нужно пропускать сообщения. По умолчанию - Control (Ctrl).
Второй параметр - скорость пропуска сообщений. По умолчанию - Slow (медленная).
После включения и настройки (опционально) плагина достаточно во время диалога зажать заданную клавишу.
В событии можно вызвать команды плагина, чтобы изменить клавишу и скорость пропуска сообщений.
Обновил до версии 1.3.1. Добавил возможность запрещать и разрешать пропуск и стандартную промотку (fast forward).
Этот плагин распространяется по лицензии MIT.
Это означает, что вы можете свободно использовать плагин в некоммерческих и коммерческих играх и даже редактировать его.
Но обязательно укажите меня в титрах!
Обновил плагин до версии 1.8.1
Добавил команду для удаления всех действий для всех картинок сразу.
Подробности о плагине в оригинальном посте.
Плагин позволит вам легко сделать игровой интерфейс, паззлы, мини-игры и другое!




Команды плагина
Срабатывание переключателя, переменной или общего события при действиях указателя с картинкой: наведение, уведение, клик, нажатие.
Плагин предоставляет команды:
Назначить - назначает обработчик на один тип действия с картинкой.
Удалить действие - удаляет обработчик одного действия с картинкой.
Удалить все действия - удаляет все обработчики картинки.
Все те же команды для глобальных триггеров (они назначаются сразу всем картинкам).
Включение и выключение плагина (триггеры ставятся на паузу, но не удаляются).
На каждый тип действия можно назначить свой обработчик, они будут работать независимо.
Например, можно на одну картинку назначить два переключателя: на Enter и на Click.
После удаления картинки все привязанные к её номеру триггеры тоже удаляются.
Недавно обновил до версии 1.8.0. Теперь опционально можно задавать ID картинки через переменную.
Этот плагин распространяется по лицензии MIT.
Это означает, что вы можете свободно использовать плагин в некоммерческих и коммерческих играх и даже редактировать его.
Но обязательно укажите меня в титрах!
Несовместим с плагином ButtonPicture. Однако он вам точно не понадобится, так как мой плагин предоставляет весь его функционал и даже больше.
Если будут проблемы - пишите мне.
Думаю, что вам рассказать о разработке игр на RPG Maker. В этом движке я наиболее компетентен. Что вам самим интересно? Я открыт к предложениям!
Это можно сделать с помощью команды Выполнить скрипт в событии. Ниже скрипт для MZ с комментариями.
// Для красоты вынес перевод строки времени в кол-во секунд в отдельную функцию.
function convertStringToSeconds(time) {
const array = time.split(":");
return (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10)
}
// Устанавливаем номер переменной, в которую хотим записать значение.
const varId = 1;
// Фиксируем текущее игровое время.
const currentSeconds = $gameSystem.playtime();
// Проверяем, есть ли сохранения.
if (!DataManager.isAnySavefileExists()) {
$gameVariables.setValue(varId, currentSeconds);
} else {
// Определяем индекс последнего сохранения.
const lastSaveFileId = DataManager.latestSavefileId();
// Получаем данные об этом сохранении (нам даже не нужно грузить всё сохранение).
const saveInfo = DataManager._globalInfo[lastSaveFileId];
// Вычисляем, сколько секунд игры было в последнем сохранении.
const lastSeconds = convertStringToSeconds(saveInfo.playtime);
// Вычисляем разницу.
const deltaSeconds = currentSeconds - lastSeconds;
// Записываем в переменную.
$gameVariables.setValue(varId, deltaSeconds);
}
Учтите, что так мы можем получить отрицательное число. К примеру, если поиграем час, запишем сохранение, а потом начнём новую игру, текущее игровое время будет меньше времени в последнем сохранении.
Версия для MV:
function convertStringToSeconds(time) { const array = time.split(":"); return (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10) }
const varId = 1; const currentSeconds = $gameSystem.playtime();
if (!DataManager.isAnySavefileExists()) { $gameVariables.setValue(varId, currentSeconds); }
else {
const lastSaveFileId = DataManager.latestSavefileId();
const saveInfo = DataManager.loadGlobalInfo()[lastSaveFileId];
const lastSeconds = convertStringToSeconds(saveInfo.playtime);
const deltaSeconds = currentSeconds - lastSeconds;
$gameVariables.setValue(varId, deltaSeconds);
}
Если нужны какие-то данные, которых нет в информации о сохранении, придётся грузить файл сохранения. Это можно сделать так:
// Устанавливаем номер переменной, в которую хотим записать значение.
const varId = 1;
// Проверяем, есть ли сохранения.
if (!DataManager.isAnySavefileExists()) {
$gameVariables.setValue(varId, 0);
} else {
// Определяем индекс последнего сохранения.
const lastSaveFileId = DataManager.latestSavefileId();
// Получаем имя файла этого сохранения.
const saveName = DataManager.makeSavename(lastSaveFileId);
// Загружаем данные из файла.
StorageManager.loadObject(saveName).then(contents => {
// Данные в contents. Обрабатываем их, как нужно.
return 0;
});
}
На смежные и схожие вопросы могу ответить в этом треде.
Я разработал плагин для языковых локализаций, здесь описание поподробнее. Постепенно буду добавлять в него функционал. Если вам нужна какая-то конкретная функция, напишите идею в теме плагина. Также обращу внимание, что в плагине есть функционал по экспорту языковых данных в Excel-таблицу и импорту из неё.
Важный совет. Если вы допускаете, что в вашей игре будет более одного языка (возможно, не сразу, но в будущем), лучше сразу разрабатывать с учётом локализаций. То есть нигде в редакторе не используйте захардкоженный текст, только теги из файлов локализации. Сначала можно прописать только один язык, потом по надобности добавлять другие. Тогда вам не придётся мучаться с экспортом текста из игры.
Тем не менее, иногда может потребоваться внедрить локализации в уже готовую игру.
Как-то раз я выполнил такой заказ для игры на RPG Maker MV. Вероятно, решение прокатит и на MZ. Если не сработает, напишите в этой теме.
Экспортировать текст из игры в JSON.
Сконвертировать JSON в XLSX и отправить получившуюся таблицу переводчику.
Дождаться готового перевода в XLSX формате.
Конвертировать новую таблицу в JSON и внедрить новый язык в проект.
Формат JSON поддерживает произвольную структуру данных. Объекты, массивы, любой уровень вложенности. При этом переводчик с JSON работать не хотел, нужно было ему обеспечить таблицу. Поэтому я решил для хранения данных локализации использовать один JSON-файл с плоским объектом. То есть был только один объект в корне файла, и каждое его свойство было текстовым. Никаких вложенных объектов.
Сначала нужно экспортировать текст из проекта. Я написал скрипт, который находит все диалоги (команда "Показать сообщение"), извлекает из них текст и сразу генерирует JSON-файл с нужной структурой. Вот он.
Этот скрипт написан на JS. Чтобы его исполнить, можно установить Node.js и запустить скрипт командой node export-localization.js
Можно также переписать скрипт на python, bash или другой язык и исполнить удобными вам инструментами. В принципе, скрипт несложный (даже примитивный).
В результате мы получим файл с таким содержимым:
{
"<тег>": "<реплика>"
}
Теперь забиваем в поисковик: "json to xlsx". Берём любой понравившийся сервис. Например, этот.
Скорее всего, мы получим таблицу с 2 строками и большим количеством столбцов. Переводчику будет неудобно работать с такой. Он ожидает 2 столбца: в одном теги, в другой - текст, который нужно перевести (переводчик либо будет редактировать этот столбец, либо добавит новый).
Если у вас получилось так, то просто транспонируйте получившуюся таблицу. Это можно сделать и в Esxcel, и в LibreOffice, и в Google Sheets. Не знаете, как? Поищите в интернете, это несложно (конкретная кнопка зависит от инструмента, поэтому тут не пишу, но она точно есть).
Отправляем таблицу переводчику, ждём перевода.
Теперь новый XLSX нужно конвертировать в JSON. Сначала транспонируем таблицу, чтобы у нас было 2 строки и множество столбцов.
Вбиваем в поисковик: "xlsx to json". Опять берём любой подходящий сервис, вроде этого. Конвертируем, получаем новый json-файл.
Переименовываем новый JSON-файл, как нам нужно ("en.json", "ru.json" и т.д.).
Вставляем в проект, добавляем язык в параметры плагина локализации (здесь конкретные действия зависят от используемого плагина).
Возможно, это не лучший способ: придумывал его в спешке на коленке. Если у вас есть альтернативные идеи, прошу написать в этом треде.
Самое ценное в этой статье - скрипт на экспорт текста, обратите на него внимание. У DK есть инструмент, который извлекает весь текст из игры, но он не генерирует JSON-файл с нужной структурой и уникальными тегами (очень важно, чтобы теги были уникальными).
Надеюсь, мне удалось достаточно раскрыть тему, остались ли вопросы?