Цикл обработки команд
Жизненный цикл игры на INSTEAD это обработка команд. Примерно как сервер отвечает на запросы клиентов, INSTEAD получает команды и отвечает на них текстом. Команды формируются интерпретатором в зависимости от того, какие действия выполняет игрок. Команда -- это слово, за которым может быть список аргументов.
Примеры команд STEAD3:
- load <файл>; - загрузка
- save <файл>; - выгрузка
- use <объект>,<объект>; - использование объекта на объект
- use <объект>; - использование объекта в инвентаре
- act <объект>; - действие на объект
- act <$объект>,аргументы...; - ссылка на системный объект
- go <переход>; - переход
- look; - осмотреться
- inv; - получить инвентарь
- way; - получить список переходов
В качестве объектов используются идентификаторы в виде цифр, которые движок сам сопоставляет каждому видимому на сцене объекту.
Каким образом STEAD3 обрабатывает команды?
Интерпретатор работает с Lua частью через специальный системный объект iface (переменная ссылка на "@iface").
Этот объект создаётся внутри STEAD3, а для графической версии интерпретатора INSTEAD, пересоздаётся специальным модулем ext/gui.lua. Выполнение команды -- это вызов iface:cmd(команда). Обратите внимание на ':'. Такая запись это синоним: iface.cmd(iface, команда).
Команда разбивается на части, и записывается в специальный массив std.cmd. Так, в случае команды load, в std.cmd[1] будет записано "load", а в std.cmd[2] -- путь к файлу.
Затем происходит вызов game:cmd(std.cmd). Это и есть то место, где команда обрабатывается игрой.
После чего вывод (возвращаемое значение) пропускается через iface:fmt(). Который в свою очередь вызывает std.fmt.
В std.fmt ссылки в выводе игры {} превращаются в ссылки для интерпретатора.