import { RpgRoomDescriptor, RpgWritableSignal } from '@rpgjs/common'; import { RpgPlayer } from '../Player/Player'; import { BaseRoom } from './BaseRoom'; import { RpgRoomConnection } from './map'; /** * Map-independent gameplay room with RPGJS players and synchronized state. * * The server owns `state`; clients receive it through `RpgClientRoom`. This * class deliberately excludes maps, events, movement, collisions, physics, * projectiles, and map loading. It works in standalone and MMORPG modes. * * @example * ```ts * @RpgRoom({ * kind: "battle", * path: "battle-{id}", * initialState: () => ({ turn: 1 }), * }) * class BattleRoom extends RpgGameplayRoom<{ turn: number }> { * @RpgRoomAction("battle.nextTurn") * nextTurn() { * this.state.update((state) => ({ turn: state.turn + 1 })) * } * } * ``` */ export declare class RpgGameplayRoom> extends BaseRoom { /** Low-level room id resolved from the registered path. */ readonly id: string; /** Path parameters extracted by the room runtime. */ readonly params: Readonly>; /** Serializable identity shared with the client scene. */ readonly descriptor: RpgRoomDescriptor; /** Players connected to this room, synchronized by the room runtime. */ players: RpgWritableSignal>; /** Server-authoritative state synchronized with every connected client. */ state: RpgWritableSignal; /** Whether Signe should automatically publish synchronized state changes. */ autoSync: boolean; private readonly clientListeners; constructor(room: { id?: string; env?: Record; }, params?: Record); onSessionRestore(payload: { userSnapshot: unknown; user?: RpgPlayer; }): Promise; onJoin(player: RpgPlayer, conn: RpgRoomConnection): Promise; onLeave(player: RpgPlayer, conn?: RpgRoomConnection | null): Promise; /** Subscribe to an ephemeral client action not handled by a decorated method. */ on(type: string, listener: (player: RpgPlayer, data: T) => void | Promise): void; /** Remove every room listener registered for an ephemeral client action. */ off(type: string): void; /** Broadcast an ephemeral packet to every client connected to this room. */ broadcast(type: string, value?: T): void; guiInteraction(player: RpgPlayer, value: { guiId: string; name: string; data: unknown; }): Promise; guiExit(player: RpgPlayer, value: { guiId: string; data?: unknown; guiOpenId?: unknown; }): void; onUnhandledAction(player: RpgPlayer, message: { action: string; value: unknown; }): Promise; } export interface RpgGameplayRoom> { $applySync(): void; $broadcast(packet: unknown, without?: string[]): void; $send(connection: RpgRoomConnection, packet: unknown): void; $sessionTransfer(connection: RpgRoomConnection, roomId: string): Promise; }