summaryrefslogtreecommitdiff
path: root/content/posts
diff options
context:
space:
mode:
authorAndrew Guschin <guschin.drew@gmail.com>2022-04-03 12:01:38 +0400
committerAndrew Guschin <guschin.drew@gmail.com>2022-04-03 12:01:38 +0400
commita3e3a41f47a80ed53cddf36a0f2a59a399b9176f (patch)
tree5156fb69e65d4b704cb3d5e9b6fdca834a95b0b4 /content/posts
Initial commit
Diffstat (limited to 'content/posts')
-rw-r--r--content/posts/cpp.md48
-rw-r--r--content/posts/git.md115
-rw-r--r--content/posts/vpn.md138
-rw-r--r--content/posts/yuydev.md206
4 files changed, 507 insertions, 0 deletions
diff --git a/content/posts/cpp.md b/content/posts/cpp.md
new file mode 100644
index 0000000..2b73814
--- /dev/null
+++ b/content/posts/cpp.md
@@ -0,0 +1,48 @@
+---
+title: "Чё по си плюс плюс"
+date: 2019-03-26T08:47:11+01:00
+draft: true
+---
+
+## Непосредственно плюсы
+
+- [Лекции С++ (Мещерин 2018)](https://youtu.be/2PM4TgCZIQs) --- первый лекции
+ можно скипнуть (но не желательно, т.к есть тонкие моменты и в самой базовой
+ части), важна часть про итераторы, возможно аллокаторы, умные указатели и
+ compile-time вычисления (последнее маловероятно, но может пригодиться)
+- [Лекции С++ (Мещерин 2020)](https://youtu.be/9WO24IJQP_Q) --- базовые темы
+ уточнены, где-то добавлен более сложный материал, но всё это на дистанте, что
+ лично мне меньше нравится:
+- [Лекции ТП (2020)](https://youtu.be/XjGbg-N4sQc) - очень веселые, крутые и
+ ненапряжные лекции о базовых принципах разработки ПО.:
+- [Перечисление важных фич С++11](https://habr.com/ru/post/182920/)
+- [Шаблоны C++](https://habr.com/ru/post/436880/)
+- [Примерная реализация системы компонентов](https://austinmorlan.com/posts/entity_component_system/)
+- [Quick Start in CLion](https://www.jetbrains.com/help/clion/clion-quick-start-guide.html#customize-the-environment)
+ (можно пролистать все разделы слева)
+
+## Git
+
+- [Местный туториал](git.html) (обязательно к прочтению)
+- <https://git-scm.com/docs/gittutorial>
+- <https://www.vogella.com/tutorials/Git/article.html> (отличный источник на английском)
+- <https://proglib.io/p/git-for-half-an-hour> (на русском)
+
+## Сборка:
+
+- [Системы сборки](https://habr.com/ru/post/478124/)
+- [GCC make](https://habr.com/ru/post/211751/)
+- [Header guards](https://ravesli.com/urok-23-header-guards/)
+- [Частые беды с инклудами](https://samwho.dev/blog/duplicate-symbol-what/) (о тонкостях линковки)
+
+## Misc
+
+- [Побаловаться с алгоритмами](https://docs.google.com/spreadsheets/d/1eQ7WS1U7HxhytsDYRsNsgXRi7w3DUoBTonXvUq1Fbt4/edit?usp=sharing)
+ (если какие-то уже известны - скип. Снизу есть ссылка на док с наиболее важной
+ теорией, если там что-то известно - тоже скип. Задачи разделены по цветам - от
+ простого к сложному.):
+- [JSON формат](https://habr.com/ru/post/554274/)
+- [Спецификация TOML](https://toml.io/en/v1.0.0)
+- [Референс по маркдауну](https://support.typora.io/Markdown-Reference)
+- [Finite State Machine](https://neerc.ifmo.ru/wiki/index.php?title=Детерминированные_конечные_автоматы)
+
diff --git a/content/posts/git.md b/content/posts/git.md
new file mode 100644
index 0000000..737dfe6
--- /dev/null
+++ b/content/posts/git.md
@@ -0,0 +1,115 @@
+---
+title: "Гайд по работе с Git"
+date: 2019-03-26T08:47:11+01:00
+draft: true
+---
+
+## Основные команды
+
+### Клонирование репозитория
+
+`git clone git@github.com:<твой-никнейм>/<репозиторий>.git`
+
+После выполнения clone будет автоматически создан remote с названием origin с
+указанным url Для обновления форка необходимо добавить remote с апстримом.
+
+### Добавление главного репозитория для обновления master ветки
+
+`git remote add upstream https://github.com/<имя>/<репозиторий>.git`
+
+### Коммит последних изменений
+
+```
+git status # Посмотреть все текущие staged и unstaged изменения
+git add . # Сделать все unstaged изменения staged
+git commit # Сделать коммит с развёрнутым сообщением. При вызове из терминала
+ # откроется какой-нибудь текстовый редактор, в котором можно
+ # написать полное сообщение. При выходе из редактора коммит
+ # делается с последним сохранённым сообщением.
+git commit -m "<сообщение>" # Добавить коммит с кратким сообщением
+```
+
+### Сохранение текущих изменений
+
+Это необходимо для избежания лишних конфликтов во время merge/pull
+
+```
+git stash # Сохранить изменения в stash
+git stash list # Вывести все сохранённые изменения
+git stash pop # Достать последние изменения
+git stash pop 0 # Применить изменения под номером 0
+git stash drop # Удалить изменения из стека
+```
+
+### Обновление ветки из апстрима
+
+```
+git pull upstream master
+git pull upstream develop
+```
+
+### Создание ветки под новое изменение
+
+`git checkout -b <тип фичи>/<краткое описание изменения>`
+
+### Переключение на существующую ветку
+
+`git checkout <название ветки>`
+
+### Объединение веток
+
+Внесение изменений из `<название ветки>` в текущую:
+`git merge <название ветки>`
+
+Если при создании пулл-реквеста появились конфликты, то следует
+сначала обновить master из апстрима, после чего внести полученные изменения
+в текущую ветку.
+
+```
+git stash # Сохранить текущие незакоммиченные изменения на этой ветке
+git checkout master
+git pull upstream master
+git checkout <branch>
+git merge master
+git stash pop # Заново применить изменения, сохранённые с помощью
+ # команды git stash
+```
+
+### Загрузка своих изменений на сервер
+
+```
+git push -u origin <название ветки> # При первой загрузке этой ветки
+git push # Во все последующие разы
+```
+
+### Что нужно выяснить самому
+
+- Как выглядят конфликты и как их решать.
+- Как создать пулл реквест.
+
+## Процесс работы с репозиторием
+
+Для разработки своей фичи следует сделать форк главного репозитория и
+после этого работать только со своей версией. После этого клонируешь свой
+форк и работаешь с ним. Также в склонированный репозиторий нужно добавить
+дополнительный remote под названием upstream (на самом деле название может
+быть любым), чтобы синхронизироваться с... апстримом.
+
+При начале работы над новой фичей создаётся новая ветка (именованная по
+указанным в основном документе правилам). **Новая ветка создаётся на основе
+develop, а не master**. В неё делаются какие-то коммиты. Когда работа над фичей
+завершена, необходимо перейти на develop ветку **форка** и синхронизировать её
+с апстримом: `git pull upstream develop`. После этого нужно выполнить слияние
+ветки с фичей и master и решить все возникшие конфликты.
+
+Только после этого делается Pull Request в главный репозиторий. Ветка источник
+--- ветка с фичей, ветка приёмник --- develop ветка в главном репозитории.
+В случае, если снова возникли конфликты --- переходим к предыдущему параграфу.
+
+Если же всё хорошо и есть возможность автоматического слияния, то нужно указать
+Reviewers чтобы кто-то мог разобрать по частям тобою написанное.
+
+Когда пулл реквест принят и слит в develop, переходишь к своему локальному
+репозиторию и снова синхронизируешься с апстримом. После этого можно приступать
+к разработке новой фичи.
+
diff --git a/content/posts/vpn.md b/content/posts/vpn.md
new file mode 100644
index 0000000..67e9b44
--- /dev/null
+++ b/content/posts/vpn.md
@@ -0,0 +1,138 @@
+---
+title: "Как настроить VPN"
+date: 2022-04-03
+draft: false
+---
+
+В качестве софта для создания сети будет использоваться Wireguard. Хостинг
+предоставляется компанией <https://1984.is/>. Сервер находится в Исландии, поэтому
+пинг может быть заметным. Ютуб смотреть можно, но не нужно. Количество трафика
+ограничено (1 терабайт в месяц на данный момент).
+
+## Установка
+
+Все нужные способы установки перечислены на этой странице:
+
+- <https://www.wireguard.com/install/>
+
+Основные системы:
+
+- На Windows следует скачать установщик и запустить его.
+- На macOS следует установить приложение Wireguard через
+ App Store
+- На Linux зависит от дистрибутива. Основные пациенты:
+ - Manjaro/Arch: `sudo pacman -S wireguard-tools`
+ - Ubuntu/Debian: `sudo apt install wireguard`
+
+## Настройка на Linux
+
+Сначала необходимо сгенерировать пару ключей для доступа к VPN:
+```
+wg genkey > private_key.pem
+wg pubkey < private_key.pem > public_key.pub
+```
+
+Содержимое файла нужно передать мне, чтобы я мог тебя добавить в сеть.
+После этого я выдам тебе твой IP-адрес внутри сети. Обозначим его как
+`<ADDRESS>`. Вместе с этим адресом я выдам адрес VPN, который обозначим как
+`<VPN_ADDRESS>`.
+
+
+В файле `/etc/wireguard/wg0.conf` следует прописать следующие настройки:
+```
+[Interface]
+PrivateKey = <Содержимое файла private_key.pem>
+Address = <ADDRESS>/32
+DNS = 1.1.1.1
+
+[Peer]
+PublicKey = yAGhH8hkukwjbw3R4MBUGoVEltgd7Wn3uGk6m0eD5SI=
+AllowedIPs = 1.0.0.0/8, 2.0.0.0/8, 3.0.0.0/8, 4.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 10.13.37.0/24, 1.1.1.1/32
+Endpoint = <VPN_ADDRESS>:51820
+PersistentKeepalive = 20
+```
+
+В поле `AllowedIPs` так много записей, чтобы исключить из них все локальные
+IP-адреса (типа `192.168.*.*`).
+
+Пока что я не нашёл как можно на линуксе управлять Wireguard из GUI, поэтому
+используем консоль.
+
+Чтобы запустить VPN следует запустить команду
+```
+wg-quick up wg0
+```
+
+Для отключения VPN используется команда
+```
+wg-quick down wg0
+```
+
+## Настройка на macOS
+
+После установки приложения Wireguard из App Store нас встречает такое окно:
+![Wireguard macOS Window](/images/vpn/mac-wg-empty.png)
+
+Нажимаем на плюсик в нижнем левом углу и на кнопку `Add Empty Tunnel...`.
+
+![Wireguard macOS Tunnel](/images/vpn/mac-tunnel-empty.png)
+
+Даём туннелю какое-нибудь название и копируем строчку после надписи `Public
+key:`. Её нужно передать мне. В ответ на эту строчку я передам тебе твой
+IP-адрес в сети. Обозначим его как `<ADDRESS>`. Вместе с этим адресом я
+выдам адрес VPN, который обозначим как `<VPN_ADDRESS>`.
+
+После уже присутствующей строчки в конфиге нужно добавить следующие строки:
+```
+...
+Address = <ADDRESS>/32
+DNS = 1.1.1.1
+
+[Peer]
+PublicKey = yAGhH8hkukwjbw3R4MBUGoVEltgd7Wn3uGk6m0eD5SI=
+AllowedIPs = 1.0.0.0/8, 2.0.0.0/8, 3.0.0.0/8, 4.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 10.13.37.0/24, 1.1.1.1/32
+Endpoint = <VPN_ADDRESS>:51820
+PersistentKeepalive = 20
+```
+
+В поле `AllowedIPs` так много записей, чтобы исключить из них все локальные
+IP-адреса (типа `192.168.*.*`).
+
+В результате окошко выглядит примерно так (Address тот, который я выдам):
+![Wireguard macOS Tunnel Configured](/images/vpn/mac-tunnel-configured.png)
+
+## Настройка на Windows
+
+Настройка на Windows такая же, как на macOS.
+
+После установки приложения Wireguard нас встречает такое окно:
+![Wireguard Windows](/images/vpn/win-wg-empty.png)
+
+Нажимаем на треугольник в нижнем левом углу и выбираем кнопку
+`Добавить пустой туннель...`.
+
+![Wireguard Windows Tunnel](/images/vpn/win-tunnel-empty.png)
+
+Даём туннелю какое-нибудь название и копируем строчку после надписи `Публичный
+ключ:`. Её нужно передать мне. В ответ на эту строчку я передам тебе твой
+IP-адрес в сети. Обозначим его как `<ADDRESS>`. Вместе с этим адресом я
+выдам адрес VPN, который обозначим как `<VPN_ADDRESS>`.
+
+После уже присутствующей строчки в конфиге нужно добавить следующие строки:
+```
+...
+Address = <ADDRESS>/32
+DNS = 1.1.1.1
+
+[Peer]
+PublicKey = yAGhH8hkukwjbw3R4MBUGoVEltgd7Wn3uGk6m0eD5SI=
+AllowedIPs = 1.0.0.0/8, 2.0.0.0/8, 3.0.0.0/8, 4.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 10.13.37.0/24, 1.1.1.1/32
+Endpoint = <VPN_ADDRESS>:51820
+PersistentKeepalive = 20
+```
+
+В поле `AllowedIPs` так много записей, чтобы исключить из них все локальные
+IP-адреса (типа `192.168.*.*`).
+
+В результате окошко выглядит примерно так (Address тот, который я выдам):
+![Wireguard Windows Tunnel Configured](/images/vpn/win-tunnel-configured.png)
diff --git a/content/posts/yuydev.md b/content/posts/yuydev.md
new file mode 100644
index 0000000..69f70bd
--- /dev/null
+++ b/content/posts/yuydev.md
@@ -0,0 +1,206 @@
+---
+title: "Вступительное слово"
+date: 2019-03-26T08:47:11+01:00
+draft: true
+---
+
+## Что делать
+
+Найти в глобальном поиске <https://groups.google.com> нашу группу
+yuydev@googlegroups.com и подать в неё заявку на вступление. После этого в гугл
+диске появится директория Yuydev в которой можно создавать и сохранять основные
+документы/ассеты связанные с игрой.
+
+Также в планах было попробовать
+[парное программирование](https://ru.wikipedia.org/wiki/Парное_программирование),
+так что почитайте что это вообще такое и как происходит.
+
+## Про архитектуру движка
+
+Очень настоятельно рекомендую почитать что-то про
+[ECS](https://en.wikipedia.org/wiki/Entity_component_system).
+Если вкратце --- основные термины:
+
+- Entity (Объект): по факту является уникальным идентификатором объекта, а
+ именно --- целым числом, которое является индексом в списке всех объектов;
+- Component (Компонент): структура с некоторыми данными в которых содержится
+ состояние объекта. Например, в компоненте `Transform` могут содержаться
+ координаты объекта, а в компоненте `Collider` --- размеры коллайдера;
+- System (Система): какая-то функция, которая изменяет состояние объекта с
+ определёнными компонентами. Например, система `movePlayer` может обновлять
+ состояние объектов, у которых есть компоненты `Transform` и `Player`, а
+ система `moveEnemy` --- `Transform` и `Enemy`.
+
+Идейные вдохновители:
+
+- Unity 3D
+- <https://github.com/saintruler/brandNewEngine>
+
+## Стек технологий
+
+Игра и движок будут писаться на C++, а проект собираться с помощью make
+(**не cmake!!!**). В качестве IDE для разработки стоит выбрать Jetbrains CLion,
+а про Visual Studio забыть. Студенческую лицензию для CLion можно получить на
+сайте [Jetbrains](https://www.jetbrains.com/shop/eform/students). Если
+активирована почта на домене sgu.ru, то можно использовать её и получить
+лицензию за несколько минут. Иначе, можно использовать студак во вкладке
+Official Document, но тогда придётся подождать несколько дней.
+
+Почитать инфу по C++ можно [тут](cpp.html).
+
+Для работы с графикой, со звуком и остальными мультимедийными вещами будет
+использоваться библиотека [SFML](https://www.sfml-dev.org/). Для её изучения
+можно почитать [туториалы](https://www.sfml-dev.org/tutorials/2.5/) на
+официальном сайте. Они на английском языке, но к этому придётся привыкать.
+
+В целом, в данном проекте я рассчитываю на то, что мы будем использовать
+минимальное количество внешних библиотек. В идеале --- ограничиться только
+SFML. Другие библиотеки стоит добавлять только в самом-самом крайнем случае,
+если проблема требует действительно очень большого количества кода и каких-то
+продвинутых знаний. На данный момент, единственный кандидат в качестве
+дополнительной внешней библиотеки --- это парсер какого-нибудь языка разметки
+(например, json).
+
+Для сборки проекта на винде нужно будет установить
+[mingw-w64](http://mingw-w64.org/doku.php) и
+[GNU make](https://www.gnu.org/software/make/). И после этого каким-то образом
+это настроить так, чтобы проект действительно собирался. Пока что этим никто
+не занимался, поэтому именно ты --- читатель --- можешь стать первым!
+
+## Оформление в различных частях проекта
+
+### Оформление кода (будет дополняться)
+```
+void
+someFunctionName(int param1, int param2)
+{
+ int someArray = { 1, 2, 3 };
+ const std::type_index anotherArray =
+ { TYPE(EnemyController)
+ , TYPE(Transform)
+ , TYPE(PlayerController
+ };
+
+ if (true || false)
+ {
+ callOtherFunction(12345);
+ }
+ for (int i = 0; i < 20; ++i)
+ {
+ // TODO(andrew): Добавить большее количество обработчиков.
+ switch (param1)
+ {
+ case 1:
+ {
+ std::string name = "World"
+ std::cout << "Hello, " << name << std::endl;
+ } break;
+ case 2:
+ {
+ // NOTE(andrew): Приветствую только себя потому что могу!
+ std::string name = "Andrew"
+ std::cout << "Hi, " << name << std::endl;
+ } break;
+ default:
+ {
+ std::cout << "Greeting is undefined" << std::endl;
+ } break;
+ }
+ }
+}
+```
+
+Моменты, на которые необходимо обратить внимание:
+
+- В названиях используется [CamelCase](https://ru.wikipedia.org/wiki/CamelCase);
+- Все фигурные скобки находятся на отдельной строке;
+- Тип возвращаемого значения функции находится на отдельной строке;
+- Блоки кода обозначаются **везде**, даже в ифе с одной командой;
+- Немного необычное оформление кейсов в свитче;
+- **Забудьте про using namespace std**;
+- Длина строки не превышает 80 символов (в некоторых случаях можно позволить
+ 120 символов, но эти случаи рассматриваются отдельно в каждом случае);
+- Оформление литералов массивов в случае, если элементы умещаются в одну
+ строку и в случае, когда не умещаются (аналогичное оформление применяется к
+ параметрам функций);
+- Комментарии на русском языке.
+
+Также можно заметить, что в комментариях есть конструкции `TODO(имя)` и
+`NOTE(имя)`. Имя указывает только на автора комментария, а не на того, кто
+это будет чинить. Нужно это для того, чтобы можно было найти автора и спросить
+его, если не совсем понятна проблема или что-то ещё. Комментарии такого
+вида обычно распознаются в IDE и, например, по TODO-комментариям можно искать
+части проекта, в которых следовало бы добавить какие-то вещи, которые могут быть
+не обязательны для сборки и работы проекта в данный момент, но могут привести
+к неожиданным ошибкам. Например, обработку ошибок/исключений можно отложить
+на потом, но чтобы не забыть о том, что такая необходимость существует, надо
+добавить комментарий `TODO(имя)` и через двоеточие указать чего именно не
+хватает.
+
+### Особенности работы с C++ в этом проекте
+
+Очень желательно везде использовать [Plain Old
+Data](https://ru.wikipedia.org/wiki/Простая_структура_данных), то есть обычные
+`struct`. Использование наследования и рефлексии запрещено (до тех пор, пока не
+найдётся место, где это **действительно** понадобится). Макросы не запрещены,
+но их количество следует минимизировать. Если какой-то сложный тип данных
+встречается достаточно часто есть возможность рассмотреть вынесение его в
+отдельный `typedef`. Глобальных переменных следует избегать, а нужные данные
+хранить непосредственно в компонентах.
+
+### Работа с git
+
+При начале работы над новой фичей следует создать новую ветку. У названия
+ветки будет какой-то префикс, соответствующий типу того, что в этой ветке
+разрабатывается, а после него указывается *очень короткое* описание самой
+фичи (два -- три слова). Название ветки полностью нижним регистром, а слова
+разделяются тире (!!!). Примеры:
+
+- feature/new-interface;
+- feature/player-controller-update;
+- fix/physics-system-bug.
+
+Во время разработки фичи можете создавать сколько угодно коммитов, так как
+при слиянии с основной веткой будет использоваться squash. Не нужно создавать
+огромное количество коммитов на каждый чих, но и не нужно делать один огромный
+коммит в котором находятся абсолютно все изменения. Git --- это ваш друг,
+который поможет откатиться до предыдущего рабочего коммита, если что-то
+непоправимо сломалось (или просто получилось какое-то говно, которое лучше
+выкинуть, забыть и начать с начала).
+
+Не рекомендуется работа в одной ветке сразу двух людей, так как это
+**неизбежно** приведёт к бесконечным конфликтам при автоматическом слиянии.
+
+В тексте squash-коммита следует указывать что именно было изменено. Первая
+строка коммита является чем-то вроде заголовка, а весь остальной текст
+следует оформлять в виде Markdown с подробным описанием новых фич.
+
+Текст коммита пишется на русском языке.
+
+Основные команды и процесс работы с нашим репозиторием можно прочитать
+[тут](git.html).
+
+## Какие есть задачи
+
+- Сборка проекта под разные архитектуры
+ - Debug и Release сборки
+- Система логгирования
+- Чтение конфигов в каком-то языке разметки
+ - Выбрать этот язык (кандидаты: toml, yaml, json, ini)
+- Движок
+ - Система компонентов
+ - Подсистема рендеринга
+ - Подсистема ввода
+ - Подсистема сцен
+ - Подсистема сохранений
+ - Сериализация/десериализация объектов
+ - Работа с незапакованными ассетами (Debug build)
+ - Звуковая подсистема
+ - Подсистема событий
+ - Фреймворк для разработки графического интерфейса (а также работа со шрифтами)
+ - Запаковка ассетов и загрузка этих архивов в собранном проекте (Release build)
+- Графический интерфейс для создания сцен
+- Игровые механики (придумывание идей и реализация)
+- Сюжет
+- Графика
+- Музыка