ТОМ2 - платформа для парсерных игр

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ТОМ2 - платформа для парсерных игр » Дневник разработчика » Архитектура командной строки


Архитектура командной строки

Сообщений 1 страница 5 из 5

1

Появилась определенность в реализации командной строки, системных команд платформы, и способа расширения набора системных команд.

Поставленные цели:
- сделать командную строку удобной как для игрока так и для разработчика игр;
- освободить dll-движок от функций завязанных на интерфейс (run, save, load, и т.п);
- для большей гибкости платформы сделать возможным использование произвольных внешних функций.

Архитектура платформы не претерпела особых изменений:
- движок вынесен в отдельную dll;
- плеер представляет из себя интерфейс к dll-движку;

Внешние функции
Функции, реализованные в интерфейсе, является внешними по отношению к движку.
После загрузки dll возможно зарегистрировать неограниченное количество внешних функций.
Для регистрации необходимо передать в dll имя функции и указатель на эту функцию.
В программе на TOML вызов внешней функции происходит по зарегистрированному имени и не отличается от вызова встроенных функций движка.
Команды run, save, load, и им подобные должны быть реализованы на стороне интерфейса и зарегистрированы как внешние функции.
Для использования синонимов допускается многократная регистрация внешней функции под различными именами.

Режимы командной строки:
- Системный режим командной строки:
  В системном режиме допускается ввод команд как на ЕЯ, так и выражений на TOML.
  Следовательно, имя функции, введенное в командной строке, одновременно является командой на её выполнение.
- Игровой режим командной строки:
  Допускается ввод команд только на ЕЯ.
  Системные команды в этом режиме должны обрабатываться стандартной библиотекой парсера.

Платформа стартует с системной командной строкой. Ввод команды "run" приводит к вызову внешней функции которая загрузит файл игры и передаст его движку ТОМа. После старта игры командная строка переключается в игровой режим.

В системном режиме разработчик имеет возможность "на ходу" из командной строки просматривать и изменять значения переменных, создавать и модифицировать объекты, вызывать функции, использовать командую строку как калькулятор.

Создание и использование произвольных интерфейсных функций, возможно, расширит область применения платформы и разнообразит её возможности.

2

Выглядит впечатляюще! По крайней мере, ориентация на столь высокую степень гибкости и удобства кажется мне весьма оправданной и перспективной.

3

Потрясающе! Вот этого я и ждал от ТОМа.

ASBer написал(а):

В программе на TOML вызов внешней функции происходит по зарегистрированному имени и не отличается от вызова встроенных функций движка.

Не забудьте сделать проверку на существование зарегистрированной функции. Чтобы можно было в игре перед вызовом специфической функции делать проверку на её существование. Например, так:

Код:
if FuncReg("save")
 save("01.sav");
else @Сохранение не поддерживается плеером.
ASBer написал(а):

Команды run, save, load, и им подобные должны быть реализованы на стороне интерфейса и зарегистрированы как внешние функции.

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

ASBer написал(а):

В системном режиме разработчик имеет возможность "на ходу" из командной строки просматривать и изменять значения переменных, создавать и модифицировать объекты, вызывать функции, использовать командую строку как калькулятор.

Это всё очень важные и полезные функции, которые сильно облегчат жизнь разработчику.

ASBer написал(а):

Создание и использование произвольных интерфейсных функций, возможно, расширит область применения платформы и разнообразит её возможности.

Да, на счёт расширения области применения. Я слежу за созданием и развитием платформы ТОМ и меня поражает тот факт, что текстовые игры уже дошли до такого, что достаточно просто разбирают команды на русском языке, хорошо строят предложения но никто не хочет сделать на этом какую-нибудь командную строку, которая бы по командам на ЕЯ выполняла бы действия на компьютере. Ведь на первый взгляд: те же самые объекты со свойствами и методами, те же команды. В компьютере даже легче - ограниченное кол-во классов (файл, папка, DVD-привод, ОС, программа...), всё дискретно... Но... Я думаю даже этот движок ТОМ не смотря на всю свою гибкость и возможность подключения внешних функций пока не сможет выполнять такие операции, т.к. основная проблема в том, что в игре все объекты известны с самого начала, а в примере с компьютером - нет. Например по команде "Перемести все файлы с флешки на диск D", чтобы узнать список файлов (объектов), которые нужно переместить, нужно не просто просканировать память и найти объекты, которые находятся в объекте Флешка, а сначала найти флешку, затем вызвать функцию сканирования, которая найдёт все файлы на флешке, превратит их в объекты и добавит в память движка. Возможно ли это сейчас на движке? Будет ли сделано такое динамическое добавление объектов в дальнейшем?
Я понимаю, что движок создан для текстовых игр, но раз уж он так близко от возможности применения в других областях, может стоит и их зацепить?

Я восхищаюсь Вашим стремлением в создании ТОМа. Несмотря на то, что на этом форуме так тихо, Вы продолжаете писать движок. Что-ж, буду ждать выхода первой бета-версии.

4

Alexandr написал(а):
ASBer написал(а):

В программе на TOML вызов внешней функции происходит по зарегистрированному имени и не отличается от вызова встроенных функций движка.

Не забудьте сделать проверку на существование зарегистрированной функции. Чтобы можно было в игре перед вызовом специфической функции делать проверку на её существование. Например, так:

Код:
if FuncReg("save")
save("01.sav");
else @Сохранение не поддерживается плеером.

Каждая внешняя функция должна возвращать строку с результатом, например "файл сохранен" или "сохранение отменено" или что-то подобное.
Идеология ТОМа позволяет вызывать несуществующие функции и методы. Результат такого вызова всегда null
Можно отлавливать результат вызова функции и выдавать сообщения на его основе.   

Alexandr написал(а):
ASBer написал(а):

Команды run, save, load, и им подобные должны быть реализованы на стороне интерфейса и зарегистрированы как внешние функции.

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

Да, именно так я и планирую реализовать сохранение и восстановление игр.
Запуск игры всё-же будет из файла. Но также будет и альтернативный способ загрузки.

Alexandr написал(а):
ASBer написал(а):

Создание и использование произвольных интерфейсных функций, возможно, расширит область применения платформы и разнообразит её возможности.

Да, на счёт расширения области применения. Я слежу за созданием и развитием платформы ТОМ и меня поражает тот факт, что текстовые игры уже дошли до такого, что достаточно просто разбирают команды на русском языке, хорошо строят предложения но никто не хочет сделать на этом какую-нибудь командную строку, которая бы по командам на ЕЯ выполняла бы действия на компьютере. Ведь на первый взгляд: те же самые объекты со свойствами и методами, те же команды. В компьютере даже легче - ограниченное кол-во классов (файл, папка, DVD-привод, ОС, программа...), всё дискретно...

Тут скорее нужна не "понималка" а "думалка"...
Я тоже задумываюсь над некоторыми неигровыми задачами для ТОМа, может быть что-то и получится, сейчас сложно сказать что-то определенное.

5

Alexandr написал(а):

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

На существующем движке ТОМа это реализуемо, но с очень большими неприемлемыми затратами. Там нет списков, нет динамического удаления объектов (динамическое добавление есть). Один раз скопировать может и получится, но потом нужно перегружать движок чтобы избавиться от мусора в памяти.
Кстати, именно из-за отсутствия списков в языке невозможно было реализовать команду "Взять всё".
В разрабатываемой версии упор делается на массивы, многое хочется позаимствовать из RUBY.
Также появятся динамические неименованные объекты.
Список файлов для копирования в таком случае будет реализован как массив неименованных объектов. Проблем я тут не вижу.


Вы здесь » ТОМ2 - платформа для парсерных игр » Дневник разработчика » Архитектура командной строки