Очень часто главному герою даётся возможность носить с собой разные предметы, которые можно по разному применять в различных ситуациях. Например, на деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, но в общем случае говорят, что предметы помещаются в "инвентарь".
Иными словами, инвентарь - это список всех предметов, что есть у героя в данный момент.
В QSP предусмотрено отдельное окно для вывода списка предметов, которое так и называется Окно предметов (в плеере — Предметы). Иногда его называют Списком предметов, Инвентарём или Рюкзаком. С этим окном, в зависимости от нужд вашей игры, вы можете проделывать разные манипуляции. Вы можете:
SHOWOBJS [#выражение] - если значение выражения отлично от 0, то показывает Список предметов, иначе скрывает его. Пример: showobjs 0 & ! скрываем Окно предметов showobjs 1 & ! выводим Окно предметов на экранДля удобства чтения кода можно заранее определить переменные
on и off с соответствующими значениями: on,off = 1,0 showobjs on & ! включаем Окно предметов showobjs off & ! выключаем Окно предметов
ADDOBJ [$название],[$путь к файлу изображения],[#индекс] - добавление предмета с названием [$название] и изображением [$путь к файлу изображения] в Инвентарь, на место с номером [#индекс]. Пример: ! добавляем в четвёртую позицию предмет с названием "Апельсин" и картинкой addobj 'Апельсин','image/orange.png',4
[#индекс] может отсутствовать. По умолчанию предметы добавляются в конец списка. ! в конец списка добавляем предмет "Отвёртка" addobj 'Отвёртка'
! добавляем предмет с картинкой в начало списка addobj 'Гаечный ключ','image/wrench.png',1
[$путь к файлу изображения] может отсутствовать, значение по умолчанию - "" (пустая строка). ! добавляем предмет без картинки в конец списка addobj 'Радиоактивный пепел' ! добавляем предмет без картинки в начало списка addobj 'Светящийся шар','',1
! действие, которое добавляет предмет "Патроны" лишь в том случае,
! если у героя нет ещё ни одного патрона
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 "Апельсин" & ! удаляем предмет с названием "Апельсин" delobj "Яблоко", 7 & ! удаляем семь предметов с названием "Яблоко"
KILLOBJ [#номер] - удаление предмета по номеру в Списке предметов. Если параметр [#номер] не указан, то полная очистка Окна предметов. killobj 3 & ! удаляем предмет из третьей позиции, не важно, как он называется
MODOBJ [$название], [$описание], [$изображение] - замена описания (текста) предмета с названием [$название] и его изображения на указанные.$selobj продолжает возвращать название предмета, которое было использовано при создании предмета командой ADDOBJ. Пример: addobj "Апельсин" & ! создаём предмет "Апельсин" modobj "Апельсин", "Апельсин (1 шт.)" & ! заменяем отображаемое наименование ! на экране видим "Апельсин (1 шт.)", но когда кликаем по этому предмету: *pl $selobj & ! $selobj возвращает "Апельсин"
modobj отображаемое наименование поменяется у всех предметов.RESETOBJ [$название] — сбрасывает отображаемое наименование и иконку предметов с названием [$название] до состояния на момент добавления с помощью ADDOBJ.KILLOBJ - данная команда без указания параметров удаляет все предметы из Окна предметов. killobj & ! очищаем Окно предметов
killobj 5 & ! удаляем из списка пятый предмет
KILLALL - данная команда эквивалентна конструкции "KILLVAR & KILLOBJ", т.е. очищает Окно предметов и уничтожает все переменные игры.$SELOBJ - возвращает название выделенного предмета в любом месте игры. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды UNSELECT.COUNTOBJ - функция возвращает количество предметов в рюкзаке.$GETOBJ([#номер]) - возвращает название предмета в рюкзаке, расположенного в заданной позиции."").$getobj(1) & ! вернёт название первого предмета в рюкзаке $getobj(countobj) & ! вернёт название последнего добавленного предмета
$CUROBJS - данная функция возвращает список выведенных на экран предметов в виде QSP-кода.ADDOBJ с ответствующими параметрами и операциями.! сохраняем список предметов как код QSP: $old_objects = $CUROBJS ! удаляем все предметы из окна предметов: KILLOBJ ! восстанавливаем все предметы в окне предметов: DYNAMIC $old_objects
OBJ [$название] - возвращает число одинаковых предметов с названием [$название] в Инвентаре. addobj "Отвёртка" *pl obj "Отвёртка" & ! на экране будет число 1, так как предмет **Отвёртка** есть в окне предметов *pl obj "Апельсин" &! на экране будет число 0, так как предмета **Апельсин** нет в окне предметов if obj "Отвёртка": *pl "У вас есть отвёртка." else *pl "У вас нет отвёртки." end
Предметы в QSP выделяются с помощью нажатия (щелчка "мышью" по предмету), и выделение не снимается до применения специальной команды:
UNSELECT — снимает выделение с предмета в Окне предметов. Имеет краткую форму UNSEL.Код, подсчитывающий в массиве OBJECTS число предметов с одинаковыми названиями:
local i = 1 loop while i <= countobj step i += 1: OBJECTS[$GETOBJ(i)] += 1 end
Когда вы щёлкаете мышью по предмету, в классическом плеере этот предмет подсвечивается голубым цветом, и это означает, что предмет становится выделенным. При этом функция $SELOBJ, вызванная в любом месте игры, будет возвращать название такого выделенного предмета.
Выделение предмета — это событие, которое происходит в момент нажатия на предмет, и к этому событию вы можете привязать автоматическое выполнение кода. Делается это с помощью системной переменной $ONOBJSEL:
$ONOBJSEL — системная переменная, куда можно прописать название локации, код на которой будет выполняться при очередном выделении предмета.Более подробная информация в разделе "Служебные локации".
Если предмет уже выделен, повторное выделение при нажатии не происходит. Чтобы повторно выделить предмет, нужно предварительно снять с него выделение с помощью команды UNSELECT.