package Ġcom . ascending . games . id 1 . edit . board Ċ Ċ import Ġcom . ascending . games . id 1 . edit . board . action . content . Hero Action Provider Ċ import Ġcom . ascending . games . id 1 . edit . board . action . room . Drop Action Ċ import Ġcom . ascending . games . id 1 . edit . board . action . room . IB o ard Action Ċ import Ġcom . ascending . games . id 1 . model . board .* Ċ import Ġcom . ascending . games . id 1 . model . me chan ics . Stat Service Ċ import Ġcom . ascending . games . id 1 . model . me chan ics . Stat Type Ċ import Ġcom . ascending . games . id 1 . model . world . Player Ċ import Ġcom . ascending . games . id 1 . model . world . Player Service Ċ import Ġcom . ascending . games . engine . model . data . Observable List Ċ import Ġcom . ascending . games . engine . model . geometry . Coord 2 Ċ import Ġcom . badlogic . gdx . math . Vector 2 Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠBoard Domain ( val Ġboard : ĠBoard , Ġval Ġplayer Ġ: ĠPlayer , Ġval Ġlevel Ġ: ĠInt , Ġroom Factory Ġ: ĠI Room Factory ) Ġ{ ĊĊĠĠĠ Ġval Ġon Project ed Room Changed Ġ= ĠHashSet < () Ġ-> ĠUnit >() ĊĠĠĠ Ġval Ġon Board Finished Ġ= ĠHashSet <( Boolean ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOUNT _ WAIT ING _ RO O MS Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠF ALL _ STEP Ġ= Ġ 1 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcurrent Room Ġby ĠDeleg ates . notNull < Room >() ĊĠĠĠ Ġvar Ġprojected Room Ġby ĠDeleg ates . notNull < Room >() ĊĠĠĠ Ġprivate Ġval Ġroom Pool Pos Y Ġ= Ġboard . height Ġ+ Ġ 2 ĊĠĠĠ Ġval Ġroom Pool Ġ= ĠRoom Pool ( room Factory , Ġroom Pool Pos Y . toFloat ()) ĊĊĠĠĠ Ġprivate Ġval Ġhero Action Provider Ġ= ĠHero Action Provider ( board ) ĊĠĠĠ Ġprivate Ġval Ġmap Room Content ToAction List Ġ= Ġmutable Map Of < AR oom Content , Ġcom . ascending . games . engine . edit . action . IT imed Action >() ĊĠĠĠ Ġprivate Ġval Ġstat Service Ġ= ĠStat Service () ĊĠĠĠ Ġprivate Ġval Ġplayer Service Ġ= ĠPlayer Service () ĊĊĠĠĠ Ġprivate Ġvar Ġfall Time Ġ= Ġ 0 f ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġboard . hero . stats . put All ( player . stats ) ĊĠĠĠĠĠĠĠ Ġnext Room () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfail Board () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . stats . put ( Stat Type . COUNT _ P OT IONS . name , Ġboard . hero . stats [ Stat Type . COUNT _ P OT IONS . name ] Ġ?: Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġon Board Finished . forEach Ġ{ Ġit . invoke ( false ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Board () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer Service . clear Level ( player , Ġboard . hero , Ġlevel ) ĊĠĠĠĠĠĠĠ Ġon Board Finished . forEach Ġ{ Ġit . invoke ( true ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( time Ġ: ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfall Time Ġ+= Ġtime ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fall Time Ġ>= ĠF ALL _ STEP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfall Time Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fall ing Rooms () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġboard . height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Row If Full ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Room Content Actions ( time ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( board . hero . spawn ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat Service . is Dead ( board . hero )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Board () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( board . hero . room Element . clear ables . any Ġ{ Ġit Ġis ĠSt airs Down Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Board () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Fall ing Rooms () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġposition Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġf allen Rooms Ġ= Ġmutable ListOf < Room >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( room Ġin Ġboard . rooms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board . has Room F allen ( room )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom . position . y Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf allen Rooms . add ( room ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom . position . y Ġ= Ġroom . position . y . round ToInt (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! position Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf allen Rooms . forEach Ġ{ Ġboard . open W alls Ne ighbour ing Do ors ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board . hero . spawn ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . hero . spawn ( board ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhero Action Provider . last Room Ġ= Ġboard . hero . room Element . room ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Room () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Room Content Actions ( time Ġ: ĠFloat ) Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhero Action Ġ= Ġget Action ( board . hero , Ġhero Action Provider ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( hero Action Ġ!= Ġnull Ġ&& Ġ(! hero Action . can Execute Ġ|| Ġhero Action . execute ( time ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Room Content ToAction List . remove ( board . hero ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Action ( a Room Content : ĠAR oom Content , Ġtimed Action Provider Ġ: Ġcom . ascending . games . engine . edit . action . IT imed Action Provider ) Ġ: Ġcom . ascending . games . engine . edit . action . IT imed Action ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Action Ġ= Ġmap Room Content ToAction List [ a Room Content ] ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Action Ġ!= Ġnull ) Ġ Ġreturn Ġexisting Action ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Action Ġ= Ġtimed Action Provider . getNext Action () ĊĠĠĠĠĠĠĠ Ġif Ġ( new Action Ġ!= Ġnull ) Ġmap Room Content ToAction List [ board . hero ] Ġ= Ġnew Action ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Action ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( action Ġ: ĠI Board Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction . execute ( current Room , board ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġis ĠDrop Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfall Time Ġ= ĠF ALL _ STEP ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Project ed Room () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cle ared Elements ( row Ġ: ĠInt ) Ġ: ĠList < Room Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcleared Elements Ġ= Ġempty List < Room Element >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġboard . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Element Ġ= Ġboard . get Room ElementAt ( Coord 2 ( x , Ġrow )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Element Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! room Element . room . is Cle ared ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( board . hero . spawn ed Ġ&& Ġboard . hero . room Element Ġ== Ġroom Element ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! board . has Room F allen ( room Element . room )) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcleared Elements Ġ+= Ġroom Element ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcleared Elements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Row If Full ( row Ġ: ĠInt ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcleared Elements Ġ= Ġget Cle ared Elements ( row ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( room Element Ġin Ġcleared Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Service . reward Room Element Clear ( board . hero , Ġroom Element . room . type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Ġ= Ġroom Element . room ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom . room Elements Ġ-= Ġroom Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room . room Elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard . rooms . remove ( room ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! cleared Elements . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Room () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Room Ġ= Ġroom Pool . poll () ĊĠĠĠĠĠĠĠ Ġcurrent Room . position Ġ= ĠVector 2 ((( board . width Ġ- Ġ 1 ) Ġ/ Ġ 2 ). toFloat (), Ġboard . height . toFloat () Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġboard . rooms . add ( current Room ) ĊĠĠĠĠĠĠĠ Ġupdate Project ed Room () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( board . is Room Over lapping ( current Room )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail Board () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Project ed Room () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Y Ġ= Ġcurrent Room . position . y ĊĠĠĠĠĠĠĠ Ġfull Drop Current R oo om () ĊĠĠĠĠĠĠĠ Ġprojected Room Ġ= ĠRoom ( Observable List ( current Room . room Elements . map Ġ{ Ġit Ġ-> Ġit . copy () Ġ}. to Mutable List ()), Ġcurrent Room . position . cpy ()) ĊĠĠĠĠĠĠĠ Ġcurrent Room . position . y Ġ= Ġposition Y ĊĠĠĠĠĠĠĠ Ġon Project ed Room Changed . forEach Ġ{ Ġit . invoke () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfull Drop Current R oo om () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġposition Y Ġ Ġ= Ġcurrent Room . position . y ĊĠĠĠĠĠĠĠ ĠDrop Action (). execute ( current Room , Ġboard ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( position Y Ġ!= Ġcurrent Room . position . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Y Ġ Ġ= Ġcurrent Room . position . y ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrop Action (). execute ( current Room , Ġboard ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }