Небольшой бонус.
Если кому-то интересно, как сделать нечто подобное.
«Behind the scene», так сказать.
Спойлер Behind the scene:
Спойлер Кратко:1. Опция «Выход из игры» добавляется плагином «ExitGame» от Brian Howard.
2. Пункты игрового меню меняются плагином «YEP_MainMenuManager» от Yanfly.
3. В инвентаре типы предметов «Оружие» и «Броня» убираются плагином «Ruyk_AddTypeItem».
4. Для визуального отображения всех текстов (кроме Вступления) используется плагин «ScreenVariables» от Digre.
5. Иконки Параметров показываются стандартными командами мейкера для работы с изображениями.
6. 99% игры построено на использовании Общих событий.
7. Все Карточки событий подгружаются из внешних JSON-файлов.
8. Рандом генерируется в мейкере и применяется к Списку Карточек события, загруженному из внешнего JSON-файла.
9. Управление стрелками/геймпадом – тоже стандартное мейкеровское.
Спойлер Подробно про «сердце» игры – обработка Карточек событий из внешних файлов:
Для повышения гибкости разработки я решил не жестко прописывать все 100 Карточек событий в самом мейкере, а сделать систему загрузки «логики игры» из внешних источников…Ведь редактировать, по сути, текстовые файлы быстрее и проще, чем копаться в эвентах мейкера (для текстовой игры, во всяком случае). А так как MV (ну и MZ) основаны на JavaScript, то JSON для мейкера прямо таки родной формат.
Короче говоря, у меня получилось сделать простенький «интерпретатор», позволяющий читать JSON-файл и на основании его данных что-то в мейкере крутить – менять текст, картинки, включать/выключать Переключатели, добавлять/отнимать Предметы, выбирать следующий файл для открытия и, что самое главное, вызывать Общие события.
Логика работы такая:
1. Рандомом выбираем, какой файл открыть первым.
2. Открываем JSON-файл.
3. Записываем его в переменную, целиком.
4. Парсим поля JSON-файла из переменной п.2 , записывая их значения в отдельные переменные.
5. Анализируем каждое поле (простыми условиями мейкера, например) и на его основе что-то делаем – отображаем текст, изменяем переменные, Общим событием открываем новые Списки карточек...
6. Рандомом выбираем, какой файл открыть следующим.
7. Повторяем, пока по внутренним критериям игра не закончилась.
Сами JSON-файлы, в данном случае, делятся на два типа:
1) Списки, в которых находятся массивы с номерами Карточек событий.
2) Карточки событий, на основе которых меняется поведение игры.
Списки позволяют динамически подгружать номера доступных Карточек событий (и удалять их).
Спойлер Пример JSON-файла стартового Списка:
{
"eventsCardsIndexes": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 21, 22, 700]
}
Спойлер Пример JSON-файла Карточки события:
{
"eventIndex":"1",
"eventIsUnique":"0",
"eventName":"Нужны патроны",
"eventText":"Шеф, у нас маловато боеприпасов.\nМожет купим пару ящиков патронов?",
"eventPersonName":"Центурий",
"eventImageIndex":"1",
"eventLeftActionText":"Нет, \nстреляйте \nточнее.",
"eventRightActionText":"Хорошо, \nящика так \nтри...",
"eventLeftActionNextCardIndex":"0",
"eventRightActionNextCardIndex":"0",
"eventLeftActionMightValue":"-10",
"eventLeftActionMoneyValue":"0",
"eventLeftActionPoliceValue":"0",
"eventLeftActionReputationValue":"0",
"eventLeftActionPowerValue":"0",
"eventLeftActionWeeksValue":"-1",
"eventRightActionMightValue":"10",
"eventRightActionMoneyValue":"-10",
"eventRightActionPoliceValue":"0",
"eventRightActionReputationValue":"0",
"eventRightActionPowerValue":"0",
"eventRightActionWeeksValue":"-1",
"eventLeftActivateSwitch":"0",
"eventRightActivateSwitch":"0",
"eventLeftDeActivateSwitch":"0",
"eventRightDeActivateSwitch":"0",
"eventLeftCallCommonEvent":"0",
"eventRightCallCommonEvent":"0",
"eventLeftAddItem":"0",
"eventRightAddItem":"0"
}
Спойлер Код скрипта для открытия JSON-файлов:
var xhr = new XMLHttpRequest();
src = 'eventsCardsIndexesList.json'; var url = 'gameCards/' + src;
xhr.open('GET', url);xhr.overrideMimeType('application/json');
xhr.onload = function() {
if (xhr.status < 400) {
let eventsCardsIndexesList = JSON.parse(xhr.responseText);
$gameVariables.setValue(21, eventsCardsIndexesList['eventsCardsIndexes']);
}};xhr.send();
(«gameCards» - название каталога с JSON-файлами, должен быть в корне каталога проекта)
Спойлер Пример скрипта парсинга данных JSON-файла Карточки события:
$gameVariables.setValue(41, parseInt(
$gameVariables.value(33)['eventIndex']));
$gameVariables.setValue(42, parseInt(
$gameVariables.value(33)['eventIsUnique']));
$gameVariables.setValue(43,
$gameVariables.value(33)['eventText']);
$gameVariables.setValue(44,
$gameVariables.value(33)['eventPersonName']);
$gameVariables.setValue(45, parseInt(
$gameVariables.value(33)['eventImageIndex']));
Спойлер Код скрипта для выбора случайного номера Карточи события из Списка:
let eventsCardsIndexesList = $gameVariables.value(21);
let radomCardIndex = Math.floor(Math.random() * (eventsCardsIndexesList.length));
let chosenCardIndex = eventsCardsIndexesList[radomCardIndex];
$gameVariables.setValue(31, chosenCardIndex);
Спойлер Код скрипта для удаления номеров карточек из массива Списка:
let eventsCardsIndexesList = $gameVariables.value(21);
let currentEventCardIndex = $gameVariables.value(41);
let currentEventCardIndexInList = eventsCardsIndexesList.indexOf(currentEventCardInd ex);
eventsCardsIndexesList.splice(currentEventCardInde xInList, 1);
$gameVariables.setValue(21,eventsCardsIndexesList) ;
(для случаев если Карточка события уникальная и не должна повторяться)
Это если тезисно.
Проект не зашифрован – кому интересно, открывайте и смотрите.
Код, написанный выше, объективно не оптимален и приведен как отправная точка.
Номера переменных в примерах скриптов меняйте на ваше усмотрение.
В целом, подход чтения внешних файлов для построения логики игры может быть удобен для игр текстового типа – текстовых квестов, визуальных новелл, настольных игр…
Спойлер Процитирую себя же, что умеет маленький интерпретатор в данном проекте:Интерпретатор "умеет" динамически:
- В целом, маппить данные файла в переменные мейкера;
- В частности - текст Карточки, текст ответов, влияние ее на Параметры (+, -);
- Отображать картинку Карточки;
- Добавлять новые массивы Карточек и удалять из текущего массива "Уникальные";
- Вызывать Связанные Карточки для создания последовательности событий (а-ля Текстовой квест);
- Включать / выключать переключатель мейкера;
- Вызывать общее событие мейкера;
- Давать / забирать предмет.
Ничего сверхъестественного, но это позволяет создавать события не открывая сам мейкер - а только редактируя внешние JSON-файлы.
Надеюсь, что-то новое вы узнали.
Спасибо что прочитали. =)
Спойлер Вопросы к вам...:...В процессе написания данного поста я понял, что работу с JSON-файлами и маппинг их на переменные мейкера можно чуть упростить, написав для этого плагин.
Так вот, вопросы:
1. Будите ли вы применять технику чтения JSON-файлов и нужен ли вам плагин для этого?
2. Нужно ли более подробное объяснение, как и что работает в проекте?
Также подчеркну, что технически можно не только читать из JSON-файлов, но и записывать в них информацию...Этакие "мета-данные", независимые от сохранения - и такой плагин, на запись, даже есть.
Социальные закладки