import { RpgProvider, RpgProviders, RpgRoomDescriptor, RpgRoomTarget } from '@rpgjs/common'; /** Runtime context supplied when RPGJS creates a registered gameplay room. */ export interface RpgRoomConstructorContext { id?: string; env?: Record; } /** Constructor for an RPGJS gameplay room. */ export type RpgRoomClass = new (room: RpgRoomConstructorContext, params?: Record) => T; /** Options understood by the RPGJS-owned room decorator. */ export interface RpgRoomOptions { /** Stable kind used by server transfers and client scene selection. */ kind: string; /** Signe room path. Placeholders are resolved by `changeRoom()`. */ path: string; /** Persist synchronized room state across room hibernation or restart. */ persistState?: boolean; /** Create the initial synchronized state for a gameplay room instance. */ initialState?: () => TState; } /** Read-only registration metadata attached by {@link RpgRoom}. */ export type RpgRoomMetadata = Readonly>; /** * Declare a server room through the stable RPGJS API. * * The decorator keeps Signe metadata internal while exposing the room kind to * RPGJS registration, session transfer, diagnostics, and client scene routing. * It works in standalone and MMORPG runtimes. * * @example * ```ts * @RpgRoom({ * kind: "battle", * path: "battle-{id}", * initialState: () => ({ turn: 1 }), * }) * class BattleRoom extends RpgGameplayRoom<{ turn: number }> {} * ``` */ export declare function RpgRoom(options: RpgRoomOptions): ClassDecorator; /** * Register a server-authoritative action on an RPGJS gameplay room. * * @param name - Packet action name sent by the client. * @returns A method decorator backed internally by Signe rooms. * * @example * ```ts * @RpgRoomAction("battle.nextTurn") * nextTurn(player: RpgPlayer) { * this.state.update((state) => ({ ...state, turn: state.turn + 1 })) * } * ``` */ export declare function RpgRoomAction(name: string): MethodDecorator; /** * Add custom gameplay-room classes to an RPGJS server bootstrap. * * Registered rooms own authoritative state and actions in both standalone and * MMORPG modes. Each room kind must have a corresponding client scene. * * @param rooms - Concrete `RpgGameplayRoom` subclasses decorated with `@RpgRoom()`. * @returns An RPGJS provider installed in the server configuration. * * @example * ```ts * createServer({ * providers: [provideServerRooms([BattleRoom])], * }) * ``` */ export declare function provideServerRooms(rooms: RpgRoomClass[]): RpgProvider; export declare function getRpgRoomMetadata(roomClass: RpgRoomClass): RpgRoomMetadata | undefined; export declare function collectProvidedServerRooms(providers: RpgProviders): RpgRoomClass[]; /** Runtime registry shared by room diagnostics and player transfers. */ export declare class RpgRoomRegistry { private readonly definitions; private readonly paths; constructor(roomClasses: RpgRoomClass[]); get roomClasses(): RpgRoomClass[]; getMetadata(kind: string): RpgRoomMetadata | undefined; describe(target: RpgRoomTarget): RpgRoomDescriptor; describeId(id: string): RpgRoomDescriptor | undefined; }