@@ -223,36 +223,38 @@ abstract class Variant private[variant] (
223
223
- 2nd direction : we know what direction we want to apply to all these 2 or 3 marbles
224
224
*/
225
225
private def piecesAfterAction (pieces : PieceMap , orig : Pos , dest : Pos , directions : Directions ): (PieceMap ) = {
226
- val lineDir : Option [Direction ] = directions.headOption
227
- val sideDir : Option [Direction ] = directions.reverse.headOption
228
- val origLineMove : Option [Pos ] = lineDir.map((direction) => direction(orig).get)
229
- val origSideMove : Option [Pos ] = sideDir.map((direction) => direction(orig).get)
230
- val diagonalMove : Option [Pos ] = (lineDir, origSideMove) match {
226
+ val lineDir : Option [Direction ] = directions.headOption
227
+ val sideDir : Option [Direction ] = directions.reverse.headOption
228
+ val origLineMove : Option [Pos ] = lineDir.flatMap(direction => direction(orig))
229
+ val origSideMove : Option [Pos ] = sideDir.flatMap(direction => direction(orig))
230
+ val destLineMove : Option [Pos ] = lineDir.flatMap(direction => direction(dest))
231
+ val destLineOneMove : Option [Pos ] = lineDir.flatMap(direction => if (destLineMove.isDefined) direction(destLineMove.get) else None )
232
+ val destLineTwoMove : Option [Pos ] = lineDir.flatMap(direction => if (destLineOneMove.isDefined) direction(destLineOneMove.get) else None )
233
+ val origDiagonalMove : Option [Pos ] = (lineDir, origSideMove) match {
231
234
case ( Some (lineDir), Some (sideMove) ) => lineDir.apply(sideMove)
232
235
case _ => None
233
236
}
234
237
235
238
if (directions.size == 0 ) // line move
236
239
pieces + (dest -> pieces(orig)) - (orig)
237
240
else if (directions.size == 1 ) // push
238
- if (directions(0 )(dest) == None ) // __(_)o\
239
- pieces + (dest -> pieces(orig)) - orig
240
- else if (! pieces.contains(directions(0 )(dest).get)) // __(_)o.
241
- pieces + (directions(0 )(dest).get -> pieces(dest)) + (dest -> pieces(orig)) - orig
242
- else if (directions(0 )((directions(0 )(dest)).get) == None ) // ___oo\
243
- pieces + ((directions(0 )(dest)).get -> pieces(dest)) + (dest -> pieces(orig)) - orig
244
- else // ___oo.
245
- pieces + (directions(0 )((directions(0 )(dest)).get).get -> pieces(dest)) + (dest -> pieces(orig)) - orig
241
+ ( destLineMove, destLineOneMove, destLineTwoMove ) match {
242
+ case ( (None , _, _) ) => pieces + (dest -> pieces(orig)) - orig // __(_)o\
243
+ case ( (Some (destLinePos), _, _) ) if (! pieces.contains(destLinePos)) => pieces + (destLinePos -> pieces(dest)) + (dest -> pieces(orig)) - orig // __(_)o.
244
+ case ( (Some (destLinePos), None , _) ) => pieces + (destLinePos -> pieces(dest)) + (dest -> pieces(orig)) - orig // ___oo\
245
+ case ( (_, _, Some (desLineTwoPos)) ) => pieces + (desLineTwoPos -> pieces(dest)) + (dest -> pieces(orig)) - orig // ___oo.
246
+ case ( _ ) => pieces
247
+ }
246
248
else // side move
247
- (origLineMove, origSideMove, diagonalMove ) match {
249
+ (origLineMove, origSideMove, origDiagonalMove ) match {
248
250
case ( Some (lineMovePos), Some (sideMovePos), Some (diagonalPos) ) =>
249
251
if (diagonalPos.index == dest.index) // oo
250
252
pieces + (sideMovePos -> pieces(orig)) - orig +
251
253
(diagonalPos -> pieces(lineMovePos)) - lineMovePos
252
254
else // ooo
253
255
pieces + (sideMovePos -> pieces(orig)) - orig +
254
256
(diagonalPos -> pieces(lineMovePos)) - lineMovePos +
255
- (directions( 1 )(lineMovePos).get -> pieces(lineMovePos)) - diagonalPos
257
+ (diagonalPos -> pieces(lineMovePos)) - diagonalPos
256
258
case _ => pieces
257
259
}
258
260
}
0 commit comments