+ let fadeout_pieces = [];
+ let fadein_pieces = [];
+ let move_pieces = [];
+ let squares_to_clear = [];
+ let squares_to_fill = {};
+ let removed_pieces = [];
+
+ for (var i = 0; i < a.length; i++) {
+ // clear a piece
+ if (a[i].type === 'clear') {
+ let square = a[i].square;
+ let piece = PIECE_ON_SQUARE[square];
+ if (piece) {
+ fadeout_pieces.push(piece);
+ squares_to_clear.push(square);
+ removed_pieces.push(piece);
+ }
+ }
+
+ // add a piece
+ if (a[i].type === 'add') {
+ let square = a[i].square;
+ let pos = findSquarePosition(square);
+ let piece = buildPiece(a[i].piece, true);
+ piece.style.left = pos.left;
+ piece.style.top = pos.top;
+ boardEl.append(piece);
+ squares_to_fill[square] = piece;
+ fadein_pieces.push(piece);
+ }
+
+ // move a piece
+ if (a[i].type === 'move') {
+ let piece = PIECE_ON_SQUARE[a[i].source];
+ move_pieces.push([piece, a[i].destination]);
+ squares_to_clear.push(a[i].source);
+ squares_to_fill[a[i].destination] = piece;
+
+ // This is O(n²), but OK.
+ let replaced_piece = PIECE_ON_SQUARE[a[i].destination];
+ if (replaced_piece && !a.some(e => e.type === 'move' && e.source === a[i].destination)) {
+ removed_pieces.push(replaced_piece);
+ }
+ }
+ }
+
+ for (const square of squares_to_clear) {
+ delete PIECE_ON_SQUARE[square];
+ }
+ for (const [square, piece] of Object.entries(squares_to_fill)) {
+ PIECE_ON_SQUARE[square] = piece;
+ piece.setAttribute('data-square', square);
+ }
+