/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠN ich olas ĠB ily k Ċ Ġ* Ċ Ġ* Ġ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 Ġld 4 1 Ċ Ċ import Ġcom . ac orn ui . collection . replace Ċ import Ġcom . ac orn ui . component . Stack Layout Container Ċ import Ġcom . ac orn ui . component . Ui Component Ċ import Ġcom . ac orn ui . component . stage Ċ import Ġcom . ac orn ui . core . di . Owned Ċ import Ġcom . ac orn ui . core . di . own Ċ import Ġcom . ac orn ui . core . focus . focus First Ċ import Ġcom . ac orn ui . core . immutable . Data Binding Ċ import Ġcom . ac orn ui . core . input . Ascii Ċ import Ġcom . ac orn ui . core . input . key Down Ċ import Ġcom . ac orn ui . core . mvc . command er Ċ import Ġcom . ac orn ui . core . mvc . invoke Command Ċ import Ġcom . ac orn ui . core . t ween . Tween Ċ import Ġcom . ac orn ui . sk ins . Basic Ui Skin Ċ import Ġld 4 1 . command .* Ċ import Ġld 4 1 . model . Ld 4 1 Vo Ċ import Ġld 4 1 . model . Target Vo Ċ import Ġld 4 1 . data . targets Ċ import Ġld 4 1 . data . emails Ċ import Ġld 4 1 . data . f lir ts Ċ import Ġld 4 1 . data . ter rors Ġas Ġd T errors Ċ import Ġld 4 1 . data . initial F li rt Ċ import Ġld 4 1 . model . F li rt Vo Ċ Ċ /** Ċ Ġ* Ġ@ author Ġnb ily k Ċ Ġ*/ Ċ class ĠL d 4 1 ( owner : ĠOwn ed ) Ġ: ĠStack Layout Container ( owner ) Ġ{ ĊĊ ĉ override Ġvar Ġfocus Enabled : ĠBoolean Ġ= Ġtrue ĊĊ ĉ private Ġval Ġdata Binding Ġ= ĠData Binding < Ld 4 1 Vo >() ĊĊ ĉ private Ġval Ġcmd Ġ= Ġown ( command er ()) ĊĊ ĉ private Ġvar Ġintro View : ĠIntro View ĊĊ ĉ private Ġvar Ġemail View : ĠEmail View ĊĊ ĉ private Ġvar Ġh unt View : ĠH unt View ĊĊ ĉ private Ġvar Ġf li rt View : ĠF li rt View ĊĊ ĉ private Ġvar Ġgame Over View : ĠGame Over View ĊĊ ĉ private Ġvar Ġ_ current View : ĠUi Component ? Ġ= Ġnull Ċ ĉ private Ġvar Ġcurrent View : ĠUi Component ? Ċĉ ĉ get () Ġ= Ġ_ current View Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ remove Element (_ current View ) Ċĉĉ ĉ _ current View Ġ= Ġvalue Ċĉĉ ĉ add Optional Element ( value ) Ċĉĉ ĉ value ?. focus First () Ċĉ ĉ } ĊĊ ĉ private Ġvar Ġt errors : ĠList < String > Ġ= Ġd T errors Ċ ĉ private Ġvar Ġhas Started H unt : ĠBoolean Ġ= Ġfalse ĊĊ ĉ init Ġ{ Ċĉ ĉ Tween . prepare () Ġ// ĠMake Ġthe Ġvery Ġfirst Ġt ween Ġsmooth . Ċĉ ĉ Basic Ui Skin ( stage ). apply () ĊĊĉ ĉ data Binding . set ( Ld 4 1 Vo ( Ċĉĉĉ ĉ targets Ġ= Ġtargets , Ċĉĉĉ ĉ emails Ġ= Ġemails , Ċĉĉĉ ĉ f lir ts Ġ= Ġf lir ts ) Ċĉ ĉ ) ĊĊĉ ĉ intro View Ġ= ĠIntro View ( this ) Ġlayout Ġ{ Ġfill () Ġ} ĊĊĉ ĉ email View Ġ= ĠEmail View ( this ). apply Ġ{ Ċĉĉ ĉ this @ Ld 4 1 . data Binding . bind Ġ{ Ċĉĉĉ ĉ emails . set ( it . emails ) Ċĉĉ ĉ } Ċĉĉ ĉ emails . bind Ġ{ Ċĉĉĉ ĉ new Emails Ġ-> Ċĉĉĉ ĉ this @ Ld 4 1 . data Binding Ġ{ Ċĉĉĉĉ ĉ it . copy ( emails Ġ= Ġnew Emails ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ġlayout Ġ{ Ġfill () Ġ} ĊĊĉ ĉ h unt View Ġ= ĠH unt View ( this ). apply Ġ{ Ċĉ ĉ } Ġlayout Ġ{ Ġfill () Ġ} ĊĊĉ ĉ f li rt View Ġ= ĠF li rt View ( this ) Ġlayout Ġ{ Ġfill () Ġ} ĊĊĉ ĉ game Over View Ġ= ĠGame Over View ( this ) Ġlayout Ġ{ Ġfill () Ġ} ĊĊĉ ĉ current View Ġ= Ġintro View ĊĊĉ ĉ cmd . on Command Inv oked ( Complete Intro ) Ġ{ Ċĉĉ ĉ f li rt View . data Bind . set ( Triple ( null , Ġinitial F li rt , Ġfalse )) Ċĉĉ ĉ current View Ġ= Ġf li rt View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( H unt Command ) Ġ{ Ċĉĉ ĉ event Ġ-> Ċĉĉ ĉ data Binding Ġ{ Ċĉĉĉ ĉ it . copy ( last Target Ġ= Ġevent . target Id , Ġh unt Count Ġ= Ġit . h unt Count Ġ+ Ġ 1 ) Ċĉĉ ĉ } Ċĉĉ ĉ h unt View . data Bind . set ( getTarget ById ( event . target Id )) Ċĉĉ ĉ if Ġ(! this . has Started H unt ) Ċĉĉĉ ĉ this . has Started H unt Ġ= Ġtrue Ċĉĉ ĉ current View Ġ= Ġh unt View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( Sp urn ed Command ) Ġ{ Ċĉĉ ĉ data Binding Ġ{ Ċĉĉĉ ĉ if Ġ(! has Started H unt ) Ġit Ġelse Ċĉĉĉĉ ĉ it . copy ( sp urn ed Count Ġ= Ġit . sp urn ed Count Ġ+ Ġ 1 ) Ċĉĉ ĉ } Ċĉĉ ĉ current View Ġ= Ġemail View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( Kill Command ) Ġ{ Ċĉĉ ĉ event Ġ-> Ċĉĉ ĉ data Binding Ġ{ Ċĉĉĉ ĉ if Ġ( event . target Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉ ĉ val Ġindex Ġ= Ġget Target Index ById ( event . target . id ) Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ targets Ġ= Ġit . targets . replace ( index , Ġevent . target . copy ( k illed Ġ= Ġtrue )), Ċĉĉĉĉĉĉ ĉ kill Count Ġ= Ġit . kill Count Ġ+ Ġ 1 , Ċĉĉĉĉĉĉ ĉ target Kill Count Ġ= Ġit . target Kill Count Ġ+ Ġ 1 Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ{ Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ kill Count Ġ= Ġit . kill Count Ġ+ Ġ 1 , Ċĉĉĉĉĉĉ ĉ inn oc ent Kill Count Ġ= Ġit . inn oc ent Kill Count Ġ+ Ġ 1 Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ current View Ġ= Ġemail View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( Miss Command ) Ġ{ Ċĉĉ ĉ event Ġ-> Ċĉĉ ĉ data Binding Ġ{ Ċĉĉĉ ĉ if Ġ( event . target Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉ ĉ val Ġindex Ġ= Ġget Target Index ById ( event . target . id ) Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ targets Ġ= Ġit . targets . replace ( index , Ġevent . target . copy ( at tempted K ills Ġ= Ġevent . target . at tempted K ills Ġ+ Ġ 1 )), Ċĉĉĉĉĉĉ ĉ wh iff Count Ġ= Ġit . wh iff Count Ġ+ Ġ 1 , Ċĉĉĉĉĉĉ ĉ target Wh iff Count Ġ= Ġit . target Wh iff Count Ġ+ Ġ 1 Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ{ Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ wh iff Count Ġ= Ġit . wh iff Count Ġ+ Ġ 1 , Ċĉĉĉĉĉĉ ĉ inn oc ent Wh iff Count Ġ= Ġit . inn oc ent Wh iff Count Ġ+ Ġ 1 Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ current View Ġ= Ġemail View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( Ac qu ies ced Command ) Ġ{ Ċĉĉ ĉ game Over View . data Bind . set ( true ) Ċĉĉ ĉ current View Ġ= Ġgame Over View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( F li rt Command ) Ġ{ Ċĉĉ ĉ val Ġlast Target Ġ= Ġget Target ById ( data Binding . get () !!. last Target ) Ċĉĉ ĉ val Ġf li rt Ġ= Ġwhen Ġ( last Target ) Ġ{ Ċĉĉĉ ĉ null Ġ-> Ġif Ġ(! has Started H unt ) Ġinitial F li rt Ġelse ĠF li rt Vo ( f Body Ġ= Ġpop T error ()) Ċĉĉĉ ĉ else Ġ-> Ġget F li rt By Target Id ( last Target . id ) Ċĉĉ ĉ } Ċĉĉ ĉ f li rt View . data Bind . set ( Triple ( last Target , f li rt , is Winner ())) Ċĉĉ ĉ current View Ġ= Ġf li rt View Ċĉ ĉ } ĊĊĉ ĉ cmd . on Command Inv oked ( Kill Cr ush Command ) Ġ{ Ċĉĉ ĉ game Over View . data Bind . set ( false ) Ċĉĉ ĉ current View Ġ= Ġgame Over View Ċĉ ĉ } ĊĊĉ ĉ stage . key Down (). add Ġ{ Ċĉĉ ĉ if Ġ(( it . alt Key Ġ&& Ġit . keyCode Ġ== ĠAsc ii . ENTER ) Ġ|| Ġit . keyCode Ġ== ĠAsc ii . F 1 1 ) Ġ{ Ċĉĉĉ ĉ window . full Screen Ġ= Ġ! window . full Screen Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ // ĠTODO : ĠTEMP Ġche at Ġcodes Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . J Ġ&& Ġit . ctrl Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ invoke Command ( H unt Command (" dummy ")) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . M Ġ&& Ġit . ctrl Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ invoke Command ( Miss Command ( getTarget ById (" je ff "))) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . M Ġ&& Ġit . ctrl Key Ġ&& Ġit . shift Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ invoke Command ( Miss Command ( getTarget ById (" jo e "))) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . K Ġ&& Ġit . ctrl Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ invoke Command ( Kill Command ( getTarget ById (" je ff "))) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . K Ġ&& Ġit . ctrl Key Ġ&& Ġit . shift Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ invoke Command ( Kill Command ( getTarget ById (" jo e "))) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . K Ġ&& Ġit . ctrl Key Ġ&& Ġit . shift Key Ġ&& Ġit . alt Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ data Binding Ġ{ Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ targets Ġ= Ġdata Binding . get () !!. targets . map Ġ{ Ġit . copy ( k illed Ġ= Ġtrue ) Ġ} Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ invoke Command ( F li rt Command ()) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ key Down (). add Ġ{ Ċĉĉ ĉ if Ġ( it . keyCode Ġ== ĠAsc ii . K Ġ&& Ġit . ctrl Key Ġ&& Ġit . shift Key Ġ&& Ġit . alt Key ) Ġ{ Ċĉĉĉ ĉ it . preventDefault () Ċĉĉĉ ĉ data Binding Ġ{ Ċĉĉĉĉ ĉ it . copy ( Ċĉĉĉĉĉĉ ĉ targets Ġ= Ġdata Binding . get () !!. targets . map Ġ{ Ġit . copy ( k illed Ġ= Ġtrue ) Ġ} Ċĉĉĉĉ ĉ ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ invoke Command ( F li rt Command ()) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġpop T error (): ĠString Ġ{ Ċĉ ĉ // ĠTODO : ĠMake Ġmore Ġoptimized Ġwith ĠRandom Ġfunction . Ġ ĠThis Ġis ĠO ( N ) Ċĉ ĉ val Ġt error Ġ= Ġt errors . sh uffled (). last OrNull () Ċĉ ĉ return Ġif Ġ( ter ror Ġ!= Ġnull ) Ġt error Ġelse Ġ{ Ċĉĉ ĉ ter rors Ġ= Ġd T errors Ċĉĉ ĉ pop T error () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Target Index ById ( target Id : ĠString ): ĠInt Ġ{ Ċĉ ĉ return Ġdata Binding . get () !!. targets . indexOf First Ġ{ Ġit . id Ġ== Ġtarget Id Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Target ById ( target Id : ĠString ?): ĠTarget Vo ? Ġ{ Ċĉ ĉ return Ġdata Binding . get () !!. targets . first OrNull Ġ{ Ġit . id Ġ== Ġtarget Id Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġget F li rt By Target Id ( target Id : ĠString ): ĠF li rt Vo Ġ{ Ċĉ ĉ return Ġdata Binding . get () !!. f lir ts . first Ġ{ Ġit . target Id Ġ== Ġtarget Id Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġis Winner (): ĠBoolean Ġ{ Ċĉ ĉ return Ġdata Binding . get () !!. targets . all Ġ{ Ġit . k illed Ġ} Ċ ĉ } Ċ } Ċ