Команды сцены
Передадим команде координаты и слот фигуры.
CommandBus находит команду по имени из FSM и передаёт ей доступ к текущей сцене.
Для размещения нужны слот и координаты. В PlaceBlockCommand.ts используется BaseTypedCommand:
import { BaseTypedCommand } from '@gamedevland/engine/commands';
import { BlockPuzzleServices } from '../BlockPuzzleServices';
import { BlockPuzzleEventSchemas } from '../configs/event.schemas';
import type { InferDecoded } from '@gamedevland/engine/validation';
type PlaceBlockCommandPayload = InferDecoded<
typeof BlockPuzzleEventSchemas.PlacementRequest
>;
export class PlaceBlockCommand extends BaseTypedCommand<PlaceBlockCommandPayload> {
protected override readonly inputDecoder =
BlockPuzzleEventSchemas.PlacementRequest;
protected override execute(payload: PlaceBlockCommandPayload): void {
this.getSceneService(BlockPuzzleServices.Gameplay).place(payload);
}
}
01
FSMЗапускает PlaceBlockCommand с событием
02
inputDecoderПроверяет slotId и anchor
03
executeПолучает проверенный payload
04
Gameplay.placeПроверяет фигуру и свободные клетки, применяет ход
В CommandsGroup укажем то же имя команды, что и в конфиге FSM.
BaseTypedCommand проверяет данные через inputDecoder перед вызовом execute.
Если команда возвращает Promise, FSM ждёт её завершения перед обработкой следующего события.