Публикации

Быстрый движок на C# в Fluent-стиле

Чисто ради любопытства за пару часов накидал рыбу парсерного (можно и менюшного) движка, позволяющего писать игры на C# в Fluent-стиле (это последовательность вызовов методов, смотрите пример кода ниже).
Выглядит самый простенький пример так:
Игра.Новая()
	.Имя("Пробная игра")
	.Локации()
		.Локация("Пещера", "Холодная и мрачная пещера")
		.Локация("Поляна", "Светлая и приветливая полянка")
	.КонецЛокаций()
	.Настройки()
		.НачатьВЛокации("Пещера")
	.КонецНастроек()
.ЗавершитьСоздание()
.ЗапуститьИгру();
Читать дальше

Краткая история одного бага

Как-то раз самый главный пользователь ЯРИЛа и фактически его соавтор наткнулся на один баг, который никому до этого не попадался — у него после добавления библиотеки в историю и последующей загрузки игры вываливалась простыня с ошибкой. (Вот этот баг.)
У меня он сходу не воспроизвёлся, да и потом тоже. Стали разбираться сообща. Все условия практически идентичны, разве что я запускаю с меню «Пуск», а он — с Total Commander. Но какая разница? Стали сравнивать логи. Единственное, чем они отличались — это регистр диска C: (у меня большая буква, у него — маленькая). И это под Windows. Под Windows же регистр не имеет значения? Да, для путей не имеет.
А дело вот в чём. В Java 6, на которой изначально писался ЯРИЛ, нет встроенного функционала для получения относительного пути к файлу из двух абсолютных (надо было получить путь к библиотеке относительно игры).
Но есть обходной путь — у класса File (отвечающего за файл) есть метод toURI(), преобразуйщий путь к URI (если что, тут есть непонятное описание URI). А у него в свою очередь есть метод relativize(), который и возвращает относительный путь. Да, это работает в большинстве случаев. :)
Помните, что наши логи отличались только регистром диска C:? Нюанс в том, что Total Commander сохраняет путь к папке запуска почему-то с маленькой буквы. Так вот, URI не прощает разный регистр, в итоге это оказались совершенно разные пути, и вместо относительного relativize() вернул абсолютный, да ещё со слэшем ("/") вначале. В итоге путь к библиотеке сохранился в виде "/C:/..." — и далее полный путь к файлу. А по такому пути File уже не может загрузить файл. да и путь этот для ссылки на библиотеку не верный.
Вот такая вот история.
P.S. Для Java 6 нет идеального исправления, пришлось пока перед получением относительного пути приводить всё к одному (нижнему) регистру, но, боюсь, это тоже может выстрелить. В Java 8 уже есть класс Path для работы с путями, надеюсь, он учитывает эти особенности разных платформ. :)
Читать дальше

ЯРИЛ 2.0

ЯРИЛ (Язык Разметки Интерактивной Литературы) — это русская платформа для парсерной интерактивной литературы. Отличается изначальной ориентированностью на русский язык и визуальным программированием всей игровой логики.
Платформа состоит из Редактора, Плеера и Тестера. Тестер — приложение для проведения автоматизированных проверок проходимости игр. (Тестер пока находится в начальном состоянии разработки.)
Технологическая платформа: Java SE 8.

Структура игр

Игра (или в терминологии ЯРИЛ — история) описывается как набор локаций, предметов, действий, процедур, настроек и их взаимосвязей.
Основные понятия:
  • Локация — выделенная единица пространства. Может содержать предметы и игрока.
  • Предмет. Может содержаться в локации, у игрока, содержать другие предметы.
  • Действие — логическая связка для действия игрока, состоит из набора шаблонов парсера и процедуры игровой логики для обработки. Имеет набор ограничений (условий для выполнения).
  • Процедура — набор инструкций игровой логики. Используется как обработчик действия, так и может вызываться из других обработчиков (процедур и проч.).
  • Перехват — возможность перехватить выполнение какого-либо действия над предметом или в локации и задать отдельную игровую логику.
  • Роль — совокупность свойств и специальных обработчиков для предметов. При «навешивании» роли на предмет он принимает её свойства, что можно проверять по имени роли (например, выражение «предмет.открываемый» будет истинным, если на предмете навешана роль «открываемый»).
  • Библиотека — файл с набором сущностей ЯРИЛ для использования в игре. С платформой идёт стандартная библиотека «Глаголы» с набором действий и ролей. Дорабатывается.

Парсер

Парсер в ЯРИЛ работает по принципу подбора шаблона для введённой фразы. Шаблоны состоят из двух типов элементов: литерал (набор фраз) и объект (упоминание предмета по словарю в каком-либо падеже). При удачном подборе шаблона выполняется привязанная к нему процедура игровой логики.

Визуальный редактор игровой логики

Вся игровая логика игры (процедуры, перехваты и проч.) создаётся и редактируется визуально в Редакторе в формате заполнения экранных форм для каждой инструкции. Нет никакой необходимости учить язык программирования. При этом гибкость достигается при помощи выражений в параметрах инструкций. Редакторы инструкций постоянно улучшаются для удобства ввода выражений.

Выпуски

Свежие выпуски публикуются на страничке проекта на GitHub.
Читать дальше