Improve triple-leg-move animation
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 8 Mar 2016 16:20:21 +0000 (17:20 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 8 Mar 2016 18:29:58 +0000 (19:29 +0100)
When both locust squares (kill and kill2) are set, animation now takes
place in three stages. As kill2 is not retreived when stepping through
the game history, this works only for moves just entered or played by
the engine. Replayed moves are still animated in 2 stages, though, which
does look pretty good on 2-out-1-in moves.

board.c

diff --git a/board.c b/board.c
index f0cb1c6..9bce22f 100644 (file)
--- a/board.c
+++ b/board.c
@@ -600,7 +600,7 @@ void
 AnimateMove (Board board, int fromX, int fromY, int toX, int toY)
 {
   ChessSquare piece;
-  int hop, x = toX, y = toY;
+  int hop, x = toX, y = toY, x2 = kill2X;
   Pnt      start, finish, mid;
   Pnt      frames[kFactor * 2 + 1];
   int        nFrames, startColor, endColor;
@@ -621,6 +621,7 @@ AnimateMove (Board board, int fromX, int fromY, int toX, int toY)
   piece = board[fromY][fromX];
   if (piece >= EmptySquare) return;
 
+  if(x2 >= 0) toX = kill2X, toY = kill2Y; else
   if(killX >= 0) toX = killX, toY = killY; // [HGM] lion: first to kill square
 
 again:
@@ -663,6 +664,7 @@ again:
   /* Be sure end square is redrawn */
   damage[0][toY][toX] |= True;
 
+  if(toX == x2 && toY == kill2Y) { fromX = toX; fromY = toY; toX = killX; toY = killY; x2 = -1; goto again; } // second leg
   if(toX != x || toY != y) { fromX = toX; fromY = toY; toX = x; toY = y; goto again; } // second leg
 }