package Ġus . wh od ag . acquire Ċ Ċ import Ġmu . K Logging Ċ import Ġus . wh od ag . acquire . ac q .* Ċ import Ġus . wh od ag . acquire . json . Json Exception Ċ import Ġus . wh od ag . acquire . json . Standard Acquire Persist Ċ import Ġus . wh od ag . acquire . json . parse Json Ċ import Ġus . wh od ag . acquire . json . to Standard Acquire Persist Ċ import Ġus . wh od ag . acquire . obj . Ac q Obj Ċ import Ġus . wh od ag . acquire . obj . Ac q Objs Ċ import Ġus . wh od ag . acquire . obj . player . Player Id Ċ import Ġus . wh od ag . acquire . sm . Ac q Sm Ċ import Ġus . wh od ag . acquire . sm . Ac q Sm State Ċ import Ġus . wh od ag . acquire . ac q . Json Cache Acquire Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util . Objects . hash Ċ Ċ /** Ċ Ġ* ĠFactory Ġfor Ġcreating ĠAc quire Ġgames . Ċ Ġ*/ Ċ object ĠAc quire s Ġ: ĠK Logging () Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġversion Ġof Ġthe ĠAc quire Ġimplementation . Ġ*/ ĊĠĠĠ Ġval ĠCURRENT _ VERSION Ġ= ĠAc q Version ( 1 , Ġ 0 ) ĊĊĠĠĠ Ġ/** ĠCreate Ġa Ġstandard ĠAc quire Ġgame Ġwith Ġthe Ġspecified Ġplayers . Ġ*/ ĊĠĠĠ Ġfun Ġstandard ( players : ĠCollection < Player Id >): ĠAc quire Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard Start ( players , ĠAc q Objs . standard ( players )) ĊĊĠĠĠ Ġ/** ĠCreate Ġa Ġstandard ĠAc quire Ġgame Ġusing Ġrand Ġfor Ġsh uff ling Ġthe Ġtiles . Ġ*/ ĊĠĠĠ Ġfun Ġstandard Shuffle ( players : ĠCollection < Player Id >, Ġshuffle Seed : ĠLong ): ĠAc quire Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard Start ( players , ĠAc q Objs . standard Shuffle ( players , Ġshuffle Seed )) ĊĊĠĠĠ Ġ/** ĠLoad Ġan ĠAc quire Ġgame Ġfrom Ġthe Ġspecified Ġpath . Ġ*/ ĊĠĠĠ Ġfun Ġstandard Load From Path ( path : ĠString ): ĠAc quire ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstandard Load ( parse Json ( File ( path ). read Text ()). to Standard Acquire Persist ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Unable Ġto Ġfind Ġgame Ġfile Ġat Ġpath Ġ[$ path ]: Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Malformed Ġgame Ġfile Ġat Ġpath Ġ[$ path ]: Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠCreate Ġa Ġstandard ĠAc quire Ġgame Ġstarting Ġfrom Ġthe Ġbeginning . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstandard Start ( players : ĠCollection < Player Id >, Ġac q Obj : ĠAc q Obj ): ĠAc quire Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate ( generate Id ( players ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCURRENT _ VERSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAc q Type . Standard , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAc q Sm . start ( ac q Obj )) ĊĊĠĠĠ Ġ/* ĠLoad Ġa Ġstandard Ġgame Ġfrom Ġpersistence . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstandard Load ( persist : ĠStandard Acquire Persist ): ĠAc quire Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! CURRENT _ VERSION . is Compatible ( persist . version )) Ġthrow ĠUnsupportedOperationException (" Cannot Ġload Ġgame Ġas Ġcurrent Ġversion Ġ[$ CURRENT _ VERSION ] Ġis Ġincompatible Ġwith Ġload Ġgame Ġversion Ġ${ persist . version }") ĊĠĠĠĠĠĠĠ Ġif Ġ( CURRENT _ VERSION Ġ!= Ġpersist . version ) Ġlogger . warn Ġ{ Ġ" Loaded Ġgame Ġwill Ġwork Ġbut Ġcurrent Ġversion Ġ[$ CURRENT _ VERSION ] Ġdoes Ġnot Ġmatch Ġloaded Ġgame Ġversion Ġ${ persist . version }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġacquire Ġ= Ġcreate ( persist . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersist . version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersist . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersist . players , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAc q Sm . start ( Ac q Objs . standard Shuffle ( persist . players , Ġpersist . shuffle Seed ))) ĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġthe Ġstart Ġgame Ġrequest ĊĠĠĠĠĠĠĠ Ġval Ġrequests Ġ= Ġpersist . requests . drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġrequests . forEach ({ Ġacquire . submit ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġacquire ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠCreate Ġan ĠAc quire Ġgame . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate ( id : ĠAc quire Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion : ĠAc q Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠAc q Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers : ĠCollection < Player Id >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart State : ĠAc q Sm State ): ĠAc quire Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Acquire ( id , Ġversion , Ġtype , Ġplayers , Ġstart State ) ĊĊĠĠĠ Ġ/** ĠPers ist Ġthis Ġacquire Ġgame Ġto Ġa Ġfile . Ġ*/ ĊĠĠĠ Ġfun ĠAc quire . file Persist (): ĠFile Persistent Acquire Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġgenerate Path ( this ) ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Pers isting Ġacquire Ġgame Ġ[ ${ id ()} ] Ġto Ġfile Ġat Ġpath : Ġ$ path " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( type () Ġ== ĠAc q Type . Standard ) ĠFile Persistent Acquire ( this , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow ĠUnsupportedOperationException (" Unable Ġto Ġpersist Ġnon - standard Ġacquire Ġgame ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCache ĠJSON Ġserial izations Ġof Ġacquire Ġstate . Ġ*/ ĊĠĠĠ Ġfun ĠAc quire . json Cache (): ĠJson Cache Acquire Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Cache Acquire ( this ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠReturn Ġthe Ġdefault Ġgame Ġpath Ġfor Ġthe Ġspecified Ġgame . Ġ*/ Ċ fun Ġdefault Game Path ( game : ĠString ) Ġ= Ġ" games /$ game " Ċ Ċ /* ĠGenerate Ġa Ġpath Ġfor Ġan ĠAc quire Ġgame Ġ*/ Ċ private Ġfun Ġgenerate Path ( acquire : ĠAc quire ): ĠString Ġ= Ġdefault Game Path ("${ acquire . id (). name }. ac q ") Ċ Ċ /* ĠGenerate Ġan ĠAc quire Id Ġgiven Ġa Ġcollection Ġof Ġplayers . Ġ*/ Ċ private Ġval ĠGEN _ ID _ PATTERN Ġ= ĠDateTime Formatter . of Pattern (" MM - dd - uu uu - HH - mm ") Ċ private Ġfun Ġgenerate Id ( players : ĠCollection < Player Id >): ĠAc quire Id Ġ{ ĊĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠ Ġval Ġps Ġ= Ġplayers . sorted (). join ToString ( separator Ġ= Ġ"- ") ĊĠĠĠ Ġval Ġts Ġ= Ġnow . format ( GEN _ ID _ PATTERN ). toString () ĊĠĠĠ Ġval Ġss Ġ= ĠMath . abs ( hash ( now )) ĊĠĠĠ Ġreturn ĠAc quire Id ("${ ps }_${ ts }_ $ ss ") Ċ }