package Ġme . digital by . lr 5 Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . Activity Info Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġcom . google . firebase . database .* Ċ import Ġme . digital by . lr 3 . DateTime Helper Ċ import Ġjava . net . Secure Cache Response Ċ Ċ class ĠGame Activity Ġ: ĠAppCompatActivity (), ĠField Fragment Listener Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuid : ĠString ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfield String : ĠString ĊĠĠĠ Ġoverride Ġlateinit Ġvar Ġfield : ĠField ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġother Field : ĠField ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgame Id : ĠString ĊĊĠĠĠ Ġprivate Ġvar Ġother Field Info : ĠField ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġleft Blueprint : ĠBlueprint ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġright Blueprint : ĠBlueprint ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġdatabase Ġ= ĠFirebase Database . getInstance () ĊĠĠĠ Ġval Ġreference Ġ= Ġdatabase . reference ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgame Reference : ĠDatabase Reference ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġleft Field Fragment : ĠField Fragment ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġright Field Fragment : ĠField Fragment ĊĊĠĠĠ Ġprivate Ġvar Ġprocessing Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġmy Turn Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġturn Ġ= Ġ 0 L ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ game ) ĊĠĠĠĠĠĠĠ Ġrequested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ LAND SC APE ĊĊĠĠĠĠĠĠĠ Ġval Ġbundle : ĠBundle ? Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠ Ġuid Ġ= Ġbundle ?. getString (" uid ") !! ĊĠĠĠĠĠĠĠ Ġfield String Ġ= Ġbundle . getString (" field String ") !! ĊĠĠĠĠĠĠĠ Ġgame Id Ġ= Ġbundle . getString (" game Id ") !! ĊĠĠĠĠĠĠĠ Ġmy Turn Ġ= Ġbundle . getLong (" my Turn ") ĊĠĠĠĠĠĠĠ Ġfield Ġ= ĠField . from Field String ( field String ) ĊĠĠĠĠĠĠĠ Ġother Field Ġ= ĠField ( Vector 2 ( 1 0 , Ġ 1 0 ), Ġ 2 0 ) ĊĊĠĠĠĠĠĠĠ Ġgame Reference Ġ= Ġreference . child (" Current Games "). child ( game Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsh ips Ġ= Ġbundle . get Serializable (" ships ") Ġas ĠHashMap < String , ĠHashMap < String , ĠLong >> ĊĊĠĠĠĠĠĠĠ Ġgame Reference . child (" player ${ my Turn } ships "). setValue ( ships ) ĊĊĠĠĠĠĠĠĠ Ġleft Field Fragment Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . left Field Fragment ) Ġas ĠField Fragment ĊĠĠĠĠĠĠĠ Ġleft Field Fragment . draw Field ( field ) ĊĊĠĠĠĠĠĠĠ Ġright Field Fragment Ġ= Ġsupport FragmentManager . find Fragment ById ( R . id . right Field Fragment ) Ġas ĠField Fragment ĊĠĠĠĠĠĠĠ Ġright Field Fragment . listener Ġ= Ġthis ĊĊĊĊĠĠĠĠĠĠĠ Ġon Turn Change () ĊĠĠĠĠĠĠĠ Ġon Made Turn Response () ĊĊĠĠĠĠĠĠĠ Ġif ( my Turn Ġ== Ġ 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrespond To Blueprint s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrespond To Made Turn () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprocessing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrespond To Blueprint s () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" player 1 ships "). add Value EventListener ( object : ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh ips HashMap Ġ= Ġp 0 . value Ġas ? ĠArrayList < HashMap < String , ĠLong >> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh ips List Ġ= ĠBlueprint . from Parcelable ( ships HashMap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblueprint Ġ= ĠBlueprint ( Vector 2 ( 1 0 , Ġ 1 0 ), Ġnull , Ġsh ips List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Blueprint Ġ= Ġblueprint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Reference . child (" player 1 ships "). setValue ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" player 2 ships "). add Value EventListener ( object : ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh ips HashMap Ġ= Ġp 0 . value Ġas ? ĠArrayList < HashMap < String , ĠLong >> Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh ips List Ġ= ĠBlueprint . from Parcelable ( ships HashMap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblueprint Ġ= ĠBlueprint ( Vector 2 ( 1 0 , Ġ 1 0 ), Ġnull , Ġsh ips List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Blueprint Ġ= Ġblueprint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Field Info Ġ= Ġright Blueprint !!. make Field () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Reference . child (" player 2 ships "). setValue ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrespond To Made Turn () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). add Value EventListener ( object : ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdict Ġ= Ġp 0 . value Ġas ? ĠHashMap < String , ĠAny > Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġdict [" sender "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Long Ġ= Ġdict [" x "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Long Ġ= Ġdict [" y "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( dict [" response "] Ġ!= Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġx Long . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġy Long . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġif ( turn Ġ== Ġmy Turn ) Ġother Field Info !! Ġelse Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġwhen ( f . cells [ x ][ y ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Empty Ġ-> Ġ" M " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Ship Ġ-> Ġ" H " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Miss Ġ-> Ġ" M " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . H urt Ġ-> Ġ" H " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Dead Ġ-> Ġ" D " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). child (" response "). setValue ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( response Ġ== Ġ" M ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Ġ= Ġif ( turn Ġ== Ġ 1 L ) Ġ 2 L Ġelse Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Reference . child (" Turn "). setValue ( turn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Made Turn Response () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). add Value EventListener ( object : ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdict Ġ= Ġp 0 . value Ġas ? ĠHashMap < String , ĠAny > Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdict [" response "] Ġas ? ĠString Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġprocess Ġsignals Ġlike Ġgame Ġover Ġand Ġcon ce de Ġhere Ġ( don 't Ġforget Ġto Ġlog Ġstats !) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Long Ġ= Ġdict [" x "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Long Ġ= Ġdict [" y "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġdict [" sender "] Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġx Long . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġy Long . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġif ( sender Ġ== Ġmy Turn ) Ġright Field Fragment Ġelse Ġleft Field Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġif ( sender Ġ== Ġmy Turn ) Ġother Field Ġelse Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . cells [ x ][ y ] Ġ= Ġwhen ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" S " Ġ-> ĠCell . Ship ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" H " Ġ-> ĠCell . H urt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" D " Ġ-> ĠCell . Dead ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠCell . Miss ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . draw Field ( field ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). remove Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Dead Sh ips ( sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Game Over () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDateTime Helper . get Formatted Date () ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Count Ġ= Ġfield . flat Cells . count Ġ{ Ġcell Ġ-> Ġcell Ġ== ĠCell . H urt Ġ} ĊĠĠĠĠĠĠĠ Ġif ( left Count Ġ== Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference . child (" Past Games "). child ( uid ). child ( date ). setValue ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage (" You Ġlose .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Game ĠOver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( android . R . string . ok )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġright Count Ġ= Ġother Field . flat Cells . count Ġ{ Ġcell Ġ-> Ġcell Ġ== ĠCell . H urt Ġ} ĊĠĠĠĠĠĠĠ Ġif ( right Count Ġ== Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference . child (" Past Games "). child ( uid ). child ( date ). setValue ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage (" You Ġwin .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Game ĠOver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( android . R . string . ok )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Game () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" uid ", Ġuid ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Dead Sh ips ( sender : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġactually Ġcheck Ġfor Ġdead Ġsh ips ĊĠĠĠĠĠĠĠ Ġcheck Game Over () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Turn Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Turn "). add Value EventListener ( object : ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġp 0 . value Ġas ? ĠLong ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( t Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġif Ġ( turn Ġ== Ġmy Turn ) Ġ" Your Ġturn " Ġelse Ġ" Opp onent 's Ġturn " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Made Turn ( position : ĠVector 2 , Ġsender : ĠLong , Ġresponse : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). child (" response "). setValue ( response ) ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). child (" sender "). setValue ( sender ) ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). child (" x "). setValue ( position . x ) ĊĠĠĠĠĠĠĠ Ġgame Reference . child (" Made Turn "). child (" y "). setValue ( position . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdid Select Cell ( sender : ĠField Fragment , Ġposition : ĠVector 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( turn Ġ!= Ġmy Turn Ġ|| Ġprocessing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġif ( other Field . cells [ position . x ][ position . y ] Ġ!= ĠCell . Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġprocessing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsend Made Turn ( position , Ġmy Turn ) ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ