package Ġnet . z om is . games . impl Ċ Ċ import Ġnet . z om is . games . Player Elimin ations Ċ import Ġnet . z om is . games . Win Result Ċ import Ġnet . z om is . games . cards . Card Ċ import Ġnet . z om is . games . cards . Card Zone Ċ import Ġnet . z om is . games . dsl . Replay able Scope Ċ import Ġnet . z om is . games . dsl . create ActionType Ċ import Ġnet . z om is . games . dsl . create Game Ċ import Ġkotlin . math . min Ċ Ċ // ĠR AIN BO W : ĠEither Ġused Ġas Ġa Ġsix th Ġcolor , Ġor Ġas Ġa Ġwildcard Ġ( where Ġcards Ġcan Ġbe Ġboth Ġblue Ġand Ġyellow Ġfor Ġexample ) Ċ // Ġname Ġthe Ġcard Ġyou Ġare Ġplaying , Ġor Ġget Ġa Ġfail Ġtoken Ċ // Ġonly Ġone Ġcard Ġof Ġmult icol or Ċ // Ġgame Ġends Ġwhen Ġplayers Ġare Ġdef e ated Ġor Ġan Ġin dis pens ible Ġcard Ġhas Ġbeen Ġdiscarded Ċ // Ġgame Ġnormally Ġends Ġone Ġfull Ġturn Ġafter Ġthe Ġlast Ġcard Ġdrawn . Ċ // Ġallow Ġempty Ġcl ues Ġ- Ġtrue / false Ċ Ċ // Ġ 0 - 5 ĠF ru kt ans v Ã¤ rt Ġut bu ad Ġav Ġpub li ken . Ċ // Ġ 6 - 1 0 ĠMed io k ert , Ġspr idd a Ġap pl Ã¥ der Ġsom Ġb Ã¤ st . Ċ // Ġ 1 1 - 1 5 ĠAn m Ã¤r k ning sv Ã¤ rt , Ġmen Ġkom mer Ġinte Ġb li Ġih Ã¥ g kom met Ġs Ã¥ Ġl Ã¤n ge Ċ // Ġ 1 6 - 2 0 ĠU tm Ã¤r kt , Ġpub li ken ĠÃ¤r ĠvÃ¤ ld igt Ġn Ã¶ jd Ċ // Ġ 2 1 - 2 4 ĠSu ver Ã¤ nt , Ġkom mer Ġatt Ġkom ma Ġih Ã¥ g ĠvÃ¤ ld igt Ġl Ã¤n ge Ċ // Ġ 2 5 ĠLeg endar is kt , Ġalla ĠÃ¤r ĠfÃ¶r st um made Ġoch Ġh Ã¤ nf Ã¶r da Ċ Ċ enum Ġclass ĠHan abi Color Ġ{ ĠY ELLOW , ĠWH ITE , ĠRED , ĠBL UE , ĠGREEN Ġ} Ċ data Ġclass ĠHan abi Card ( val Ġcolor : ĠHan abi Color , Ġval Ġvalue : ĠInt , Ġvar Ġcolor Known : ĠBoolean , Ġvar Ġvalue Known : ĠBoolean ) Ġ{ ĊĠĠĠ Ġfun Ġknown ( known : ĠBoolean ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" color Known " Ġto Ġcolor Known , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" value Known " Ġto Ġvalue Known ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( known Ġ|| Ġcolor Known ) Ġit . plus (" color " Ġto Ġcolor . name ) Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( known Ġ|| Ġvalue Known ) Ġit . plus (" value " Ġto Ġvalue . toString ()) Ġelse Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreveal ( cl ue : ĠHan abi Cl ue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cl ue . value Ġ== Ġthis . value ) Ġthis . value Known Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( cl ue . color Ġ== Ġthis . color ) Ġthis . color Known Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto State String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ color -$ value " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠHan abi Player ( val Ġcards : ĠCard Zone < Han abi Card > Ġ= ĠCard Zone ()) Ċ data Ġclass ĠHan abi Config ( ĊĠĠĠ Ġval Ġmax Cl ue Tokens : ĠInt , ĊĠĠĠ Ġval Ġfail Tokens : ĠInt , ĊĠĠĠ Ġval Ġrain bow Extra Color : ĠBoolean , ĊĠĠĠ Ġval Ġrain bow Wildcard : ĠBoolean , ĊĠĠĠ Ġval Ġrain bow Only One : ĠBoolean , ĊĠĠĠ Ġval Ġname Playing Card : ĠBoolean , ĊĠĠĠ Ġval Ġplay Until Full End : ĠBoolean , ĊĠĠĠ Ġval Ġallow Empty Cl ues : ĠBoolean Ċ ) Ċ data Ġclass ĠHan abi Color Data ( val Ġcolor : ĠHan abi Color , Ġval Ġboard : ĠCard Zone < Han abi Card > Ġ= ĠCard Zone ( mutable ListOf ()), Ġval Ġdiscard : ĠCard Zone < Han abi Card > Ġ= ĠCard Zone ( mutable ListOf ())) Ċ data Ġclass ĠHan abi ( val Ġconfig : ĠHan abi Config , Ġval Ġplayers : ĠList < Han abi Player >) Ġ{ ĊĠĠĠ Ġval Ġcolors : ĠList < Han abi Color Data > Ġ= ĠHan abi Color . values (). map Ġ{ ĠHan abi Color Data ( it ) Ġ} ĊĠĠĠ Ġvar Ġcl ue Tokens : ĠInt Ġ= Ġconfig . max Cl ue Tokens ĊĠĠĠ Ġvar Ġfail Tokens : ĠInt Ġ= Ġconfig . fail Tokens ĊĠĠĠ Ġvar Ġcurrent Player : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġturns Left Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġcolors Used Ġ= Ġif Ġ( config . rain bow Extra Color ) Ġ 6 Ġelse Ġ 5 ĊĠĠĠ Ġval Ġcurrent : ĠHan abi Player Ġget () Ġ= Ġplayers [ current Player ] ĊĠĠĠ Ġval Ġdeck Ġ= ĠCard Zone ( Han abi Color . values (). flatMap Ġ{ Ġcolor Ġ-> ĊĠĠĠĠĠĠĠ Ġ( 1 .. 5 ). flatMap Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 .. 4 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Not Ġan ĠHan abi Ġvalue : Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. count ). map Ġ{ ĠHan abi Card ( color , Ġvalue , Ġcolor Known Ġ= Ġfalse , Ġvalue Known Ġ= Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. sh uffled (). to Mutable List ()) ĊĊĠĠĠ Ġ// ĠPlay ing Ġa Ġfive Ġshould Ġgive Ġa Ġcl ue Ġtoken Ġback ĊĠĠĠ Ġfun Ġreveal ( cl ue : ĠHan abi Cl ue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġplayers [ cl ue . player ] ĊĠĠĠĠĠĠĠ Ġplayer . cards . forEach Ġ{ Ġit . reveal ( cl ue ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Turn () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( turn s Left Ġ> Ġ 0 ) Ġturns Left -- ĊĠĠĠĠĠĠĠ Ġthis . current Player Ġ= Ġ( this . current Player Ġ+ Ġ 1 ) Ġ% Ġplayers . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcolor Data ( card : ĠHan abi Card ): ĠHan abi Color Data Ġ= Ġcolors . find Ġ{ Ġit . color Ġ== Ġcard . color Ġ} !! ĊĠĠĠ Ġfun Ġplay Area For ( card : ĠHan abi Card ): ĠCard Zone < Han abi Card >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcolor Data ( card ). board . take If Ġ{ Ġit . size Ġ+ Ġ 1 Ġ== Ġcard . value Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġboard Complete (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . colors . size Ġ== Ġthis . colors Used Ġ&& Ġthis . colors . all Ġ{ Ġit . board . size Ġ== Ġ 5 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġincrease Cl ue Tokens () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . cl ue Tokens Ġ= Ġmin ( this . cl ue Tokens Ġ+ Ġ 1 , Ġthis . config . max Cl ue Tokens ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġempty Deck Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( deck . size Ġ== Ġ 0 Ġ&& Ġturns Left Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġturns Left Ġ= Ġthis . players . size Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Game Over (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . board Complete () Ġ|| Ġthis . turn s Left Ġ== Ġ 0 Ġ|| Ġthis . fail Tokens Ġ== Ġ 0 ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠHan abi Cl ue ( val Ġplayer : ĠInt , Ġval Ġcolor : ĠHan abi Color ?, Ġval Ġvalue : ĠInt ?) Ċ Ċ object ĠHan abi Game Ġ{ ĊĊĠĠĠ Ġval Ġgive Cl ue Ġ= Ġcreate ActionType (" Give Cl ue ", ĠHan abi Cl ue :: class ) ĊĠĠĠ Ġval Ġdiscard Ġ= Ġcreate ActionType (" Discard ", ĠInt :: class ) ĊĠĠĠ Ġval Ġplay Ġ= Ġcreate ActionType (" Play ", ĠInt :: class ) ĊĠĠĠ Ġval Ġgame Ġ= Ġcreate Game < Han abi >(" Han abi ") Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup ( Han abi Config :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHan abi Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Cl ue Tokens Ġ= Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Tokens Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrain bow Extra Color Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrain bow Only One Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrain bow Wildcard Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Empty Cl ues Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Playing Card Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Until Full End Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers ( 2 .. 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHan abi ( config , Ġ( 0 Ġuntil Ġplayer Count ). map Ġ{ ĠHan abi Player () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 5 Ġcards Ġfor Ġ 2 Ġor Ġ 3 Ġplayers , Ġotherwise Ġ 4 Ġcards . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Count Ġ= Ġit . players . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard Per Player Ġ= Ġif Ġ( player Count Ġin Ġ 2 .. 3 ) Ġ 5 Ġelse Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard States Ġ= Ġthis . strings (" cards ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . deck . top ( card Per Player Ġ* Ġplayer Count ). map Ġ{ Ġc Ġ-> Ġc . to State String () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Ġ= Ġit . deck . find States ( card States ) Ġ{ Ġc Ġ-> Ġc . to State String () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . deck . deal ( cards , Ġit . players . map Ġ{ Ġp Ġ-> Ġp . cards Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogic Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Action ( discard , Ġ{ Ġit . current . cards . indices Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Ġ{ Ġit . player Index Ġ== Ġit . game . current Player Ġ&& Ġit . game . turn s Left Ġ!= Ġ 0 Ġ&& Ġit . game . cl ue Tokens Ġ< Ġit . game . config . max Cl ue Tokens Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeffect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard Ġ= Ġit . game . current . cards [ it . parameter ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Card ( this . replay able (), Ġit . game , Ġcard , Ġit . game . color Data ( card . card ). discard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . increase Cl ue Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Turn End Check ( it . game , Ġplayer Elimin ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint Action ( play , Ġ{ it . current . cards . indices }) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Ġ{ Ġit . player Index Ġ== Ġit . game . current Player Ġ&& Ġit . game . turn s Left Ġ!= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeffect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplay Card Ġ= Ġit . game . current . cards [ it . parameter ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplay Area Ġ= Ġit . game . play Area For ( play Card . card ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Card ( this . replay able (), Ġit . game , Ġplay Card , Ġplay Area Ġ?: Ġit . game . color Data ( play Card . card ). discard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( play Card . card . value Ġ== Ġ 5 Ġ&& Ġplay Area Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . increase Cl ue Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( play Area Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . fail Tokens -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . game . fail Tokens Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Elimin ations . elim inate Remaining ( Win Result . LO SS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . game . board Complete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Elimin ations . elim inate Remaining ( Win Result . WIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Turn End Check ( it . game , Ġplayer Elimin ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( give Cl ue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption From ({ Ġit . players . indices . toList (). minus ( it . current Player ) Ġ}) Ġ{ player Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠTEXT _ COLOR Ġ= Ġ" color " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption ( listOf ( TEXT _ COLOR , Ġ" value ")) Ġ{ cl ue Mode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cl ue Mode Ġ== ĠTEXT _ COLOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption ( Han abi Color . values (). toList ()) Ġ{ color Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Parameter ( Han abi Cl ue ( player , Ġcolor , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption ( 1 .. 5 ) Ġ{ value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Parameter ( Han abi Cl ue ( player , Ġnull , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parameter . player Ġ!= Ġit . player Index Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . player Index Ġ== Ġit . game . current Player Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . cl ue Tokens Ġ> Ġ 0 Ġ&& Ġit . game . turn s Left Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeffect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . cl ue Tokens -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . game . reveal ( it . parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Turn End Check ( it . game , Ġplayer Elimin ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Player Ġ{ Ġit . current Player Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" others ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . players . map Indexed Ġ{ Ġindex , Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Ġ= Ġplayer . cards . map Ġ{ Ġcard Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard . known ( index Ġ!= Ġviewer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġviewer ) Ġreturn @ map Indexed Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" index " Ġto Ġindex , Ġ" cards " Ġto Ġcards ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" hand ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Perspective Ġ= Ġthis . viewer Ġ?: Ġit . current Player ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Ġ= Ġit . players [ view Perspective ]. cards . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Ġ-> Ġcard . known ( it . is Game Over ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" index " Ġto Ġview Perspective , Ġ" cards " Ġto Ġcards ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" colors ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . colors . map Ġ{ color Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color " Ġto Ġcolor Data . color . name . toLowerCase (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" board " Ġto Ġcolor Data . board . map Ġ{ Ġcard Ġ-> Ġcard . known ( true ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" discard " Ġto Ġcolor Data . discard . toList (). sorted By Ġ{ Ġcard Ġ-> Ġcard . value Ġ}. map Ġ{ Ġcard Ġ-> Ġcard . known ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" cards Left ") Ġ{ Ġit . deck . size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" cl ues ") Ġ{ Ġit . cl ue Tokens Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" score ") Ġ{ Ġit . colors . sum By Ġ{ Ġzone Ġ-> Ġzone . board . size Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue (" fails ") Ġ{ Ġit . fail Tokens Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Turn End Check ( game : ĠHan abi , Ġplayer Elimin ations : ĠPlayer Elimin ations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgame . next Turn () ĊĠĠĠĠĠĠĠ Ġif Ġ( game . turn s Left Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Elimin ations . elim inate Remaining ( Win Result . LO SS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove Card ( replay able : ĠRe play able Scope , Ġgame : ĠHan abi , Ġcard : ĠCard < Han abi Card >, Ġdestination : ĠCard Zone < Han abi Card >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( game . deck . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzone Ġ= Ġcard . zone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard State Ġ= Ġreplay able . string (" card ") Ġ{ Ġgame . deck . cards [ 0 ]. to State String () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Card Ġ= Ġgame . deck . find State ( card State ) Ġ{ Ġc Ġ-> Ġc . to State String () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard . moveTo ( destination ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame . deck . card ( next Card ). moveTo ( zone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠO LD : Ġcard . move And Replace ( destination , Ġgame . deck . card ( next Card )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame . empty Deck Check () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard . moveTo ( destination ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }