package Ġbe . hog ent . fa ith . fa ith . models . goals Ċ Ċ import Ġorg . th reet en . bp . LocalDateTime Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . UUID Ċ import Ġkotlin . NoSuch ElementException Ċ Ċ /** Ċ Ġ* Ġ- 1 Ġindicates Ġthe Ġbase ment Ċ Ġ*/ Ċ private Ġconst Ġval ĠSUB GO ALS _ LOWER _ BOUND Ġ= Ġ- 1 Ċ Ċ // ĠThere Ġare Ġ 1 0 Ġflo ors , Ġincluding Ġthe Ġground Ġfloor , Ġmaking Ġ 9 Ġthe Ġtop Ġfloor . Ċ const Ġval ĠSUB GO ALS _ UPPER _ BOUND Ġ= Ġ 9 Ċ private Ġconst Ġval ĠDESCRIPTION _ MAX _ LENGTH Ġ= Ġ 3 0 Ċ Ċ // ĠTODO Ġchange Ġto Ġvalue Ġof Ġthe Ġcolors Ċ enum Ġclass ĠGoal Color ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ ĠRED ( 0 ), ĠGREEN ( 1 ), ĠY ELLOW ( 2 ), ĠBL UE ( 3 ), ĠD ARK GREEN ( 4 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġpossible Ġoptions Ġof Ġwhere Ġthe Ġavatar Ġcan Ġbe Ġplaced , Ġindicating Ġthe Ġdifferent Ġways Ġto Ċ Ġ* Ġreach Ġhis Ġgoal . Ċ Ġ*/ Ċ enum Ġclass ĠRe ach Goal Way Ġ{ ĊĠĠĠ ĠSt airs , ĠE lev ator , ĠRo pe Ċ } Ċ Ċ data Ġclass ĠGoal ( ĊĠĠĠ Ġval Ġgoal Color : ĠGoal Color , ĊĠĠĠ Ġval Ġuuid : ĠUUID Ġ= ĠUUID . randomUUID () Ċ ) Ġ: ĠSerializable Ġ{ ĊĠĠĠ Ġvar ĠdateTime : ĠLocalDateTime Ġ= ĠLocalDateTime . now () ĊĊĠĠĠ Ġvar Ġis Completed : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġcurrent Position Avatar : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġ_ sub Go als Ġ= Ġmutable Map Of < Int , ĠSub Goal >() ĊĠĠĠ Ġval Ġsub Go als : ĠMap < Int , ĠSub Goal > Ġ= Ġ_ sub Go als ĊĊĠĠĠ Ġvar Ġdescription : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( value . length Ġ<= ĠDESCRIPTION _ MAX _ LENGTH ) Ġ{ Ġ" B esch rij ving Ġmag Ġniet Ġl anger Ġzijn Ġdan Ġ$ DESCRIPTION _ MAX _ LENGTH Ġte ken s ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġchosen Reach Goal Way : ĠRe ach Goal Way Ġ= ĠRe ach Goal Way . E lev ator ĊĊĠĠĠ Ġfun Ġadd Sub Goal ( new Sub Goal : ĠSub Goal , Ġfloor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire (( SUB GO ALS _ LOWER _ BOUND .. SUB GO ALS _ UPPER _ BOUND ). contains ( floor )) ĊĠĠĠĠĠĠĠ Ġ_ sub Go als [ floor ] Ġ= Ġnew Sub Goal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Sub Goal ( sub Goal : ĠSub Goal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfloor Ġ= Ġfind Floor For Sub goal ( sub Goal ) ĊĠĠĠĠĠĠĠ Ġ_ sub Go als . remove ( floor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Floor Sub Goal ( sub Goal : ĠSub Goal , Ġfloor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Goal At Floor Ġ= Ġ_ sub Go als [ floor ] ĊĠĠĠĠĠĠĠ Ġif Ġ( current Goal At Floor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Sub Goal ( sub Goal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als [ floor ] Ġ= Ġsub Goal ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Floor Ġ= Ġfind Floor For Sub goal ( sub Goal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Sub Goal ( sub Goal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als [ floor ] Ġ= Ġsub Goal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als [ original Floor ] Ġ= Ġcurrent Goal At Floor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Floor Sub Goal ( from Position : ĠInt , Ġto Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( from Position Ġ< Ġto Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Position Ġuntil Ġto Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Position Ġdown To Ġto Position Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap ( i Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswap ( i : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp : ĠSub Goal ? Ġ= Ġ_ sub Go als [ i ] ĊĠĠĠĠĠĠĠ Ġif Ġ(_ sub Go als [ i Ġ+ Ġ 1 ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als [ i ] Ġ= Ġ_ sub Go als [ i Ġ+ Ġ 1 ] !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als . remove ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als [ i Ġ+ Ġ 1 ] Ġ= Ġtemp ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ sub Go als . remove ( i Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Completed Ġ= Ġ! is Completed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Avatar To Sub Goal ( sub Goal : ĠSub Goal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Position Avatar Ġ= Ġfind Floor For Sub goal ( sub Goal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Floor For Sub goal ( sub Goal : ĠSub Goal ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ sub Go als . entries . forEach Ġ{ Ġ( index , Ġgoal ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( goal Ġ== Ġsub Goal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcopy (): ĠGoal Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Ġ= ĠGoal ( this . goal Color , Ġthis . uuid ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . description Ġ= Ġthis . description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dateTime Ġ= Ġthis . dateTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . chosen Reach Goal Way Ġ= Ġthis . chosen Reach Goal Way ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Completed Ġ= Ġthis . is Completed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Position Avatar Ġ= Ġthis . current Position Avatar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsub Go als . forEach Ġ{ Ġsub goal Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal . add Sub Goal ( sub goal . value . copy (), Ġsub goal . key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgoal ĊĠĠĠ Ġ} Ċ } Ċ