## Инвентарь

Положить объект в инвентарь можно нажатием "кнопки действия" рядом с объектом (взять, событие `take`).
Берётся ближайший объект, которые можно взять в инвентарь.
Эта операция приоритетнее "действия" в определённом месте локации
(см. [События](./События)).

Объект в инвентаре можно:
* Использовать:
	Генерируется событие `use`,
	"использованный" объект не удаляется из инвентаря (но его может удалить вызванная метка).
* Удалить (вернуть в локацию или совсем удалить, в зависимости от параметра `remove_to_location` при регистрации):
	Генерируется событие `remove`.

Все события с объектами инвентаря (`take`, `use` и `remove`)
хранят название объекта события в переменной `rpg_event_object`.

***

## Объекты

Во всех функциях для работы с инвентарём используется необязательный объект `obj`, с которым и ведётся работа.

В качестве объекта можно передать персонажа (`Character`), объект (`RpgLocationObject`)
или место в локации (`RpgPlace`).  
В этом случае в качестве инвентаря объекта используется `obj.inventory`.

Но иногда удобнее сразу передать непосредственно инвентарь, а в некоторых случаях это вообще единственный вариант.  
Например, это касается работы с инвентарём одежды, которая не одета на персонажа в данный момент (см. далее).

***

## Одежда

Для каждой одежды у каждого персонажа есть свой инвентарь.  
При смене одежды вещи из старого автоматически перекладываются в новый.  
Если сделать это для всех вещей не удалось, то открывается окно,
в котором предлагается разобраться с этим вручную.  
Очевидно, при установке одного и того же размера инвентаря для каждой одежды
автоматический режим будет срабатывать всегда.

Размеры инвентарей по умолчанию для каждой одежды у всех персонажей указываются, например, так:
```python
inventory.dress_sizes = {
	'default': 10,
	'winter': 20,
	'summer': 6,
}
```
Здесь зимняя одежда содержит 20 ячеек инвентаря, летняя - 6, а все остальные (например, весенняя) - 10.

Текущий инвентарь персонажа можно получить по свойству `inventory`, как и у любых других объектов.  
Например, через `me.inventory` можно получить инвентарь основного персонажа.

Инвентари для других одежд хранятся в `inventories` персонажей.  
Это свойство является словарём (`dict`), и ключами в нём выступают названия одежд.

Важно: если одежда ещё не была надета на данного персонажа в текущей игре и она не указана
в `inventory.dress_sizes`, то и в `inventories` её не будет.

***

## Указать размер инвентаря

`$ inventory.set_size(size, obj = None)`  
Где:
* `size` - новый размер инвентаря (при уменьшении невлезающие вещи будут разбросаны вокруг),
* `obj` - объект, у которого меняется размер инвентаря (по умолчанию - персонаж `me`).

При уменьшении размера движок стремится переложить вещи из удаляемых ячеек в те, что не будут удалены.  
Если это невозможно, то часть вещей будет разбросана вокруг игрока.

Как и говорилось выше, инвентарь может быть у объектов и мест (для ящиков, шкафов и т. д.),
подробности см. в статье [Объекты локаций](./Объекты-локаций).

***

## Добавить в инвентарь

`inventory.add("obj_name", count, obj = None)`

Добавляет в инвентарь `count` объектов типа `obj_name` и
возвращает кол-во объектов, которые нельзя поместить из-за ограничений по размеру инвентаря.

***

## Наличие в инвентаре

`inventory.has("obj_name", count = 1, obj = None)`  
Возвращает `True`, если в инвентаре имеется `count` объектов типа `obj_name`, иначе - `False`.

***

## Удалить из инвентаря

`inventory.remove("obj_name", count, obj = None)`  
Удаляет из инвентаря `count` объектов типа `obj_name` и
возвращает кол-во объектов, которые нельзя удалить из-за их отсутствия.

***

## Сгенерировать событие инвентаря

`inventory.add_event("event", "obj_name")`  
Где:
* `event` - название события инвентаря (одна из строк среди `"take"`, `"use"`, `"remove"`),
* `obj_name` - название объекта, который связан с событием.

***

## Открыть окно инвентаря

`inventory.show(first = None, second = None)`  
Где:
* `first` - объект для "своего" инвентаря (по умолчанию - `me`), который будет отображаться снизу,
* `second` - другой объект вроде шкафа или сундука, `None` - отсутствие.

***

## Перекладывание между инвентарями

Для автоматического перекладывания вещей из инвентаря (не объекта!) `old` в `new` используется  
`inventory.change(old, new, show_on_fail)`

Если для автоматического режима в новом инвентаре не хватает свободного места и параметр `show_on_fail`
установлен в `True`, то будет открыто окно для ручного перемещения объектов.

Именно эта функция используется при смене одежды
(`show_on_fail` устанавливается в `True` только для основного персонажа).

***

## Закрыть окно инвентаря

`inventory.close()`

***

## Разброс выкидываемых вещей

Свойство `inventory.throw_radius` (по умолчанию - 3) отвечает за радиус,
в котором вокруг персонажа будут разбросаны выкидываемые вещи.

Хотя вернее, наверно, было бы назвать это половиной стороны квадрата, а не радиусом круга,
но "радиус" звучит проще и понятнее, а разница обычно не имеет значения.

***

## Внутреннее устройство инвентаря

Инвентарь объекта является списком и обычно хранится в свойстве `inventory`.  
Инвентарь у объекта может отсутствовать (`None`) или быть нулевого размера (пустой список `[]`).

Каждый элемент списка (ячейка) является массивом из 2 элементов: название объекта (строка) и их кол-во в этой ячейке.  
Если данная ячейка пуста, то названием объектов, которые она содержит, будет пустая строка.  
Нужно следить за этим при ручном изменении кол-ва объектов.

Пользовательский код может без проблем менять содержимое инвентаря вручную, если в этом возникнет необходимость.  
Например, так можно заменить все монеты в `10` тугриков монетами в `20` (удвоив таким образом наличные):
```python
for i in me.inventory:
	if i[0] == 'coin-10':
		i[0] = 'coin-20'
```
Здесь предполагается, что объект `coin-20` был зарегистрирован также, как и `coin-10`.

В случае увеличения кол-ва объектов стоит помнить о том,
что у объекта может быть ограничение на максимальное кол-во в 1 ячейке.  
Возможно, в этом случае будет проще использовать функцию `inventory.add`.

***

[Далее ->](./Пользовательские-классы-и-функции)  
[<- Назад](./Квесты)
