feat(engine): shuffle booster re-deals the tray
This commit is contained in:
@@ -227,4 +227,13 @@ class GameEngine {
|
|||||||
_checkStuck();
|
_checkStuck();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Booster: re-deals the tray. No move/score effect. Re-checks stuck so a
|
||||||
|
/// dead board with a hopeless tray can become playable again.
|
||||||
|
bool useShuffle() {
|
||||||
|
if (_phase == GamePhase.won || _phase == GamePhase.lost) return false;
|
||||||
|
_tray = _generator.nextTray(_grid);
|
||||||
|
_checkStuck();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,4 +46,24 @@ void main() {
|
|||||||
e.declineAndLose();
|
e.declineAndLose();
|
||||||
expect(e.useHammer(0, 0), isFalse);
|
expect(e.useHammer(0, 0), isFalse);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('useShuffle replaces the tray without spending a move or scoring', () {
|
||||||
|
final e = GameEngine(_stage());
|
||||||
|
final before = List.of(e.tray);
|
||||||
|
final score0 = e.score;
|
||||||
|
final moves0 = e.movesUsed;
|
||||||
|
|
||||||
|
final ok = e.useShuffle();
|
||||||
|
|
||||||
|
expect(ok, isTrue);
|
||||||
|
expect(e.tray.length, before.length);
|
||||||
|
expect(e.score, score0);
|
||||||
|
expect(e.movesUsed, moves0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('useShuffle is rejected after the attempt finishes', () {
|
||||||
|
final e = GameEngine(_stage());
|
||||||
|
e.declineAndLose();
|
||||||
|
expect(e.useShuffle(), isFalse);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user