package Ġcom . tox ic bak ery . game . d ungeon . map Ċ Ċ import Ġcom . tox ic bak ery . game . d ungeon . map . model . Window Ċ import Ġcom . tox ic bak ery . game . d ungeon . model . character . Location Ċ import Ġorg . kode in . di . K ode in Ċ import Ġorg . kode in . di . er ased . bind Ċ import Ġorg . kode in . di . er ased . instance Ċ import Ġorg . kode in . di . er ased . singleton Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . ceil Ċ Ċ private Ġclass ĠMap ManagerImpl ( ĊĠĠĠ Ġprivate Ġval Ġmap Store : ĠMap Store Ċ ) Ġ: ĠMap Base Function ality ( ĊĠĠĠ Ġmap Size Atomic Ġ= Ġmap Store . map Size Atomic , ĊĠĠĠ Ġregion Size Atomic Ġ= Ġmap Store . region Size Atomic Ċ ), ĠMap Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠRegion Location . region : ĠRegion ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfetch Region ( this ) ĊĊĠĠĠ Ġprivate Ġval ĠLocation . region Location : ĠRegion Location ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġregion Size . let Ġ{ Ġsize Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegion Location . wrapped ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Count Ġ= Ġregion Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġwrap World Position ( x ) Ġ/ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġwrap World Position ( y ) Ġ/ Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠLocation . region Location Round Up : ĠRegion Location ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġregion Size . let Ġ{ Ġsize Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegion Location . wrapped ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Count Ġ= Ġregion Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġceil ( wrap World Position ( x ) Ġ/ Ġsize . toDouble ()). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġceil ( wrap World Position ( y ) Ġ/ Ġsize . toDouble ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmap Size (): ĠInt Ġ= Ġmap Size ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Window ( window Description : ĠWindow Description ): ĠWindow Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow Description . validate () ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Left Region Location Ġ= Ġwindow Description . top Left Location . region Location ĊĠĠĠĠĠĠĠ Ġval Ġbottom Right Region Location Ġ= Ġwindow Description . bottom Right Location . region Location Round Up ĊĠĠĠĠĠĠĠ Ġval Ġx Region Distance Ġ= Ġregion Distance ( top Left Region Location . x , Ġbottom Right Region Location . x ) ĊĠĠĠĠĠĠĠ Ġval Ġy Region Distance Ġ= Ġregion Distance ( top Left Region Location . y , Ġbottom Right Region Location . y ) ĊĠĠĠĠĠĠĠ Ġval Ġwindow Rows Ġ= Ġ( 0 .. x Region Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. y Region Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelative Region Location ( x , Ġy ) Ġto ĠRegion Location . wrapped ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Count Ġ= Ġregion Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġtop Left Region Location . x Ġ+ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġtop Left Region Location . y Ġ+ Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). region . byteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠWindow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Rows Ġ= Ġpaint Regions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Description Ġ= Ġwindow Description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregions Ġ= Ġwindow Rows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Complete Map (): ĠWindow Ġ= Ġ( 0 Ġuntil Ġregion Count ) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġy Ġ-> Ġ( 0 Ġuntil Ġregion Count ). map Ġ{ Ġx Ġ-> ĠRegion Location ( x , Ġy ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġregion Location Ġ-> Ġregion Location Ġto Ġregion Location . region . byteArray Ġ} ĊĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġregion Map : ĠMap < Region Location , ĠByteArray > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= ĠList ( map Size ) Ġ{ ĠByteArray ( map Size ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġmap Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġmap Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregion Location Ġ= ĠRegion Location ( x Ġ/ Ġregion Size , Ġy Ġ/ Ġregion Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregion Ġ= Ġregion Map . getValue ( region Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr X Ġ= Ġx Ġ% Ġregion Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Y Ġ= Ġy Ġ% Ġregion Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ x ][ y ] Ġ= Ġregion [ r X Ġ* Ġregion Size Ġ+ Ġr Y ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow ( rows . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpaint Regions ( ĊĠĠĠĠĠĠĠ Ġwindow Description : ĠWindow Description , ĊĠĠĠĠĠĠĠ Ġregions : ĠList < Pair < Relative Region Location , ĠByteArray >> ĊĠĠĠ Ġ): ĠList < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= ĠList ( window Description . size ) Ġ{ ĠByteArray ( window Description . size ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvision Top Left X Ġ= Ġwrap World Position ( window Description . top Left Location . x ) ĊĠĠĠĠĠĠĠ Ġval Ġvision Top Left Y Ġ= Ġwrap World Position ( window Description . top Left Location . y ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset X Ġ= Ġvision Top Left X Ġ- Ġwindow Description . top Left Location . region Location . x Ġ* Ġregion Size ĊĠĠĠĠĠĠĠ Ġval Ġoffset Y Ġ= Ġvision Top Left Y Ġ- Ġwindow Description . top Left Location . region Location . y Ġ* Ġregion Size ĊĠĠĠĠĠĠĠ Ġregions . forEach Ġ{ Ġ( location , ĠbyteArray ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( rx , Ġry ) Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray . forEach Indexed Ġ{ Ġi , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġi Ġ/ Ġregion Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġi Ġ% Ġregion Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrx 1 Ġ= Ġ( rx Ġ* Ġregion Size Ġ+ Ġx ) Ġ- Ġoffset X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġry 1 Ġ= Ġ( ry Ġ* Ġregion Size Ġ+ Ġy ) Ġ- Ġoffset Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx In Bound Ġ= Ġrx 1 Ġ>= Ġ 0 Ġ&& Ġrx 1 Ġ< Ġwindow Description . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy In Bound Ġ= Ġry 1 Ġ>= Ġ 0 Ġ&& Ġry 1 Ġ< Ġwindow Description . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x In Bound Ġ&& Ġy In Bound ) Ġrows [ rx 1 ][ ry 1 ] Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrows ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Region ( region Location : ĠRegion Location ): ĠRegion Ġ= ĊĠĠĠĠĠĠĠ Ġmap Store . map . getValue ( region Location ) ĊĊĠĠĠ Ġprivate Ġfun Ġregion Distance ( left : ĠInt , Ġright : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ> Ġright ) Ġdistance (( left Ġ- Ġregion Count ) Ġ% Ġregion Count , Ġright ) ĊĠĠĠĠĠĠĠ Ġelse Ġdistance ( left , Ġright ) ĊĊĠĠĠ Ġprivate Ġfun ĠWindow Description . validate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġmap Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Request Ġ$ size Ġexceeds Ġworld Ġdimension Ġ$ map Size ") ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġand Ġ 1 Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Request Ġ$ size Ġmust Ġbe Ġodd ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap World Position ( pos : ĠInt ) Ġ= Ġif Ġ( pos Ġ< Ġ 0 ) Ġmap Size Ġ+ Ġpos Ġelse Ġpos ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDistance Ġbetween Ġtwo Ġpoints Ġon Ġa Ġline . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠĠĠĠĠ Ġ* ĠD ( AB ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdistance ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ= Ġabs ( b Ġ- Ġa ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġdata Ġclass ĠRelative Region Location ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ Ċ actual Ġval Ġmap Manager Module Ġ= ĠK ode in . Module (" map Manager Module ") Ġ{ ĊĠĠĠ Ġimport ( map Store Module ) ĊĠĠĠ Ġbind < Map Manager >() Ġwith Ġsingleton Ġ{ ĊĠĠĠĠĠĠĠ ĠMap ManagerImpl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Store Ġ= Ġinstance () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ