feat(fx): play ambient Control sound commands
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s

This commit is contained in:
Valentin Popov committed 2026-10-31 22:06:49 +04:00
1 parent 3f4059b726
commit 7ba8a0d84e
7 files changed
+573 -24

No files matched your search

+4
View File
@@ -70,6 +70,10 @@ Control Op1 пока использует цвет и радиус без слу
это явное приближение считается в `render_coverage control_op1_jitter_unsupported`.
Масштаб радиуса длиной преобразованного направления и нижняя замена 0,01 восстановлены.
Control Op2 воспроизводит modes 0/2; modes 1/3, body+76 и неподдержанные
time modes/привязки считаются как `render_coverage control_op2_unsupported`.
Управление фазой экземпляра командами Control остаётся до его подключения в runtime.
Размеры команд, resource references, lifecycle, flags families и используемые
time modes известны. Не закрыто значение каждого поля body opcodes 1--10,
отсутствующий во всех проверенных каталогах opcode 6 и точные формулы редких
+35
View File
@@ -218,6 +218,41 @@ OneShot -> воспроизвести разовый звук молни
отдельный spatial source, применяет DirectSound range/pan и текущий listener.
Отсутствие устройства вывода не должно останавливать симуляцию.
### Звуки Control
Команда Op2 может принадлежать не погоде, а экземпляру эффекта на узле модели.
`fparkan-fx::ambient_sound` хранит её временное окно и предыдущее значение
фазы. В режиме 0 разовый звук начинается при строгом пересечении начала окна:
`previous <= start && start < phase`, если фаза движется вперёд. Значение
`phase == 1` для этой проверки заменяется нулём и подготавливает следующий
цикл. Режим 2 включает loop на обеих границах окна; внутри окна уже работающий
источник обновляется, а не запускается заново. Выход за окно останавливает его.
Позиция интерполируется между двумя локальными точками и проходит через ту же
матрицу владельца, что и графические команды. Минимальная и максимальная
дистанции остаются постоянными; частота интерполируется по фазе окна.
Каждая команда получает отдельный источник звука, даже если ресурс совпадает
с ресурсом соседней команды. Дождь сохраняет свой loop. Перемещение слушателя,
потеря фокуса и завершение приложения затрагивают все эти источники.
Эти ветви восстановлены в GOG `Effect.dll` (сборка из
[таблицы бинарников](original-binaries.md)): init RVA `0x12D10`, update
`0x12EB0`. Живой loop `sounds.lib:f_defl.wav` передаёт в звуковой backend
диапазон `12/80`, частоту `1` и мировую позицию из матрицы владельца.
В режиме 2 признак loop берётся из первого DWORD body, а не из command flag.
Обычное создание эффекта Control сохраняет time mode заголовка и задаёт
постоянную фазу нулём. Raw selector строки служит ID экземпляра, а не номером
режима времени. Поэтому `f_comp_sfx` с time mode 0 и началом окна `0.001`
остаётся тихим до управляющей команды Control. Preview такие команды ещё не
исполняет. Периодические звуки с time mode 2 уже следуют общим часам и текущей
позе узла. `render_coverage control_op2_supported` считает подготовленные
команды, а `control_sound_start/stop` показывает фактические переходы.
Неизвестные backend modes 1/3, ненулевое поле body+76, неподдержанное время
или привязка владельца пропускаются с `render_coverage control_op2_unsupported`.
Они не заменяются разовым звуком или произвольным loop.
## Цвет солнца
Солнце берёт цвет спрайта и прозрачность бликов из `palette[10]` расписания
+11
View File
@@ -845,6 +845,17 @@ projected shadows. Радиус источника масштабируется
синий свет завода почти незаметным. Неположительный итог заменяется на 0,01.
Случайные добавки к цвету и радиусу пока явно считаются в
`render_coverage control_op1_jitter_unsupported`.
Эффект может одновременно рисовать поверхность и издавать звук. Для Op2
приложение создаёт отдельный звуковой источник у каждого экземпляра команды:
несколько одинаковых механизмов слышны одновременно и не заменяют дождь.
Позиция следует анимируемому узлу, а фаза включает, обновляет и останавливает
loop. Обычная строка Control создаёт экземпляр с нулевой постоянной фазой;
звуки с таким режимом ожидают отдельной управляющей команды. Периодические
звуки работают по часам уже в preview. Устройство вывода остаётся в приложении,
а правила переходов и параметров — в `fparkan-fx::ambient_sound`
([подробнее](../reference/environment-effects.md#звуки-control)).
Туман также зависит от расстояния нелинейно: между ближней и дальней границами
движок интерполирует по квадрату дистанции. При границах 0 и 700 точка в 350
получает четверть тумана, а не половину. Это сохраняет контраст среднего плана.