🌳
pt0/gamesapp/serverF/gameState/doGetOldGame.mts
1import * as _ from 'lodash-es'
11type GetOldGameProps = {
12 id: string
13 isEphemeralGame?: boolean
14 settings?: Record<string, unknown>
17export const getGameStateAtIdx = async (props: GetOldGameProps) => {
18 const oldGame = await doGetOldGame(props)
19 if (!oldGame) return
20 const {
21 gqGameState,
22 ...rest
23 } = oldGame
25 return {
26 ...gqGameState,
27 ...rest,
28 }
31export const getApplyToIdx = () => (global as any).apply2Idx
32export const setApplyToIdx = (newval: number) => (global as any).apply2Idx = newval
34type ApplyHistActionParams = {
35 gameActionHistA: GameActionH[]
36 gqActionsHistA: GameActionH[]
37 existingGame: any
38 curActionId: number
41export const applyGameHistActionIdx = async ({gameActionHistA, gqActionsHistA, existingGame, curActionId}: ApplyHistActionParams) => {
42 const gameActionH = gameActionHistA[curActionId]
44 existingGame, gameActionH, gameRoom: undefined,
45 })
46 gqActionsHistA.push(gameActionH)
49type GameStateFromActionParams = {
50 gameActionHistA: GameActionH[]
51 cpGameStateH: {id: string; isEphemeralGame?: boolean; settings?: Record<string, unknown>}
54export const gameStateFromActionA = async ({gameActionHistA, cpGameStateH}: GameStateFromActionParams) => {
55 let applyToIdx = getApplyToIdx()
56 let curActionId = 0
57 let existingGame = _.clone({...mkBaseGameState(), ...cpGameStateH})
58 if (!_.isInteger(applyToIdx)) {
59 applyToIdx = gameActionHistA.length - 1
60 }
61 let gqActionsHistA: GameActionH[] = []
62 while (curActionId <= applyToIdx) {
63 await applyGameHistActionIdx({gameActionHistA, gqActionsHistA, existingGame, curActionId})
64 curActionId++
65 }
66 return {gqGameState: existingGame, gqActionsHistA, gameActionHistA}
69export const isReplayGameCtx = genContext<{isReplay: boolean} | undefined>()
71export const doGetOldGame = async ({id, isEphemeralGame, settings}: GetOldGameProps) => {
72 const db = getGamesDb()
73 const ret = await db.selectFrom('dbgames')
74 .where('id', '=', id)
75 .select(['game_state'])
76 .executeTakeFirst()
77 if (!ret) return
78 const {gameActionHistA} = ret.game_state as GameStateJson
79 const replaySettings = settings || getGameSettings(getPubEnv())
81 if (gameActionHistA) {
82 return await gameStateFromActionA({
83 gameActionHistA, cpGameStateH: {id, isEphemeralGame, settings: replaySettings},
84 })
85 }
86 const {game_state} = ret // support old game fmt
87 return {gqGameState: game_state}