package Ġcom . github . mark ush i . pos enet čĊč Ċ import Ġandroidx . lifecycle . Mutable LiveData č Ċ import Ġcom . github . mark ush i . pos enet . domain . Pose č Ċ import Ġjava . util .* čĊč Ċ class ĠGame Controller Ġ{ čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ WALL _ DIFF Ġ= Ġ 0 . 0 6 f čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġsealed Ġclass ĠState Ġ{ čĊĠĠĠĠĠĠĠ Ġobject ĠReady Ġ: ĠState () čĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠRunning ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoints Text : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Time Text : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwall Pose : ĠP ose , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Pose : ĠP ose ?, čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwall Diff : ĠFloat čĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () čĊčĊĠĠĠĠĠĠĠ Ġclass ĠOver ( val Ġpoints Text : ĠString ) Ġ: ĠState () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġval Ġstate Ġ= ĠMutable LiveData < State >( State . Ready ) čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġremaining Ġtime Ġin Ġseconds čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġvar Ġremaining Time Ġ= Ġ 0 čĊĠĠĠ Ġprivate Ġvar Ġpoints : ĠInt Ġ= Ġ 0 čĊĠĠĠ Ġprivate Ġvar Ġuser Pose : ĠP ose ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġwall Pose : ĠP ose ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġwall Idx Ġ= Ġ 0 čĊĠĠĠ Ġprivate Ġvar Ġwall Diff : ĠFloat Ġ= Ġ 1 f čĊĠĠĠ Ġprivate Ġvar Ġtimer : ĠTimer ? Ġ= Ġnull čĊčĊĠĠĠ Ġprivate Ġvar Ġwalls Ġ= ĠlistOf ( čĊĠĠĠĠĠĠĠ ĠP ose . from ( čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 2 1 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 3 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 7 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 1 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 6 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 8 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 1 5 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 9 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 9 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 6 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 3 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 9 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 0 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 7 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 8 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 1 1 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 3 5 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 3 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 9 5 f čĊĠĠĠĠĠĠĠ Ġ), čĊĠĠĠĠĠĠĠ ĠP ose . from ( čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 4 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 5 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 8 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 4 7 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 5 7 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 9 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 4 0 7 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 1 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 0 7 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 7 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 5 7 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 2 1 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 2 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f čĊĠĠĠĠĠĠĠ Ġ), čĊĠĠĠĠĠĠĠ ĠP ose . from ( čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 3 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 1 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 7 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 3 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 2 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 4 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 5 6 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 2 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 3 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 4 0 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 2 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 7 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 6 7 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 6 6 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 4 4 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 9 5 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 2 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 7 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 7 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 3 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f čĊĠĠĠĠĠĠĠ Ġ), čĊĠĠĠĠĠĠĠ ĠP ose . from ( čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 0 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 8 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 4 8 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 1 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 4 1 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 1 2 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 1 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 6 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 9 5 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 3 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 9 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 1 9 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 6 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 2 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 1 3 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 7 8 8 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 0 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 0 0 f čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġprivate Ġfun Ġupdate Running State () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġremaining Time Ġ/ Ġ 6 0 čĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġremaining Time Ġ% Ġ 6 0 čĊĠĠĠĠĠĠĠ Ġval Ġremaining Time Text Ġ= ĠString . format ( Locale . US , Ġ"% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) čĊĠĠĠĠĠĠĠ Ġstate . post Value ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . Running ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ points ĠPoints ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time Text , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwall Pose !! , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Pose , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwall Diff čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġmove To Stop State () Ġ{ čĊĠĠĠĠĠĠĠ Ġstate . post Value ( State . Over ("$ points ")) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġstart Game () Ġ{ čĊĠĠĠĠĠĠĠ Ġtimer ?. cancel () čĊčĊĠĠĠĠĠĠĠ Ġpoints Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġwalls Ġ= Ġwalls . sh uffled () čĊĠĠĠĠĠĠĠ Ġwall Idx Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġwall Pose Ġ= Ġwalls [ wall Idx ] čĊĠĠĠĠĠĠĠ Ġremaining Time Ġ= Ġ 3 0 čĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer (" game - countdown "). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule At Fixed Rate ( object Ġ: ĠTimer Task () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remaining Time Ġ<= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ apply . cancel () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Stop State () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Time -- čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Running State () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 , Ġ 1 0 0 0 ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġupdate Running State () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġstop Game () Ġ{ čĊĠĠĠĠĠĠĠ Ġtimer ?. cancel () čĊĠĠĠĠĠĠĠ Ġmove To Stop State () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon User Pose ( pose : ĠP ose ) Ġ{ čĊĠĠĠĠĠĠĠ Ġuser Pose Ġ= Ġpose čĊčĊĠĠĠĠĠĠĠ Ġ// ĠR aising Ġhands Ġto Ġlaunch Ġthe Ġgame čĊĠĠĠĠĠĠĠ Ġif Ġ( state . value Ġ== ĠState . Ready Ġ|| Ġstate . value Ġis ĠState . Over ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pose . left W rist . y Ġ< Ġ 0 . 1 f Ġ&& Ġpose . right W rist . y Ġ< Ġ 0 . 1 f ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Game () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġmore Ġtime čĊĠĠĠĠĠĠĠ Ġif Ġ( remaining Time Ġ<= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠĠĠĠĠ Ġ// ĠCompare Ġwall Ġto Ġuser Ġpose čĊĠĠĠĠĠĠĠ Ġwall Diff Ġ= Ġwall Pose ?. diff To ( pose ) Ġ?: Ġ 1 f čĊĠĠĠĠĠĠĠ Ġif Ġ( wall Diff Ġ<= ĠMAX _ WALL _ DIFF ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwall Idx Ġ= Ġ( wall Idx Ġ+ Ġ 1 ) Ġ% Ġwalls . size čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwall Pose Ġ= Ġwalls [ wall Idx ] čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġupdate Running State () čĊĠĠĠ Ġ} č Ċ }