@@ -7,6 +7,9 @@ var g_playerWhite = true;
77var g_changingFen = false ;
88var g_analyzing = false ;
99
10+ var g_uiBoard ;
11+ var g_cellSize = 45 ;
12+
1013function UINewGame ( ) {
1114 moveNumber = 1 ;
1215
@@ -19,11 +22,10 @@ function UINewGame() {
1922 g_backgroundEngine . postMessage ( "go" ) ;
2023 }
2124 g_lastMove = null ;
25+ RedrawBoard ( ) ;
2226
2327 if ( ! g_playerWhite ) {
2428 SearchAndRedraw ( ) ;
25- } else {
26- RedrawBoard ( ) ;
2729 }
2830}
2931
@@ -97,6 +99,8 @@ function UIPlayMove(move, pv) {
9799 MakeMove ( move ) ;
98100
99101 UpdatePVDisplay ( pv ) ;
102+
103+ UpdateFromMove ( move ) ;
100104}
101105
102106function UpdatePVDisplay ( pv ) {
@@ -125,7 +129,6 @@ function SearchAndRedraw() {
125129 g_backgroundEngine . postMessage ( "search " + g_timeout ) ;
126130 } else {
127131 Search ( FinishMove , 99 , null ) ;
128- setTimeout ( "RedrawBoard()" , 100 ) ;
129132 }
130133}
131134
@@ -146,7 +149,6 @@ function InitializeBackgroundEngine() {
146149 UpdatePVDisplay ( e . data . substr ( 3 , e . data . length - 3 ) ) ;
147150 } else {
148151 UIPlayMove ( GetMoveFromString ( e . data ) , null ) ;
149- RedrawBoard ( ) ;
150152 }
151153 }
152154 g_backgroundEngine . error = function ( e ) {
@@ -160,6 +162,98 @@ function InitializeBackgroundEngine() {
160162 return g_backgroundEngineValid ;
161163}
162164
165+ function UpdateFromMove ( move ) {
166+ var fromX = ( move & 0xF ) - 4 ;
167+ var fromY = ( ( move >> 4 ) & 0xF ) - 2 ;
168+ var toX = ( ( move >> 8 ) & 0xF ) - 4 ;
169+ var toY = ( ( move >> 12 ) & 0xF ) - 2 ;
170+
171+ if ( ! g_playerWhite ) {
172+ fromY = 7 - fromY ;
173+ toY = 7 - toY ;
174+ fromX = 7 - fromX ;
175+ toX = 7 - toX ;
176+ }
177+
178+ if ( ( move & moveflagCastleKing ) ||
179+ ( move & moveflagCastleQueen ) ||
180+ ( move & moveflagEPC ) ||
181+ ( move & moveflagPromotion ) ) {
182+ RedrawPieces ( ) ;
183+ } else {
184+ var fromSquare = g_uiBoard [ fromY * 8 + fromX ] ;
185+ $ ( g_uiBoard [ toY * 8 + toX ] )
186+ . empty ( )
187+ . append ( $ ( fromSquare ) . children ( ) ) ;
188+ }
189+ }
190+
191+ function RedrawPieces ( ) {
192+ for ( y = 0 ; y < 8 ; ++ y ) {
193+ for ( x = 0 ; x < 8 ; ++ x ) {
194+ var td = g_uiBoard [ y * 8 + x ] ;
195+ var pieceY = g_playerWhite ? y : 7 - y ;
196+ var piece = g_board [ ( ( pieceY + 2 ) * 0x10 ) + ( g_playerWhite ? x : 7 - x ) + 4 ] ;
197+ var pieceName = null ;
198+ switch ( piece & 0x7 ) {
199+ case piecePawn : pieceName = "pawn" ; break ;
200+ case pieceKnight : pieceName = "knight" ; break ;
201+ case pieceBishop : pieceName = "bishop" ; break ;
202+ case pieceRook : pieceName = "rook" ; break ;
203+ case pieceQueen : pieceName = "queen" ; break ;
204+ case pieceKing : pieceName = "king" ; break ;
205+ }
206+ if ( pieceName != null ) {
207+ pieceName += "_" ;
208+ pieceName += ( piece & 0x8 ) ? "white" : "black" ;
209+ }
210+
211+ if ( pieceName != null ) {
212+ var img = document . createElement ( "div" ) ;
213+ $ ( img ) . addClass ( 'sprite-' + pieceName ) ;
214+ img . style . backgroundImage = "url('img/sprites.png')" ;
215+ img . width = g_cellSize ;
216+ img . height = g_cellSize ;
217+ var divimg = document . createElement ( "div" ) ;
218+ divimg . appendChild ( img ) ;
219+
220+ $ ( divimg ) . draggable ( { start : function ( e , ui ) {
221+ if ( g_selectedPiece === null ) {
222+ g_selectedPiece = this ;
223+ var offset = $ ( this ) . closest ( 'table' ) . offset ( ) ;
224+ g_startOffset = {
225+ left : e . pageX - offset . left ,
226+ top : e . pageY - offset . top
227+ } ;
228+ } else {
229+ return g_selectedPiece == this ;
230+ }
231+ } } ) ;
232+
233+ $ ( divimg ) . mousedown ( function ( e ) {
234+ if ( g_selectedPiece === null ) {
235+ var offset = $ ( this ) . closest ( 'table' ) . offset ( ) ;
236+ g_startOffset = {
237+ left : e . pageX - offset . left ,
238+ top : e . pageY - offset . top
239+ } ;
240+ e . stopPropagation ( ) ;
241+ g_selectedPiece = this ;
242+ g_selectedPiece . style . backgroundImage = "url('img/transpBlue50.png')" ;
243+ } else if ( g_selectedPiece === this ) {
244+ g_selectedPiece . style . backgroundImage = null ;
245+ g_selectedPiece = null ;
246+ }
247+ } ) ;
248+
249+ $ ( td ) . empty ( ) . append ( divimg ) ;
250+ } else {
251+ $ ( td ) . empty ( ) ;
252+ }
253+ }
254+ }
255+ }
256+
163257function RedrawBoard ( ) {
164258 var div = $ ( "#board" ) [ 0 ] ;
165259
@@ -169,19 +263,17 @@ function RedrawBoard() {
169263
170264 var tbody = document . createElement ( "tbody" ) ;
171265
172- var cellSize = 45 ;
173-
174- var guiTable = new Array ( ) ;
266+ g_uiBoard = [ ] ;
175267
176268 var dropPiece = function ( e , ui ) {
177269 var endX = e . pageX - $ ( table ) . offset ( ) . left ;
178270 var endY = e . pageY - $ ( table ) . offset ( ) . top ;
179271
180- endX = Math . floor ( endX / cellSize ) ;
181- endY = Math . floor ( endY / cellSize ) ;
272+ endX = Math . floor ( endX / g_cellSize ) ;
273+ endY = Math . floor ( endY / g_cellSize ) ;
182274
183- var startX = Math . floor ( g_startOffset . left / cellSize ) ;
184- var startY = Math . floor ( g_startOffset . top / cellSize ) ;
275+ var startX = Math . floor ( g_startOffset . left / g_cellSize ) ;
276+ var startY = Math . floor ( g_startOffset . top / g_cellSize ) ;
185277
186278 if ( ! g_playerWhite ) {
187279 startY = 7 - startY ;
@@ -206,7 +298,6 @@ function RedrawBoard() {
206298 endX = 7 - endX ;
207299 }
208300
209-
210301 g_selectedPiece . style . left = 0 ;
211302 g_selectedPiece . style . top = 0 ;
212303
@@ -222,25 +313,15 @@ function RedrawBoard() {
222313 g_lastMove = move ;
223314 MakeMove ( move ) ;
224315
225- if ( ( move & moveflagCastleKing ) ||
226- ( move & moveflagCastleQueen ) ||
227- ( move & moveflagEPC ) ||
228- ( move & moveflagPromotion ) ) {
229- RedrawBoard ( ) ;
230- } else {
231- g_selectedPiece . parentNode . removeChild ( g_selectedPiece ) ;
232- if ( g_board [ ( move >> 8 ) & 0xFF ] != 0 ) {
233- $ ( guiTable [ endY * 8 + endX ] ) . empty ( ) ;
234- }
235- guiTable [ endY * 8 + endX ] . appendChild ( g_selectedPiece ) ;
236- }
316+ UpdateFromMove ( move ) ;
317+
318+ g_selectedPiece . style . backgroundImage = null ;
319+ g_selectedPiece = null ;
237320
238321 var fen = GetFen ( ) ;
239322 document . getElementById ( "FenTextBox" ) . value = fen ;
240323
241324 setTimeout ( "SearchAndRedraw()" , 0 ) ;
242-
243- g_selectedPiece = null ;
244325 }
245326 } ;
246327
@@ -249,73 +330,11 @@ function RedrawBoard() {
249330
250331 for ( x = 0 ; x < 8 ; ++ x ) {
251332 var td = document . createElement ( "td" ) ;
252- td . style . width = cellSize + "px" ;
253- td . style . height = cellSize + "px" ;
254-
255- var pieceY = g_playerWhite ? y : 7 - y ;
256- var piece = g_board [ ( ( pieceY + 2 ) * 0x10 ) + ( g_playerWhite ? x : 7 - x ) + 4 ] ;
257- var pieceName = null ;
258- switch ( piece & 0x7 ) {
259- case piecePawn : pieceName = "pawn" ; break ;
260- case pieceKnight : pieceName = "knight" ; break ;
261- case pieceBishop : pieceName = "bishop" ; break ;
262- case pieceRook : pieceName = "rook" ; break ;
263- case pieceQueen : pieceName = "queen" ; break ;
264- case pieceKing : pieceName = "king" ; break ;
265- }
266- if ( pieceName != null ) {
267- pieceName += "_" ;
268- pieceName += ( piece & 0x8 ) ? "white" : "black" ;
269- }
270-
271- if ( pieceName != null ) {
272- var img = document . createElement ( "div" ) ;
273- $ ( img ) . addClass ( 'sprite-' + pieceName ) ;
274- img . style . backgroundImage = "url('img/sprites.png')" ;
275- img . width = cellSize ;
276- img . height = cellSize ;
277- var divimg = document . createElement ( "div" ) ;
278- divimg . appendChild ( img ) ;
279- td . appendChild ( divimg ) ;
280-
281- $ ( divimg ) . draggable ( { start : function ( e , ui ) {
282- if ( g_selectedPiece === null ) {
283- g_selectedPiece = this ;
284- g_startOffset = {
285- left : e . pageX - $ ( table ) . offset ( ) . left ,
286- top : e . pageY - $ ( table ) . offset ( ) . top
287- } ;
288- } else {
289- return g_selectedPiece == this ;
290- }
291- } } ) ;
292-
293- $ ( divimg ) . mousedown ( function ( e ) {
294- if ( g_selectedPiece === null ) {
295- g_startOffset = {
296- left : e . pageX - $ ( table ) . offset ( ) . left ,
297- top : e . pageY - $ ( table ) . offset ( ) . top
298- } ;
299- e . stopPropagation ( ) ;
300- g_selectedPiece = this ;
301- g_selectedPiece . style . backgroundImage = "url('img/transpBlue50.png')" ;
302- } else if ( g_selectedPiece === this ) {
303- g_selectedPiece . style . backgroundImage = null ;
304- g_selectedPiece = null ;
305- }
306- } ) ;
307- }
308-
309- var bgColor = ( y ^ x ) & 1 ;
310- if ( bgColor ) {
311- td . style . backgroundColor = "#D18947" ;
312- }
313- else {
314- td . style . backgroundColor = "#FFCE9E" ;
315- }
316-
333+ td . style . width = g_cellSize + "px" ;
334+ td . style . height = g_cellSize + "px" ;
335+ td . style . backgroundColor = ( ( y ^ x ) & 1 ) ? "#D18947" : "#FFCE9E" ;
317336 tr . appendChild ( td ) ;
318- guiTable [ y * 8 + x ] = td ;
337+ g_uiBoard [ y * 8 + x ] = td ;
319338 }
320339
321340 tbody . appendChild ( tr ) ;
@@ -328,7 +347,9 @@ function RedrawBoard() {
328347 if ( g_selectedPiece !== null ) {
329348 dropPiece ( e ) ;
330349 }
331- } )
350+ } ) ;
351+
352+ RedrawPieces ( ) ;
332353
333354 $ ( div ) . empty ( ) ;
334355 div . appendChild ( table ) ;
0 commit comments