Remove unused assets and update project configuration. Deleted obsolete files including CLAUDE.md, README.md, default_bus_layout.tres, and various background images. Updated .editorconfig and .gitignore for improved project organization and asset management.

This commit is contained in:
Leonid Pershin
2026-08-12 09:44:32 +03:00
parent 2429e75967
commit 4c98764680
274 changed files with 13 additions and 10005 deletions
-151
View File
@@ -1,151 +0,0 @@
# CLAUDE.md
Заметки для агентов, работающих с этим репозиторием.
## Что это за проект
Двумерная игра с видом сбоку на Godot 4.7. Референс — Fallout Shelter: разрез убежища,
комнаты в сетке, жители. **Игра полностью 2D.** Новые игровые сцены — на `Node2D`/`Control`;
3D-узлам в проекте места нет. Рендерер при этом Forward+ — так решил владелец проекта,
не переключайте его без явной просьбы.
## Работа через MCP, а не через файлы
В проекте включён плагин `addons/godot_ai`, редактор Godot обычно запущен и подключён.
Сцены и ресурсы правьте инструментами MCP (`scene_manage`, `ui_manage`, `node_create`,
`theme_manage`, `resource_manage`), а не редактированием `.tscn` руками — иначе открытый
редактор перезапишет изменения при сохранении.
Скрипты — через `script_create` / `script_patch`: они возвращают диагностику парсера сразу.
Проверять результат — `project_run` + `editor_screenshot(source="game")`. Ввод в запущенную
игру шлётся через `game_manage(op="input_key")`; **`input_action` не двигает фокус Control-ов**,
для навигации по UI нужны настоящие события клавиш.
### Известные особенности
- `node_set_property` не принимает целочисленный `0` — используйте `batch_execute`
с командой `set_property`.
- Правка скрипта, который зарегистрирован автозагрузкой, даёт в ответе
`GDScript reload failed with error code 43`. Это неудачная горячая перезагрузка в редакторе,
а не ошибка разбора: проверяйте `logs_read(source="editor")`, игра при этом запускается чисто.
- `project_manage(op="settings_set")` отказывается менять `application/run/main_scene`.
- Большие `ui_manage(op="build_layout")` иногда не доезжают целиком — стройте дерево
несколькими вызовами поменьше.
- Запуск из редактора отдаёт встроенное окно: `Embedded window can't be resized` в логе — норма.
## Конвенции кода
- Отступы — табы (см. `.editorconfig`), статическая типизация везде, где возможно.
- Комментарии и весь UI-текст — по-русски; имена узлов, файлов, методов, сигналов — по-английски.
- Комментарий объясняет **почему**, а не пересказывает код.
- Приватные члены — с подчёркиванием: `_card`, `_focus_first_button()`.
- Документирующие комментарии `##` — на классах, сигналах и неочевидных методах.
## Архитектура UI
- Единая тема `themes/main_menu.theme.tres` на корне каждого экрана. Цвета в узлах не хардкодим.
- Экран = сцена со своим скриптом, наружу торчат `open()` / `close()` и сигнал `closed`.
- Оверлеи центрируются `CenterContainer`, а **не** пресетом `center`: пресет ставит левый
верхний угол карточки в центр экрана. Та же ловушка у `bottom_wide` — он прижимает к нижнему
краю *верх* панели, и она уезжает за экран; для нижней панели используйте `MarginContainer`
во весь экран + `HBoxContainer` с `size_flags_vertical = SIZE_SHRINK_END` у содержимого.
- Контейнеры не раскладывают скрытые узлы — после `visible = true` нужен
`await get_tree().process_frame`, прежде чем читать `size` (например, для `pivot_offset`).
- Наведение мышью делается фокусом (`mouse_entered``grab_focus`), чтобы у мыши и клавиатуры
была одна подсветка.
## Игровой слой
Файлы в `scripts/game/` разделены по принципу «данные и правила отдельно, отрисовка отдельно».
Модель и правила — без узлов и без `_draw()`:
- `vault_grid.gd` — сетка и комнаты. Сюда идут типы комнат, размещение, ресурсы.
Вертикальное смещение бункера под землю — константа `DEPTH`, её учитывают и
`cell_rect()`, и `cell_at()`, поэтому картинка и попадание мышью не разъезжаются.
- `game_clock.gd` — игровые дата и время, скорость, своя пауза. Такт наружу — сигнал
`minute_passed`; темп задаётся `MINUTES_PER_SECOND`.
- `weather_system.gd` — тип погоды, матрица переходов и плавная смена параметров.
Такт берёт у часов, поэтому стоит вместе с паузой. Форма осадков решается
температурой, а не месяцем: у нуля дождь становится снегом.
- `climate.gd` — сезонная норма температуры и ветра (средняя полоса Европы).
Перечисление погоды сюда не тянем — вышла бы циклическая ссылка.
- `sky_cycle.gd` — палитра неба по часу суток, положение солнца и луны. Чистые вычисления.
Отрисовка — только `_draw()`, читают модель и ничего не решают:
- `sky_view.gd` — градиент неба, звёзды, светила.
- `surface_view.gd` — поверхность: горы, холмы, деревья, облака, осадки.
- `vault_view.gd` — разрез: порода, корпус, шахта, комнаты, будка входа.
`vault_scene.gd` связывает всё это с камерой и HUD и держит контракт сохранения.
Новый тип комнаты добавляется одной записью в `VaultGrid.KINDS`: кнопка в панели строительства
и подсчёт ресурсов подхватятся сами. Новый тип погоды — записью в `WeatherSystem.KINDS`
плюс строкой в `TRANSITIONS`.
### Текстуры фона
**Ловушка с плиткой.** `draw_texture_rect(tex, rect, tile = true)` повторяет
текстуру в её натуральную величину и **по обеим осям**. Если растянуть
прямоугольник ради масштаба, текстура просто уложится в него несколько раз, и
на стыке копий пойдёт горизонтальная полоса через весь экран. Плюс при
`texture_repeat = ENABLED` фильтрация на краю подмешивает противоположный край
текстуры — ещё одна тонкая линия.
Поэтому полосы пейзажа кладутся плитками вручную. При этом важен ещё один
момент: крайние столбцы пикселей у этих текстур полупрозрачные от сглаживания,
и встык они складываются дважды, давая **вертикальную** линию. Отсюда
`EDGE_INSET` — плитки рисуются через `draw_texture_rect_region()` с отступом
в пиксель с каждой стороны, плюс пиксель нахлёста. Повтор на узле выключен.
`background/` — набор Kenney Background Elements. Два стиля, и они не взаимозаменяемы:
`PNG/Flat/*` — бледные, почти белые силуэты, их место на дальних планах, где цвет всё равно
задаётся тонировкой; `PNG/*` — цветные спрайты для ближнего плана. Перепутать легко: деревья
из Flat на переднем плане выглядят выцветшими.
## Консоль разработчика
Открывается тильдой или F1 в любой сцене, работает и на паузе. Сама об игре
ничего не знает: команды регистрируют сцены через `DevConsole.register(...)`,
и они умирают вместе со сценой — консоль выбрасывает команду, когда её
`Callable` протухает.
Команды игровой сцены живут в `vault_scene.gd`, в разделе «Команды консоли»:
`stats`, `time`, `date`, `speed`, `weather`, `temp`, `wind`, `build`, `wipe`.
У погоды есть латинские ключи (`snow`, `rain`, …) — набирать русские названия
с латинской раскладки посреди отладки неудобно.
### Файловый мост — как выполнять команды из MCP
Набрать команду через `game_manage(op="input_key")` нельзя: внедрённые события
доносят до `LineEdit` код клавиши, но не символ. Enter при этом проходит — то
есть дело не в фокусе. Поэтому в консоли есть мост через файлы в `user://`
(только `OS.is_debug_build()`, в релиз не попадает):
```bash
DIR="$APPDATA/Godot/app_userdata/GWorld"
printf 'weather storm\ntemp -3\nstats\n' > "$DIR/console_in.txt"
cat "$DIR/console_log.txt"
```
Консоль опрашивает `console_in.txt` четыре раза в секунду, выполняет строки и
удаляет файл. Весь вывод дублируется в `console_log.txt`, который
перезаписывается на каждый запуск игры. Работает и с закрытой консолью, и на
паузе.
## Автозагрузки
`GameSettings` (`GameSettingsService`), `SaveManager` (`SaveManagerService`)
и `DevConsole` (сцена `scenes/ui/dev_console.tscn`).
У обеих есть `class_name`: константы, перечисления и типы берём через него, экземпляр —
через `get_node("/root/...")`. Имя автозагрузки редактор не резолвит без перезапуска проекта.
Контракт сохранения игровой сцены описан в [README.md](README.md).
## Проверка
Изменения в UI считаются сделанными только после запуска и скриншота. Логи смотреть в обоих
источниках: `logs_read(source="game")` и `logs_read(source="editor")` — ошибки загрузки скриптов
попадают только во второй.