Builder API

**Builder API** - инструмент для создания модификаций на экспериментальную, двухмерную версию Лайтбокса, 2D builder.

Для изучения работы **Builder API** существует сайт документации. В этой же статье большая часть информации будет списана с того же сайта.

# Сайт документации

## Типы скриптов.

### Скрипты в папке с модом:

* **script.cs** - Происходит один раз при запуске игры!
* **OnMapRedraw.cs** - Происходит при завершении полной прорисовки карты, но не реагирует на прорисовку отдельного блока!
* **OnGlobalTimerTick.cs** - Происходит при каждом тике таймера. Таймер обновляется **50 раз** в секунду.
* **OnAbout.cs** - Происходит при нажатии на вопросик в инвентаре формы мода. Передает **Mod** под названием **obj**.

### Скрипты в папке с блоком:

* **script.cs** - Происходит один раз при поставке блока пользователем, *но он не сработает при перерисовке и загрузке карты из списка сохранений! Также передается аргумент **Block** под названием **obj**, это блок, поставленный пользователем!*
* **OnSelect.cs** - Происходит при выборе блока в меню инвентаря и передает **ModG** паттерн блока под названием **obj**!
* **OnRedraw.cs** - Происходит при любой перерисовке блока! Передается аргумент **Block** под названием **obj**.
* **OnDestroy.cs** - Происходит при удалении блока! Перед самим удалением передается аргумент **Block** под названием **obj**.

**OnClick.cs** - Происходит при клике на блок! Передается аргумент **Block** под названием **obj** и индекс нажатой кнопки мыши **MouseClick**.

* Левая кнопка мыши - **MouseClick = 0**;
* Средняя кнопка мыши - **MouseClick = 1**;
* Правая кнопка мыши - **MouseClick = 2**;

## Алгоритм инициализации скриптов.

### При инициализации игры

>
>  Сначала инициализируются скрипты из папки мода:
>
>
>  Происходит загрузка скрипта **script.cs**
>
>
>  Происходит загрузка скрипта **OnMapRedraw.cs**
>
>
>  Происходит загрузка скрипта **OnGlobalTimerTick.cs**
>
>
>  Происходит загрузка скрипта **OnAbout.cs**
>
>
>
>

>
>  Затем инициализируются скрипты из папки блока:
>
>
>  Происходит загрузка скрипта **script.cs**
>
>
>  Происходит загрузка скрипта **OnSelect.cs**
>
>
>  Происходит загрузка скрипта **OnRedraw.cs**
>
>
>  Происходит загрузка скрипта **OnDestroy.cs**
>
>
>  Происходит загрузка скрипта **OnClick.cs**
>
>
>
>

>
>  Происходит инициализация **script.cs**, после загрузки всех предыдущих скриптов.
>
>
>  Начинается выполнение **OnGlobalTimerTick.cs**
>
>
>
>

### При Перерисовке

>
>  Приостанавливается выполнение **OnGlobalTimerTick.cs**
>
>
>  Происходит выполнение скрипта **OnRedraw.cs**
>
>
>  Происходит выполнение скрипта **OnMapRedraw.cs** после завершения перерисовки
>
>
>  Возобновляется выполнение **OnGlobalTimerTick.cs**
>
>
>
>

### При загрузке карты

```
Приостанавливается выполнение **OnGlobalTimerTick.cs**

```

```
Происходит выполнение скрипта **OnRedraw.cs**

```

```
Происходит выполнение скрипта **OnMapRedraw.cs после завершения перерисовки**

```

```
Возобновляется выполнение **OnGlobalTimerTick.cs**

```

## \_2Dblock - Классы

Для того, чтобы понимать, что за классы в API, вот список и их поля:

### Block

* **OnRedraw** - Происходит при перерисовке блока. (**Action**)
* **OnDestroy** - Происходит при уничтожении блока. (**Action**)
* **OnClick** - Происходит при нажатии на блок. (**Action**)
* **Position** - Позиция блока. (**Vector2**)
* **Scale** - Размер блока. (**Vector2**)
* **Texture** - текстура блока. (**Image**)
* (*Устарело*) **\_IndexTexture** - Индекс текстуры встроенного блока. (**int**)
* **Mod** - Мод, которому блок принадлежит. (**ModManager.Mod**)
* **BlockMod** - Паттерн блока. (**ModG**)
* **IsInteractive** - Возвращает **true**, если **OnClick** не равен **null**. (**bool**)
* **Properties** - CustomProperties (**Dictionary|string, string|**)
* **Execute**(*string code*) - Выполняет скрипт из текста (**Method**)
* **draw**() - Нарисовать блок на сцене (**Method**)

### ModG

* **OnBlockPlaced** - срабатывает при появлении блока (**Action**)
* **OnDestroyed** - Срабатывает перед уничтожением блока (**Action**)
* **OnBlockSelect** - Срабатывает при выборе блока в инвентаре (**Action**)
* **OnRedraw** - Происходит при перерисовке блока (**Action**)
* **OnClick** - Срабатывает при клике на блок (**Action**)
* **Mod** - мод, которому блок принадлежит (**ModManager.Mod**)
* **ModName** - Имя мода (**string**)
* **\_Texture** - Текстура блока (**Image**)
* **BlockName** - Имя блока (**string**)

### Inventar

* **MyMod** - Паттерн блока (**ModG**)
* **ModName** - Имя мода (**string**)
* **BlockName** - Имя блока (**string**)
* **\_Texture** - Текстура блока (**Image**)

## \_2Dblock - Методы

* **GetBlocks**() - Получает все поставленные блоки. (**List of Block**)
* **GetBlockByIDTexture**(**int id**) - можно получить массив блоков по указанному **id** текстуры. (**List of Block**)
* **GetBlockByID**(**int id**) - можно получить блок с указанным **id** из массива блоков. (**Block**)
* **GetBlockByName**(**string name**) - можно получить первый по очереди блок по указанному имени из массива блоков. (**Block**)
* **GetBlockByNameArray**(**string name**) - можно получить массив блоков по указанному имени. (**IEnumerable of Block**)
* **GetBlockByModNameArray**(**string name**) - получение объекта по имени мода, из которого блок. (**IEnumerable of Block**)
* **GetGFX**() - получает **Graphics**. (**Graphics**)
* **PaintTable**() - Получает панель, в которой на **PictureBox** рисуются блоки. (**Panel**)
* **LoadPanel**() - получает панель загрузки карты. (**Panel**)
* **Form**() - Получает форму, в которой запущен 2Д билдер. (**Form**)
* **GetBackground**() - Получает текущий BackgroundImage. (**Image**)
* **GetCounter**() - Получает зеленый **PictureBox**. При поставке блоков игра использует его координаты. (**Control as PictureBox**)
* **GetSelectedInventar**() - получает выбранный в данный момент инвентарь(**слот**). (**Inventar**)
* **GetThisBlock**() - получает блок, в котором выполнен скрипт. (**Block**)
* **GetCurrentModInfo**() - Получает информацию о моде в выбранном в инвентаре блоке. (**string**)
* **Destroy**(*int x, int y*) - Уничтожает блок по заданной координате.
* **Destroy**(**Block obj**) - Уничтожает выбранный блок.
* **DestroyAll**() - Очищает карту от блоков.
* **TryBuild**(*int x, int y,* **ModG pattern**) - Ставит блок, если координата не занята. (**Block**)
* **Build**(int x, int y, ModG pattern) - Ставит Блок из паттерна в заданную координату даже если там уже стоит блок. (**Block**)
* **Render**() - Рендерит, то есть применяет перерисовку всех объектов.

## ModManager - Классы и Методы

### ModManager

* **Mods** - Список всех инициализированных модов в билдере. (**List of Mod**)
* **GetMod**(**string name**) - Возвращает мод с указанным именем. (**Mod**)

### Mod - Класс

* **Name** - Имя мода. (**string**)
* **Path** - Путь к папке с модом. (**string**)
* **ResourcePath** - Путь к папке с ресурсами в моде. (**string**)
* **Blocks** - Список блоков мода. (**List of ModG)**
* **GetBlock**(**string name**) - Возвращает блок мода по имени. (**ModG**) Данный класс способен работать с **Properties** и **Resources**

## Custom & Global properties

Это подходит для блока и мода. В блоке при сохранении карты свойства сохраняются, в отличии от мода.

Свойства в **Global** хранятся в виде **object**, а в **Custom** в виде **string** листа.

* **Custom Property - Block**
* **Global Property - Mod**

### Для мода (Global)

* **SetProperty(string key, object content)** - ставит свойство.
* **GetProperty(string key)** - возвращает свойство **object**.

### Для Блока (Custom)

* **SetProperty(string key, string content)** - ставит свойство.
* **GetProperty(string key)** - возвращает свойство **string**.

## Resource System

В каждом моде есть ресурсы благодаря новой системе. Для нее надо создать в папке мода папку "**Resources**" Также блока "**Resources**" не может быть, так как это название зарезервировано для этой системы

### Методы

* **GetTextFromResources(string FileName)** - Возвращает **string** из файла
* **GetImageFromResources(string FileName)** - Возвращает Image из файла
* **GetBytesFromResources(string FileName)** - Возвращает **byte[]** из файла
* **GetSoundFromResources(string FileName)** - Возвращает **SoundPlayer** со звуком из WAV файла
* **SetTextToResources(string FileName, string content)** - Сохраняет **string** данные в файл
* **SetImageToResources(string FileName, Image content)** - Сохраняет **Image** в файл
* **SetBytesToResources(string FileName, byte[] content)** - Сохраняет **byte[]** в файл

## Остальные классы и методы

### AlertForm - вывод сообщения пользователю.

**arguments: (string content, string label = "Lightbox Launcher", Image Icon = null, Action \_onSubmit = null, Action \_onAbort = null)**

* Инициализация класса выглядит так: **new AlertForm("Привет");**

Также можно получить форму вот так**: Form MyObj = new AlertForm("Привет");**

**Аргументы:**

* **content** - что выведет форма.
* **label** - Заголовок формы, но вводить параметр необязательно.
* **Icon** = иконка формы.
* **\_onSubmit** - действие при нажатии кнопки '**ОК**' или '**Да**'.
* **\_onAbort** - действие при нажатии '**Нет**'.

### AboutMod - Форма информации мода.

**arguments: ()**

* Инициализация класса выглядит так: **new AboutMod();**

Также можно получить форму вот так: **var MyObj = new AboutMod();**

**Методы:**

* **SetName(string text)** - Ставит Имя мода.
* **SetVersion(string text)** - Ставит версию мода.
* **SetLogotype(string text)** - Ставит изображение по пути к файлу.
* **SetLogotype(Image content)** - Ставит изображение.
* **SetHeadColor(Color)** - Ставит цвет шапки.
* **SetHeadColor(string text)** - Ставит цвет шапки по имени цвета.
* **SetHeadColor**(*int r, int g, int b, int a*) - Ставит цвет шапки.
* **SetBackColor(Color)** - Ставит цвет формы.
* **SetBackColor(string text)** - Ставит цвет формы по имени цвета.
* **SetBackColor**(*int r, int g, int b, int a*) - Ставит цвет формы.
* **AddPane**l(*int* **height** = **25**) - Добавляет новую панель в форму.
* **AddButton**(**string text**, *int* **width** = **350**, *int* **fontSize** = **12**, **string** **fontFamily** = "***Segoe UI***", **string colorName** = "***black***") - Добавляет новую кнопку в форму.
* **AddLabel**(**string text**, *int* **fontSize** = **12**, **string** **fontFamily** = "***Segoe UI***", **string** **colorName** = "**black**") - Добавляет новый текст в форму.
* **AddToogle**(**string text**, **bool content**, *int* **fontSize** = **12**, **string fontFamily** = "***Segoe UI***", **string colorName** = "***black***") - Добавляет новый **toogle** в форму.
* **AddCustomControl**(**Control custom**) - Добавляет в форму переданный компонент.

**Поля:**

* **ClearProperties** - **Button** "*Сбросить настройки*".

### Методы:

* **AddString**(**string content**) - Добавляет строку в список консоли