Skip to content

Другие функции стандартной библиотеки

В 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 [[Я тут первый раз.]]
      end
    
  • walk(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) тоже сработает и удалит объект из тех мест, где он присутствует.

Рассмотрим несколько примеров.

lua
act = function()
	pn "Я иду в следующую комнату..."
	walk (nextroom);
end

obj {
	nam = 'моя машина';
	dsc = 'Перед хижиной стоит мой старенький {пикап} Toyota.';
	act = function(s)
		walk 'inmycar';
	end
};

Важно!

После вызова 'walk' выполнение обработчика продолжится до его завершения. Поэтому обычно, после 'walk' всегда следует 'return', если только это не последняя строка функции, хотя и в этом случае безопасно поставить 'return'.

lua
act = function()
        pn "Я иду в следующую комнату..."
        walk (nextroom);
        return
end

Не забывайте также, что при вызове 'walk' вызовутся обработчики 'onexit/onenter/exit/enter'' и если они запрещают переход, то он не произойдёт.