package Ġio . github . suit ou gre ent ea . var ious _ min os _ tro is . game . b omb Ċ Ċ import Ġio . github . suit ou gre ent ea . var ious _ min os _ tro is .* Ċ import Ġio . github . suit ou gre ent ea . var ious _ min os _ tro is . game .* Ċ import Ġio . github . suit ou gre ent ea . var ious _ min os _ tro is . game . Min o Buffer Infinite Ċ import Ġio . github . suit ou gre ent ea . var ious _ min os _ tro is . rule . Rule Ċ import Ġjava . util .* Ċ Ċ // ĠTODO : Ġãĥķ ãĥª ãĥ¼ãĤ º çĬ¶æħĭ ãĤĴ Block ãģ« åĲ« ãĤģ ãĤĭ Ċ open Ġclass ĠGame B omb ( player : ĠPlayer , Ġrule : ĠRule ): ĠBasic Min o Game ( player , Ġ 1 0 , Ġ 5 0 , Ġrule ) Ġ{ ĊĠ Ġoverride Ġfun Ġget Required Renderer ( app : ĠVar ious Min os Tro is ) Ġ= ĠRenderer B omb ( app , Ġplayer . player Number ) ĊĊĠ Ġval Ġb omb Size Ġ= ĠarrayOf ( Pair ( 3 , Ġ 0 ), ĠPair ( 3 , Ġ 1 ), ĠPair ( 3 , Ġ 2 ), ĠPair ( 3 , Ġ 3 ), ĠPair ( 4 , Ġ 4 ), ĠPair ( 4 , Ġ 4 ), ĠPair ( 5 , Ġ 5 ), ĠPair ( 5 , Ġ 5 ), ĠPair ( 6 , Ġ 6 ), ĠPair ( 6 , Ġ 6 ), ĠPair ( 7 , Ġ 7 ), ĠPair ( 7 , Ġ 7 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 ), ĠPair ( 8 , Ġ 8 )) ĊĊĠ Ġvar Ġb omb Frequency Ġ= Ġ 2 ĊĠ Ġvar Ġb omb Offset Ġ= Ġ 0 ĊĠ Ġvar Ġall B omb Frequency Ġ= Ġ 4 0 ĊĠ Ġvar Ġall B omb Offset Ġ= Ġ 1 ĊĊĠ Ġoverride Ġval Ġmin o Buffer Ġ= ĠM ino Buffer Infinite ( buffer Num , ĠM ino Generator B omb ()) ĊĊĠ Ġopen Ġvar Ġspeed B omb Ġ= ĠSpeed Data B omb ( ĊĠĠĠĠĠĠĠĠĠ Ġbefore Moving After Freeze Line Count Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠ Ġbefore Moving After Explo sion Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠ Ġbefore Explo sion Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠ Ġexplo sion Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠ Ġafter Explo sion Ġ= Ġ 5 , ĊĠĠĠĠĠĠĠĠĠ Ġbig B omb Ġ= Ġ 1 0 ĊĠ Ġ) ĊĊĠ Ġvar Ġcount Timer Ġ= Ġ- 1 ĊĠ Ġvar Ġexplo sion Timer Ġ= Ġ- 1 ĊĠ Ġvar Ġbig B omb Timer Ġ= Ġ- 1 ĊĊĠ Ġvar Ġexplo sion List : ĠMutable List < Explo sion Data > Ġ= ĠArrayList () ĊĠ Ġvar Ġbig B omb List : ĠMutable List < Pos > Ġ= ĠArrayList () ĊĊĠ Ġvar Ġcount Lines : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠ Ġvar Ġcount Lines Index Ġ= Ġ 0 ĊĠ Ġvar Ġfreezed Lines : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠ Ġvar Ġchain Ġ= Ġ 0 ĊĠ Ġvar Ġcurrent Explo sion Size Ġ= Ġ 0 ĊĊĠ Ġvar Ġb om bed Blocks Ġ= Ġ 0 ĊĊĠ Ġvar Ġcount Number Ġ= Ġ 0 ĊĊĠ Ġvar Ġafter Freeze Line Count Ġ= Ġfalse ĊĠ Ġvar Ġafter Explo sion Ġ= Ġfalse ĊĊĠ Ġenum Ġclass ĠLine State Ġ{ ĊĠĠĠ ĠFIL LED _ WITHOUT _ BO MB , ĊĠĠĠ ĠFIL LED _ WITH _ BO MB , ĊĠĠĠ ĠNOT _ FIL LED ĊĠ Ġ} ĊĊĠ Ġfun Ġget Line State () Ġ= Ġ( 0 .. field . height - 1 ). map Ġ{ Ġiy Ġ-> ĊĠĠĠ Ġval Ġline Ġ= Ġfield . map . filter Ġ{ Ġit . key . y Ġ== Ġiy Ġ} ĊĠĠĠ Ġif ( line . size Ġ== Ġfield . width ) Ġ{ ĊĠĠĠĠĠ Ġif ( line . any Ġ{ Ġit . value Ġis ĠBlock B omb Ġ|| Ġit . value Ġis ĠBlock Big B omb Ġ}) ĠLine State . FIL LED _ WITH _ BO MB Ġelse ĠLine State . FIL LED _ WITHOUT _ BO MB ĊĠĠĠ Ġ} Ġelse ĠLine State . NOT _ FIL LED ĊĠ Ġ} ĊĊĠ Ġfun Ġis Any Line Filled () Ġ= Ġget Line State (). any Ġ{ Ġit Ġ== ĠLine State . FIL LED _ WITHOUT _ BO MB Ġ|| Ġit Ġ== ĠLine State . FIL LED _ WITH _ BO MB Ġ} ĊĠ Ġfun Ġis Explo d able () Ġ= Ġget Line State (). any Ġ{ Ġit Ġ== ĠLine State . FIL LED _ WITH _ BO MB Ġ} ĊĊĠ Ġfun Ġis Big B omb Needed () Ġ= Ġfield . map . filter Values Ġ{ Ġit Ġis ĠBlock B omb Ġ}. keys . any Ġ{ ĊĠĠĠ ĠarrayOf ( Pos ( it . x , Ġit . y ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y ), ĠPos ( it . x , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y Ġ- Ġ 1 )). all Ġ{ ĊĠĠĠĠĠ Ġfield . contains ( it ) Ġ&& Ġfield . get ( it ) Ġis ĠBlock B omb ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis Cascade Needed () Ġ= ĠgetCurrent Cascade List (). filter Ġ{ Ġit . blocks . all Ġ{ Ġit . first . y Ġ> Ġ 0 Ġ&& Ġ! it . second . fixed Ġ} Ġ}. isNotEmpty () ĊĊĠ Ġinner Ġclass ĠState Before Moving : ĠBasic Min o Game . State Before Moving () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġframes Ġ= Ġif ( after Explo sion ) Ġspeed B omb . before Moving After Explo sion ĊĠĠĠ Ġelse Ġif ( after Freeze Line Count ) Ġspeed B omb . before Moving After Freeze Line Count ĊĠĠĠ Ġelse Ġspeed . before Moving ĊĠĠĠ Ġoverride Ġfun Ġenter () Ġ{ ĊĠĠĠĠĠ Ġsuper . enter () ĊĊĠĠĠĠĠ Ġfreezed Lines . clear () ĊĠĠĠĠĠ Ġget Line State (). forEach Indexed Ġ{ Ġi , Ġe Ġ-> Ġif Ġ( e Ġ== ĠLine State . FIL LED _ WITHOUT _ BO MB ) Ġfreezed Lines . add ( i ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠnewState Before Moving () Ġ= ĠState Before Moving () ĊĠ Ġoverride Ġfun ĠnewState Moving () Ġ= ĠState Moving () ĊĠ Ġoverride Ġfun ĠnewState After Moving () Ġ= ĠState After Moving () ĊĠ Ġopen Ġfun ĠnewState Count ing () Ġ= ĠState Count ing () ĊĠ Ġopen Ġfun ĠnewState Before Explo sion () Ġ= ĠState Before Explo sion () ĊĠ Ġopen Ġfun ĠnewState Explo sion () Ġ= ĠState Explo sion () ĊĠ Ġopen Ġfun ĠnewState After Explo sion () Ġ= ĠState After Explo sion () ĊĠ Ġoverride Ġfun ĠnewState Cascade () Ġ= ĠState Cascade () ĊĠ Ġoverride Ġfun ĠnewState After Cascade () Ġ= ĠState After Cascade () ĊĠ Ġopen Ġfun ĠnewState M aking Big B omb () Ġ= ĠState M aking Big B omb () ĊĊĠ Ġoverride Ġfun Ġon New Cycle () Ġ{ ĊĠĠĠ Ġsuper . on New Cycle () ĊĠĠĠ Ġchain Ġ= Ġ 0 ĊĠĠĠ Ġb om bed Blocks Ġ= Ġ 0 ĊĠĠĠ Ġafter Freeze Line Count Ġ= Ġfalse ĊĠĠĠ Ġafter Explo sion Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġopen Ġfun Ġon Line Filled () Ġ{} ĊĊĠ Ġopen Ġinner Ġclass ĠState After Moving : ĠBasic Min o Game . State After Moving () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġnext State () Ġ= Ġif ( getLine State (). filter Ġ{ Ġit Ġ== ĠGame B omb . Line State . FIL LED _ WITHOUT _ BO MB Ġ|| Ġit Ġ== ĠGame B omb . Line State . FIL LED _ WITH _ BO MB Ġ}. size Ġ> Ġfreezed Lines . size ) ĠnewState Count ing () ĊĠĠĠ Ġelse Ġif ( is Cascade Needed ()) ĠnewState Cascade () ĊĠĠĠ Ġelse Ġif ( is Big B omb Needed ()) ĠnewState M aking Big B omb () ĊĠĠĠ Ġelse ĠnewState Before Moving () ĊĠ Ġ} ĊĊĠ Ġopen Ġinner Ġclass ĠState Count ing (): ĠState Ġ{ ĊĠĠĠ Ġfun Ġnext State () Ġ= Ġif Ġ( is Explo d able ()) ĠnewState Before Explo sion () ĊĠĠĠ Ġelse Ġif Ġ( is Cascade Needed ()) ĠnewState Cascade () ĊĠĠĠ Ġelse Ġif Ġ( is Big B omb Needed ()) ĠnewState M aking Big B omb () ĊĠĠĠ Ġelse ĠnewState Before Moving () ĊĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠ Ġcount Number Ġ= Ġ 0 ĊĠĠĠĠĠ Ġchain Ġ++ ĊĠĠĠĠĠ Ġif (! is Explo d able ()) Ġafter Freeze Line Count Ġ= Ġtrue ĊĠĠĠĠĠ Ġget Line State (). forEach Indexed Ġ{ Ġi , Ġe Ġ-> Ġif ( e Ġ== ĠLine State . FIL LED _ WITHOUT _ BO MB Ġ|| Ġe Ġ== ĠLine State . FIL LED _ WITH _ BO MB ) Ġcount Lines . add ( i ) Ġ} ĊĠĠĠĠĠ Ġif ( speed B omb . count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġse Queue . add (" count ") ĊĠĠĠĠĠĠĠ Ġcount Number Ġ= Ġchain Ġ+ Ġcount Lines . size Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġstate Manager . skip State ( next State ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenter () Ġ{ ĊĠĠĠĠĠ Ġcount Timer Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠ Ġif ( count Timer Ġ== Ġ 0 Ġ|| Ġcount Timer Ġ== Ġspeed B omb . count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġse Queue . add (" count ") ĊĠĠĠĠĠĠĠ Ġcount Number Ġ= Ġchain Ġ+ Ġcount Lines Index Ġ- Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcount Timer Ġ= Ġ( count Timer Ġ% Ġspeed B omb . count ) Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġif Ġ( count Timer Ġ== Ġspeed B omb . count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( count Lines Index Ġ== Ġcount Lines . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstate Manager . change State ( next State ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcount Lines Index Ġ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave Or Skip () Ġ{ ĊĠĠĠĠĠ Ġsuper . leave Or Skip () ĊĠĠĠĠĠ Ġon Line Filled () ĊĠĠĠĠĠ Ġcount Lines . clear () ĊĠĠĠĠĠ Ġcount Lines Index Ġ= Ġ 0 ĊĠĠĠĠĠ Ġcount Timer Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠState Before Explo sion : ĠState With Timer () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġframes Ġ= Ġspeed B omb . before Explo sion ĊĠĠĠ Ġoverride Ġval Ġstate Manager Ġ= Ġthis @ Game B omb . state Manager ĊĊĠĠĠ Ġoverride Ġfun Ġnext State () Ġ= ĠnewState Explo sion () ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠ Ġsuper . init () ĊĠĠĠĠĠ Ġget Line State (). forEach Indexed Ġ{ Ġi , Ġe Ġ-> Ġif ( e Ġ== ĠLine State . FIL LED _ WITH _ BO MB ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield . map . filter Ġ{ Ġit . key . y Ġ== Ġi Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġ( pos , Ġblock ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠ Ġif ( block Ġis ĠBlock B omb ) Ġblock . ign ited Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġif ( block Ġis ĠBlock Big B omb ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock . ign ited Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( block . position ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . BOTTOM _ LEFT , ĠBlock Big B omb . Position . BOTTOM _ RIGHT Ġ-> Ġ( field . get ( Pos ( pos . x , Ġpos . y Ġ+ Ġ 1 )) Ġas ĠBlock Big B omb ). ign ited Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . TOP _ LEFT , ĠBlock Big B omb . Position . TOP _ RIGHT Ġ-> Ġ( field . get ( Pos ( pos . x , Ġpos . y Ġ- Ġ 1 )) Ġas ĠBlock Big B omb ). ign ited Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġopen Ġinner Ġclass ĠState Explo sion (): ĠState Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġenter () Ġ{ ĊĠĠĠĠĠ Ġsuper . enter () ĊĠĠĠĠĠ Ġlock Render Timer Ġ= Ġ- 1 ĊĠĠĠĠĠ Ġcurrent Explo sion Size Ġ= Ġchain Ġ+ Ġget Line State (). filter Ġ{ Ġit Ġ== ĠLine State . FIL LED _ WITHOUT _ BO MB Ġ|| Ġit Ġ== ĠLine State . FIL LED _ WITH _ BO MB Ġ}. size Ġ- Ġ 2 ĊĠĠĠĠĠ Ġexplo sion Timer Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠ Ġif ( explo sion Timer Ġ== Ġ 0 Ġ|| Ġexplo sion Timer Ġ== Ġspeed B omb . explo sion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexplo sion List Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġif ( field . map . values . any Ġ{ Ġit Ġis ĠBlock B omb Ġ&& Ġit . ign ited Ġ}) Ġse Queue . add (" explo sion _ small ") ĊĠĠĠĠĠĠĠ Ġif ( field . map . values . any Ġ{ Ġit Ġis ĠBlock Big B omb Ġ&& Ġit . ign ited Ġ}) Ġse Queue . add (" explo sion _ big ") ĊĠĠĠĠĠĠĠ Ġfield . map . filter Values Ġ{ Ġit Ġis ĠBlock B omb Ġ&& Ġit . ign ited Ġ}. forEach Ġ{ Ġexplo sion List . add ( Explo sion Data ( it . key , Ġcurrent Explo sion Size )) Ġ} ĊĠĠĠĠĠĠĠ Ġfield . map . filter Values Ġ{ Ġit Ġis ĠBlock Big B omb Ġ&& Ġit . position Ġ== ĠBlock Big B omb . Position . BOTTOM _ LEFT Ġ&& Ġit . ign ited Ġ}. forEach Ġ{ Ġexplo sion List . add ( Explo sion Data ( it . key , Ġ- 1 )) Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġexplo sion Timer Ġ= Ġ( explo sion Timer Ġ% Ġspeed B omb . explo sion ) Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġif ( explo sion Timer Ġ== ĠMath . ceil ( speed B omb . explo sion Ġ/ Ġ 3 . 0 ). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexplo sion Positions : ĠMutable Set < Pos > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġexplo sion List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġ( cx , Ġcy ) Ġ= Ġit . position ĊĠĠĠĠĠĠĠĠĠ Ġval Ġ( rx , Ġry ) Ġ= Ġif ( it . size Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (( cx Ġ- Ġ 4 Ġ.. Ġcx Ġ+ Ġ 5 ), Ġ( cy Ġ- Ġ 4 Ġ.. Ġcy Ġ+ Ġ 5 )) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( w , Ġh ) Ġ= Ġb omb Size . get ( it . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (( cx Ġ- Ġw Ġ.. Ġcx Ġ+ Ġw ), Ġ( cy Ġ- Ġh Ġ.. Ġcy Ġ+ Ġh )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġfield . remove ( Pos ( cx , Ġcy )) ĊĠĠĠĠĠĠĠĠĠ Ġb om bed Blocks Ġ++ ĊĠĠĠĠĠĠĠĠĠ Ġif ( it . size Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . remove ( Pos ( cx Ġ+ Ġ 1 , Ġcy )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . remove ( Pos ( cx , Ġcy Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . remove ( Pos ( cx Ġ+ Ġ 1 , Ġcy Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb om bed Blocks Ġ+= Ġ 3 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġfield . map . keys . filter Ġ{ Ġrx . contains ( it . x ) Ġ&& Ġry . contains ( it . y ) Ġ}. forEach Ġ{ Ġexplo sion Positions . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexplo sion Positions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġfield . get ( it ) ĊĠĠĠĠĠĠĠĠĠ Ġwhen ( block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Normal Ġ-> Ġ{ Ġfield . remove ( it ); Ġb om bed Blocks Ġ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock B omb Ġ-> Ġblock . ign ited Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Big B omb Ġ-> Ġwhen ( block . position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . BOTTOM _ LEFT Ġ-> ĠarrayOf ( Pos ( it . x , Ġit . y ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y ), ĠPos ( it . x , Ġit . y Ġ+ Ġ 1 ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . BOTTOM _ RIGHT Ġ-> ĠarrayOf ( Pos ( it . x Ġ- Ġ 1 , Ġit . y ), ĠPos ( it . x , Ġit . y ), ĠPos ( it . x Ġ- Ġ 1 , Ġit . y Ġ+ Ġ 1 ), ĠPos ( it . x , Ġit . y Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . TOP _ LEFT Ġ-> ĠarrayOf ( Pos ( it . x , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x , Ġit . y ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Big B omb . Position . TOP _ RIGHT Ġ-> ĠarrayOf ( Pos ( it . x Ġ- Ġ 1 , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x Ġ- Ġ 1 , Ġit . y ), ĠPos ( it . x , Ġit . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ Ġ( field [ it ] Ġas ĠBlock Big B omb ). ign ited Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock White Ġ-> Ġif ( block . level Ġ== Ġ 0 ) Ġ{ Ġfield . remove ( it ); Ġb om bed Blocks Ġ++ Ġ} Ġelse Ġblock . level Ġ-- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Black Ġ-> Ġif ( block . level Ġ== Ġ 0 ) Ġ{ Ġfield . remove ( it ); Ġb om bed Blocks Ġ++ Ġ} Ġelse Ġblock . level Ġ-- ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif ( explo sion Timer Ġ== Ġspeed B omb . explo sion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! field . map . any Ġ{ Ġval Ġblock Ġ= Ġit . value ; Ġ( block Ġis ĠBlock B omb Ġ&& Ġblock . ign ited ) Ġ|| Ġ( block Ġis ĠBlock Big B omb Ġ&& Ġblock . ign ited ) Ġ}) Ġstate Manager . change State ( newState After Explo sion ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave () Ġ{ ĊĠĠĠĠĠ Ġsuper . leave () ĊĠĠĠĠĠ Ġnext Frame TaskList . add ( Next Frame Task ({ ĊĠĠĠĠĠĠĠ Ġexplo sion List Ġ= ĠArrayList () ĊĠĠĠĠĠ Ġ}, Ġfalse )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġopen Ġinner Ġclass ĠState After Explo sion : ĠState With Timer () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġframes Ġ= Ġspeed B omb . after Explo sion ĊĠĠĠ Ġoverride Ġval Ġstate Manager Ġ= Ġthis @ Game B omb . state Manager ĊĊĠĠĠ Ġoverride Ġfun Ġnext State () Ġ= Ġif ( is Cascade Needed ()) ĠnewState Cascade () ĊĠĠĠ Ġelse Ġif ( is Big B omb Needed ()) ĠnewState M aking Big B omb () ĊĠĠĠ Ġelse ĠnewState Before Moving () ĊĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠ Ġafter Explo sion Ġ= Ġtrue ĊĠĠĠĠĠ Ġsuper . init () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġopen Ġinner Ġclass ĠState After Cascade : ĠBasic Min o Game . State After Cascade () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġstate Manager Ġ= Ġthis @ Game B omb . state Manager ĊĊĠĠĠ Ġoverride Ġfun Ġnext State () Ġ= Ġif ( is Explo d able ()) ĠnewState Count ing () ĊĠĠĠ Ġelse Ġif ( is Big B omb Needed ()) ĠnewState M aking Big B omb () ĊĠĠĠ Ġelse ĠnewState Before Moving () ĊĊĠĠĠ Ġoverride Ġfun Ġleave Or Skip () Ġ{ ĊĠĠĠĠĠ Ġsuper . leave Or Skip () ĊĠĠĠĠĠ Ġif (! is Explo d able () Ġ&& Ġget Line State (). filter Ġ{ Ġit Ġ== ĠGame B omb . Line State . FIL LED _ WITHOUT _ BO MB Ġ}. size Ġ> Ġfreezed Lines . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchain Ġ++ ĊĠĠĠĠĠĠĠ Ġon Line Filled () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġopen Ġinner Ġclass ĠState M aking Big B omb : ĠState Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠ Ġsuper . init () ĊĠĠĠĠĠ Ġval Ġbig B omb Reserved List : ĠMutable List < Pos > Ġ= ĠArrayList () ĊĠĠĠĠĠ Ġ// ĠSort : Ġ( 0 , Ġ 1 0 ), Ġ( 1 , Ġ 1 0 ), Ġ( 0 , Ġ 9 ), Ġ( 1 , Ġ 9 ) Ġ... ĊĠĠĠĠĠ Ġfield . map . filter Values Ġ{ Ġit Ġis ĠBlock B omb Ġ}. keys . sorted With ( Comparator Ġ{ Ġa , Ġb Ġ-> Ġif Ġ( a . y Ġ== Ġb . y ) Ġa . x Ġ- Ġb . x Ġelse Ġb . y Ġ- Ġa . y Ġ}). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Positions Ġ= ĠarrayOf ( Pos ( it . x , Ġit . y ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y ), ĠPos ( it . x , Ġit . y Ġ- Ġ 1 ), ĠPos ( it . x Ġ+ Ġ 1 , Ġit . y Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġif ( block Positions . all Ġ{ Ġfield . contains ( it ) Ġ&& Ġfield . get ( it ) Ġis ĠBlock B omb Ġ&& Ġ! big B omb Reserved List . contains ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbig B omb List . add ( Pos ( it . x , Ġit . y Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠ Ġblock Positions . forEach Ġ{ Ġbig B omb Reserved List . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbig B omb Reserved List . forEach Ġ{ Ġfield . remove ( it ) Ġ} ĊĠĠĠĠĠ Ġbig B omb Timer Ġ= Ġ 0 ĊĠĠĠĠĠ Ġse Queue . add (" big _ b omb ") ĊĠĠĠĠĠ Ġif ( speed B omb . big B omb Ġ== Ġ 0 ) Ġstate Manager . skip State ( newState Before Moving ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠ Ġbig B omb Timer Ġ++ ĊĠĠĠĠĠ Ġif ( big B omb Timer Ġ== Ġspeed B omb . big B omb ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Manager . change State ( newState Before Moving ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave () Ġ{ ĊĠĠĠĠĠ Ġsuper . leave () ĊĠĠĠĠĠ Ġbig B omb Timer Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġleave Or Skip () Ġ{ ĊĠĠĠĠĠ Ġsuper . leave Or Skip () ĊĠĠĠĠĠ Ġbig B omb List . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġfield [ Pos ( it . x , Ġit . y )] Ġ= ĠBlock Big B omb ( Block Big B omb . Position . BOTTOM _ LEFT ) ĊĠĠĠĠĠĠĠ Ġfield [ Pos ( it . x Ġ+ Ġ 1 , Ġit . y )] Ġ= ĠBlock Big B omb ( Block Big B omb . Position . BOTTOM _ RIGHT ) ĊĠĠĠĠĠĠĠ Ġfield [ Pos ( it . x , Ġit . y Ġ+ Ġ 1 )] Ġ= ĠBlock Big B omb ( Block Big B omb . Position . TOP _ LEFT ) ĊĠĠĠĠĠĠĠ Ġfield [ Pos ( it . x Ġ+ Ġ 1 , Ġit . y Ġ+ Ġ 1 )] Ġ= ĠBlock Big B omb ( Block Big B omb . Position . TOP _ RIGHT ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbig B omb List Ġ= ĠArrayList () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinner Ġclass ĠM ino Generator B omb : ĠM ino Generator Ġ{ ĊĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġfun Ġnew Min o (): ĠM ino Ġ{ ĊĠĠĠĠĠ Ġval Ġmin o Id Ġ= Ġmin o Random izer . next () ĊĠĠĠĠĠ Ġval Ġcolor Id Ġ= Ġmin o Color ing . getMin o Color ( mino Id ) ĊĠĠĠĠĠ Ġval Ġblock Positions Ġ= ĠM ino List . list [ mino Id ]. second ĊĠĠĠĠĠ Ġval Ġb omb Index Ġ= Ġ( Math . random () Ġ* Ġblock Positions . size ). toInt () ĊĊĠĠĠĠĠ Ġval Ġblocks Ġ= Ġif (( count Ġ+ Ġall B omb Offset ) Ġ% Ġall B omb Frequency Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Positions . map Indexed Ġ{ Ġ_, Ġpos Ġ-> ĠPair ( pos , ĠBlock B omb ()) Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġif (( count Ġ+ Ġb omb Offset ) Ġ% Ġb omb Frequency Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Positions . map Indexed Ġ{ Ġi , Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhen ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb omb Index Ġ-> ĠPair ( pos , ĠBlock B omb ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( pos , ĠBlock Normal ( color Id )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Positions . map Indexed Ġ{ Ġ_, Ġpos Ġ-> ĠPair ( pos , ĠBlock Normal ( color Id )) Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcount ++ ĊĊĠĠĠĠĠ Ġreturn ĠM ino ( mino Id , Ġblocks ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠBig B omb Ġis Ġsize =- 1 ĊĠ Ġclass ĠExplo sion Data ( val Ġposition : ĠPos , Ġval Ġsize : ĠInt ) Ġ{} ĊĊĠ Ġopen Ġclass ĠBlock Base : ĠBlock Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġfixed Ġ= Ġfalse ĊĠ Ġ} ĊĠ Ġclass ĠBlock Normal ( val Ġcolor : ĠInt ): ĠBlock Base () ĊĊĠ Ġclass ĠBlock B omb : ĠBlock Base () Ġ{ ĊĠĠĠ Ġvar Ġign ited Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġclass ĠBlock Big B omb ( val Ġposition : ĠPosition ): ĠBlock Base () Ġ{ ĊĠĠĠ Ġenum Ġclass ĠPosition Ġ{ ĊĠĠĠĠĠ ĠBOTTOM _ LEFT , ĠBOTTOM _ RIGHT , ĠTOP _ LEFT , ĠTOP _ RIGHT ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġign ited Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġclass ĠBlock White ( var Ġlevel : ĠInt ): ĠBlock Base () ĊĊĠ Ġclass ĠBlock White Un break able (): ĠBlock Base () ĊĊĠ Ġclass ĠBlock Black ( var Ġlevel : ĠInt ): ĠBlock Base () Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġfixed Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġclass ĠBlock Black Un break able (): ĠBlock Base () Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġfixed Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġdata Ġclass ĠSpeed Data B omb ( ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġbefore Moving After Freeze Line Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġbefore Moving After Explo sion : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġcount : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġbefore Explo sion : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġexplo sion : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġafter Explo sion : ĠInt , ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġbig B omb : ĠInt ĊĠ Ġ) Ċ } Ċ