// Ċ // ĠSource Ġcode Ġre created Ġfrom Ġa Ġ. class Ġfile Ġby ĠIntelliJ ĠIDEA Ċ // Ġ( powered Ġby ĠF ern Flow er Ġde compiler ) Ċ // Ċ package Ġw tf . osh isa ure . null pom od sh it . wall k icks Ċ Ċ import Ġmu . nu . null po . game . component . Controller Ċ import Ġmu . nu . null po . game . component . Field Ċ import Ġmu . nu . null po . game . component . Piece Ċ import Ġmu . nu . null po . game . component . Wall kick Result Ċ import Ġmu . nu . null po . game . subsystem . wall kick . Wall kick Ċ Ċ class ĠTw ist Bias Wall kick : Wall kick Ġ{ Ċ ĉ override Ġfun Ġexecute Wall kick ( Ċĉ ĉ x : Int , Ġy : Int , Ġrt Dir : Int , Ġrt Old : Int , Ġrt New : Int , Ġallow Up ward : Boolean , Ġpiece : Piece , Ġfield : Field , Ġctrl : Controller ? Ċ ĉ ): Wall kick Result ? Ġ{ Ċĉ ĉ if (! check Collision Kick ( piece , Ġx , Ġy , Ġrt New , Ġfield ) && ! piece . check Collision ( x , Ġy + 1 , Ġfield )) Ġ{ Ċĉĉ ĉ return Ġnull Ċĉ ĉ } Ċĉ ĉ var Ġx Offs Ġ= Ġ 0 Ċĉ ĉ var Ġy Offs Ġ= Ġ 2 0 Ċĉ ĉ var Ġfound Space Ġ= Ġfalse Ċĉ ĉ while ( true ) Ġ{ Ċĉĉ ĉ while (! found Space ) Ġ{ Ċĉĉĉ ĉ found Space Ġ= Ġtrue Ċĉĉĉ ĉ if (! piece . check Collision ( x , Ġy + y Offs , Ġrt New , Ġfield )) Ġx Offs Ġ= Ġ 0 Ċĉĉĉ ĉ else Ġif (! piece . check Collision ( x + 1 , Ġy + y Offs , Ġrt New , Ġfield )) Ġx Offs Ġ= Ġ 1 Ċĉĉĉ ĉ else Ġif (! piece . check Collision ( x - 1 , Ġy + y Offs , Ġrt New , Ġfield )) Ġx Offs Ġ= Ġ- 1 Ċĉĉĉ ĉ else Ġif ( piece . big && ! piece . check Collision ( x + 2 , Ġy + y Offs , Ġrt New , Ġfield )) Ġx Offs Ġ= Ġ 2 Ċĉĉĉ ĉ else Ġif ( piece . big && ! piece . check Collision ( x - 2 , Ġy + y Offs , Ġrt New , Ġfield )) Ġx Offs Ġ= Ġ- 2 Ċĉĉĉ ĉ else Ġ{ Ċĉĉĉĉ ĉ if ( y Offs <- 2 0 ) Ġreturn Ġnull Ċĉĉĉĉ ĉ found Space Ġ= Ġfalse Ċĉĉĉĉ ĉ -- y Offs Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return ĠWall kick Result ( x Offs , Ġy Offs , Ġrt New ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġcheck Collision Kick ( piece : Piece , Ġx : Int , Ġy : Int , Ġrt : Int , Ġfld : Field ): Boolean Ġ{ Ċĉ ĉ return Ġif ( piece . big ) Ġcheck Collision Kick Big ( piece , Ġx , Ġy , Ġrt , Ġfld ) Ġelse Ġ{ Ċĉĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġpiece . max Block ) Ġ{ Ċĉĉĉ ĉ if ( piece . data X [ rt ][ i ] != 1 + piece . data Offset X [ rt ]) Ġ{ Ċĉĉĉĉ ĉ val Ġx 2 Ġ= Ġx + piece . data X [ rt ][ i ] Ċĉĉĉĉ ĉ val Ġy 2 Ġ= Ġy + piece . data Y [ rt ][ i ] Ċĉĉĉĉ ĉ if ( x 2 >= fld . width || y 2 >= fld . height || fld . get Coord Attribute ( x 2 , Ġy 2 )== 3 || Ċĉĉĉĉĉ ĉ fld . get Coord Attribute ( x 2 , Ġy 2 )!= 2 && fld . getBlock Color ( x 2 , Ġy 2 )!= null Ċĉĉĉĉ ĉ ) Ġreturn Ġtrue Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ false Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġcheck Collision Kick Big ( piece : Piece , Ġx : Int , Ġy : Int , Ġrt : Int , Ġfld : Field ): Boolean Ġ{ Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġpiece . max Block ) Ġ{ Ċĉĉ ĉ if ( piece . data X [ rt ][ i ] != 1 + piece . data Offset X [ rt ]) Ġ{ Ċĉĉĉ ĉ val Ġx 2 Ġ= Ġx + piece . data X [ rt ][ i ]* 2 Ċĉĉĉ ĉ val Ġy 2 Ġ= Ġy + piece . data Y [ rt ][ i ]* 2 Ċĉĉĉ ĉ for ( k Ġin Ġ 0 .. 1 ) Ġ{ Ċĉĉĉĉ ĉ for ( l Ġin Ġ 0 .. 1 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġx 3 Ġ= Ġx 2 + k Ċĉĉĉĉĉ ĉ val Ġy 3 Ġ= Ġy 2 + l Ċĉĉĉĉĉ ĉ if ( x 3 >= fld . width || y 3 >= fld . height || fld . get Coord Attribute ( x 3 , Ġy 3 )== 3 || Ċĉĉĉĉĉĉ ĉ fld . get Coord Attribute ( x 3 , Ġy 3 )!= 2 && fld . getBlock Color ( x 3 , Ġy 3 )!= null Ċĉĉĉĉĉ ĉ ) Ġreturn Ġtrue Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġfalse Ċ ĉ } Ċ } Ċ