Перейти к основному содержимому

Назад: Действия

Предметы (инвентарь)

Очень часто главному герою даётся возможность носить с собой разные предметы, которые можно по разному применять в различных ситуациях. Например, на деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, но в общем случае говорят, что предметы помещаются в "инвентарь".

Иными словами, инвентарь - это список всех предметов, что есть у героя в данный момент.

В QSP предусмотрено отдельное окно для вывода списка предметов, которое так и называется Окно предметов (в плеере — Предметы). Иногда его называют Списком предметов, Инвентарём или Рюкзаком. С этим окном, в зависимости от нужд вашей игры, вы можете проделывать разные манипуляции. Вы можете:

  • Отключать и включать Окно предметов по своему желанию
  • Добавлять предметы в Окно предметов
  • Удалять предметы из Окна предметов
  • Полностью очищать Окно предметов

Команды для работы с Окном предметов

Включение и выключение Окна предметов

  • SHOWOBJS [#выражение] - если значение выражения отлично от 0, то показывает Список предметов, иначе скрывает его. Пример:
    showobjs 0 & ! скрываем Окно предметов
    showobjs 1 & ! выводим Окно предметов на экран
    Для удобства чтения кода можно заранее определить переменные on и off с соответствующими значениями:
    on,off = 1,0
    showobjs on & ! включаем Окно предметов
    showobjs off & ! выключаем Окно предметов

Команды для управления предметами

  • ADDOBJ [$название],[$путь к файлу изображения],[#индекс] - добавление предмета с названием [$название] и изображением [$путь к файлу изображения] в Инвентарь, на место с номером [#индекс]. Пример:

    ! добавляем в четвёртую позицию предмет с названием "Апельсин" и картинкой
    addobj 'Апельсин','image/orange.png',4
    • Предметы можно добавлять только в уже существующие позиции, либо в конец списка. Например, если вы уже добавили три предмета в список, вы можете указать для добавляения четвёртого предмета только позиции 1, 2, 3 и 4; если вы укажете больший номер позиции, то предмет просто не добавится.
    • Параметр [#индекс] может отсутствовать. По умолчанию предметы добавляются в конец списка.
      ! в конец списка добавляем предмет "Отвёртка"
      addobj 'Отвёртка'
    • Индексация (нумерация) предметов в Окне предметов начинается с 1:
      ! добавляем предмет с картинкой в начало списка
      addobj 'Гаечный ключ','image/wrench.png',1
    • Параметр [$путь к файлу изображения] может отсутствовать, значение по умолчанию - "" (пустая строка).
      ! добавляем предмет без картинки в конец списка
      addobj 'Радиоактивный пепел'
      ! добавляем предмет без картинки в начало списка
      addobj 'Светящийся шар','',1
    • В названиях предметов не важен регистр букв, т.е. "ДеньГи" и "деньги" - один и тот же предмет.
    • Обратите внимание - для использования одинаковых предметов инвентаря, например денег, патронов и т.п., лучше использовать дополнительную переменную, обозначающую количество этих предметов, чтобы не загромождать инвентарь списком из 137 предметов Рубль/Патрон.
      ! действие, которое добавляет предмет "Патроны" лишь в том случае,
      ! если у героя нет ещё ни одного патрона
      act "Взять десять патронов":
      if no obj("Патроны"):
      addobj "Патроны"
      end
      патроны += 10 & ! увеличиваем число патронов у героя
      end
      Для хранения числа предметов можно использовать массивы, индексируемые через строки:
      ! так мы добавляем сами предметы
      addobj "Деньги"
      addobj "Патроны"
      ! так мы помещаем число этих предметов в массив
      OBJECTS['деньги'] = 12
      OBJECTS['патроны'] = 137
      ! а так мы выводим предметы и их количество на экран:
      loop i=1 while i < countobj+1 step i += 1:
      *pl $getobj(i)+' (<<OBJECTS[$lcase($getobj(i))]>> шт.)'
      end
  • DELOBJ [$название] - удаление предмета из Окна предметов по названию. Если существует предмет с названием [$название], он будет удалён.

    delobj "Апельсин" & ! удаляем предмет с названием "Апельсин"
  • KILLOBJ [#номер] - удаление предмета по номеру в Списке предметов. Если параметр [#номер] не указан, то полная очистка Окна предметов.

    killobj 3 & ! удаляем предмет из третьей позиции, не важно, как он называется
    • Индексация (нумерация) предметов в Окне предметов начинается с 1.

Команды очистки Окна предметов

  • KILLOBJ - данная команда без указания параметров удаляет все предметы из Окна предметов.

    killobj & ! очищаем Окно предметов
    • Можно указать номер предмета, тогда данная команда удалит предмет в указанной позиции:
    killobj 5 & ! удаляем из списка пятый предмет
  • KILLALL - данная команда эквивалентна конструкции "KILLVAR & KILLOBJ", т.е. очищает Окно предметов и уничтожает все переменные игры.

Функции для обработки предметов

  • $SELOBJ - возвращает название выделенного предмета в любом месте игры. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды UNSELECT.
  • COUNTOBJ - функция возвращает количество предметов в рюкзаке.
  • $GETOBJ([#номер]) - возвращает название предмета в рюкзаке, расположенного в заданной позиции.
    • Индексация предметов рюкзака ведётся с 1.
    • Если предмета с заданным индексом не существует, возвращается пустая строка ("").
    • Примеры:
      $getobj(1) & ! вернёт название первого предмета в рюкзаке

      $getobj(countobj) & ! вернёт название последнего добавленного предмета
  • $CUROBJS - данная функция возвращает список выведенных на экран предметов в виде QSP-кода.
    • Предметы сохраняются в виде набора операторов ADDOBJ с ответствующими параметрами и операциями.
    • Записав возвращённое функцией значение в переменную, можно восстановить предметы с помощью оператора DYNAMIC. Пример:
      ! сохраняем список предметов как код QSP:
      $old_objects = $CUROBJS
      ! удаляем все предметы из окна предметов:
      KILLOBJ
      ! восстанавливаем все предметы в окне предметов:
      DYNAMIC $old_objects

Снять выделение с предмета

Предметы в QSP выделяются с помощью нажатия (щелчка "мышью" по предмету), и выделение не снимается до применения специальной команды:

  • UNSELECT — снимает выделение с предмета в Окне предметов. Имеет краткую форму UNSEL.

Другие примеры:

Код, подсчитывающий в массиве OBJECTS число предметов с одинаковыми названиями:

local i = 1
loop while i <= countobj step i += 1:
OBJECTS[$GETOBJ(i)] += 1
end

Событие "Выделение предмета"

Когда вы щёлкаете мышью по предмету, в классическом плеере этот предмет подсвечивается голубым цветом, и это означает, что предмет становится выделенным. При этом функция $SELOBJ, вызванная в любом месте игры, будет возвращать название такого выделенного предмета.

Выделение предмета — это событие, которое происходит в момент нажатия на предмет, и к этому событию вы можете привязать автоматическое выполнение кода. Делается это с помощью системной переменной $ONOBJSEL:

  • $ONOBJSEL — системная переменная, куда можно прописать название локации, код на которой будет выполняться при очередном выделении предмета.

Более подробная информация в разделе "Служебные локации".

Если предмет уже выделен, повторное выделение при нажатии не происходит. Чтобы повторно выделить предмет, нужно предварительно снять с него выделение с помощью команды UNSELECT.

Вперёд: Порядок работы интерпретатора