package Ġcom . quest mark . entity . systems . enemy Ċ Ċ import Ġcom . badlogic . ash ley . core . Engine Ċ import Ġcom . badlogic . ash ley . core . Entity Ċ import Ġcom . badlogic . ash ley . core . Entity System Ċ import Ġcom . badlogic . ash ley . core . Family Ċ import Ġcom . badlogic . ash ley . systems . Iter ating System Ċ import Ġcom . badlogic . ash ley . utils . Immutable Array Ċ import Ġcom . badlogic . gdx . math . Rectangle Ċ import Ġcom . badlogic . gdx . math . Vector 2 Ċ import Ġcom . badlogic . gdx . utils . Array Ċ import Ġcom . quest mark . entity . Mapper Ċ import Ġcom . quest mark . entity . components .* Ċ import Ġcom . quest mark . entity . components . enemy . Ag gression Component Ċ import Ġcom . quest mark . entity . components . enemy . Enemy Component Ċ import Ġcom . quest mark . entity . components . enemy . Source Position Component Ċ import Ġcom . quest mark . entity . components . player . Player Component Ċ import Ġcom . quest mark . entity . systems . Map System Ċ import Ġcom . quest mark . path finding . A Star Ċ import Ġcom . quest mark . path finding . Node Ċ Ċ import Ġjava . util . HashMap Ċ Ċ /** Ċ Ġ* ĠA ĠLib G DX ĠA sh ley Ġ[ Entity System ] Ġthat Ġhandles Ġthe Ġmovement Ġof Ġenemies . ĠIn Ġthis Ġsystem , Ċ Ġ* Ġenemies Ġfollows Ġthe Ġplayer Ġusing Ġa Ġpath Ġcalculated Ġby Ġthe ĠA * Ġsearch Ġalgorithm . Ċ Ġ* Ċ Ġ* Ġ@ author ĠM ing ĠLi Ċ Ġ*/ Ċ class ĠA Star Movement System Ġ: ĠIter ating System ( Family . all ( Enemy Component :: class . java , ĠAg gression Component :: class . java , ĠSource Position Component :: class . java ). get ()), ĠMap System Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalg : ĠA Star ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcoll id able Entities : ĠImmutable Array < Entity > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmap Coll isions : ĠArray < Rectangle > ĊĠĠĠ Ġprivate Ġval Ġall Coll isions : ĠArray < Rectangle > Ġ= ĠArray () ĊĠĠĠ Ġprivate Ġvar Ġtile Size : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġplayer : ĠEntity ĊĠĠĠ Ġprivate Ġval Ġpaths : ĠMutable Map < Entity , ĠArray < Node >> Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġtimers : ĠMutable Map < Entity , ĠFloat > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġfreq s : ĠMutable Map < Entity , ĠFloat > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġto Source : ĠMutable Map < Entity , ĠBoolean > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġreturn Paths : ĠMutable Map < Entity , ĠArray < Node >> Ġ= ĠHashMap () ĊĊĠĠĠ Ġoverride Ġfun Ġadded To Engine ( engine : ĠEngine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . added To Engine ( engine ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġthis . entities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimers [ e ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Source [ e ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer Ġ= Ġengine . get Entities For ( Family . all ( Player Component :: class . java ). get ()). get ( 0 ) ĊĠĠĠĠĠĠĠ Ġcoll id able Entities Ġ= Ġengine . get Entities For ( Family . all ( BoundingBox Component :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exclude ( Enemy Component :: class . java , ĠPlayer Component :: class . java ). get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Entity ( entity : ĠEntity , Ġdelta Time : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagg Ġ= ĠMapper . AGG RESS ION _ MAP PER . get ( entity ) ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠMapper . POS _ MAP PER . get ( entity ) ĊĠĠĠĠĠĠĠ Ġval Ġplayer Pos Ġ= ĠMapper . POS _ MAP PER . get ( player ) ĊĠĠĠĠĠĠĠ Ġval Ġvel Ġ= ĠMapper . VEL _ MAP PER . get ( entity ) ĊĠĠĠĠĠĠĠ Ġval Ġmag Ġ= ĠMapper . SPEED _ MAP PER . get ( entity ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġplayer Ġwithin Ġag gression Ġrange ĊĠĠĠĠĠĠĠ Ġif Ġ( pos . p . dst ( player Pos . p ) Ġ<= Ġagg . range Ġ|| Ġagg . range Ġ== Ġ- 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġagg . at Source Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Source [ entity ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimers [ entity ] Ġ= Ġtimers [ entity ] !! Ġ+ Ġdelta Time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timers [ entity ] !! Ġ> Ġfreq s [ entity ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠVector 2 (( Math . round ( pos . p . x Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . round ( pos . p . y Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠVector 2 (( Math . round ( player Pos . p . x Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . round ( player Pos . p . y Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġ== Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . v . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths [ entity ] Ġ= ĠgetPath ( entity , Ġsource , Ġtarget ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimers [ entity ] Ġ= Ġtimers [ entity ] !! Ġ- Ġfreq s [ entity ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġpaths [ entity ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġpath . get ( path . size Ġ- Ġ 1 ). position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( pos . p , Ġtarget , Ġvel . v , Ġmag . speed , Ġdelta Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠMapper . SOURCE _ POS _ MAP PER . get ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsx Ġ= Ġsource . s . x . toInt () Ġ/ Ġtile Size Ġ* Ġtile Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsy Ġ= Ġsource . s . y . toInt () Ġ/ Ġtile Size Ġ* Ġtile Size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! to Source [ entity ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠVector 2 ( sx . toFloat (), Ġsy . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Paths [ entity ] Ġ= ĠgetPath ( entity , ĠVector 2 (( Math . round ( pos . p . x Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . round ( pos . p . y Ġ/ Ġtile Size ) Ġ* Ġtile Size ). toFloat ()), Ġs ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Source [ entity ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreturn Path Ġ= Ġreturn Paths [ entity ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return Path . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġreturn Path . get ( return Path . size Ġ- Ġ 1 ). position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sx . toFloat () Ġ== Ġtarget . x Ġ&& Ġsy . toFloat () Ġ== Ġtarget . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( pos . p , Ġsource . s , Ġvel . v , Ġmag . speed , Ġdelta Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . p Ġ== Ġsource . s ) Ġreturn Path . remove Index ( return Path . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( pos . p , Ġtarget , Ġvel . v , Ġmag . speed , Ġdelta Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . p Ġ== Ġtarget ) Ġreturn Path . remove Index ( return Path . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos . p Ġ== Ġsource . s ) Ġagg . at Source Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Map Data ( map Width : ĠInt , Ġmap Height : ĠInt , Ġtile Size : ĠInt , Ġbounding Boxes : ĠArray < Rectangle >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . alg Ġ= ĠA Star ( map Width , Ġmap Height , Ġtile Size ) ĊĠĠĠĠĠĠĠ Ġthis . map Coll isions Ġ= Ġbounding Boxes ĊĠĠĠĠĠĠĠ Ġthis . tile Size Ġ= Ġtile Size ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġthis . entities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmag Ġ= ĠMapper . SPEED _ MAP PER . get ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfreq s [ e ] Ġ= Ġtile Size Ġ/ Ġ 2 Ġ/ Ġmag . speed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġthe ĠA * Ġalgorithm Ġwith Ġa Ġgiven Ġsource Ġand Ġtarget Ġon Ġa Ġgiven Ġentity . ĊĠĠĠĠ Ġ* ĠHelper Ġmethod Ġthat Ġdoes Ġthe Ġinitial Ġcollision Ġdata Ġsetup . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġe ĊĠĠĠĠ Ġ* Ġ@ param Ġsource ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetPath ( e : ĠEntity , Ġsource : ĠVector 2 , Ġtarget : ĠVector 2 ): ĠArray < Node >? Ġ{ ĊĠĠĠĠĠĠĠ Ġall Coll isions . clear () ĊĠĠĠĠĠĠĠ Ġall Coll isions . addAll ( map Coll isions ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( entity Ġin Ġcoll id able Entities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ!= Ġentity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbb Ġ= ĠMapper . BOUND ING _ BOX _ MAP PER . get ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Coll isions . add ( bb . bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġalg . set Collision Data ( all Coll isions ) ĊĠĠĠĠĠĠĠ Ġreturn Ġalg . find Path ( source , Ġtarget ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġan Ġentity Ġfrom Ġa Ġsource Ġto Ġa Ġtarget Ġby Ġupdating Ġits Ġvelocity . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsource ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget ĊĠĠĠĠ Ġ* Ġ@ param Ġvel ĊĠĠĠĠ Ġ* Ġ@ param Ġspeed ĊĠĠĠĠ Ġ* Ġ@ param Ġdt ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmove ( source : ĠVector 2 , Ġtarget : ĠVector 2 , Ġvel : ĠVector 2 , Ġspeed : ĠFloat , Ġdt : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( source . x Ġ< Ġtarget . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source . x Ġ+ Ġspeed Ġ* Ġdt Ġ> Ġtarget . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . x Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . x Ġ= Ġtarget . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . x Ġ= Ġspeed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( source . x Ġ> Ġtarget . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source . x Ġ- Ġspeed Ġ* Ġdt Ġ< Ġtarget . x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . x Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . x Ġ= Ġtarget . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . x Ġ= Ġ- speed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( source . y Ġ< Ġtarget . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source . y Ġ+ Ġspeed Ġ* Ġdt Ġ> Ġtarget . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . y Ġ= Ġtarget . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . y Ġ= Ġspeed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( source . y Ġ> Ġtarget . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source . y Ġ- Ġspeed Ġ* Ġdt Ġ< Ġtarget . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . y Ġ= Ġtarget . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvel . y Ġ= Ġ- speed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ