BaseCommand и BaseTypedCommand09 / 13

Команды сцены

Передадим команде координаты и слот фигуры.

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Проверяет фигуру и свободные клетки, применяет ход
Проверка структуры происходит до execute; проверка правил — внутри сервиса и домена.

В CommandsGroup укажем то же имя команды, что и в конфиге FSM.

BaseTypedCommand проверяет данные через inputDecoder перед вызовом execute.

Если команда возвращает Promise, FSM ждёт её завершения перед обработкой следующего события.

Источники ↗

Block Puzzle · PlaceBlockCommand.ts↗Команда игры.