Другие функции стандартной библиотеки
В INSTEAD в модуле stdlib, который всегда подключается автоматически, определены функции, которые предлагаются автору как основной рабочий инструмент по работе с миром игры. Рассмотрим их в этой главе.
При описании функции в большинстве функций под параметром 'w' понимается объект или комната, заданная именем, тегом или по переменной-ссылке. [ wh ] - означает необязательный параметр.
include(файл) - включить файл в игру;
include "lib" -- включит файл lib.lua из текущего каталога с игрой;loadmod(модуль) - подключить модуль игры;
loadmod "module" -- включит модуль module.lua из текущего каталога;rnd(m) - случайное целочисленное значение от '1' до 'm';
rnd(a, b) - случайное целочисленное значение от 'a' до 'b', где 'a' и 'b' целые >= 0;
rnd_seed(что) - задать зерно генератора случайных чисел;
p(...) - вывод строки в буфер обработчика/атрибута (с пробелом в конце);
pr(...) - вывод строки в буфер обработчика/атрибута "как есть";
pn(...) - вывод строки в буфер обработчика/атрибута (с переводом строки в конце);
pf(fmt, ...) - вывод форматной строки в буфер обработчика/атрибута;
local text = 'hello'; pf("Строка: %q Число: %d\n", text, 10);pfn(...)(...)... "строка" - формирование простого обработчика; Данная функция упрощает создание простых обработчиков:
act = pfn(walk, 'ванная') "Я решил зайти в ванную."; act = pfn(enable, '#переход') "Я заметил отверстие в стене!";obj {} - создание объекта;
stat {} - создание статуса;
room {} - создание комнаты;
menu {} - создание меню;
dlg {} - создание диалога;
me() - возвращает текущего игрока;
here() - возвращает текущую сцену;
from([w]) - возвращает комнату из которой осуществлён переход в текущую сцену;
new(конструктор, аргументы) - создание нового динамического объекта (будет описано далее);
delete(w) - удаление динамического объекта;
gamefile(файл, [сбросить состояние?]) - подгрузить динамически файл с игрой;
gamefile("part2.lua", true) -- сбросить состояние игры (удалить объекты и переменные), подгрузить part2.lua и начать с main комнаты.player {} - создать игрока;
dprint(...) - отладочный вывод;
visits([w]) - число визитов в данную комнату (или 0, если визитов не было);
visited([w]) - число визитов в комнату или false, если визитов не было;
if not visited() then p [[Я тут первый раз.]] endwalk(w, [булевое exit], [булевое enter], [булевое менять from]) - переход в сцену;
walk('конец', false, false) -- безусловный переход (игнорировать onexit/onenter/exit/enter);walkin(w) - переход в под-сцену (без вызова exit/onexit текущей комнаты);
walkout([w], [dofrom]) - возврат из подсцены (без вызова enter/onenter);
walkback([w]) - синоним walkout([w], false);
_(w) - получение объекта;
for_all(fn, ...) - выполнить функцию для всех аргументов;
for_all(enable, 'окно', 'дверь');seen(w, [где]) - поиск видимого объекта;
lookup(w, [где]) - поиск объекта;
ways([где]) - получить список переходов;
objs([где]) - получить список объектов;
search(w) - поиск доступного игроку объекта;
have(w) - поиск предмета в инвентаре;
inroom(w) - возврат комнаты/комнат, в которой находится объект;
where(w, [таблица]) - возврат объекта/объектов, в котором находится объект;
local list = {} local w = where('яблоко', list) -- если яблоко находится в более, чем одном месте, то -- list будет содержать массив этих мест. -- Если вам достаточно одного местоположения, то: where 'яблоко' -- будет достаточноclosed(w) - true если объект закрыт;
disabled(w) - true если объект выключен;
enable(w) - включить объект;
disable(w) - выключить объект;
open(w) - открыть объект;
close(w) - закрыть объект;
actions(w, строка, [значение]) - возвращает (или устанавливает) число действий типа t для объекта w.
if actions(w, 'tak') > 0 then -- предмет w был взят хотя бы 1 раз; if actions(w) == 1 then -- act у предмета w был вызван 1 раз;pop(тег) - возврат в прошлую ветвь диалога;
push(тег) - переход в следующую ветвь диалога
empty([w]) - пуста ли ветвь диалога? (или объект)
lifeon(w) - добавить объект в список живых;
lifeoff(w) - убрать объект из списка живых;
live(w) - объект жив?;
change_pl(w) - смена игрока;
player_moved([pl]) - текущий игрок перемещался в этом такте?;
inv([pl]) - получить список-инвентарь;
remove(w, [wh]) - удалить объект из объекта или комнаты; Удаляет объект из списков obj и way (оставляя во всех остальных, например, game.lifes);
purge(w) - уничтожить объект (из всех списков); удаляет объект из всех списков, в которых он присутствует;
replace(w, ww, [wh]) - заменить один объект на другой;
place(w, [wh]) - поместить объект в объект/комнату (удалив его из старого объекта/комнаты);
put(w, [wh]) - поместить объект без удаления из старого местоположения;
take(w) - забрать объект;
drop(w, [wh]) - выбросить объект;
path {} - создать переход;
time() - число ходов от начала игры.
Важно!
На самом деле, многие из этих функций также умеют работать не только с комнатами и объектами, но и со списками. То есть 'remove(apple, inv())' сработает также как и 'remove(apple, me())''; Впрочем, remove(apple) тоже сработает и удалит объект из тех мест, где он присутствует.
Рассмотрим несколько примеров.
act = function()
pn "Я иду в следующую комнату..."
walk (nextroom);
end
obj {
nam = 'моя машина';
dsc = 'Перед хижиной стоит мой старенький {пикап} Toyota.';
act = function(s)
walk 'inmycar';
end
};Важно!
После вызова 'walk' выполнение обработчика продолжится до его завершения. Поэтому обычно, после 'walk' всегда следует 'return', если только это не последняя строка функции, хотя и в этом случае безопасно поставить 'return'.
act = function()
pn "Я иду в следующую комнату..."
walk (nextroom);
return
endНе забывайте также, что при вызове 'walk' вызовутся обработчики 'onexit/onenter/exit/enter'' и если они запрещают переход, то он не произойдёт.