/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 0 ĠG uth ix Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . g uth ix . old scape . server . path ing Ċ Ċ import Ġio . g uth ix . old scape . server . world . World Map Ċ import Ġio . g uth ix . old scape . server . world . map . Tile Ċ import Ġio . g uth ix . old scape . server . world . map . dim . Tile Unit Ċ import Ġio . g uth ix . old scape . server . world . map . dim . tiles Ċ Ċ fun Ġsimple Path Search ( start : ĠTile , Ġdest : ĠDestination , Ġm over Size : ĠTile Unit , Ġmap : ĠWorld Map ): ĠMutable List < Tile > Ġ{ ĊĠĠĠ Ġvar Ġcur X Ġ= Ġstart . x ĊĠĠĠ Ġvar Ġcur Y Ġ= Ġstart . y ĊĠĠĠ Ġval Ġpath Ġ= Ġmutable ListOf < Tile >() ĊĠĠĠ Ġwhile Ġ(! dest . re ached ( cur X , Ġcur Y , Ġm over Size )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= Ġget Direction ( cur X . value , Ġcur Y . value , Ġdest . x . value , Ġdest . y . value ) ĊĠĠĠĠĠĠĠ Ġvar Ġfinal Destination Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġdirections @ Ġfor Ġ( dir Ġin Ġdirections ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . SO UTH Ġ-> Ġif Ġ( map . can Walk South ( start . floor , Ġcur X , Ġcur Y , Ġm over Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . NORTH Ġ-> Ġif Ġ( map . can Walk North ( start . floor , Ġcur X , Ġcur Y , Ġm over Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . WEST Ġ-> Ġif Ġ( map . can Walk West ( start . floor , Ġcur X , Ġcur Y , Ġm over Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . EAST Ġ-> Ġif Ġ( map . can Walk East ( start . floor , Ġcur X , Ġcur Y , Ġm over Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . SO UTH _ WEST Ġ-> Ġif Ġ( map . can Walk South West ( start . floor , Ġcur X , Ġcur Y , Ġm over Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ!( dest . x Ġ== Ġcur X Ġ- Ġ 1 . tiles Ġ&& Ġdest . y Ġ== Ġcur Y Ġ- Ġ 1 . tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . NORTH _ WEST Ġ-> Ġif Ġ( map . can Walk North West ( start . floor , Ġcur X , Ġcur Y , Ġm over Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ!( dest . x Ġ== Ġcur X Ġ- Ġ 1 . tiles Ġ&& Ġdest . y Ġ== Ġcur Y Ġ+ Ġ 1 . tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . SO UTH _ EAST Ġ-> Ġif Ġ( map . can Walk South East ( start . floor , Ġcur X , Ġcur Y , Ġm over Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ!( dest . x Ġ== Ġcur X Ġ+ Ġ 1 . tiles Ġ&& Ġdest . y Ġ== Ġcur Y Ġ- Ġ 1 . tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . NORTH _ EAST Ġ-> Ġif Ġ( map . can Walk North East ( start . floor , Ġcur X , Ġcur Y , Ġm over Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ!( dest . x Ġ== Ġcur X Ġ+ Ġ 1 . tiles Ġ&& Ġdest . y Ġ== Ġcur Y Ġ+ Ġ 1 . tiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur X ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Y ++ Ġ// ĠTODO Ġm abe Ġoptimize Ġthis Ġuse ĠDirection s Ġarray ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . add ( Tile ( start . floor , Ġcur X , Ġcur Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Destination Found Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ directions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( final Destination Found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpath Ċ } Ċ Ċ private Ġval Ġdirect Directions Ġ= ĠlistOf ( Direction . NORTH , ĠDirection . EAST , ĠDirection . SO UTH , ĠDirection . WEST ) Ċ Ċ private Ġfun Ġget Direction ( start X : ĠInt , Ġstart Y : ĠInt , Ġdest X : ĠInt , Ġdest Y : ĠInt ): ĠList < Direction > Ġ{ ĊĠĠĠ Ġif Ġ( start X Ġ== Ġdest X ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start Y Ġ> Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . SO UTH ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( start Y Ġ< Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . NORTH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( start Y Ġ== Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start X Ġ> Ġdest X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . WEST ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( start X Ġ< Ġdest X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . EAST ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start X Ġ< Ġdest X Ġ&& Ġstart Y Ġ< Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . NORTH _ EAST , ĠDirection . EAST , ĠDirection . NORTH ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( start X Ġ< Ġdest X Ġ&& Ġstart Y Ġ> Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . SO UTH _ EAST , ĠDirection . EAST , ĠDirection . SO UTH ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( start X Ġ> Ġdest X Ġ&& Ġstart Y Ġ< Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . NORTH _ WEST , ĠDirection . WEST , ĠDirection . NORTH ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( start X Ġ> Ġdest X Ġ&& Ġstart Y Ġ> Ġdest Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Direction . SO UTH _ WEST , ĠDirection . WEST , ĠDirection . SO UTH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdirect Directions . sh uffled () Ċ }