Динамическое создание объектов
Обычные объекты и комнаты нельзя создавать "на лету". Обычно вы создаёте их в глобальном пространстве lua файла. Однако, существуют игры, в которых количество объектов неизвестно заранее, или количество объектов велико, и они добавляются по ходу игры.
В INSTEAD существует способ создания любого объекта на лету. Для этого вам понадобится написать конструктор вашего объекта и воспользоваться функцией 'new'.
Конструктор должен быть декларирован.
Итак, вы можете использовать функции 'new' и 'delete' для создания и удаления динамических объектов. Примеры:
declare 'box' (function()
return obj {
dsc = [[Тут лежит {коробка}.]];
tak = [[Я взял коробку.]];
}
end)
local o = new (box);
take(o);declare 'box' (function(dsc)
return obj {
dsc = dsc;
tak = [[Я взял коробку.]];
}
end)
take(new(box, 'В углу стоит {коробка}'))'new' воспринимает первый аргумент -- как задекларированную функцию-конструктор, а все остальные параметры -- как аргументы конструктору. Результатом выполнения конструктора должен быть объект.
function myconstructor()
local v = {}
v.disp = 'тестовый объект'
v.act = 'Тестовая реакция'
return obj(v)
endВнимание! При создании объекта конструктор должен опираться только на информацию, полученную из параметров! Дело в том, что создание объекта при загрузке происходит в самом начале, когда окружение мира ещё не загружено полностью! В качестве параметров поддерживаются простые типы: строки, таблицы, числа, булевые значения. Недекларированные функции и списки не будут работать.
Если вы хотите уничтожить объект по его имени или ссылке-переменной, воспользуйтесь:
purge(o) -- удалить из всех списков
delete(o) -- освободить объектПри этом, delete это именно удаление объекта из INSTEAD, а не аналог remove() или purge(). Обычно, нет особого смысла делать delete. Только если предмет больше никогда не понадобится в игре, или вы собираетесь пересоздать объект с тем же именем, имеет смысл освободить его с помощью delete().
Более практически-полезный пример:
-- декларируем конструктор
-- path
declare 'make_path' (function(v) return path(v) end)
-- динамический переход
-- создали новый объект
-- и положили его в ways()
put( new (make_path, { 'переход', 'комната2'}, ways())