Skip to main content

Module abi

Module abi 

Source
Expand description

export_game_core_abi! — генерирует #[wasm_bindgen] impl для игрового GameCore, снимая ~25-метод boilerplate, зафиксированный §3.4 PLAN.md. Все методы ниже — механические 1:1-делегации в уже generic EngineSim<G>/SnapshotPacker, чья сигнатура зафиксирована трейтом crate::sim::GameSim<G> независимо от конкретной игры — не дизайн под гипотетическую вторую игру, а извлечение уже существующего соответствия (см. PLAN_4_details.md §5).

Контракт: тип-цель обязан иметь поля state: vimp_engine_core::game::EngineSim<G> (под именем EngineSim<...>, конкретный G — забота игрового crate) и packer: vimp_engine_core::snapshot::SnapshotPacker, и раскрываться в модуле, где уже подключён wasm-bindgen как зависимость (пути ниже квалифицированы через ::wasm_bindgen, поэтому не зависят от локальных use, но зависят от наличия крейта в Cargo.toml вызывающей стороны). new (парсинг игрового конфига) и не-#[wasm_bindgen] тестовые аксессоры в макрос не входят — остаются рукописными в game-crate.

Constants§

ABI_DESCRIBE_VERSION
Версия формата самоописания (abi_describe), не контракта плагина.
CORE_VERSION
Версия крейта движка, с которым собрано ядро. Внутри макроса env! раскрылся бы в версию крейта ИГРЫ — поэтому константа живёт здесь.
ENGINE_CLIENT_OPS
То же для клиентского макроса.
ENGINE_GAME_OPS
Движковые опкоды dispatch, которые умеет это раскрытие игрового макроса. Список растёт вместе с движком: игра, пересобранная с новым крейтом, получает их без единой правки своего исходника.
OP_DEBUG_JSON
Имя опкода читается ТОЛЬКО отсюда — как на JS-стороне из src/config/abiOps.js (ABI_OP_DEBUG_JSON). Литерал, написанный руками и в списке, и в match обработчика, разъезжается молча: ядро объявляет опкод, которого не обрабатывает, движок видит «не обработан» и уходит на запасной путь, ничего не сказав.

Functions§

describe_json
JSON самоописания ядра: версия формата, версия движкового крейта и объединённый список опкодов (движковые + объявленные игрой).
dispatch_result
Соглашение о возврате dispatch: пустой вектор — «опкод не обработан» (вызывающий идёт по запасному пути), однобайтовый маркер [0x00] — «обработан, ответа нет».