animate method
Animates piece forward by steps cells, invoking onStep after
each cell lands. Awaiting this future means all steps are complete.
onStep receives the new trackPosition after each step.
Implementation
Future<void> animate({
required LudoPiece piece,
required int steps,
required void Function(int newTrackPosition) onStep,
}) async {
_cancelled = false;
int current = piece.trackPosition;
for (var i = 0; i < steps; i++) {
if (_cancelled) break;
current++;
onStep(current);
await Future.delayed(Duration(milliseconds: stepDurationMs));
}
}