package Ġworld . greg s . void ps . tools . map . view . graph Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude Ċ import Ġcom . fasterxml . jackson . core . Json Factory Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġworld . greg s . void ps . engine . map . Tile Ċ import Ġjava . io . File Ċ Ċ class ĠMutable Navigation Graph Ġ{ ĊĊĠĠĠ Ġval Ġad jacency List Ġ= Ġmutable Map Of < Tile , ĠMutable List < Link >>() ĊĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġadd Node ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠTile Ġ= ĠgetNode OrNull ( x , Ġy , Ġz ) Ġ?: Ġcreate Node ( x , Ġy , Ġz ) ĊĊĠĠĠ Ġfun ĠgetNode OrNull ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ) Ġ= ĠgetNode OrNull ( Tile . getId ( x , Ġy , Ġz )) ĊĊĠĠĠ Ġfun ĠgetNode OrNull ( id : ĠInt ) Ġ= Ġad jacency List . keys . first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( tile : ĠTile ) Ġ= Ġad jacency List . contains ( tile ) ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Node ( x : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠTile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠTile ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġad jacency List . put If Absent ( node , Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Node ( node : ĠTile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ad jacency List . remove ( node ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Link ( x 1 : ĠInt , Ġy 1 : ĠInt , Ġz 1 : ĠInt , Ġx 2 : ĠInt , Ġy 2 : ĠInt , Ġz 2 : ĠInt ): ĠLink Ġ= Ġadd Link ( Tile ( x 1 , Ġy 1 , Ġz 1 ), ĠTile ( x 2 , Ġy 2 , Ġz 2 )) ĊĊĠĠĠ Ġfun Ġadd Link ( start : ĠTile , Ġend : ĠTile ): ĠLink Ġ= Ġget Link OrNull ( start , Ġend ) Ġ?: Ġcreate Link ( start , Ġend ) ĊĊĠĠĠ Ġfun Ġget Link OrNull ( start : ĠTile , Ġend : ĠTile ): ĠLink ? Ġ= Ġget Links ( start ). first OrNull Ġ{ Ġit . end Ġ== Ġend Ġ} ĊĊĠĠĠ Ġfun Ġget Link OrNull ( x 1 : ĠInt , Ġy 1 : ĠInt , Ġz 1 : ĠInt , Ġx 2 : ĠInt , Ġy 2 : ĠInt , Ġz 2 : ĠInt ): ĠLink ? Ġ= Ġget Link OrNull ( Tile ( x 1 , Ġy 1 , Ġz 1 ), ĠTile ( x 2 , Ġy 2 , Ġz 2 )) ĊĊĠĠĠ Ġfun Ġget Links ( node : ĠTile ): ĠList < Link > Ġ= Ġad jacency List [ node ] Ġ?: Ġempty List () ĊĊĠĠĠ Ġfun Ġget Linked ( node : ĠTile ): ĠList < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġad jacency List . flatMap Ġ{ Ġ(_, Ġadj ) Ġ-> Ġadj . filter Ġ{ Ġlink Ġ-> Ġlink . end Ġ== Ġnode Ġ} Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Link ( start : ĠTile , Ġend : ĠTile ): ĠLink Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Ġ= ĠLink ( start , Ġend ) ĊĠĠĠĠĠĠĠ Ġad jacency List . get Or Put ( start ) Ġ{ Ġmutable ListOf () Ġ}. add ( link ) ĊĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġlink ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Link ( link : ĠLink ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ad jacency List [ link . start ]?. remove ( link ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Node ( original : ĠTile , Ġx : ĠInt , Ġy : ĠInt , Ġz : ĠInt ): ĠTile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġcreate Node ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġ== Ġoriginal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoriginal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġad jacency List . remove ( original )?. to Mutable List () Ġ?: Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġad jacency List [ node ] Ġ= Ġremoved ĊĠĠĠĠĠĠĠ Ġremoved . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . start Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġad jacency List . forEach Ġ{ Ġ(_, Ġadj ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadj . forEach Ġ{ Ġlink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link . end Ġ== Ġoriginal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink . end Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġremove Node ( original ) ĊĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreader Ġ= ĠObjectMapper ( Json Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Kotlin Module () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Serialization In clusion ( JsonInclude . Include . NON _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwriter Ġ= Ġreader . writer WithDefault PrettyPrinter () ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġsave ( graph : ĠMutable Navigation Graph , Ġpath : ĠString Ġ= Ġ"./ nav graph . json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . writeValue ( file , Ġgraph . ad jacency List . map Keys Ġ{ Ġit . key . id Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġload ( path : ĠString Ġ= Ġ"./ nav graph . json "): ĠMutable Navigation Graph Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠMutable Navigation Graph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < String , ĠArrayList < Map < String , ĠAny >>> Ġ= Ġreader . readValue ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . forEach Ġ{ Ġ( key , Ġlist ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . ad jacency List [ Tile ( key . toInt ()) ] Ġ= Ġlist . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLink ( Tile ( it [" start "] Ġas ĠInt ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTile ( it [" end "] Ġas ĠInt ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" actions "] Ġas ? ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" requirements "] Ġas ? ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgraph ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }