Предметы (инвентарь)
Очень часто главному герою даётся возможность носить с собой разные предметы, которые можно по разному применять в различных ситуациях. Например, на деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, но в общем случае говорят, что предметы помещаются в "инвентарь".
Иными словами, инвентарь - это список всех предметов, что есть у героя в данный момент.
В QSP предусмотрено отдельное окно для вывода списка предметов, которое так и называется Окно предметов (в плеере — Предметы). Иногда его называют Списком предметов, Инвентарём или Рюкзаком. С этим окном, в зависимости от нужд вашей игры, вы можете проделывать разные манипуляции. Вы можете:
- Отключать и включать Окно предметов по своему желанию
- Добавлять предметы в Окно предметов
- Удалять предметы из Окна предметов
- Полностью очищать Окно предметов
Команды для работы с Окном предметов
Включение и выключение Окна предметов
-
SHOWOBJS [#выражение]- если значение выражения отлично от 0, то показывает Список предметов, иначе скрывает его. Пример:showobjs 0 & ! скрываем Окно предметовshowobjs 1 & ! выводим Окно предметов на экранДля удобства чтения кода можно заранее определить переменные
onиoffс соответствующими значениями:on,off = 1,0showobjs 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['деньги'] = 12OBJECTS['патроны'] = 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 & ! удаляем предмет из третьей позиции, не важно, как он называется- Индексация (нумерация) предметов в Окне предметов начинается с 1.
-
MODOBJ [$название], [$описание], [$изображение]- замена описания (текста) предмета с названием[$название]и его изображения на указанные.-
Данная операция помогает легко заменять отображаемое наименование предмета и его иконку в окне предметов. При этом название предмета не меняется, то есть
$selobjпродолжает возвращать название предмета, которое было использовано при создании предмета командойADDOBJ. Пример:addobj "Апельсин" & ! создаём предмет "Апельсин"modobj "Апельсин", "Апельсин (1 шт.)" & ! заменяем отображаемое наименование! на экране видим "Апельсин (1 шт.)", но когда кликаем по этому предмету:*pl $selobj & ! $selobj возвращает "Апельсин" -
Обратите внимание!!! Если вы добавили в окно предметов несколько предметов с одинаковыми названиями, при использовании
modobjотображаемое наименование поменяется у всех предметов. -
Практический смысл данного оператора заключается в том, чтобы не проводить поиск, получение позиции, удаление старого предмета и замену его новым, если вы делаете "стакающиеся" предметы. Достаточно просто заменить отображаемое наименование (title) предмета на нужный с помощью данного оператора.
-
-
RESETOBJ [$название]— сбрасывает отображаемое наименование и иконку предметов с названием[$название]до состояния на момент добавления с помощьюADDOBJ.
Команды очистки Окна предметов
-
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
-
-
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.