package Ġcom . ort . last w olf . domain . model . v illage . participant Ċ Ċ import Ġcom . ort . db fl ute . all common . C Def Ċ import Ġcom . ort . last w olf . domain . model . camp . Camp Ċ import Ġcom . ort . last w olf . domain . model . skill . Skill Ċ import Ġcom . ort . last w olf . domain . model . skill . Skill Request Ċ import Ġcom . ort . last w olf . domain . model . v illage . V illage Day Ċ Ċ data Ġclass ĠV illage Participants ( ĊĠĠĠ Ġval Ġcount : ĠInt , Ġ// Ġ éĢĢ æĿ ĳ ãģĹãģŁ äºº ãģ¯ åĲ« ãģ¾ ãģªãģĦ ĊĠĠĠ Ġval Ġlist : ĠList < V illage Participant > Ġ= ĠlistOf () Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġassign Skill ( v illage Participant Id : ĠInt , Ġskill : ĠSkill ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġv illage Participant Id ) Ġit . assign Skill ( skill ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Participant ( char a Id : ĠInt , Ġplayer Id : ĠInt , Ġskill Request : ĠSkill Request ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġcount Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġlist Ġ+ ĠV illage Participant . create For Register ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar a Id Ġ= Ġchar a Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Id Ġ= Ġplayer Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskill Request Ġ= Ġskill Request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Skill Request ( participant Id : ĠInt , Ġfirst : ĠC Def . Skill , Ġsecond : ĠC Def . Skill ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . change Skill Request ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ éĢĢ æĿ ĳ ĊĠĠĠ Ġfun Ġleave ( participant Id : ĠInt ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġthis . count Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . g one () Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ çªģ çĦ¶ æŃ» ĊĠĠĠ Ġfun Ġsudden ly Death ( participant Id : ĠInt , Ġv illage Day : ĠV illage Day ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . su dden ly Death ( v illage Day ) Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ åĩ¦ åĪ ĳ ĊĠĠĠ Ġfun Ġexecute ( participant Id : ĠInt , Ġv illage Day : ĠV illage Day ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . execute ( v illage Day ) Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ è¥ ² æĴ ĥ ĊĠĠĠ Ġfun Ġattack ( participant Id : ĠInt , Ġv illage Day : ĠV illage Day ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . attack ( v illage Day ) Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ åĳ ª æ® º ĊĠĠĠ Ġfun Ġdiv ine Kill ( participant Id : ĠInt , Ġv illage Day : ĠV illage Day ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . div ine Kill ( v illage Day ) Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ çĤ¹ åĳ¼ ĊĠĠĠ Ġfun Ġroll Call ( participant Id : ĠInt , Ġdone : ĠBoolean ): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġthis . list . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġparticipant Id ) Ġit . roll Call ( done ) Ġelse Ġit . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ åĭ Ŀ æķ Ĺ è¨Ńå®ļ ĊĠĠĠ Ġfun Ġwin Lo se ( win Camp : ĠCamp ?): ĠV illage Participants Ġ= Ġthis . copy ( list Ġ= Ġthis . list . map Ġ{ Ġit . win Lo se ( win Camp ) Ġ}) ĊĊĠĠĠ Ġfun Ġfind ( id : ĠInt ): ĠV illage Participant ? Ġ= Ġlist . first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĊĠĠĠ Ġfun Ġfirst ( id : ĠInt ): ĠV illage Participant Ġ= Ġlist . first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ?: Ġthrow ĠIllegalStateException (" not Ġfound Ġmember ") ĊĊĠĠĠ Ġfun ĠfindBy Player Id ( player Id : ĠInt ): ĠV illage Participant ? Ġ= Ġlist . first OrNull Ġ{ Ġit . player . id Ġ== Ġplayer Id Ġ&& Ġ! it . is G one Ġ} ĊĊĠĠĠ Ġfun Ġfirst By Player Id ( player Id : ĠInt ): ĠV illage Participant Ġ= ĠfindBy Player Id ( player Id ) Ġ?: Ġthrow ĠIllegalStateException (" not Ġfound Ġmember ") ĊĊĠĠĠ Ġfun Ġfilter Alive (): ĠV illage Participants Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalive Members Ġ= Ġlist . filter Ġ{ Ġit . is Alive () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠV illage Participants ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġalive Members . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġalive Members ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Random ( predicate : Ġ( V illage Participant ) Ġ-> ĠBoolean ): ĠV illage Participant ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . filter Ġ{ Ġpredicate ( it ) Ġ}. sh uffled (). first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexists Difference ( participant : ĠV illage Participants ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( count Ġ!= Ġparticipant . count ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( list . size Ġ!= Ġparticipant . list . size ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . any Ġ{ Ġmember 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticipant . list . none Ġ{ Ġmember 2 Ġ-> Ġ! member 1 . exists Difference ( member 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }