package Ġapps . games . ser ious . ma f ia . sub games . role . distribution Ċ Ċ import Ġapps . chat . Chat Ċ import Ġapps . games . Game Ċ import Ġapps . games . Game Manager Ċ import Ġapps . games . Game Manager Class Ċ import Ġapps . games . ser ious . ma f ia . roles . Player Role Ċ import Ġapps . games . ser ious . ma f ia . sub games . role . generation . Role Deck Ċ import Ġcrypto . random . random String Ċ import Ġentity . Group Ċ import Ġentity . User Ċ import Ġorg . bouncycastle . j ce . spec . EC Parameter Spec Ċ import Ġproto . Game Message Proto Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġuser Ġon Ġ 8 / 1 2 / 1 6 . Ċ Ġ*/ Ċ Ċ class ĠRole Distribution Game ( chat : ĠChat , Ġgroup : ĠGroup , Ġgame ID : ĠString , Ġval ĠEC Params : ĠEC Parameter Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Deck : ĠRole Deck , Ġgame Manager : ĠGame Manager Class Ġ= ĠGame Manager ) Ġ: ĊĠĠĠĠĠĠĠ ĠGame < Pair < Player Role , ĠRole Distribution Helper >>( chat , Ġgroup , Ġgame ID , Ġgame Manager Ġ= Ġgame Manager ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Role ĠDistribution ĠGame " ĊĊĠĠĠ Ġval Ġplayer Order Ġ= Ġgroup . users . sorted By Ġ{ Ġx Ġ-> Ġx . name Ġ}. to Mutable List () ĊĠĠĠ Ġval Ġplayer ID Ġ= Ġplayer Order . indexOf ( chat . me ()) ĊĠĠĠ Ġval Ġkey Helper Ġ= ĠRole Distribution Helper ( role Deck . clone (), Ġgroup . users . toList ()) ĊĠĠĠ Ġval ĠN Ġ= Ġgroup . users . size ĊĠĠĠ Ġval ĠHAND SHA KE _ PH R ASE Ġ= Ġ" HAND SH AK ER EN " ĊĠĠĠ Ġprivate Ġval Ġsalt Ġ= Ġrandom String ( 5 1 2 ) ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ ĠINIT , ĊĠĠĠĠĠĠĠ ĠEX CHANGE _ KEYS , Ġ// EX CHANGE ĠKEYS Ġ 1 .. N ĊĠĠĠĠĠĠĠ ĠVERIFY _ COM RA DES , ĊĠĠĠĠĠĠĠ ĠEND ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġstate : ĠState Ġ= ĠState . INIT ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrole : ĠPlayer Role ĊĊĠĠĠ Ġoverride Ġfun Ġevaluate ( responses : ĠList < Game Message Proto . GameState Message >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( msg Ġin Ġresponses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat . showMessage ( msg . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . INIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġmutable ListOf < BigInteger >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. N Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġplayer ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( role Deck . role Keys . elementAt ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( role Deck . V Keys . elementAt ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( role Deck . R keys . elementAt ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( BigInteger . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( BigInteger . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . add ( BigInteger . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . EX CHANGE _ KEYS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys . join ToString (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . EX CHANGE _ KEYS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( msg Ġin Ġresponses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser ( msg . user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserID Ġ= Ġplayer Order . indexOf ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġmsg . value . split (" Ġ"). map Ġ{ Ġx Ġ-> ĠBigInteger ( x ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 3 Ġ* ĠN Ġ- Ġ 1 Ġstep Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ 3 Ġ* ĠuserID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register Role Key ( user , Ġi Ġ/ Ġ 3 , Ġsplit [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register V Key ( user , Ġi Ġ/ Ġ 3 , Ġsplit [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register R Key ( user , Ġi Ġ/ Ġ 3 , Ġsplit [ i Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register Role Key ( chat . me (), Ġplayer ID , Ġrole Deck . role Keys . elementAt ( player ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register V Key ( chat . me (), Ġplayer ID , Ġrole Deck . V Keys . elementAt ( player ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Helper . register R Key ( chat . me (), Ġplayer ID , Ġrole Deck . R keys . elementAt ( player ID )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= Ġkey Helper . get Role ( player ID ). player Role ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole . register IV ( key Helper . get De crypted V Card ( player ID ). normalize ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . VERIFY _ COM RA DES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrole . encrypt For Com r ades ( salt Ġ+ Ġ" Ġ" Ġ+ ĠHAND SHA KE _ PH R ASE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . VERIFY _ COM RA DES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( msg Ġin Ġresponses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser ( msg . user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Ġ= Ġrole . decrypt For Com r ades ( msg . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat . showMessage ("${ user . name } Ġis Ġnot Ġmy Ġcom r ade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġdecrypted . split (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat . showMessage ("${ user . name } Ġis Ġnot Ġmy Ġcom r ade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( split [ 1 ] Ġ== ĠHAND SHA KE _ PH R ASE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat . showMessage ("${ user . name } Ġis Ġmy Ġcom r ade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole . register Com r ade ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . END ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . END Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġis Finished (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate Ġ== ĠState . END ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Result (): ĠPair < Player Role , ĠRole Distribution Helper > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrole Ġto Ġkey Helper ĊĠĠĠ Ġ} Ċ }