# G-WORLD Двумерная игра с видом сбоку на Godot 4.7. Референс по подаче и структуре — **Fallout Shelter**: разрез убежища, комнаты в сетке, жители, которых расселяют по этажам, и мир, реагирующий на решения игрока. > Статус: ранняя альфа. Готов каркас меню и первый игровой слой — сетка комнат в разрезе. --- ## Что уже работает | Часть | Файл | Что умеет | |---|---|---| | Убежище | `scenes/game/vault.tscn` | разрез на 6 этажей, лифтовая шахта, строительство и снос комнат, сводка ресурсов | | Главное меню | `scenes/ui/main_menu.tscn` | анимированный фон на шейдере, появление по стаггеру, единая подсветка для мыши и клавиатуры | | Настройки | `scenes/ui/settings_menu.tscn` | видео, звук, переназначение клавиш; сохраняется в `user://settings.cfg` | | Пауза | `scenes/ui/pause_menu.tscn` | останавливает дерево, переиспользует экраны настроек и сохранений | | Сохранения | `scenes/ui/save_menu.tscn` | 6 слотов с миниатюрами, датой и наигранным временем, запись/чтение/удаление | Экраны настроек и сохранений — отдельные сцены, вложенные инстансами и в главное меню, и в паузу. Дублирования нет: правка в одном месте видна везде. ## Игровой слой Убежище разделено на три части, чтобы графику можно было заменить, не трогая логику: - **`vault_grid.gd`** (`VaultGrid`) — модель: сетка 9×6, список комнат, правила размещения, баланс ресурсов, сериализация. Ни одного узла, ни одной отрисовки. - **`vault_view.gd`** (`VaultView`) — весь `_draw()`: небо, порода, шахта, комнаты, призрак строительства. Пока рисуется процедурно — ассетов нет. Появится графика — меняется только этот файл. - **`vault_scene.gd`** — связывает модель, вид, камеру и HUD, реализует контракт сохранения. Управление: **ЛКМ** — построить или снести, **ПКМ/СКМ** — тащить вид, **колесо** — зум, **WASD / стрелки** — прокрутка, **Esc** — пауза. Типы комнат и их баланс ресурсов заданы одним словарём `VaultGrid.KINDS` — новый тип добавляется одной записью, кнопка в панели строительства и подсчёт ресурсов подхватываются сами. ## Требования - **Godot 4.7** (Forward+, .NET-сборка не обязательна — код на GDScript) - Windows / Linux / macOS ## Запуск Откройте папку проекта в Godot и нажмите F5 — главная сцена уже прописана (`res://scenes/ui/main_menu.tscn`). ## Структура ``` scenes/ ui/ main_menu, settings_menu, pause_menu, save_menu game/ vault.tscn — убежище scripts/ autoload/ game_settings.gd, save_manager.gd ui/ по скрипту на экран game/ vault_grid.gd, vault_view.gd, vault_camera.gd, vault_scene.gd shaders/ menu_background.gdshader + материал themes/ main_menu.theme.tres — единая тема всех экранов default_bus_layout.tres — шины микшера: Master → Music, SFX ``` ## Соглашения **Тема.** Все экраны наследуют `themes/main_menu.theme.tres`. Цвета не прописываются в узлах: акцент `#2ee6c5`, второй акцент `#7b6bf5`, текст `#dbe7f0`, приглушённый `#8fa5ba`. Локальные `theme_override_*` — только там, где элемент должен отличаться намеренно. **Язык.** Интерфейс и комментарии — русские, имена узлов, файлов и методов — английские. **Автозагрузки.** - `GameSettings` (`GameSettingsService`) — настройки: чтение, применение к движку, `user://settings.cfg` - `SaveManager` (`SaveManagerService`) — слоты сохранений в `user://saves/` У обеих есть `class_name`: константы и типы берутся через него, экземпляр — через `get_node("/root/GameSettings")`. Так редактор резолвит имена без перезапуска проекта. **Контракт игровой сцены.** Чтобы сцена умела сохраняться: ```gdscript func _ready() -> void: add_to_group(SaveManagerService.PERSIST_GROUP) SaveManager.begin_session(scene_file_path) func save_data() -> Dictionary: return {"...": ...} func load_data(data: Dictionary) -> void: ... ``` `SaveManager` обходит группу `persistent`, собирает словари по путям узлов и пишет JSON. Миниатюра слота — кадр, снятый в момент вызова паузы, до показа оверлея. **Действия ввода** (`project.godot` → Input Map): `move_left`, `move_right`, `move_up`, `move_down` (прокрутка камеры), `interact`, `pause`. Переназначаются в настройках; список в UI строится из `GameSettingsService.ACTION_LABELS`, так что новое действие нужно добавить и туда. **Рендерер** — Forward+ (по умолчанию). Для чистой 2D он избыточен, но оставляет запас на 3D-вставки и продвинутый пост-процессинг. Если понадобится максимальная лёгкость и веб-экспорт, осмысленный переход — не Mobile, а Compatibility (OpenGL); смена требует перезапуска редактора. **Слияния.** `.tscn` и `.tres` — текстовые, но построчный авто-мердж по ним даёт мусор. Конфликтующие сцены лучше разрешать, открывая обе версии в редакторе, а не в diff-вьювере. ## Что дальше - [x] Игровой слой на 2D: сетка комнат в разрезе, вид сбоку - [ ] Жители: найм, характеристики, расселение по комнатам - [ ] Время и производство: ресурсы должны копиться, а не только считаться в сводке - [ ] Слияние одинаковых соседних комнат, как в референсе - [ ] Стоимость строительства и ограничение по ресурсам - [ ] Графика вместо процедурной отрисовки в `vault_view.gd` - [ ] Звук: подключить шины Music и SFX - [ ] Лицензия не выбрана ## Лицензия Не определена. Плагин `addons/godot_ai` поставляется со своей лицензией — см. `addons/godot_ai/LICENSE`.