Доброго времени суток.
Я давно покинул мир RPG Maker, осознав бессмысленность и ущербность данного инструмента. Советую всем авторам посмотреть в сторону Unity3D. Когда-то мы с Dr. NikTo думали над идеей универсального редактора для ресурсов любой игры. Я даже написал альфа-версию. Потом идея заглохла из-за недостатка времени. А потом я посмотрел в Unity3D и обнаружил, что и есть как раз этот редактор. До конца этого года нас порадуют финальной версией... очередной версии с полноценной поддержкой 2D игр и все ваши начинания можно будет весело перебросить туда. Создавайте что угодно, редактируйте как угодно, изменяйте редактор. Никаких ограничений в геймплее. И более чем достаточный простор касательно прозиводительности и графики. Но это так, лирическое отступление на тему, почему нет смысла изучать RGSS.
Теперь же о сути. Летом, коротая время на больничной койке, я придумал отличный пример для новичков по созданию "Hello world'а". Написать я его написал, но понял, что на адаптирование информации мне потребуется несколько недель, которые мне было попросту лень тратить на то, что я уже основательно забыл и забросил. Вместе с тем, там была реализована интересная идея, которой я хочу поделиться с вами. Быть может, она вам когда-нибудь где-нибудь пригодится и вы захотите использовать её у себя. Для новичков же, решивших всё-таки освоить RGSS, это будет великолепным испытанием, после которого они смогут с уверенностью сказать, что познали азы (которых не знают и многие старички).
Так вот... идея. Идея была проста - создать Сундук. Да, обычный сундук, который позволяет перекладывать вещи в инвентарь игрока и обратно. Классика, верно? Но как это, обычно, выглядит? Мы берём событие, ставим ему иконку сундука, заводим чудовищный скрипт навроде: new MyNamespace::MyChest([10, 20], [1, 2], [3, 1], [5, 7]); или созадём модуль, со списком всех сундуков в игре, где хранится информация о содержимом сундуков..., в общем, тихий ужас.
А между тем стоило бы задуматься - с чего всё начиналось? Наверняка, каждый, кто начинал писать свои игры (особенно на RPG Maker 2003), одним из первых событий создавал какой-нибудь тайник, на self-перключателе (или каком угодно другом), который помещает предметы в инвентарь игрока и выводит об этом сообщение. Что изменилось с тех пор? Да ничего. У нас же есть действия - выдать предмет, выдать золото, есть само событие. Тоесть все данные. Не хватает только информации о том, что это сундук и как с ним быть игре.
И вот тут мы пишем собственный препроцессор. А кто сказал, что будет легко?
Прежде всего, стоит определиться - как мы будем говорить игре, что наше чудо-событие нужно обрабатывать иначе. На помощь нам приходят комментарии. То самое бесполезное событие. В XP можно было завязаться на имя самого события. В VX и выше оно в итоговую сборку не попадает. А вот комментарии - пожалуйста (где логика, справшивается?..).
Итак, мы делаем комментарий. Например, "[Chest]". И также добавлям прдеметы, деньги. В итоге наше событие выглядит как-то так:
# Comment: [Chest]
Add Item: [0001: Potion, 1]
Add Gold: [1000]
Здорово, правда?
Теперь мы лезем в то волшебное место, где жуткие маршалеры загружают наши карты. К сожалению, я не смогу сейчас вспомнить - куда именно я загнал логику препроцессора. Возможно, в Interpretor. Возможно, куда-то выше. Важно отловить самое первое появления Event'а в игре.
Далее, мы обращаемся к содержимому его страниц и смотрим на первое действие. Если это не комментарий - оставляем страницу в покое. Если комментарий - проверяем, не начинается ли он с [ и не заканчивается ли на ] (условия делаем максимально точными и простыми, чтобы свести к минимум обработку событий, к которым мы отношения не имеем - иначе в больших проектах это может увеличить общее время загрузки игры). Наконец, если и это условие верно - сравниваем содержимое с известными тэгами. Не нашли - опять же оставляем страницу в покое.
Допустим, мы прочитали первый комментарий и выяснили, что это "Chest". Что же дальше?
А всё очень просто. Мы собираем все последующие записи о выдаче предметов, золота. Пропускаем другие комментарии (или не пропускаем - это уже на вашей совести). Если встретили незнакомую комманду - не ленимся, выбрасываем исключение. Собрав все действия, мы начинаем их потрошить. Выковыриваем из них сведения о предметах, сколько их нам дают. Ругаемся, если вместо + в действии задан -. И т.д. Собрав всё необходимое для нашего сундука, мы генерируем новое действие. Задаем ему уникальный ID (н.п. 65535), описываем его класс, задаем аксессоры. Это действие должно хранить внутри себя лямбда-выражение. О лямбдах читаем в справке - опять же уже всё забыл. Но суть в том, что мы можем запихнуть в эдакий делегат создание и вызов окна с нашим сундуком, на основе заданных параметров. Скомпилировов лямбду, и засунув её в действие, мы удаляем предыдущие - комментарий, выдачу предметов, всё, что использовали до этого. И оставляем только её и пустое действие (<@) - не забудьте про него (понятия не имею, что будет - если забудите).
Осталась мелочь - открываем интерпретатор (да-да, тот жуткий класс, в, кажется, XP (или VX?), распиленный на 4 части), и добавляем новую проверку. Если тип действия == 65535, то вынуть из первого параметра лямбду и выполнить её.
Всё!
Теперь при первой загрузке вашей карты, препроцессор пройдётся по всем событиям, по всем страницам. И, если найдёт в них "директивы препроцессора" - ваши комментарии, то заменит существующие команды на сгенерированные на их основе лямбда-выражения.
Наслаждайтесь. (=
Если кто-то решит это реализовать и возникнут трудности - попробуйте написать. Может быть, увижу и отвечу.
Это выполнимо - я проверял. (=
P.S. Домашнее задание - средствами RGSS организовать сохранение измененных событий после обработки препроцессором для того, чтобы она происходила только при первом запуске игры. Кроме того, для того же сундука нужно организовать учёт отданных предметов, но это уже совсем тривиальная задача, не достойная данного сообщения.
Социальные закладки