Skip to content

Commit f5d8935

Browse files
fix: play error
1 parent 5354c3c commit f5d8935

6 files changed

Lines changed: 40 additions & 60 deletions

File tree

src/contexts/PlayControllerContext.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export interface IPlayControllerContext extends BaseTreeControllerContext {
2424
makePlayerMove: ReturnType<typeof usePlayController>['makePlayerMove']
2525
updateClock: ReturnType<typeof usePlayController>['updateClock']
2626
setCurrentNode: ReturnType<typeof usePlayController>['setCurrentNode']
27-
addMove: ReturnType<typeof usePlayController>['addMove']
2827
addMoveWithTime: ReturnType<typeof usePlayController>['addMoveWithTime']
2928
}
3029

@@ -70,6 +69,5 @@ export const PlayControllerContext =
7069
goToNextNode: fn,
7170
goToPreviousNode: fn,
7271
goToRootNode: fn,
73-
addMove: fn,
7472
addMoveWithTime: fn,
7573
})

src/hooks/usePlayController/usePlayController.ts

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
Color,
3-
Check,
4-
GameNode,
5-
GameTree,
6-
Termination,
7-
PlayGameConfig,
8-
} from 'src/types'
1+
import { Color, Check, GameTree, Termination, PlayGameConfig } from 'src/types'
92
import { AllStats } from '../useStats'
103
import { PlayedGame } from 'src/types/play'
114
import { Chess, Piece, SQUARES } from 'chess.ts'
@@ -79,32 +72,36 @@ export const usePlayController = (id: string, config: PlayGameConfig) => {
7972
const [lastMoveTime, setLastMoveTime] = useState<number>(0)
8073

8174
const moveList = useMemo(
82-
() => controller.gameTree.toMoveArray(),
83-
[controller.gameTree, treeVersion],
75+
() => controller.tree.toMoveArray(),
76+
[controller.tree, treeVersion],
8477
)
8578

8679
const moveTimes = useMemo(
87-
() => controller.gameTree.toTimeArray(),
88-
[controller.gameTree, treeVersion],
80+
() => controller.tree.toTimeArray(),
81+
[controller.tree, treeVersion],
8982
)
9083

9184
const game: PlayedGame = useMemo(() => {
92-
const mainLine = controller.gameTree.getMainLine()
85+
const mainLine = controller.tree.getMainLine()
86+
console.log(mainLine)
9387
const lastNode = mainLine[mainLine.length - 1]
94-
const chess = controller.gameTree.toChess()
88+
const turn = lastNode.turn
89+
const chess = controller.tree.toChess()
90+
91+
console.log('gme node', lastNode.fen)
9592

9693
const termination = resigned
9794
? Math.min(whiteClock, blackClock) > 0
9895
? ({
99-
result: chess.turn() == 'w' ? '0-1' : '1-0',
100-
winner: chess.turn() == 'w' ? 'black' : 'white',
96+
result: turn == 'w' ? '0-1' : '1-0',
97+
winner: turn == 'w' ? 'black' : 'white',
10198
type: 'resign',
10299
} as Termination)
103-
: computeTimeTermination(chess, chess.turn() == 'w' ? 'white' : 'black')
100+
: computeTimeTermination(chess, turn == 'w' ? 'white' : 'black')
104101
: computeTermination(chess)
105102

106103
const moves = []
107-
const rootNode = controller.gameTree.getRoot()
104+
const rootNode = controller.tree.getRoot()
108105
const rootChess = new Chess(rootNode.fen)
109106
moves.push({
110107
board: rootNode.fen,
@@ -131,12 +128,11 @@ export const usePlayController = (id: string, config: PlayGameConfig) => {
131128

132129
return {
133130
id,
134-
moves,
135-
tree: controller.gameTree,
136131
termination,
137-
turn: chess.turn() == 'b' ? 'black' : 'white',
132+
tree: controller.tree,
133+
turn: turn == 'b' ? 'black' : 'white',
138134
}
139-
}, [controller.gameTree, treeVersion, resigned, whiteClock, blackClock, id])
135+
}, [controller.tree, treeVersion, resigned, whiteClock, blackClock, id])
140136

141137
const toPlay: Color | null = game.termination ? null : game.turn
142138
const playerActive = toPlay == config.player
@@ -228,33 +224,23 @@ export const usePlayController = (id: string, config: PlayGameConfig) => {
228224
whiteClock,
229225
])
230226

231-
const addMove = useCallback(
232-
(moveUci: string) => {
233-
const newNode = controller.gameTree.addMoveToMainLine(moveUci)
234-
if (newNode) {
235-
controller.setCurrentNode(newNode)
236-
// Force re-render by incrementing tree version
237-
setTreeVersion((prev) => prev + 1)
238-
}
239-
},
240-
[controller.gameTree, controller],
241-
)
242-
243227
const addMoveWithTime = useCallback(
244228
(moveUci: string, moveTime: number) => {
245-
const newNode = controller.gameTree.addMoveToMainLine(moveUci, moveTime)
229+
const newNode = controller.tree.addMoveToMainLine(moveUci, moveTime)
246230
if (newNode) {
231+
console.log('old node', controller.currentNode.fen)
232+
console.log('new move', moveUci)
233+
console.log('new node', newNode.fen)
247234
controller.setCurrentNode(newNode)
248-
// Force re-render by incrementing tree version
249235
setTreeVersion((prev) => prev + 1)
250236
}
251237
},
252-
[controller.gameTree, controller],
238+
[controller.tree, controller],
253239
)
254240

255241
const reset = () => {
256242
const newTree = new GameTree(config.startFen || nullFen)
257-
controller.gameTree = newTree
243+
controller.tree = newTree
258244
controller.setCurrentNode(newTree.getRoot())
259245
setResigned(false)
260246
setLastMoveTime(0)
@@ -278,7 +264,7 @@ export const usePlayController = (id: string, config: PlayGameConfig) => {
278264

279265
return {
280266
game,
281-
gameTree: controller.gameTree,
267+
gameTree: controller.tree,
282268
currentNode: controller.currentNode,
283269
player: config.player,
284270
playType: config.playType,
@@ -305,7 +291,6 @@ export const usePlayController = (id: string, config: PlayGameConfig) => {
305291
orientation: controller.orientation,
306292
setOrientation: controller.setOrientation,
307293

308-
addMove,
309294
addMoveWithTime,
310295
setResigned,
311296
reset,

src/hooks/usePlayController/useVsMaiaController.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export const useVsMaiaPlayController = (
3939
!controller.playerActive &&
4040
!controller.game.termination
4141
) {
42+
console.log('node before move', controller.currentNode.fen)
4243
const maiaClock =
4344
(controller.player == 'white'
4445
? controller.blackClock
@@ -125,10 +126,8 @@ export const useVsMaiaPlayController = (
125126
},
126127
)
127128

128-
// Only update stats after final move submitted
129129
if (controller.game.termination) {
130130
const winner = controller.game.termination?.winner
131-
// Safely update rating - only if the response contains a valid rating
132131
safeUpdateRating(response.player_elo, updateRating)
133132
incrementStats(1, winner == playGameConfig.player ? 1 : 0)
134133
}

src/hooks/useTreeController/useTreeController.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ export const useTreeController = (
55
gameTree: GameTree,
66
initialOrientation: Color = 'white',
77
) => {
8-
const [currentNode, setCurrentNode] = useState<GameNode>(gameTree.getRoot())
8+
const [tree, setTree] = useState(gameTree)
9+
const [currentNode, setCurrentNode] = useState<GameNode>(tree.getRoot())
910
const [orientation, setOrientation] = useState<Color>(initialOrientation)
1011

1112
const plyCount = useMemo(() => {
12-
if (!gameTree) return 0
13-
return gameTree.getMainLine().length
14-
}, [gameTree])
13+
if (!tree) return 0
14+
return tree.getMainLine().length
15+
}, [tree])
1516

1617
const goToNode = useCallback(
1718
(node: GameNode) => {
@@ -33,17 +34,17 @@ export const useTreeController = (
3334
}, [currentNode, setCurrentNode])
3435

3536
const goToRootNode = useCallback(() => {
36-
if (gameTree) {
37-
setCurrentNode(gameTree.getRoot())
37+
if (tree) {
38+
setCurrentNode(tree.getRoot())
3839
}
39-
}, [gameTree, setCurrentNode])
40+
}, [tree, setCurrentNode])
4041

4142
useEffect(() => {
4243
setOrientation(initialOrientation)
4344
}, [initialOrientation])
4445

4546
return {
46-
gameTree,
47+
tree,
4748
currentNode,
4849
setCurrentNode,
4950
orientation,

src/pages/play/maia.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import Head from 'next/head'
22
import { startGame } from 'src/api'
33
import { NextPage } from 'next/types'
44
import { useRouter } from 'next/router'
5+
import { tourConfigs } from 'src/constants/tours'
56
import { ModalContext, useTour } from 'src/contexts'
6-
import { useContext, useEffect, useMemo, useState } from 'react'
77
import { DelayedLoading, PlayControls } from 'src/components'
88
import { Color, TimeControl, PlayGameConfig } from 'src/types'
9+
import { useContext, useEffect, useMemo, useState } from 'react'
910
import { GameplayInterface } from 'src/components/Board/GameplayInterface'
1011
import { useVsMaiaPlayController } from 'src/hooks/usePlayController/useVsMaiaController'
1112
import { PlayControllerContext } from 'src/contexts/PlayControllerContext'
12-
import { tourConfigs } from 'src/constants/tours'
1313

1414
interface Props {
1515
id: string
@@ -100,7 +100,6 @@ const PlayMaiaPage: NextPage = () => {
100100
startFen,
101101
} = router.query
102102

103-
// simulateMaiaTime can be configured in setup modal, default to true if not specified
104103
const [simulateMaiaTime, setSimulateMaiaTime] = useState<boolean>(
105104
simulateMaiaTimeQuery === 'true' || simulateMaiaTimeQuery === undefined
106105
? true
@@ -132,7 +131,6 @@ const PlayMaiaPage: NextPage = () => {
132131
useEffect(() => {
133132
if (!initialTourCheck) {
134133
setInitialTourCheck(true)
135-
// Always attempt to start the tour - the tour context will handle completion checking
136134
startTour(tourConfigs.play.id, tourConfigs.play.steps, false)
137135
}
138136
}, [initialTourCheck, startTour])

src/types/tree.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ export class GameTree {
119119
const mainLine = this.getMainLine()
120120
const lastNode = mainLine[mainLine.length - 1]
121121

122-
const chess = new Chess(lastNode.fen)
123-
const result = chess.move(moveUci, { sloppy: true })
122+
const board = new Chess(lastNode.fen)
123+
const result = board.move(moveUci, { sloppy: true })
124124

125125
if (result) {
126126
return this.addMainMove(
127127
lastNode,
128-
chess.fen(),
128+
board.fen(),
129129
moveUci,
130130
result.san,
131131
undefined,
@@ -260,7 +260,6 @@ export class GameNode {
260260
return parseInt(parts[5]) - (turn === 'w' ? 1 : 0)
261261
}
262262

263-
// Core classification logic - used by both instance and static methods
264263
private performMoveClassification(
265264
stockfishEval: StockfishEvaluation,
266265
maiaEval: { [rating: string]: MaiaEvaluation } | undefined,

0 commit comments

Comments
 (0)