# Как кодить
Для удобной работы с нашим кодом вам понадобятся следующие инструменты:
* [BYOND](http://www.byond.com/download/). Серьёзно.
* [VSCode](https://code.visualstudio.com/download). Легковесный и работает достаточно быстро.
* [GitHub Desktop](https://desktop.github.com). Говно, но с пивком пойдёт.
* [StrongDMM](https://github.com/SpaiR/StrongDMM). Для работы с картами незаменим.
* [TweakPNG](http://entropymine.com/jason/tweakpng). Особый инструмент, который может помочь с форматом иконок **.dmi**.
### Получаем билд правильным путём
Предположим, что вы уже установили **Git**. Тут всё очень просто:
1. Ищём любое удобное место у себя на диске.
2. Жмём **ПКМ** по свободному месту в желаемом месте...
3. Выбираем **Git Bash Here**. Откроется терминал в этой папке.
4. Пишем довольном простую команду:
`git clone --depth=1 https://github.com/frosty-dev/white-dream-main`
Это создаст папку с названием репозитория. Можете дописать в конце команды через пробел любое другое название, если желаете. Также позволит загрузить билд не качая всю историю коммитов, а только последнюю версию, что **значительно уменьшает** время загрузки билда.
5. Открываем **GitHub Desktop**, в меню **File** жмём ![Шиза](https://i.imgur.com/vlzNiD5.png) и выбираем папку куда загрузили билд.
Это не всё. Если вы хотите внести изменения, то придётся перейти к следующему пункту.
### Создание Pull Requests
Для этого нам потребуются следующие вещи:
* Аккаунт на [GitHub](http://github.com/join). Куда ж без него.
* Сам **GitHub Desktop** или его аналоги.
* Собственно, сами изменения в коде/картах/картинках/звуках/чём угодно.
Всё имеется? Продолжим. Допустим, у нас есть изменение в файле `code/shitcode/anus/bepis.dm` и мы хотим видеть его в основном репозитории. Создаём коммит с изменениями тогда:
1. Открываем **GitHub Desktop**. Видим изменения в левой части экрана, галочкой выбираем то, что будем коммитить (по дефолту всё выделено).
2. Жмём прекрасную кнопочку **Commit to master**. Коммит готов.
Теперь нам нужно выгрузить куда-то это всё. Если вы делали всё по нашей инструкции, то понадобится ещё сделать собственный форк репозитория:
1. Переходим в нужный, например, [наш](https://github.com/frosty-dev/white-dream-main).
2. Жмём кнопочку **Fork** в правом верхнем углу. Выбираем свой никнейм и через мгновение вы окажетесь в своём форке.
3. Копируем ссылку из адресной строки, она должна быть в виде `https://github.com/YOURNICKNAME/white-dream-main`.
4. Открываем папку с билдом, жмём **ПКМ** внутри и выбираем **Git Bash Here**.
5. В терминале вводим следующие команды:
`git remote add myfork https://github.com/YOURNICKNAME/white-dream-main`
`git push myfork master`
(там где **YOURNICKNAME** ставим свой вариант).
Изменения будут в вашем форке. Теперь нужно открыть **Pull Request** для запроса внесения ваших правок в основной репозиторий:
1. Открываем ваш форк и жмём сюда: ![Я съел бомжа](https://i.imgur.com/wQeWvqx.png)
2. Жмём сюда: ![Прикол](https://i.imgur.com/2tp4hFi.png)
3. В поле **Title** пишем понятное и короткое описание того, что вы хотели бы впилить.
4. На вкладке **Write** тоже заполняем всё. Комментарии можете не убирать, их всё равно не будет видно. На вкладке **Preview** можете посмотреть как будет выглядеть готовая версия.
5. Жмём ![](https://i.imgur.com/pEpjvVI.png), если всё готово.
**Важная заметка!** Все коммиты, которые вы делаете в ваш форк, также будут **автоматически** добавлены в ваш **Pull Request**. Не нужно создавать новый после каждого коммита, если существует текущий.
![Интерфейс программы](https://i.imgur.com/bD3WsJj.png)
Самый мощный инструмент экономящий тонну времени из всей пачки. Выделим несколько особенностей при работе с ним:
* Открыть директорию с билдом. Это делается простым сочетанием клавиш **CTRL+O**.
* На вкладке **Extensions** появятся рекомендованные расшения, которые нужно обязательно поставить без исключений. Обязательно перезапустить **VSCode** после установки.
* В правом нижнем углу есть кнопочка отвечающая за "галочку" на файле: **Ticked** - файл с галочкой; **Unticked** - без галочки. Переключается нажатием на эту кнопку, не забываем сохранять **.dme** файл (вкладка всплывёт для этого).
* Кнопка в левой нижней части под названием **tgstation** (или какой у вас там билд), перезапустит анализатор кода и покажет ошибки и предупреждения, если они есть.
* Комбинация **CTRL+SHIFT+B** и затем **Enter** запустят компиляцию кода. Удобно?
* **CTRL+Клик** по какой-то переменной или чему угодно, что подсвечивается при удерживании **CTRL** приведут вас к родительскому элементу. Экономит время неплохо.
* **CTRL+SHIFT+F** поможет быстро найти что-то в коде и при желании -- заменить. Работает в разы быстрее тормознутого бьёндовского поиска.
* ![Неведомая шиза из разума дизайнеров майкрософта](https://i.imgur.com/yGaHXos.png) в левой нижней части автоматически обновит текущий репозиторий в котором вы работаете, если вы используете **Git**.
* *И это только часть особенностей, про остальное ищите информацию на страницах расширений.*
### Примерная структура
Объект, который можно использовать в игре:
```dm
/*
Объект дилдо
Все переменные от этого объекта наследуют его дети
Например: /obj/item/dildo/small
*/
/obj/item/dildo
// большая часть имён должна быть в нижнем регистре,
// но возможны исключения,
// если вы используете имена существительные
name = "дилдо"
desc = "Описание дилдо."
// обязательно в одинарных кавычках
icon = 'путь/к/иконке/дилдо.dmi'
// название состояния в файле .dmi иконки
icon_state = "дилдо_драконий"
// любая переменная на ваш вкус
var/gayish = TRUE
// Прок инициализации. Он заменяет бьёндовский прок New()
/obj/item/dildo/Initialize()
// данная штука снизу нужна для вызова родительского прока Initialize().
// если забудете её, то ваш объект может работать неправильно, конечно,
// если только вы не собираетесь полностью менять этот прок
. = ..() // да, эта
// сюда пишем любую ересь, которую вы хотите видеть при инициализации, например
if(get_turf(src) == /turf/closed/wall)
gayish = TRUE
/*
Определяем свой собственный прок для объекта дилдо.
Для определения новых проков пишем перед названием /proc/
Все дети от этого объекта наследуют их.
В него также передаётся переменная /mob/M
Передаётся так "fuk(какой-то реф моба)"
*/
/obj/item/dildo/proc/fuk(mob/M)
// тут не нужен вызов родительской функции . = ..()
// однако, если будете менять этот прок у наследственного объекта
// то можно и добавить, если не собираетесь перезаписывать этот полностью
// моб принадлежит к классу living?
if(isliving(M))
// если да, то обозначаем его как living и работаем дальше
var/mob/living/L = M
// вызываем муть в глазах у этого моба в зависимости от force объекта dildo
M.apply_effects(eyeblur = force)
// возвращаем успех
return TRUE
else
// если моб не относится к классу living
// возвращаем не успех
return FALSE
// вызываем родительский прок attack(КОГО, КТО).
/obj/item/dildo/attack(mob/living/M, mob/living/user)
// дальше идёт проверка родительской функции
if(..())
// выполняем наш прок, который возвращает что-то в return
if(fuk(M))
// если успех
gayish = FALSE
// для прикола красим в красный
color = "#ff0000"
else
// если провал
gayish = TRUE
// цвет голубых?
color = "#00ffff"
// можем выполнить что-то ещё после проверки
say("Санекмен доигрался...")
// удаляем дилдо через 10 секунд
QDEL_IN(src, 100)
```
Как вы заметили, тут обилие комментариев. Комментарии всегда обязательны в коде для более быстрого понимания как он работает. Даже для себя, не только для других.
> [time=Thu, Jul 2, 2020 10:05 PM]