[[help:acts|Назад: Действия]]
====== Предметы (инвентарь) ======
Очень часто главному герою даётся возможность носить с собой разные предметы, которые можно по разному применять в различных ситуациях. Например, на деньги можно купить оружие, оружием кого-нибудь победить, ключом открыть дверь, и так далее. Герой может нести предметы в руках, в карманах, в заплечном мешке, даже катить, но в общем случае говорят, что предметы помещаются в "инвентарь".
Иными словами, инвентарь - это список всех предметов, что есть у героя в данный момент.
В **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)+' (<> шт.)'
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''** с ответствующими параметрами и операциями.
* Записав возвращённое функцией значение в переменную, можно восстановить предметы с помощью оператора **[[help:dynamical|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''** — системная переменная, куда можно прописать название локации, код на которой будет выполняться при очередном выделении предмета.
Более подробная информация в разделе [[help:service_locations|"Служебные локации"]].
Если предмет уже выделен, повторное выделение при нажатии не происходит. Чтобы повторно выделить предмет, нужно предварительно снять с него выделение с помощью команды **''UNSELECT''**.
[[help:principle|Вперёд: Порядок работы интерпретатора]]