package Ġsh mp . simulation . culture . group . centers Ċ Ċ import Ġsh mp . random . singleton . chance Of Not Ċ import Ġsh mp . random . singleton . random Tile Ċ import Ġsh mp . simulation . C ult ures Controller . session Ċ import Ġsh mp . simulation . Simulation Error Ċ import Ġsh mp . simulation . culture . group .* Ċ import Ġsh mp . simulation . culture . group . place . Static Place Ċ import Ġsh mp . simulation . space . ter rit ory . Br ink Invariant T erritory Ċ import Ġsh mp . simulation . space . ter rit ory . Mutable T erritory Ċ import Ġsh mp . simulation . space . ter rit ory . Static T erritory Ċ import Ġsh mp . simulation . space . ter rit ory . T erritory Ċ import Ġsh mp . simulation . space . tile . Tile Ċ import Ġsh mp . simulation . space . tile . Tile Tag Ċ import Ġsh mp . simulation . space . tile . get Distance Ċ import Ġjava . util .* Ċ import Ġkotlin . math . abs ĊĊ Ċ class ĠT erritory Center ( group : ĠGroup , Ġval Ġspread Ability : ĠDouble , Ġtile : ĠTile ) Ġ{ ĊĠĠĠ Ġval Ġreach Distance Ġ= Ġsession . default Group Reach ĊĊĠĠĠ Ġval Ġset tled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnot Moved Ġ>= Ġ 5 0 ĊĊĠĠĠ Ġval Ġt erritory : ĠMutable T erritory Ġ= ĠBr ink Invariant T erritory () ĊĠĠĠ Ġval Ġcenter : ĠTile ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġt erritory . center ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠGroup Error (" Empty ĠGroup ĠT erritory ") ĊĊĠĠĠ Ġvar Ġnot Moved Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġtile Tag : ĠGroup Tile Tag Ġ= ĠGroup Tile Tag ( group ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ places Ġ= Ġmutable ListOf < Static Place >() ĊĠĠĠ Ġval Ġplaces : ĠList < Static Place > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ places ĊĊĠĠĠ Ġprivate Ġvar Ġ_ old Center : ĠTile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġ_ old Reach : ĠSet < Tile > Ġ= Ġset Of () ĊĠĠĠ Ġprivate Ġvar Ġ_ old Tile Types : ĠCollection < Tile . Type > Ġ= ĠlistOf () ĊĊĠĠĠ Ġfun Ġtile Potential Mapper ( tile : ĠTile ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneeded Resource Part Ġ= Ġget Reach able Tiles From ( tile ). sum By Ġ{ Ġevaluate One Tile ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrelation Part Ġ= Ġtile Tag . group . relation Center . evaluate Tile ( tile ) ĊĠĠĠĠĠĠĠ Ġreturn Ġneeded Resource Part Ġ+ Ġrelation Part ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġt erritory Potential Mapper ( ter rit ory : ĠT erritory ) Ġ= Ġt erritory . tiles . sum By Ġ{ Ġtile Potential Mapper ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate One Tile ( tile : ĠTile ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtile Evaluation Hash [ tile Ġto Ġsession . world . get Turn ()] ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequirements Ġ= Ġtile Tag . group . culture Center . aspect Center . aspect Pool . getResource Requirements () ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġrequirements . sum By Ġ{ Ġtile . resource Pack . get Amount ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġtile Evaluation Hash [ tile Ġto Ġsession . world . get Turn ()] Ġ= Ġ 3 Ġ* Ġsum ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 3 Ġ* Ġsum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġtile Evaluation Hash Ġ= Ġmutable Map Of < Pair < Tile , ĠInt >, ĠInt >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġclaim Tile ( tile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġaccessible T erritory : ĠT erritory ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠStatic T erritory ( reachable Tiles ) ĊĊĠĠĠ Ġfun ĠgetAll Near Groups ( exception : ĠGroup ) Ġ= Ġt erritory . outer Br ink ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġget Res iding Group ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġexception Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġfun Ġupdate () Ġ{// TODO Ġchange ĠWater Ġon ĠGood Tiles ĊĠĠĠĠĠĠĠ Ġleave Tiles ( ter rit ory . filter Ġ{ Ġ! can Set tle ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġif Ġ( ter rit ory . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile Tag . group . die () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! ter rit ory . contains ( ter rit ory . center )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt erritory . center Ġ= Ġt erritory . random Tile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt erritory . add ( center ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnot Moved ++ ĊĠĠĠĠĠĠĠ Ġif Ġ( set tled Ġ&& Ġcenter . tag Pool . getBy Type ( SETT LE _ TAG ). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ places . add ( Static Place ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTile Tag ( SETT LE _ TAG Ġ+ Ġ_ places . count Ġ{ Ġit . tile Tag . type Ġ== ĠSET TLE _ TAG Ġ}, ĠSET TLE _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmigrate (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Center Ġ= Ġmigration Tile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġpopulation Ġ= Ġtile Tag . group . population Center . actual Population ĊĠĠĠĠĠĠĠ Ġt erritory . center ?. remove Resource ( population ) ĊĠĠĠĠĠĠĠ Ġt erritory . center ?. add Delayed Resource ( population ) ĊĊĠĠĠĠĠĠĠ Ġt erritory . center Ġ= Ġnew Center ĊĠĠĠĠĠĠĠ Ġclaim Tile ( new Center ) ĊĠĠĠĠĠĠĠ Ġleave Tiles ( ter rit ory . filter Ġ{ Ġ! is Tile Reach able ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmigration Tile : ĠTile ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġreachable Tiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġcan Set tle And No Group Except ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. max By OrNull Ġ{ Ġtile Potential Mapper ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreachable Tiles : ĠSet < Tile > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Types Ġ= Ġget Accessible Tile Types () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ old Center Ġ!= Ġt erritory . center Ġ|| Ġtile Types Ġ!= Ġ_ old Tile Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ old Center Ġ= Ġt erritory . center ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ old Reach Ġ= Ġget Reach able Tiles From ( center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ old Tile Types Ġ= Ġtile Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ old Reach ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Accessible Tile Types (): ĠList < Tile . Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( tile Tag . group . resource Center . pack . any Ġ{ Ġit . simple Name Ġ== Ġ" Bo at " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Tile . Type . Water ) ĊĠĠĠĠĠĠĠ Ġelse ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Reach able Tiles From ( tile : ĠTile ): ĠSet < Tile > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtiles Ġ= Ġmutable Set Of < Tile >() ĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġmutable ListOf < Pair < Tile , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġqueue . add ( tile Ġto Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Layer Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtiles . addAll ( queue . map Ġ{ Ġit . first Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Tiles Ġ= Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġis Tile Reach able In Tra verse ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . first . ne ighbours Ġ}. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! tiles . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġcurrent Layer Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Tiles . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . addAll ( current Tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Layer ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Tile Reach able In Tra verse ( pair : ĠPair < Tile , ĠInt >) Ġ= Ġwhen Ġ( pair . first . type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTile . Type . Water Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ old Tile Types . contains ( Tile . Type . Water )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second Ġ<= Ġreach Distance Ġ* Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠĠĠ ĠTile . Type . Mount ain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tile Tag . group . culture Center . aspect Center . aspect Pool . contains (" Mount ain Living ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second Ġ<= Ġreach Distance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpair . second Ġ<= Ġreach Distance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġspread Ability . chance Of Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclaim Tile ( ter rit ory . get Most Use ful Tile On Outer Br ink ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcan Set tle And No Group ( it ) Ġ&& Ġis Tile Reach able ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: tile Potential Mapper ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshrink () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ter rit ory . size Ġ<= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġleave Tile ( ter rit ory . get Most Use less Tile ( this :: tile Potential Mapper )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Tile Reach able ( tile : ĠTile ) Ġ= Ġget Distance ( tile , Ġcenter ) Ġ< Ġsession . default Group T erritory Radius ĊĊĠĠĠ Ġfun Ġclaim Tile ( tile : ĠTile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tile Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! tile . tag Pool . contains ( tile Tag ) Ġ&& Ġhas Res iding Group ( tile )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () ĊĊĠĠĠĠĠĠĠ Ġtile Tag . group . parent Group . claim Tile ( tile ) ĊĠĠĠĠĠĠĠ Ġtile . tag Pool . add ( tile Tag ) ĊĠĠĠĠĠĠĠ Ġt erritory . add ( tile ) ĊĠĠĠĠĠĠĠ Ġtile Tag . group . add Event ( Claim Tile Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Group Ġ${ tile Tag . group . name } Ġclaimed Ġtile Ġ${ tile . pos Str }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtile Tag . group , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtile ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdie () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tile Ġin Ġt erritory . tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile . tag Pool . remove ( tile Tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġleave Tile ( tile : ĠTile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tile Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtile . tag Pool . remove ( tile Tag ) ĊĠĠĠĠĠĠĠ Ġt erritory . remove ( tile ) ĊĠĠĠĠĠĠĠ Ġtile Tag . group . parent Group . remove Tile ( tile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġleave Tiles ( tiles : ĠCollection < Tile >) Ġ= Ġtiles . forEach Ġ{ Ġleave Tile ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġcan Set tle ( tile : ĠTile ) Ġ= Ġ( tile . type Ġ!= ĠTile . Type . Water Ġ&& Ġtile . type Ġ!= ĠTile . Type . Mount ain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( tile . type Ġ== ĠTile . Type . Mount ain // TODO Ġset Ġof Ġaccessible Ġtile Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtile Tag . group . culture Center . aspect Center . aspect Pool . contains (" mount ain Living "))) ĊĊĠĠĠ Ġfun Ġcan Set tle And No Group ( tile : ĠTile ) Ġ= Ġcan Set tle ( tile ) Ġ{ Ġhas No Res iding Group ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġcan Set tle And No Group Except ( tile : ĠTile ) Ġ= Ġcan Set tle ( tile ) Ġ{ Ġhas No Res iding Group Except ( it , Ġtile Tag . group ) Ġ} ĊĊĠĠĠ Ġfun Ġcan Set tle ( tile : ĠTile , Ġadditional Condition : Ġ( Tile ) Ġ-> ĠBoolean ) Ġ= Ġcan Set tle ( tile ) Ġ&& Ġadditional Condition ( tile ) ĊĊĠĠĠ Ġfun Ġmake Path ( start : ĠTile , Ġfinish : ĠTile ): ĠList < Tile >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmake Path A Star ( start , Ġfinish ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Path A Star ( start : ĠTile , Ġfinish : ĠTile ): ĠList < Tile >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġ{ t : ĠTile Ġ-> Ġabs ( t . x Ġ- Ġfinish . x ) Ġ+ Ġabs ( t . y Ġ- Ġfinish . y ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġg Ġ= Ġmutable Map Of < Tile , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġmutable Map Of < Tile , ĠInt >() ĊĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġmutable Map Of < Tile , ĠTile >() ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠPriority Queue < Tile >( Comparator . comp aring Int Ġ{ Ġt Ġ-> Ġf . getValue ( t ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġu Ġ= Ġmutable Set Of < Tile >() ĊĊĠĠĠĠĠĠĠ Ġg [ start ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġg [ start ] Ġ= Ġh ( start ) ĊĠĠĠĠĠĠĠ Ġq . add ( start ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġturns Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( q . isNotEmpty () Ġ&& Ġturns Ġ< Ġ 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturns ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Ġ= Ġq . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Ġ== Ġfinish ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġun wind ( start , Ġfinish , Ġprev ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġu . add ( cur ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġne ighbours Ġ= Ġcur . ne ighbours . filter Ġ{ Ġis Tile Reach able In Tra verse ( it Ġto Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġne ighbours ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġg . getValue ( cur ) Ġ+ Ġdistance ( cur , Ġv ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġin Ġu Ġ&& Ġdistance Ġ>= Ġg . getValue ( v )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev [ v ] Ġ= Ġcur ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg [ v ] Ġ= Ġdistance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf [ v ] Ġ= Ġdistance Ġ+ Ġh ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq . add ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdistance ( start : ĠTile , Ġfinish : ĠTile ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( finish . resource Pack . any Ġ{ Ġit . simple Name Ġ== Ġ" Road " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġabs ( start . level Ġ- Ġfinish . level ) Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun wind ( start : ĠTile , Ġcur : ĠTile , Ġmap : ĠMap < Tile , ĠTile >): ĠList < Tile > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( cur Ġ== Ġstart ) Ġempty List () Ġelse Ġun wind ( start , Ġmap . getValue ( cur ), Ġmap )) Ġ+ ĠlistOf ( cur ) Ċ } Ċ Ċ const Ġval ĠSET TLE _ TAG Ġ= Ġ" Set tlement " Ċ Ċ data Ġclass ĠTile And Prev ( val Ġtile : ĠTile , Ġval Ġprev : ĠTile And Prev ?, Ġval Ġlength : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠ Ġfun Ġun wind (): ĠList < Tile > Ġ= ĠlistOf ( this . tile ) Ġ+ Ġif Ġ( this . prev Ġ== Ġnull ) Ġempty List () Ġelse Ġthis . prev . un wind () Ċ } Ċ