package Ġcom . ann ap ol 0 4 . mun ch kin . engine Ċ Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . support . annotation . String Res Ċ import Ġandroid . util . Log Ċ Ċ import Ġcom . ann ap ol 0 4 . mun ch kin . R Ċ import Ġcom . ann ap ol 0 4 . mun ch kin . data . Event Repository Ċ Ċ import Ġcom . ann ap ol 0 4 . mun ch kin . util .* Ċ Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ open Ġclass ĠMatch Ġ@ Inject Ċ constructor ( protected Ġvar Ġde sk : ĠDes k , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ param : Named (" my self ") Ġprotected Ġval Ġmyself : ĠPlayer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotected Ġvar Ġevent Repository : ĠEvent Repository ) Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġlog _ Ġby Ġlazy Ġ{ ĠNon Null Mutable LiveData < String >(" ") Ġ} ĊĠĠĠ Ġval Ġlog : ĠNon Null LiveData < String > Ġget () Ġ= Ġlog _ ĊĊĠĠĠ Ġprotected Ġval Ġplayers _ Ġby Ġlazy Ġ{ ĠNon Null Mutable LiveData < List < Player >>( emptyList ()) Ġ} ĊĠĠĠ Ġval Ġplayers : ĠNon Null LiveData < List < Player >> Ġget () Ġ= Ġplayers _ ĊĊĠĠĠ Ġprotected Ġval Ġcurrent Player _ Ġby Ġlazy Ġ{ ĠMutable LiveData < Player >() Ġ} ĊĠĠĠ Ġval Ġcurrent Player : ĠLive Data < Player > Ġget () Ġ= Ġcurrent Player _ ĊĊĠĠĠ Ġprotected Ġval Ġcan Finish Round _ Ġby Ġlazy Ġ{ ĠNon Null Mutable LiveData ( false ) Ġ} ĊĠĠĠ Ġval Ġcan Finish Round : ĠNon Null LiveData < Boolean > Ġget () Ġ= Ġcan Finish Round _ ĊĊĠĠĠ Ġprotected Ġval Ġcan Start Combat _ Ġby Ġlazy Ġ{ ĠNon Null Mutable LiveData ( false ) Ġ} ĊĠĠĠ Ġval Ġcan Start Combat : ĠNon Null LiveData < Boolean > Ġget () Ġ= Ġcan Start Combat _ ĊĊĠĠĠ Ġprivate Ġval Ġresult _ Ġby Ġlazy Ġ{ ĠMutable LiveData < Match Result >() Ġ} ĊĠĠĠ Ġval Ġresult : ĠLive Data < Match Result > Ġget () Ġ= Ġresult _ ĊĊĠĠĠ Ġprotected Ġvar Ġcurrent : ĠPlayer Ġ= Ġmyself ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Player _. value Ġ= Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġvar Ġjoined Ġ= Ġempty List < Player >() ĊĠĠĠ Ġprotected Ġvar Ġfirst Ġ= Ġmyself ĊĠĠĠ Ġprotected Ġvar Ġturn Phase Ġ= ĠTurn Phase . IDLE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠTurn Phase . FINISHED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Finish Round _. value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( can Finish Round _. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Finish Round _. value Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Start Combat _. value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( can Start Combat _. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Start Combat _. value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġvar Ġstate Ġ= ĠState . JOIN ING ĊĠĠĠ Ġvar Ġamount Of Players Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠ Ġprotected Ġvar Ġplayers Rename d Ġ= Ġ 0 ĊĊĠĠĠ Ġprotected Ġvar Ġnamed Ġ= Ġfalse ĊĠĠĠ Ġprotected Ġvar Ġhand Cards Draw n Ġ= Ġfalse ĊĊĠĠĠ Ġprotected Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ ĠJOIN ING , ĊĠĠĠĠĠĠĠ ĠN AM ING , ĊĠĠĠĠĠĠĠ ĠHAND _ CAR DS , ĊĠĠĠĠĠĠĠ ĠSTART ED , ĊĠĠĠĠĠĠĠ ĠRUN NING , ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Player _. value Ġ= Ġmyself ĊĠĠĠĠĠĠĠ Ġresult _. value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġjoined Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġplayers _. value Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Cle ared Ġplayers ") ĊĠĠĠĠĠĠĠ Ġplayers Rename d Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġlog _. value Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġde sk . reset () ĊĠĠĠĠĠĠĠ Ġmyself . reset () ĊĠĠĠĠĠĠĠ Ġevent Repository . reset () ĊĊĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . IDLE ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . JOIN ING ĊĊĠĠĠĠĠĠĠ Ġnamed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġhand Cards Draw n Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġmyself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis My self ( player : ĠPlayer ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplayer Ġ=== Ġmyself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog _. value Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( log _. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog _. value Ġ= Ġlog _. value . replace ("\ n [^\ n ]+ \ n +$ ". to Regex (), Ġ"\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Player ( player Nr : ĠInt ): ĠPlayer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplayers _. value [ player Nr Ġ- Ġ 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Player ( scope : ĠScope ): ĠPlayer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Player ( scope . ordinal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġstart ( amount Of Players : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĊĠĠĠĠĠĠĠ Ġthis . amount Of Players Ġ= Ġamount Of Players ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( Event ( Scope . GAME , ĠAction . JOIN _ PLAYER , Ġ 0 , Ġmyself . id ), Ġignore Hash Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop ( reason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĊĠĠĠĠĠĠĠ Ġresult _. value Ġ= ĠMatch Abort ed Result ( reason ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġevaluate Host (): ĠPlayer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjoined . max By Ġ{ Ġit . id Ġ} Ġ?: Ġmyself ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġspecify Player Numbers () Ġ{ ĊĠĠĠĠĠĠĠ Ġmyself . scope Ġ= ĠScope . PLAYER 1 ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( my self . scope , ĠAction . ASSIGN _ PLAYER _ NUMBER , Ġ 0 , Ġmyself . id )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġnr Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( player Ġin Ġjoined ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!= Ġmyself ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . scope Ġ= ĠScope . from Id ( nr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( Scope . from Id ( nr ++ ), ĠAction . ASSIGN _ PLAYER _ NUMBER , Ġ 0 , Ġplayer . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġplayers _. value Ġ= Ġjoined . sorted By Ġ{ Ġit . scope . ordinal Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjoin Player ( random Number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġif Ġ( random Number Ġ== Ġmyself . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmyself ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ( random Number , Ġde sk , Ġevent Repository ) ĊĊĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠ Ġplayer . allow To Draw Tre asure Cards ( AMOUNT _ OF _ HAND _ CAR DS ) ĊĊĠĠĠĠĠĠĠ Ġjoined Ġ+= Ġplayer ĊĊĠĠĠĠĠĠĠ Ġif Ġ( joined . size Ġ== Ġamount Of Players ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . NAM ING ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġevaluate Host () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġcurrent ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġmyself ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecify Player Numbers () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnaming Round () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Player Fight Monster ( player : ĠPlayer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġde sk . desk Cards . value . size Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġplayer . getF ight Level (). value !! Ġ> Ġ( desk . desk Cards . value [ 0 ] Ġas ĠMon ster ). level ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġnaming Round () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . HAND _ CAR DS ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( current . scope , ĠAction . NAME _ PLAYER , ĠR . string . ev _ join _ player , Ġmyself . getName (). value !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( current . scope , ĠAction . HAND _ OVER _ TOKEN , Ġ 0 , Ġnext Player (). scope . ordinal ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġnext Player (): ĠPlayer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplayers _. value [( players _. value . indexOf ( current ) Ġ+ Ġ 1 ) Ġ% Ġplayers _. value . size ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdraw Initial Hand cards () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( desk . getRandom Tre asure Cards ( AMOUNT _ OF _ HAND _ CAR DS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map { ĠEvent ( current . scope , ĠAction . DRAW _ TRE AS URE CARD , Ġ 0 , Ġit . id ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġemit Hand Over Token ( current . scope , Ġnext Player ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġare All Players Named (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplayers Rename d Ġ== Ġamount Of Players ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġare All Initial Cards Draw n (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjoined . all { Ġ! it . is Allowed To Draw Tre asure Card . value !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġemit Hand Over Token ( scope : ĠScope , Ġplayer : ĠPlayer , Ġdisplay Message : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmessage Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( display Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . ev _ hand _ over _ token ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( current . scope , ĠAction . HAND _ OVER _ TOKEN , Ġmessage , Ġplayer . scope . ordinal ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġopen Ġfun Ġhand Over Token ( scope : ĠScope , Ġplayer Nr : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ=== ĠMatch . State . RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest ( can Finish Round _. value ," You Ġcan Ġhand Ġover Ġthe Ġcontrol Ġafter Ġdoing Ġthe Ġrequired Ġsteps ") ĊĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġget Player ( player Nr ) ĊĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . IDLE ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . NAM ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! named Ġ&& Ġcurrent Ġ== Ġmyself ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . HAND _ CAR DS ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnaming Round () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . HAND _ CAR DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( are All Players Named ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! hand Cards Draw n Ġ&& Ġcurrent Ġ== Ġmyself ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhand Cards Draw n Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . STARTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Initial Hand cards () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . STARTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( are All Initial Cards Draw n ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . RUNNING ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġmyself ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( current . scope , ĠR . string . ev _ hand _ over _ token , Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Round () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . RUNNING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Round () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegal Engine StateException (" Illegal Ġstate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġplay Round () Ġ{ ĊĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . EQ U IP MENT ĊĠĠĠĠĠĠĠ Ġcurrent . allow To Draw Door Cards ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassign Player Number ( player Nr : ĠInt , Ġrandom Number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjoined . find Ġ{ Ġit . id Ġ== Ġrandom Number Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . scope Ġ= ĠScope . from Id ( player Nr ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( joined . all Ġ{ Ġit . scope Ġ!= ĠScope . GAME Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers _. value Ġ= Ġjoined . sorted By Ġ{ Ġit . scope . ordinal Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġname Player ( player Nr : ĠInt , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayers _. value [ player Nr Ġ- Ġ 1 ]. rename ( name ) ĊĠĠĠĠĠĠĠ Ġ++ players Rename d ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġprotected Ġfun Ġtest Host ( player : ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!== Ġcurrent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Engine StateException (" can Ġnot Ġplay Ġa Ġcard Ġin Ġanother Ġplayer 's Ġround ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Combat () Ġ{ ĊĠĠĠĠĠĠĠ Ġemit Message ( current . scope , ĠR . string . tp _ kick _ open _ the _ door _ and _ fight ); ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/ **************************************************************** ************************ ĊĠĠĠĠ Ġ* Ġ=== = ĠAction Ġimplementations Ġ=== = ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġemit Message ( scope : ĠScope , Ġ@ String Res Ġmessage : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . MESSAGE , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġemit Message ( scope : ĠScope , Ġ@ String Res Ġmessage : ĠInt , Ġinteger : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . MESSAGE , Ġmessage , Ġinteger ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġemit Draw Door Card ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġde sk . getRandom Door Cards ( 1 )[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġemit Message ( scope , ĠR . string . tp _ kick _ open _ the _ door ) ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . DRAW _ DO OR CARD , ĠR . string . ev _ draw _ card , Ġcard . id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġfun Ġdraw Door Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Host ( getPlayer ( scope )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( turn Phase Ġ== ĠTurn Phase . EQ U IP MENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" it 's Ġnot Ġallowed Ġto Ġdraw Ġdoor Ġcards Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĠĠĠĠĠĠĠ Ġtest ( desk . desk Cards . value . size Ġ== Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" you Ġcan Ġnot Ġdraw Ġa Ġdoor Ġcard Ġfrom Ġan Ġempty Ġdeck !") ĊĊĠĠĠĠĠĠĠ Ġget Player ( scope ). draw Door Card ( card ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġemit Draw Tre asure Card ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġde sk . getRandom Tre asure Cards ( amount Ġ= Ġ 1 )[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . DRAW _ TRE AS URE CARD , ĠR . string . ev _ draw _ card , Ġcard . id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġfun Ġdraw Tre asure Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Host ( getPlayer ( scope )) ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR _ AND _ DRAW Ġ|| Ġturn Phase Ġ== ĠTurn Phase . IDLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" it 's Ġnot Ġallowed Ġto Ġdraw Ġtre asure Ġcards Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĠĠĠĠĠĠĠ Ġtest ( desk . desk Cards . value . size Ġ== Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" you Ġcan Ġnot Ġdraw Ġa Ġtre asure Ġcard Ġfrom Ġan Ġempty Ġdeck !") ĊĊĠĠĠĠĠĠĠ Ġget Player ( scope ). draw Tre asure Card ( card ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( turn Phase Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR _ AND _ DRAW ĊĠĠĠĠĠĠĠ Ġ&& Ġcurrent . is Allowed To Draw Tre asure Card . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . limit Hand Cards ( max Ġ= ĠMAX _ AMOUNT _ OF _ HAND _ CAR DS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Char iting Or Finish (); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Char iting Or Finish () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current . is Allowed To Drop Card . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġmyself ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my self . hand Cards . value . size Ġ> ĠMAX _ AMOUNT _ OF _ HAND _ CAR DS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( current . scope , ĠR . string . tp _ char ity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . CHAR ITY ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . FINISHED ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġemit Fight Monster ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . F IGHT _ MON STER , ĠR . string . ev _ fight _ monster ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġfun Ġfight Monster ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġget Player ( scope ) ĊĊĠĠĠĠĠĠĠ Ġtest Host ( player ) ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mon sters Ġcan Ġnot Ġf ought Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Player ( scope ). fight Monster () ĊĊĠĠĠĠĠĠĠ Ġval Ġcards To Draw Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( scope Ġ== Ġmyself . scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( scope , ĠR . string . player _ k illed _ monster , Ġresult . first . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( scope , ĠR . string . player _ gets _ level , Ġresult . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( scope , ĠR . string . tp _ kick _ open _ the _ door _ and _ draw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Message ( scope , ĠR . string . player _ draw s _ tre asure _ cards , Ġcards To Draw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( player . get Level (). value !! Ġ>= ĠWIN _ LEVEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult _. value Ġ= ĠMatch Finished Result ( name Ġ= Ġplayer . getName (). value !! , Ġlevel Ġ= Ġplayer . get Level (). value !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Player ( scope ). allow To Draw Tre asure Cards ( cards To Draw ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR _ AND _ DRAW ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġemit Run Away ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . RUN _ AW AY , ĠR . string . ev _ run _ away ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġfun Ġrun Away ( scope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Host ( getPlayer ( scope )) ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . K ICK _ OPEN _ THE _ DO OR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Ġnot Ġrun Ġaway Ġfrom Ġmonster Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĊĠĠĠĠĠĠĠ Ġget Player ( scope ). run Away () ĊĊĠĠĠĠĠĠĠ Ġstart Char iting Or Finish () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġemit Play Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . PLAY _ CARD , ĠR . string . ev _ play _ card , Ġcard . id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Illegal Engine StateException :: class ) ĊĠĠĠ Ġfun Ġplay Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Host ( getPlayer ( scope )) ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . EQ U IP MENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Ġnot Ġequip Ġitems Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĊĠĠĠĠĠĠĠ Ġget Player ( scope ). play Card ( card ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġemit Drop Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Repository . push ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( scope , ĠAction . DROP _ CARD , ĠR . string . ev _ drop _ card , Ġcard . id ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrop Card ( scope : ĠScope , Ġcard : ĠCard ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Host ( getPlayer ( scope )) ĊĊĠĠĠĠĠĠĠ Ġtest ( turn Phase Ġ== ĠTurn Phase . CHAR ITY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Ġnot Ġdrop Ġcards Ġin Ġ\"$ turn Phase \" Ġphase !") ĊĊĠĠĠĠĠĠĠ Ġget Player ( scope ). drop Card ( card ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( turn Phase Ġ== ĠTurn Phase . CHAR ITY Ġ&& Ġ! current . is Allowed To Drop Card . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturn Phase Ġ= ĠTurn Phase . FINISHED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Round () Ġ{ ĊĠĠĠĠĠĠĠ Ġemit Hand Over Token ( current . scope , Ġnext Player (), Ġdisplay Message Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠA MOUNT _ OF _ HAND _ CAR DS Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠMAX _ AMOUNT _ OF _ HAND _ CAR DS Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠWIN _ LEVEL Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠTAG Ġ= ĠMatch :: class . java . simple Name ĊĠĠĠ Ġ} Ċ }