/* Copyright (c) 2022 Rune AI Inc. All rights reserved. This code is proprietary to Rune AI Inc. The code may be used solely for accessing the Service provided by Rune AI Inc. following the Rune Terms of Service ("Terms") accessible at rune.ai/eula. You may not use this code for any use or purpose other than as expressly permitted by the Terms. Restrictions set forth in the Terms include, but is not limited to, that you may not copy, adapt, modify, prepare derivative works based upon, distribute, license, sell, transfer, publicly display, publicly perform, transmit, stream, broadcast, attempt to discover any source code, reverse engineer, decompile, dissemble, or otherwise exploit the code as a whole or any portion of the code. */ type PersistedPlayers = Record; type PersistedUsers = Record; type GameStateWithPersisted = GameState & { persisted: PersistedPlayers; }; type UntypedPersistedData = {}; type UntypedGameState = Record; type UntypedGameStateWithPersisted = GameStateWithPersisted; type UntypedInitLogicAction = (params?: any) => void; type UntypedInitLogicActions = Record; type GameConfig = { landscape: boolean; minPlayers: number; maxPlayers: number; updatesPerSecond: number; eventCallbacks: { playerLeft: boolean; playerJoined: boolean; }; update: boolean; persistPlayerData: boolean; }; type SessionId = string; type GameId = number; type PlayerId = string; type RandomSeed = number; type Player = { playerId: PlayerId; displayName: string; avatarUrl: string; }; type Players = Record; type UserId = number; type Spectator = { playerId: undefined; }; type User = (Player | Spectator) & { userId: number; sdkProtocolVersion: number; }; type Users = Record; type Environment = "runtime" | "devUI" | "test"; type LogFn = { (obj: object, msg: string): void; (msg: string): void; }; type MsgLogger = { error: LogFn; warn: LogFn; info: LogFn; }; type ServerErrorMessage = keyof typeof errorMap; declare const errorMap: { GAME_OVER_INVALID_OPTIONS: { devUIMessage: string; consoleMessage: (data: any) => string; printExtraDataInDevUI: true; }; STATE_SYNC_TOO_BIG: { devUIMessage: (data: any) => string; }; SERVER_UPDATE_LOOP_FAILED: { devUIMessage: string; printExtraDataInDevUI: true; }; ACTION_FAILED: { devUIMessage: (data: any) => string; printExtraDataInDevUI: true; }; PLAYER_JOINED_FAILED: { devUIMessage: string; printExtraDataInDevUI: true; }; PLAYER_LEFT_FAILED: { devUIMessage: string; printExtraDataInDevUI: true; }; UPDATE_LOOP_BEHIND_GAME_TIME: { devUIUnexpected: true; }; SERVER_UPDATE_LOOP_FASTER_THAN_GAME_TIME: { devUIUnexpected: true; }; GET_GAME_STATE_FAILED: { devUIUnexpected: true; }; SERVER_RECEIVED_MESSAGE_TOO_BIG: { devUIUnexpected: true; }; SERVER_MESSAGE_TO_CLIENTS_TOO_BIG: { devUIUnexpected: true; }; SERVER_FULL: { devUIUnexpected: true; }; ON_PLAYER_JOINED_CALLBACK_MISSING: { devUIUnexpected: true; }; ROOM_GAME_STATE_MISSING: { devUIUnexpected: true; }; ACTION_PARAMS_SIZE_OVER_LIMIT: { devUIUnexpected: true; }; SETUP_PERSISTED_KEY_NOT_ALLOWED: { devUIMessage: string; }; PERSISTED_NOT_AN_OBJECT: { devUIMessage: string; }; PERSISTED_KEY_MISSING: { devUIMessage: string; }; PERSISTED_EXTRA_KEY_DETECTED: { devUIMessage: (data: any) => string; }; PERSISTED_PLAYER_MISSING: { devUIMessage: (data: any) => string; }; PERSISTED_PLAYER_NOT_AN_OBJECT: { devUIMessage: (data: any) => string; }; PERSISTED_PLAYER_OVER_LIMIT: { devUIMessage: (data: any) => string; }; SETUP_GAME_OVER_NOT_ALLOWED: { devUIMessage: string; }; PERSISTED_STATE_NOT_ENABLED: { devUIUnexpected: true; }; PERSISTED_STATE_USED_WITHOUT_FLAG: { devUIMessage: string; }; SETUP_FAILED: { devUIMessage: string; printExtraDataInDevUI: true; }; PERSIST_DATA_AFTER_ERROR_NOT_AVAILABLE: { devUIUnexpected: true; }; GET_PERSISTED_STATE_FAILED: { devUIUnexpected: true; }; GAME_END_PERSIST_USER_NOT_FOUND: { devUIUnexpected: true; }; PLAYER_LEFT_NO_USERS_INCORRECT_PERSISTED_PLAYERS: { devUIUnexpected: true; }; }; type GameOverResult = "WON" | "LOST" | "TIE" | number; type GameOverOptions = { delayPopUp?: boolean; minimizePopUp?: boolean; } & ({ players: { [playerId: PlayerId]: GameOverResult; }; everyone?: never; } | { players?: never; everyone: GameOverResult; }); type GameOverGameEnded = { reason: "gameEnded"; options: GameOverOptions; }; type GameOverPlayerLeft = { reason: "playerLeft"; }; type GameOverMinPlayers = { reason: "minPlayers"; }; type GameOverError = { reason: "err"; err?: { message: ServerErrorMessage; data?: object; }; }; type GameOverContext = (GameOverMinPlayers | GameOverPlayerLeft | GameOverGameEnded | GameOverError) & { players: Players; }; type ContextWithGameState = Context & { game: PersistedData extends false ? GameState : GameStateWithPersisted; }; type EventContext = { allPlayerIds: PlayerId[]; }; type UpdateContext = { allPlayerIds: PlayerId[]; }; type ActionContext = { playerId: PlayerId; allPlayerIds: PlayerId[]; }; type InitLogicEvent = (playerId: PlayerId, eventContext: ContextWithGameState) => void; type InitLogicEvents = { playerJoined?: InitLogicEvent; playerLeft?: InitLogicEvent; }; type InitLogicUpdate = (updateContext: ContextWithGameState) => void; type InitLogicActions = { [key in keyof GameActions]: (params: Parameters[0], actionContext: ContextWithGameState) => void; }; type InitLogicParams = { minPlayers: number; maxPlayers: number; landscape?: boolean; updatesPerSecond?: number; setup: (allPlayerIds: PlayerId[], context: PersistedData extends false ? undefined : { game: { persisted: PersistedPlayers; }; }) => GameState; actions: InitLogicActions; events?: InitLogicEvents; update?: InitLogicUpdate; inputDelay?: number; } & (PersistedData extends false ? { persistPlayerData?: false; } : { persistPlayerData: true; }); type SharedSdk = { initLogic: (params: InitLogicParams) => void; invalidAction: () => Error; gameOver: (options?: GameOverOptions) => void; /** @deprecated, use gameTime() */ gameTimeInSeconds: () => number; gameTime: () => number; }; type LogicRunnerContext = { randomSeed: RandomSeed; msPerTick: number; logicTick: number; }; type LogicRunnerResult = { error: "ROOM_GAME_STATE_MISSING"; } | { data: T; }; type LogicRunnerGameContext = { gameOver: GameOverContext | null; }; type LogicRunnerReturnContext = { gameContext: LogicRunnerGameContext; stateHash?: number; }; type LogicRunnerAction = (params: { roomId: number; logicContext: LogicRunnerContext; params: any; actionContext: ActionContext; calculateStateHash: boolean; }) => LogicRunnerResult; type LogicRunnerActions = Record; type PlayerJoinedEvent = (params: { roomId: number; logicContext: LogicRunnerContext; playerId: PlayerId; eventContext: EventContext; persistedPlayerState: UntypedPersistedData | null; calculateStateHash: boolean; }) => LogicRunnerResult; type PlayerLeftEvent = (params: { roomId: number; logicContext: LogicRunnerContext; playerId: PlayerId; eventContext: EventContext; calculateStateHash: boolean; }) => LogicRunnerResult | null; }>; type LogicRunnerEvents = { playerJoined?: PlayerJoinedEvent; playerLeft?: PlayerLeftEvent; }; type LogicRunnerUpdate = (params: { roomId: number; logicContext: LogicRunnerContext; updateContext: UpdateContext; }) => LogicRunnerResult; type LogicRunnerSetup = (params: { roomId: number; logicContext: LogicRunnerContext; playerIds: PlayerId[]; calculateStateHash: boolean; persistedPlayers: PersistedPlayers | null; }) => { gameState: UntypedGameStateWithPersisted; stateHash?: number; }; type SdkServer = { gameConfig?: GameConfig; setup?: LogicRunnerSetup; actions?: LogicRunnerActions; events?: LogicRunnerEvents; update?: LogicRunnerUpdate; logicContext: LogicRunnerContext; gameOverContext: GameOverContext | null; rehydrate: (roomId: number, gameState: UntypedGameStateWithPersisted) => void; getActionNames: () => string[]; getGameState: (roomId: number, calculateStateHash: boolean) => LogicRunnerResult<{ gameState: UntypedGameStateWithPersisted; stateHash?: number; }>; cleanup: (roomId: number) => void; runAction: (action: string, ...args: Parameters) => ReturnType; runPlayerJoinedEvent: (...args: Parameters) => ReturnType; runPlayerLeftEvent: (...args: Parameters) => ReturnType; getPersistedData: (roomId: number, playerIds: PlayerId[]) => LogicRunnerResult<{ persistedPlayers: PersistedPlayers; }>; } & SharedSdk; type TimelineEntryStart = { type: "START"; serverSeed: number; initialPlayers: Players; stateHash: number; persisted: PersistedPlayers | null; }; type TimelineEntryEnd = { type: "END"; gameState: UntypedGameStateWithPersisted | string; stateHash: number; reason: GameOverContext["reason"] | "stop"; }; type TimelineEntryWithSuccess = T & ({ success: false; } | { success: true; stateHash: number; }); type TimelineEntryWithoutOrder = { logicTick: number; } & (TimelineEntryStart | TimelineEntryEnd | TimelineEntryWithSuccess<{ type: "ACTION"; playerId: PlayerId; action: string; params: any; randomSeed: number; }> | TimelineEntryWithSuccess<{ type: "PLAYER_JOINED"; player: Player; persisted: UntypedPersistedData | null; }> | TimelineEntryWithSuccess<{ type: "PLAYER_LEFT"; playerId: PlayerId; }>); type TimelineEntry = TimelineEntryWithoutOrder & { order: number; }; type SdkProtocolVersion = number; type SdkMessageCodec = { encodeGameToServer(msg: GameToServer, compress: boolean): string; encodeServerToGame(msg: ServerToGame, compress: boolean): string; decodeGameToServer(msg: string, logger: MsgLogger | null): GameToServer | undefined; decodeServerToGame(msg: string, logger: MsgLogger | null): ServerToGame | undefined; }; type Only = { [P in keyof T]: T[P]; } & { [P in keyof U]?: never; }; type Either = Only | Only; type PlayersRandomState = Record; type GameContext = { readonly gameOver: GameOverContext | null; orderNumber: number; sessionId: SessionId; gameId: GameId; }; type ServerSerializationData = { game: GameStateWithPersisted; } & ServerState; type ServerState = { context: GameContext; random: PlayersRandomState; gameTime: number; updateCount: number; }; type UpdateLoopContext = { logicTick: number; }; type RunGameLogic = { getConfig: () => GameConfig; getActionNames: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; getGameState: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; getPersistedData: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runSetup: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runPlayerJoinedEvent: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runPlayerLeftEvent: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runAction: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; runUpdate: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; rehydrate: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; cleanup: (msgLogger: MsgLogger, ...args: Parameters) => Promise>; }; type GameServer = { onMsg: (msgLogger: MsgLogger, userId: UserId, msg: string, info: { serverPreprocessingDurationInMs: number; }) => Promise; onPlayerJoined: (msgLogger: MsgLogger, playerId: PlayerId, persistedUserData: PersistedData) => Promise; onPlayerLeft: (msgLogger: MsgLogger, playerId: PlayerId) => Promise; getDataForSerialization: (msgLogger: MsgLogger) => Promise>>; getConfig: () => GameConfig; getSessionId: () => SessionId; getGameId: () => GameId; getPersistedUsers: (msgLogger: MsgLogger, userIds?: UserId[]) => Promise>; isGameOver: () => boolean; onUpdateLoop: (msgLogger: MsgLogger, updateLoopContext: UpdateLoopContext) => Promise; cleanup: (msgLogger: MsgLogger) => Promise | null>; getCodec: () => SdkMessageCodec; }; type NetworkServer = { getUsers: () => Users; broadcastMsg: (msgLogger: MsgLogger, msg: string) => void; sendMsg: (msgLogger: MsgLogger, userId: UserId, msg: string) => void; queueUpdateLoop: (updateLoopContext: UpdateLoopContext) => void; onGameOver: (msgLogger: MsgLogger, reason: GameOverContext["reason"], persistedUsers: PersistedUsers | null) => void; onTimelineEntry?: (msgLogger: MsgLogger, timelineEntry: TimelineEntry) => void; getSeedForPlayerId?: (playerId: PlayerId) => number; }; type CreateGameServerProps = { initialMsgLogger: MsgLogger; network: NetworkServer; logic: RunGameLogic; flags: { logServerClientGameTime?: boolean; logNetworkMsg?: boolean; logWrongTick?: boolean; logNetworkMsgSize?: boolean; sendInitialStateSync?: boolean; sendStateHash?: boolean; isPersistFeatureEnabled: boolean; }; params: { sessionId: string | null; roomId: number; gameId: GameId; serverSeed: RandomSeed; } & Either<{ persistedUsers: PersistedUsers; }, { initialServerData: ServerSerializationData; }>; config: { logicTimeoutDuration?: number | false; allowedGameTimeDelay?: number; gameTimeUpdateEveryXTicks?: number; environment: Environment; sdkProtocolVersion: SdkProtocolVersion; }; }; type ServerToGameBase = { orderNumber: number; serverGameTime: number; logicTick: number; }; type OnChangeMsgAction = { [Key in keyof GameActions]: { action: Key; playerId: PlayerId; params: Parameters[0]; }; }[keyof GameActions]; type ActionBase = { uuid: string; actionCount: number; sessionId: SessionId; randomSeed: RandomSeed; measureLatencyStart: number; }; type GameToServerAction = OnChangeMsgAction & ActionBase & { clientGameTime: number; expectedLogicTick: number; }; type ServerToGameAction = ServerToGameBase & OnChangeMsgAction & ActionBase & { stateHash: number | undefined; }; type OnChangeStateSyncEvent = { event: "stateSync"; }; type ServerToGameGameTimeUpdate = ServerToGameBase & { event: "gameTimeUpdate"; params: { gameContext: GameContext; }; }; type ServerToGameLatencyEstimate = { event: "latencyEstimate"; measureLatencyStart: number; serverGameTime: number; }; type ServerToGameStopGameEvent = { event: "debugStopGame"; }; type ServerToGameStateSyncEvent = ServerToGameBase & OnChangeStateSyncEvent & { params: { game: GameStateWithPersisted; gameContext: GameContext; players: Players; pastPlayerIds: PlayerId[]; yourPlayerSeed: RandomSeed | undefined; yourPlayerActionCount: number | undefined; yourPlayerId: PlayerId | undefined; serverSeed: RandomSeed; triggeredByUpdateLoop: boolean; measureLatencyStart?: number; latencyRttEstimate?: number; }; dictionary?: string[]; }; type OnChangePlayerJoinedEvent = { event: "playerJoined"; params: { playerId: PlayerId; }; }; type ServerToGamePlayerJoinedEvent = ServerToGameBase & OnChangePlayerJoinedEvent & { params: { playerId: PlayerId; gameContext: GameContext; players: Players; randomSeed: RandomSeed; stateHash: number | undefined; persistedPlayerState?: UntypedPersistedData; }; }; type OnChangePlayerLeftEvent = { event: "playerLeft"; params: { playerId: PlayerId; }; }; type ServerToGamePlayerLeftEvent = ServerToGameBase & OnChangePlayerLeftEvent & { params: { playerId: PlayerId; gameContext: GameContext; players: Players; randomSeed: RandomSeed; stateHash: number | undefined; }; }; type ServerToGameOnChangeTriggeringEvent = ServerToGameStateSyncEvent | ServerToGamePlayerJoinedEvent | ServerToGamePlayerLeftEvent; type ServerToGameEvent = ServerToGameOnChangeTriggeringEvent | ServerToGameGameTimeUpdate | ServerToGameLatencyEstimate | ServerToGameStopGameEvent; type ServerToGame = ServerToGameAction | ServerToGameEvent; type GameToServer = GameToServerAction | GameToServerStateSyncRequest | { type: "MEASURE_LATENCY"; measureLatencyStart: number; } | { type: "DEBUG_TIMELINE"; data: any; }; type GameToServerStateSyncRequest = { type: "REQUEST_STATE_SYNC"; measureLatencyStart: number; gameId: number | null; }; declare function generateId(length?: number): string; declare function isNewUserSpectator(users: Users, gameConfig: GameConfig, isGameOver: boolean): boolean; declare function canSwitchSpectatorToPlayer(users: Users, gameConfig: GameConfig): boolean; declare function createSdkForLogicRunner(environment: Environment): SdkServer; declare function createGameServer({ initialMsgLogger, params: { gameId, roomId, sessionId, initialServerData, serverSeed, persistedUsers, }, flags: { sendStateHash: sendStateHashFlag, logWrongTick, logNetworkMsg, logNetworkMsgSize, sendInitialStateSync, isPersistFeatureEnabled, }, config: { logicTimeoutDuration, allowedGameTimeDelay, gameTimeUpdateEveryXTicks, environment, sdkProtocolVersion, }, network, logic, }: CreateGameServerProps): Promise>; export { CreateGameServerProps, GameConfig, GameId, GameOverContext, GameServer, MsgLogger, PersistedUsers, Player, RunGameLogic, SdkServer, ServerSerializationData, SessionId, UntypedGameState, UntypedGameStateWithPersisted, UntypedPersistedData, User, canSwitchSpectatorToPlayer, createGameServer, createSdkForLogicRunner, generateId, isNewUserSpectator };