package Ġj 4 k . c andy cr ush Ċ Ċ import Ġcom . so y wiz . k logger . Logger Ċ import Ġcom . so y wiz . kor inject . Async Injector Ċ import Ġj 4 k . c andy cr ush . Game Me chan ics . Insert Move Ċ import Ġj 4 k . c andy cr ush . Game Me chan ics . Move Ċ import Ġj 4 k . c andy cr ush . audio . Sound Machine Ċ import Ġj 4 k . c andy cr ush . lib . EventBus Ċ import Ġj 4 k . c andy cr ush . math . Position Grid . Position Ċ import Ġj 4 k . c andy cr ush . model . Level Ċ import Ġj 4 k . c andy cr ush . model . Tile Ċ import Ġj 4 k . c andy cr ush . model . Tile Cell Ċ import Ġj 4 k . c andy cr ush . renderer . animation . Tile Animator Ċ Ċ /** Ċ Ġ* ĠGlobal Ġgame Ġcycle Ġwhich Ġreact s Ġon Ġsw apped Ġtiles Ġ[ on Drag Tile Event ]. Ċ Ġ*/ Ċ class ĠGame Flow ( private Ġval Ġlevel : ĠLevel , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbus : ĠEvent Bus , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmechan ics : ĠGame Me chan ics , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanim ator : ĠTile Animator , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsound Machine : ĠSound Machine ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfield Ġ= Ġlevel . field ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbus . register < Drag Tile Event > Ġ{ Ġit . on Drag Tile Event () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠLogger < Game Flow >() ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġoperator Ġfun Ġinvoke ( injector : ĠAsync Injector ): ĠGame Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinjector . map Singleton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGame Flow ( get (), Ġget (), Ġget (), Ġget (), Ġget ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinjector . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġr ush Ġis Ġthe Ġphase Ġfrom Ġdeleting Ġtiles Ġ-> Ġlet Ġtiles Ġfall Ġto Ġground Ġ-> Ġref ill Ġempty Ġfiles . ĊĠĠĠĠ Ġ* ĠThe Ġr ush Ġcounts Ġthe Ġref ills Ġafter Ġan Ġinitial Ġtile Ġswap . ĠThis Ġis Ġuseful Ġto Ġgive Ġa Ġscore Ġbonus Ġfor Ġmultiple Ġr ushed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġr ush Ġ= Ġ 1 ĊĊĠĠĠ Ġprivate Ġfun ĠDrag Tile Event . on Drag Tile Event () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( anim ator . is Animation Running ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Skipping Ġdrag Ġevent Ġbecause Ġof Ġmoving Ġtiles Ġ($ pos A . Ġ$ pos B )" Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( field [ pos A ]. isNot Tile () Ġ|| Ġfield [ pos B ]. isNot Tile ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Skipping Ġdrag Ġevent Ġbecause Ġone Ġtile Ġwasn 't Ġa Ġtile Ġ($ pos A . Ġ$ pos B )" Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( me chan ics . is Swap Allowed ( pos A , Ġpos B )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Tiles ( pos A , Ġpos B ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Illegal Swap ( pos A , Ġpos B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsound Machine . play Wrong Move () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSw aps Ġtwo Ġtiles Ġand Ġtriggers Ġthe Ġremoval Ġof Ġand Ġref ill Ġof Ġconnected Ġtiles . ĠAn Ġillegal Ġswap , Ġwill Ġbe Ġsw apped Ġback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġswap Tiles ( pos A : ĠPosition , Ġpos B : ĠPosition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbus . send ( Swap Tile Event ( pos A , Ġpos B )) ĊĠĠĠĠĠĠĠ Ġr ush Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġmechan ics . swap Tiles ( pos A , Ġpos B ) ĊĠĠĠĠĠĠĠ Ġval Ġtiles ToRemove : ĠList < Tile Cell > Ġ= Ġget Connected Tiles ( pos A , Ġpos B ) ĊĠĠĠĠĠĠĠ Ġmechan ics . remove Tile Cells ( tiles ToRemove ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Moves : ĠList < Move > Ġ= Ġmechan ics . drop All To Ground () ĊĠĠĠĠĠĠĠ Ġval Ġnew Tile Moves : ĠList < Insert Move > Ġ= Ġget New Tile Moves () ĊĠĠĠĠĠĠĠ Ġanim ator . animate Swap ( pos A , Ġpos B ). invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsound Machine . play Clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Remove Tiles ( tiles ToRemove ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . send ( Tile Deletion Event ( r ush , Ġ( tiles ToRemove ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Moves ( next Moves ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmechan ics . insert ( new Tile Moves ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Insert ( new Tile Moves ). invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck New Field () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġ[ Tile Cell ] s Ġwhich Ġare Ġleast Ġwith Ġ 3 Ġequal Ġ[ Tile ] s Ġin Ġa Ġhorizontal Ġor Ġvertical Ġconnected Ġline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Connected Tiles ( pos A : ĠPosition , Ġpos B : ĠPosition ): ĠList < Tile Cell > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġmechan ics . get Connected Lines ( pos A , Ġpos B ) ĊĠĠĠĠĠĠĠ Ġif Ġ( lines . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ush Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlines . flatten () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġthe Ġwhole Ġfield Ġfor Ġconnected Ġrows , Ġdeletes Ġthem Ġand Ġref ill Ġwith Ġnew Ġtiles . ĠThis Ġwill Ġbe Ġrepeated Ġuntil Ġno ĊĠĠĠĠ Ġ* Ġmore Ġconnected Ġtiles Ġare Ġleft . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck New Field () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal : ĠList < List < Tile Cell >> Ġ= ĠGame Me chan ics ( field . clone ()). get And RemoveAll Horizontal Rows () ĊĠĠĠĠĠĠĠ Ġval Ġvertical : ĠList < List < Tile Cell >> Ġ= ĠGame Me chan ics ( field . clone ()). get And RemoveAll Vertical Rows () ĊĠĠĠĠĠĠĠ Ġval Ġtiles ToRemove : ĠList < Tile Cell > Ġ= Ġhorizontal . flatten () Ġ+ Ġvertical . flatten () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tiles ToRemove . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Removing Ġtiles Ġafter Ġr ush Ġ$ r ush : Ġ${ tiles ToRemove . size }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr ush ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsound Machine . play Multi ( r ush ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmechan ics . remove Tile Cells ( tiles ToRemove ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Remove Tiles ( tiles ToRemove ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbus . send ( Tile Deletion Event ( r ush , Ġtiles ToRemove )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Moves : ĠList < Move > Ġ= Ġmechan ics . drop All To Ground () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Tile Moves : ĠList < Insert Move > Ġ= Ġget New Tile Moves () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Moves ( next Moves ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmechan ics . insert ( new Tile Moves ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . animate Insert ( new Tile Moves ). invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck New Field () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Field Ġwas Ġclean Ġon Ġr ush : Ġ$ r ush " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġnew Ġrandom Ġtiles Ġfor Ġeach Ġempty Ġcell ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget New Tile Moves (): ĠList < Insert Move > Ġ= Ġmechan ics . getNew Tile Moves ( level :: getNext Tile ) ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġr ush Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ Ċ } Ċ