Показано с 1 по 3 из 3

Тема: KINGPIN ( + Бонус)

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #2
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Небольшой бонус.
    Если кому-то интересно, как сделать нечто подобное.
    «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-файлов, но и записывать в них информацию...Этакие "мета-данные", независимые от сохранения - и такой плагин, на запись, даже есть.




    Последний раз редактировалось Darchan Kaen; 21.05.2021 в 00:05. Причина: Добавил вопрос в Бонусе

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
KINGPIN ( + Бонус)