package Ġcom . ick . kal amb ury . drawing Ċ Ċ import Ġandroid . text . Sp anned Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . core . text . Html Compat . FROM _ HTML _ MODE _ COMP ACT Ċ import Ġandroidx . core . text . parse As Html Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġcom . ick . kal amb ury . Base ViewModel Ċ import Ġcom . ick . kal amb ury . Event Ċ import Ġcom . ick . kal amb ury . Game Mode Ċ import Ġcom . ick . kal amb ury . R Ċ import Ġcom . ick . kal amb ury . entities . Game Data Protos Ċ import Ġcom . ick . kal amb ury . list . model . Player Ċ import Ġcom . ick . kal amb ury . list . model . Simple Data Ċ import Ġcom . ick . kal amb ury . net . connection . User Ċ import Ġcom . ick . kal amb ury . net . connection . model . ChatMessage Ċ import Ġcom . ick . kal amb ury . net . connection . model . Drawable Data Ċ import Ġcom . ick . kal amb ury . net . connection . model . Game Data Ċ import Ġcom . ick . kal amb ury . net . connection . model . GameState Data Ċ import Ġcom . ick . kal amb ury . service . Game Event Ċ import Ġcom . ick . kal amb ury . service . Game Handler Ċ import Ġcom . ick . kal amb ury . service . Game Handler Repository Ċ import Ġcom . ick . kal amb ury . service . GameState Ċ import Ġcom . ick . kal amb ury . settings . Main Preference Storage Ċ import Ġcom . ick . kal amb ury . util . Label Ċ import Ġcom . ick . kal amb ury . util . Limit ed Mutable List Ċ import Ġcom . ick . kal amb ury . util . Scheduler Provider Ċ import Ġcom . ick . kal amb ury . util . Timer Mode Ċ import Ġcom . ick . kal amb ury . util . log . Log Ċ import Ġcom . ick . kal amb ury . util . log . log Tag Ċ import Ġcom . ick . kal amb ury . words repository . Language Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġio . reactivex . rx java 3 . kotlin . plus Assign Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠGame ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġgame Handler Repository : ĠGame Handler Repository , ĊĠĠĠ Ġprivate Ġval Ġpreference Storage : ĠMain Preference Storage , ĊĠĠĠ Ġprivate Ġval Ġmessage Formatter : ĠMessage Formatter , ĊĠĠĠ Ġscheduler Provider : ĠScheduler Provider , Ċ ) Ġ: ĠBase ViewModel < Unit >() Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠView Transitions Ġ{ ĊĠĠĠĠĠĠĠ ĠD RAW ING _ EXP AN DED _ TO _ DRAW ING _ COLL AP SED , ĊĠĠĠĠĠĠĠ ĠD RAW ING _ COLL AP SED _ TO _ DRAW ING _ EXP AN DED , ĊĠĠĠĠĠĠĠ ĠD RAW ING _ EXP AN DED _ TO _ GU ESS ING _ EXP AN DED , ĊĠĠĠĠĠĠĠ ĠGU ESS ING _ EXP AN DED _ TO _ DRAW ING _ EXP AN DED , ĊĠĠĠĠĠĠĠ ĠD RAW ING _ COLL AP SED _ TO _ GU ESS ING _ COLL AP SED , ĊĠĠĠĠĠĠĠ ĠGU ESS ING _ COLL AP SED _ TO _ DRAW ING _ COLL AP SED , ĊĠĠĠĠĠĠĠ ĠGU ESS ING _ EXP AN DED _ TO _ GU ESS ING _ COLL AP SED , ĊĠĠĠĠĠĠĠ ĠGU ESS ING _ COLL AP SED _ TO _ GU ESS ING _ EXP AN DED , ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgame Handler : ĠGame Handler Ġ= Ġgame Handler Repository . get Handler () ĊĠĠĠ Ġprivate Ġval Ġmessages : ĠMutable List < Simple Data > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlast Messages : ĠLimited Mutable List < String > ĊĊĠĠĠ Ġlateinit Ġvar Ġself : ĠUser ĊĊĠĠĠ Ġval Ġgame Mode : ĠGame Mode Ġ= Ġgame Handler . config . game Mode ĊĠĠĠ Ġval Ġis Host : ĠBoolean Ġ= Ġgame Handler . config . is Host ĊĠĠĠ Ġval Ġlanguage : ĠLanguage Ġ= Ġgame Handler . config . language ĊĊĠĠĠ Ġvar Ġgame State : ĠGameState Data ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġplayers : ĠMap < String , ĠPlayer > Ġ= Ġmap Of () ĊĊĠĠĠ Ġval Ġis Operator : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġself . uuid Ġ== Ġgame State ?. operator Player Id ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Drawing : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġis Drawing : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Drawing . value Ġ== Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Full Chat Opened : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġis Full Chat Opened : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Full Chat Opened . value Ġ== Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġ_ timer : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData ( 0 ) ĊĠĠĠ Ġval Ġtimer : ĠLive Data < Int > Ġ= Ġ_ timer ĊĊĠĠĠ Ġprivate Ġval Ġ_ timer Mode : ĠMutable LiveData < Timer Mode > Ġ= ĠMutable LiveData ( Timer Mode . GONE ) ĊĠĠĠ Ġval Ġtimer Mode : ĠLive Data < Timer Mode > Ġ= Ġ_ timer Mode ĊĊĠĠĠ Ġprivate Ġval Ġ_ full Chat Messages : ĠMutable LiveData < List < Simple Data >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġfull Chat Messages : ĠLive Data < List < Simple Data >> Ġ= Ġ_ full Chat Messages ĊĊĠĠĠ Ġprivate Ġval Ġ_ small Chat Messages : ĠMutable LiveData < Sp anned > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġsmall Chat Messages : ĠLive Data < Sp anned > Ġ= Ġ_ small Chat Messages ĊĊĠĠĠ Ġprivate Ġval Ġ_ draw Events : ĠMutable LiveData < Draw Event > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġdraw Events : ĠLive Data < Draw Event > Ġ= Ġ_ draw Events ĊĊĠĠĠ Ġprivate Ġval Ġ_ left Label : ĠMutable LiveData < Label ?> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġleft Label : ĠLive Data < Label ?> Ġ= Ġ_ left Label ĊĊĠĠĠ Ġprivate Ġval Ġ_ right Label : ĠMutable LiveData < Label ?> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġright Label : ĠLive Data < Label ?> Ġ= Ġ_ right Label ĊĊĠĠĠ Ġprivate Ġval Ġ_ finish Event : ĠMutable LiveData < Event < Finish Event >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġfinish Event : ĠLive Data < Event < Finish Event >> Ġ= Ġ_ finish Event ĊĊĠĠĠ Ġprivate Ġval Ġ_ finished Game Data : ĠMutable LiveData < Event < Finished Game Data >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġfinished Game Data : ĠLive Data < Event < Finished Game Data >> Ġ= Ġ_ finished Game Data ĊĊĠĠĠ Ġprivate Ġval Ġ_ view Transitions Ġ= ĠMed iator LiveData < View Transitions >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Source ( Transform ations . distinct Until Changed (_ is Drawing )) Ġ{ Ġdrawing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( drawing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ== Ġ_ is Full Chat Opened . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . GU ESS ING _ EXP AN DED _ TO _ DRAW ING _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . GU ESS ING _ COLL AP SED _ TO _ DRAW ING _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ== Ġ_ is Full Chat Opened . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . DRAW ING _ EXP AN DED _ TO _ GU ESS ING _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . DRAW ING _ COLL AP SED _ TO _ GU ESS ING _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Source ( Transform ations . distinct Until Changed (_ is Full Chat Opened )) Ġ{ Ġopened Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( opened ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ== Ġ_ is Drawing . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . DRAW ING _ COLL AP SED _ TO _ DRAW ING _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . GU ESS ING _ COLL AP SED _ TO _ GU ESS ING _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ== Ġ_ is Drawing . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . DRAW ING _ EXP AN DED _ TO _ DRAW ING _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Transitions . GU ESS ING _ EXP AN DED _ TO _ GU ESS ING _ COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġview Transitions : ĠLive Data < View Transitions > Ġ= Ġ_ view Transitions ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġgame Handler . get Game Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . main ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe (:: handle Game Events ) ĊĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠSingle . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . local UserData . first Or Error (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . chat Size . first Or Error () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġuser , Ġchat Size Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġself Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Messages Ġ= ĠLimited Mutable List ( chat Size ) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Comp letable Ġ{ Ġgame Handler . ready () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . main ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġgame Handler . config ĊĠĠĠĠĠĠĠ Ġif Ġ( config . name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ right Label . value Ġ= ĠLabel . res ( R . string . ga _ points _ limit , Ġfalse , Ġconfig . points Limit ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ right Label . value Ġ= ĠLabel . res ( R . string . ga _ table _ name _ and _ points , Ġtrue , Ġconfig . name !! , Ġconfig . points Limit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Game Events ( event : ĠGame Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( event . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . CONNECTED Ġ-> Ġhandle Game Data ( event . game Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . HOST _ FINISHED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . set Last Game Without Error ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Remote ( R . string . alert _ host _ terminated )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . AD VERT ISING _ FAILURE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . set Last Game Without Error ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Error ( R . string . alert _ ad vertising _ failed )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . K ICK ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . set Last Game Without Error ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Remote ( R . string . alert _ kick ed )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . NETWORK _ FAILURE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGame Event . State . GENERIC _ FAILURE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreference Storage . set Last Game Without Error ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Error ( R . string . alert _ connection _ lost )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ/* Ġnot Ġapplicable Ġhere Ġ*/ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Game Data ( data : ĠGame Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( log Tag , Ġ" Received Ġevent Ġfrom Ġservice Ġbut ĠGame Data Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . v ( log Tag , Ġ" Game Ġdata Ġfrom Ġservice : Ġ$ data ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . PLAYER _ UPDATE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Ġ= Ġdata . players ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . GAME _ STATE _ CHANGE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle GameState Change ( data . game State Data Ġ?: Ġthrow ĠIllegalArgumentException ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . TIMER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ timer . value Ġ= Ġdata . action Data ?. toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . ADD _ NEW _ OBJECT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Add ( data . draw ables ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . DELETE _ LAST _ OBJECT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Undo ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . CLEAR _ SCREEN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Clear ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . CHAT _ MESSAGE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Chat Messages ( data . messages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . getMessage ( Game Data Protos . ChatMessage . Type . LIT TLE _ TIME _ WARN ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ timer Mode . value Ġ= ĠTimer Mode . WARN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data . has Action ( Game Data . GAME _ FIN ISH )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayers Copy Ġ= Ġplayers . values . map Ġ{ Ġit . clone () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finished Game Data . value Ġ= ĠEvent ( Finished Game Data ( players Copy , Ġplayers [ data . game State Data !!. winner Player Id ] !!. name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Remote Finish ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle GameState Change ( data : ĠGameState Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame State Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Clear ĊĠĠĠĠĠĠĠ Ġ_ left Label . value Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . state Ġ== ĠGameState . WAIT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Drawing . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ timer Mode . value Ġ= ĠTimer Mode . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data . state Ġ== ĠGameState . IN _ GAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawing Ġ= Ġself . uuid Ġ== Ġdata . drawing Player Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Drawing . value Ġ= Ġdrawing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ timer Mode . value Ġ= ĠTimer Mode . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ left Label . value Ġ= ĠLabel . res ( R . string . da _ password , Ġtrue , Ġdata . word To Guess !! , Ġdata . category !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ timer Mode . value Ġ= ĠTimer Mode . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ left Label . value Ġ= ĠLabel . res ( R . string . ga _ drawing _ player , Ġtrue , Ġplayers [ data . drawing Player Id ]?. name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Chat Messages ( msg List : ĠList < ChatMessage >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmsg List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformatted Ġ= Ġmessage Formatter . format ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . add ( Simple Data ( text Ġ= Ġformatted . parse As Html ( FROM _ HTML _ MODE _ COMP ACT ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Messages . add ( formatted ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ full Chat Messages . value Ġ= Ġmessages ĊĊĠĠĠĠĠĠĠ Ġval Ġsmall Chat String Ġ= Ġlast Messages . join ToString ( separator Ġ= Ġ"< br Ġ/> ") ĊĠĠĠĠĠĠĠ Ġ_ small Chat Messages . value Ġ= Ġsmall Chat String . parse As Html ( FROM _ HTML _ MODE _ COMP ACT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Draw ( data : ĠDrawable Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . drawable ( data )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonDelete () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Undo ĊĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . action ( Game Data . DELETE _ LAST _ OBJECT )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Clear () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ draw Events . value Ġ= ĠDraw Event . Clear ĊĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . action ( Game Data . CLEAR _ SCREEN )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Ab and on Drawing () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . action ( Game Data . AB AND ON _ DRAW ING )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Full Chat Opened () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ is Full Chat Opened . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Full Chat Closed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ is Full Chat Opened . value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Local ChatMessage ( text : ĠString , Ġis Answer : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage : ĠChat Message Ġ= Ġif Ġ( is Answer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . player Answer ( self . nickname , Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChat Message . player Write ( self . nickname , Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Chat Messages ( listOf ( message )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . message ( message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Kick Players ( player Ids : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer Ids . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Handler . handle Local Game Data ( Game Data . action ( Game Data . K ICK _ PLAYER , Ġit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Leave () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ finish Event . value Ġ= ĠEvent ( Finish Event . Local Leave ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Finish () Ġ{ ĊĠĠĠĠĠĠĠ Ġgame Handler . finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFinished Game Data ( val Ġplayers : ĠList < Player >, Ġval Ġwinner Name : ĠString ) ĊĊĠĠĠ Ġsealed Ġclass ĠFinish Event ( val Ġshow Ad : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠRemote Finish Ġ: ĠFinish Event ( true ) ĊĠĠĠĠĠĠĠ Ġobject ĠLocal Leave Ġ: ĠFinish Event ( true ) ĊĠĠĠĠĠĠĠ Ġopen Ġclass ĠRemote (@ String Res Ġval ĠmessageId : ĠInt , Ġshow Ad : ĠBoolean Ġ= Ġtrue ) Ġ: ĠFinish Event ( show Ad ) ĊĠĠĠĠĠĠĠ Ġclass ĠError (@ String Res ĠmessageId : ĠInt , Ġshow Ad : ĠBoolean Ġ= Ġfalse ) Ġ: ĠRemote ( message Id , Ġshow Ad ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠDraw Event Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠAdd ( val Ġdraw ables : ĠList < Drawable Data >) Ġ: ĠDraw Event () ĊĠĠĠĠĠĠĠ Ġobject ĠUndo Ġ: ĠDraw Event () ĊĠĠĠĠĠĠĠ Ġobject ĠClear Ġ: ĠDraw Event () ĊĠĠĠ Ġ} Ċ Ċ }