package Ġrules Ċ Ċ import Ġcoordinates . Coordinate 2 D Ċ import Ġmoves .* Ċ import Ġgame Types . chess . Abstract Che ss 2 D Ċ import Ġpieces . chess . Black Pawn Ċ import Ġpieces . chess . White Pawn Ċ import Ġplayers . Player Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠEn ĠPass ant Ġin Ġstandard Ġche ss Ċ Ġ* Ċ Ġ* ĠSpecial Ġp awn Ġcapture Ġthat Ġcan Ġonly Ġoccur Ġimmediately Ġafter Ġa Ġp awn Ġmakes Ċ Ġ* Ġa Ġmove Ġof Ġtwo Ġsquares Ġfrom Ġits Ġstarting Ġsquare , Ċ Ġ* Ġand Ġit Ġcould Ġhave Ġbeen Ġcaptured Ġby Ġan Ġenemy Ġp awn Ġhad Ġit Ġadvanced Ġonly Ġone Ġsquare Ċ Ġ*/ Ċ class ĠE np ass ant Ġ: ĠSpecial Rules 2 D < Abstract Che ss 2 D > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Possible Moves ( game : ĠAbstract Che ss 2 D , Ġplayer : ĠPlayer , Ġmoves : ĠMutable List < Move 2 D >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġboard Ġ= Ġgame . board ĊĠĠĠĠĠĠĠ Ġval Ġmove Log Ġ= Ġgame . move Log ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Move 2 D >() ĊĠĠĠĠĠĠĠ Ġval Ġprev Move Ġ= Ġif Ġ( game . getCurrent Player () Ġ== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Log . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Log [ move Log . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Log . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Log [ move Log . size Ġ- Ġ 2 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(!( prev Move Ġis ĠBasic Move 2 D Ġ&& Ġ(( prev Move . piece Moved Ġis ĠWhite Pawn Ġ|| Ġprev Move . piece Moved Ġis ĠBlack Pawn ) Ġ&& Ġabs ( prev Move . from . y Ġ- Ġprev Move . to . y ) Ġ== Ġ 2 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġp awns Ġ= Ġboard . get Pieces ( player ). filter Ġ{ Ġp Ġ-> Ġ( p . first Ġis ĠWhite Pawn Ġ|| Ġp . first Ġis ĠBlack Pawn ) Ġ&& Ġ( p . second . y Ġ== Ġprev Move . to . y ) Ġ&& Ġ( abs ( p . second . x Ġ- Ġprev Move . to . x ) Ġ== Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( pawn Ġin Ġp awns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġif Ġ( pawn . first Ġis ĠBlack Pawn ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board . get Piece ( Coordinate 2 D ( prev Move . to . x , Ġprev Move . to . y Ġ+ Ġdy )) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComposite Move 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Move 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate 2 D ( pawn . second . x , Ġp awn . second . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate 2 D ( prev Move . to . x , Ġprev Move . to . y ), Ġp awn . first , Ġplayer , Ġprev Move . piece Moved , Ġcheck For Check Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Move 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate 2 D ( prev Move . to . x , Ġprev Move . to . y ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoordinate 2 D ( prev Move . to . x , Ġprev Move . to . y Ġ+ Ġdy ), Ġp awn . first , Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmoves . addAll ( res ) ĊĠĠĠ Ġ} Ċ } Ċ