package Ġcom . ascending . games . id 1 . model . board Ċ Ċ import Ġcom . ascending . games . engine . model . data . Observable List Ċ import Ġcom . ascending . games . engine . model . geometry . Coord 2 Ċ import Ġcom . ascending . games . engine . model . geometry . Direction 4 Ċ import Ġcom . ascending . games . engine . model . path finding . IG raph Ċ Ċ class ĠBoard ( val Ġwidth Ġ: ĠInt , Ġval Ġheight Ġ: ĠInt ) Ġ: ĠI Graph < Room Element > Ġ{ ĊĠĠĠ Ġval Ġhero Ġ: ĠHero Ġ= ĠHero () ĊĠĠĠ Ġval Ġrooms Ġ= ĠObservable List ( mutable ListOf < Room >()) ĊĊĠĠĠ Ġoverride Ġfun Ġget Nodes (): ĠList < Room Element > Ġ{ ĊĠĠĠĠĠĠ Ġreturn Ġrooms . flatMap Ġ{ Ġit . room Elements Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Ne ighbours ( node Ġ: ĠRoom Element ): ĠList < Room Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneighbour ing Room Elements Ġ= Ġmutable ListOf < Room Element >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( direction Ġin ĠDirection 4 . values (). filter Ġ{ Ġnode . isOpen ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġdirection . to Offset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoord Ġ= Ġnode . board Coord . add ( offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Element Other Ġ= Ġget Room ElementAt ( coord ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room Element Other Ġ!= Ġnull Ġ&& Ġroom Element Other . isOpen ( direction . op pos ite ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneighbour ing Room Elements . add ( room Element Other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġneighbour ing Room Elements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Ne ighbours ( room Ġ: ĠRoom ) Ġ: ĠSet < Room > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroom . room Elements . flatMap Ġ{ Ġroom Element Ġ-> Ġget Ne ighbours ( room Element ). map Ġ{ Ġit . room Ġ}. filter Ġ{ Ġit Ġ!= Ġroom Ġ} Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhave Rooms F allen () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrooms . all Ġ{ Ġhas Room F allen ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Room F allen ( room Ġ: ĠRoom ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroom . room Elements . any Ġ{ Ġit . position . y Ġ<= Ġ 0 Ġ|| Ġexists Room Below ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexists Room Below ( room Element Ġ: ĠRoom Element ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroom Coord Ġ= Ġroom Element . board Coord ĊĠĠĠĠĠĠĠ Ġval Ġroom Below Ġ= Ġget Room At ( Coord 2 ( room Coord . x , Ġroom Coord . y Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġroom Below Ġ!= Ġnull Ġ&& Ġroom Below Ġ!= Ġroom Element . room Ġ&& Ġroom Below . position . y . toDouble () Ġ== ĠMath . ceil ( room Below . position . y . toDouble ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room Elements At ( position Ġ: ĠCoord 2 ) Ġ: ĠList < Room Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrooms . flatMap Ġ{ Ġroom Ġ-> Ġroom . room Elements . filter Ġ{ Ġit . board Coord Ġ== Ġposition Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room ElementAt ( position Ġ: ĠCoord 2 ) Ġ: ĠRoom Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Room Elements At ( position ). get OrNull ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Room At ( position Ġ: ĠCoord 2 ) Ġ: ĠRoom ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroom Element Ġ= Ġget Room ElementAt ( position ) ĊĠĠĠĠĠĠĠ Ġroom Element Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroom Element . room ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Room Over lapping ( room Ġ: ĠRoom ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroom . room Elements . any Ġ{ Ġroom Element Ġ-> Ġget Room Elements At ( room Element . board Coord ). filter Ġ{ Ġit Ġ!= Ġroom Element Ġ}. isNotEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Room In Bounds ( room Ġ: ĠRoom ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroom . room Elements . none Ġ{ Ġit . position . x Ġ< Ġ 0 Ġ|| Ġit . position . y Ġ< Ġ 0 Ġ|| Ġit . position . x Ġ>= Ġwidth Ġ|| Ġit . position . y Ġ>= Ġheight Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen W alls Ne ighbour ing Do ors ( room Ġ: ĠRoom ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnected Rooms Ġ= Ġmutable Set Of < Room >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( room Element Ġin Ġroom . room Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwalls To Open Ġ= Ġget W alls To Open ( room Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwalls To Open . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Rooms . add ( it . room Element . room ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . room Element . wall s . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget W alls To Open ( room Element Ġ: ĠRoom Element ) Ġ: ĠList < Wall > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwalls To Open Ġ= Ġmutable ListOf < Wall >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( wall Ġin Ġroom Element . wall s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoord Other Ġ= Ġroom Element . board Coord . add ( wall . direction . to Offset ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Element Other Ġ= Ġget Room ElementAt ( coord Other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( room Element Other Ġ!= Ġnull Ġ&& Ġhas Room F allen ( room Element Other . room )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwall Other Ġ= Ġroom Element Other . wall s . find Ġ{ Ġit . direction Ġ== Ġwall . direction . op pos ite () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalls To Open . addAll ( get W alls To Open ( wall , Ġwall Other )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwalls To Open ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget W alls To Open ( wall Ġ: ĠWall ?, Ġwall Other Ġ: ĠWall ?) Ġ: ĠList < Wall > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( wall Ġ!= Ġnull Ġ&& Ġwall Other Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wall . wall State Ġ== ĠWall State . DO OR Ġ|| Ġwall Other . wall State Ġ== ĠWall State . DO OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( wall , Ġwall Other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġempty List < Wall >() ĊĠĠĠ Ġ} Ċ }