Implement weather system and developer console features. Added functionality for setting weather conditions, temperature, and wind speed through a new developer console. Enhanced the vault scene to display current weather, temperature, and wind information, and updated game clock to allow time manipulation. Improved cloud rendering and introduced a new climate management system for seasonal temperature adjustments.

This commit is contained in:
Leonid Pershin
2026-08-11 11:37:56 +03:00
parent a81747781d
commit 3b886ab3ab
14 changed files with 928 additions and 63 deletions
+49 -2
View File
@@ -67,7 +67,10 @@
- `game_clock.gd` — игровые дата и время, скорость, своя пауза. Такт наружу — сигнал
`minute_passed`; темп задаётся `MINUTES_PER_SECOND`.
- `weather_system.gd` — тип погоды, матрица переходов и плавная смена параметров.
Такт берёт у часов, поэтому стоит вместе с паузой.
Такт берёт у часов, поэтому стоит вместе с паузой. Форма осадков решается
температурой, а не месяцем: у нуля дождь становится снегом.
- `climate.gd` — сезонная норма температуры и ветра (средняя полоса Европы).
Перечисление погоды сюда не тянем — вышла бы циклическая ссылка.
- `sky_cycle.gd` — палитра неба по часу суток, положение солнца и луны. Чистые вычисления.
Отрисовка — только `_draw()`, читают модель и ничего не решают:
@@ -84,14 +87,58 @@
### Текстуры фона
**Ловушка с плиткой.** `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`).
`GameSettings` (`GameSettingsService`), `SaveManager` (`SaveManagerService`)
и `DevConsole` (сцена `scenes/ui/dev_console.tscn`).
У обеих есть `class_name`: константы, перечисления и типы берём через него, экземпляр —
через `get_node("/root/...")`. Имя автозагрузки редактор не резолвит без перезапуска проекта.