## Регистрация объекта для отображения в локации

```renpy
$ register_location_object("obj_name", "directory", "main_image", "free_image",
                           max_in_inventory_cell = 0, remove_to_location = True)
```
Где
* `obj_name` - название регистрируемого объекта, который будет отображаться в локации,
* `directory` - путь к директории изображений,
* `main_image` - основное изображение объекта (в `directory`) без точки с расширением (`.png`),
* `free_image` - изображение "карты проходимости",  
	Аналогично такой же у локаций, но персонаж может передвигаться только вне чёрных зон (у локаций - только внутри),  
	Если отсутствует (`None`), то двигаться можно везде,
* `max_in_inventory_cell` - максимальное кол-во таких объектов в одной ячейке инвентаря (если меньше `1`, то
в инвентарь взять нельзя),
* `remove_to_location` - `True` - если при "удалении" из инвентаря объект возвращается на карту, `False` - если
просто удаляется.

Путь до изображения объекта вычисляется так:  
`image_path = directory + main_image + '.png'`  
Для карты проходимости вместо `main_image` берётся `free_image`.

***

## Регистрация анимации у объекта

```renpy
$ register_location_object_animation("obj_name", "anim_name", "directory", "main_image", "free_image",
                                     xoffset, yoffset, 
                                     count_frames, start_frame, end_frame, time = 1.0)
```
Где
* `obj_name` - название объекта локации, для которого регистрируется анимация,
* `anim_name` - название регистрируемой анимации,
* `directory` - путь к директории изображений,
* `main_image` - основное изображение с одинаковыми по размеру кадрами,
расположенными горизонтально друг за другом (без расширения),
* `free_image` - изображение с кадрами "карты проходимости", так же расположенными друг за другом (без расширения),  
	Если кадры не одинаковы, то прохождение по ним игрока *во время их смены* нежелательно,
* `xoffset`, `yoffset` - отступ относительно обычного состояния (целые числа),
* `count_frames` - количество кадров в `main_image`,
* `start_frame` - начальный кадр анимации,
* `end_frame` - последний кадр анимации (включительно),
* `time` - время, за которое анимация будет закончена (в секундах).

Путь до изображения с кадрами вычисляется аналогично пути к основному изображению (см. абзац выше).

***

## Добавление объекта в локацию

`$ add_location_object("location_name", place, "obj_name", **kwargs)`  
Где
* `location_name` - имя локации, в которую добавляется объект,
* `place` - имя места в локации, в которое будет поставлен объект,  
	Или объект (например, `dict`) со свойствами `x` и `y` (опционально, с `xsize` и `ysize`),
	обозначающми координаты (и размеры) места, в которое будет добавлен объект,
* `obj_name` - название зарегистрированного (с помощью `register_location_object`) объекта, который будет отображаться в локации,
* `kwargs` в этом случае не используется.

Также вместо названия ранее зарегистрированного объекта можно использовать [свой класс](./Пользовательские-классы-и-функции).

***

## Ближайшие объекты

Получить список из `count` ближайших объектов типа `obj_name`:  
`$ objs = get_location_objects("location_name", place, "obj_name", count = -1)`  
Где
* `location_name` - имя локации, на которой ищутся объекты (название текущей локации лежит в переменной `cur_location_name`),
* `place`:
	* Имя места в локации, рядом с которым будет искаться объект,
	* Или объект (например, `dict`) со свойствами `x` и `y`, обозначающими координаты точки, в которой будет искаться объект,
* Если `obj_name == None`, то тип объекта игнорируется (берутся все),
* Если `count < 0`, то вернётся список всех объектов указанного типа,
* Если нужных объектов будет меньше `count`, результат будет аналогичен с `count == -1`.

***

## Ближайший объект для взятия в инвентарь

`$ obj = get_near_location_object_for_inventory(character = None)`  
Здесь `character` - персонаж, рядом с которым ищется объект, по умолчанию персонаж игрока (`me`),

***

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

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

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

Кроме того, иногда может быть удобно не создавать отдельный объект и добавлять его в локацию,
а просто нарисовать его в `main.png` локации.  
В качестве же объекта в этом случае нужно использовать "место" локации, например:  
`inventory.set_size(16, rpg_locations['house_mt'].places['cupboard'])`  
(предполагается, что абзац про "внутренности" в статье о [локациях](./Локации) уже был прочитан ранее).

***

## Ближайший объект с инвентарём

`$ obj = get_near_location_object_with_inventory(character = None)`  
Здесь `character` - персонаж, рядом с которым ищется объект, по умолчанию персонаж игрока (`me`),

***

## Ближайшие объекты-сиденья

`objs = get_near_sit_objects(character = None, max_dist = None)`  
Где:
* `character` - персонаж, возле которого ищется сиденье (`me`, если не указано),
* `max_dist` - максимальное расстояние от персонажа (без ограничений, если меньше `0`).

Результатом будет массив из кортежей вида `(obj, point)`,
где `point` - точка `(x, y)`, с которой лучше садиться на `obj` (вычисляется, исходя из указанного при регистрации поворота).

***

## Расстояние до объекта

Посчитать расстояние от точки `x, y` до объекта:
`dist = obj.dist_to(x, y)`

Расчёт производится до ближайшей точки объекта
(на основе "физики", минимального прямоугольника в картинке параметра `free_image`),
а не просто до координат объекта.

***

## Запуск анимации у объекта локации

`$ obj.start_animation("anim_name", speed = 1.0, repeat = 0)`  
Где
* `obj` - объект локации из списка, полученного вызовом `get_location_objects`,
* `anim_name` - имя зарегистрированной анимации,
* `speed` - скорость воспроизведения относительно указанной при регистрации:
	* Если `speed == 0`, отображаться будет только начальный кадр анимации,
	* Если `speed < 0`, то только финальный,
* `repeat` определяет кол-во повторов после первого воспроизведения:
	* если `repeat == 0`, повторов не будет,
	* если `repeat < 0`, повторы будут длиться до тех пор, пока анимация не будет удалена или заменена.
Эту анимацию можно "перемотать", нажав Пробел/Enter или кликнув по фону или кнопке "Далее".

***

## Удаление анимации у объекта

Возврат к обычному изображению объекта:  
`$ obj.remove_animation()`  
Где `obj` - объект локации из списка, полученного вызовом `get_location_objects`.

***

## Удаление объекта

`$ remove_location_object("location_name", place, "obj_name", count = 1)`  
Здесь
* `"location_name"` - имя локации, с которой удаляется объект,
* `place` - место в этой локации (название или `dict` с `x` и `y`),
* `obj_name` - тип удаляемых объектов,
* `count` - кол-во ближайших к `place` объектов, которые нужно удалить.
Если указано больше, чем существует, то оставшееся игнорируется.

***

## Объекты-сиденья

На некоторые объекты (стулья, скамейки...) можно сесть, подойдя к ним и нажав `Z`
(или [вызвав](./Персонажи#user-content-Сесть) `me.sit_down(obj)` в сценарии).
Причём сесть возможно и более чем на одно место в объекте.
Чтобы сделать такой объект из обычного, нужно вызвать `set_sit_place`:

`$ set_sit_place("obj_name", sit_places, over = None)`  
Где
* `obj_name` - тип объекта, которому добавляется эта фунциональность,
* `sit_places` - список из координат и поворота на объекте, `0, 0` - центральный верхний пиксель объекта,
* `over` - изображение, которое рисуется поверх объекта и персонажа на нём, если `None` - отсутствует.

Последний параметр обычно используется, когда при сидении персонаж смотрит "от нас".

Пример:  
`set_sit_place('liaz_bench_left', [(-16, 30, to_left), (-16, 50, to_left)])`

Рекомендуется выделить отдельный файл (`locations/sit_places.rpy`), в котором будут описаны места для всех "объектов-сидений".

***

[Далее ->](./События)  
[<- Назад](./Локации)
