@ file : Jvm Name (" Main ") Ċ Ċ package Ġsol _ game Ċ Ċ import Ġcom . xen om ach ina . arg parser . Arg Parser Ċ import Ġcom . xen om ach ina . arg parser . default Ċ import Ġcom . xen om ach ina . arg parser . main Body Ċ import Ġsol _ engine . engine _ interface . Simulation Loop Ċ import Ġsol _ engine . network . network _ game . game _ server . Server Connection Data Ċ import Ġsol _ game . core _ game . Character Config Ċ import Ġsol _ game . core _ game . Sol Game Bot Simulation Ċ import Ġsol _ game . core _ game . Sol Game Simulation Offline Ċ import Ġsol _ game . game .* Ċ import Ġsol _ game . sol _ players . Rule Based Player Ċ import Ġsol _ game . sol _ players . Sol Random Test Player ĊĊ Ċ data Ġclass ĠServer Config ( ĊĠĠĠĠĠĠĠ Ġval Ġuse : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġhead less : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġdisable Gui : ĠBoolean Ġ= Ġfalse Ċ ) Ċ Ċ data Ġclass ĠClient Config ( ĊĠĠĠĠĠĠĠ Ġval Ġteam Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġhead less : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġobserver : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġdisable Gui : ĠBoolean Ċ ) Ċ Ċ class ĠArgs ( parser : ĠArg Parser ) Ġ{ ĊĠĠĠ Ġval Ġpool Server Ġby Ġparser . st oring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- pool Server ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" run Ġa Ġsimple Ġpool Ġserver . ĠFollow ed Ġby Ġcomma Ġseparated Ġoptions : Ġ[ headless ?, Ġdisable Gui ? ]" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġthis . split (",") ĊĠĠĠĠĠĠĠ Ġval Ġhead less Ġ= Ġoptions . contains (" headless ") ĊĠĠĠĠĠĠĠ ĠServer Config ( true , Ġhead less ) ĊĠĠĠ Ġ}. default ( Server Config ()) ĊĊĠĠĠ Ġval Ġclients Ġby Ġparser . adding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- client ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Clients Ġto Ġconnect Ġto Ġthe Ġpool Ġserver . ĠFollow ed Ġby Ġcomma Ġseparated Ġoptions : Ġ[ team Index ? =( int Ġ= Ġ 0 ), headless ?, disable Gui ?, observer ? ]" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġthis . split (",") ĊĠĠĠĠĠĠĠ Ġval Ġteam Index Ġ= Ġargs . find Ġ{ Ġarg Ġ-> Ġarg . startsWith (" team index ") Ġ} ?. split (" =") ?. get OrNull ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġhead less Ġ= Ġargs . contains (" headless ") ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġargs . contains (" observer ") ĊĠĠĠĠĠĠĠ Ġval Ġdisable Gui Ġ= Ġargs . contains (" disable Gui ") ĊĠĠĠĠĠĠĠ ĠClient Config ( team Index , Ġhead less , Ġobserver , Ġdisable Gui ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrun Ex haust ion Ġby Ġparser . flag ging ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- run Ex haust ion ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Run Ġmany Ġsp ed Ġup Ġgames Ġwith Ġhead less Ġserver Ġand Ġclients " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġoffline Ġby Ġparser . flag ging ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- run Offline ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Run Ġoffline " ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= Ġmain Body Ġ{ ĊĠĠĠ ĠArg Parser ( args ). parse Into (:: Args ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( run Ex haust ion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Many Fast Sim ulations () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . pool Server . use ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Running Ġpool Ġserver : Ġ$ pool Server ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Pool Server ( headless Ġ= Ġthis . pool Server . headless ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclients . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Running Ġclient : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Connect Client To Pool ( it . headless , Ġit . disable Gui , Ġit . team Index , Ġit . observer ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( offline ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Offline () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġexample Config : ĠCharacter Config Ġ= ĠCharacter Config Loader . from Resource File (" example Fr ank Config . json ") Ċ val Ġsh rank Config : ĠCharacter Config Ġ= ĠCharacter Config Loader . from Resource File (" sh rank Config . json ") Ċ val Ġsch math ias Config : ĠCharacter Config Ġ= ĠCharacter Config Loader . from Resource File (" sch math ias Config . json ") Ċ val Ġbr ail Config : ĠCharacter Config Ġ= ĠCharacter Config Loader . from Resource File (" br ail Config . json ") Ċ val Ġmag net Config : ĠCharacter Config Ġ= ĠCharacter Config Loader . from Resource File (" mag net Config . json ") Ċ Ċ val Ġcharacters Config Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġsh rank Config , ĊĠĠĠĠĠĠĠ Ġsch math ias Config Ċ ) Ċ Ċ fun Ġrun Offline () Ġ{ ĊĠĠĠ Ġval Ġloop Ġ= ĠSimulation Loop ( Sol Game Bot Simulation ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSol Game Simulation Offline ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Configs Ġ= Ġcharacters Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraphics Settings Ġ= ĠSol Game Simulation Offline . Graphics Settings ( graphical Input Ġ= Ġfalse , Ġcontrol Player Index Ġ= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( 0 Ġto ĠRule Based Player (), Ġ 1 Ġto ĠRule Based Player ()) ĊĠĠĠ Ġ), Ġ 1 f Ġ/ Ġ 6 0 f ) ĊĠĠĠ Ġloop . setup () ĊĠĠĠ Ġloop . start () Ċ } Ċ Ċ fun Ġrun Pool Server ( headless : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġpool Server Ġ= ĠSimple Sol Game Server Pool Server ( headless Ġ= Ġhead less ) ĊĠĠĠ Ġpool Server . serve ( 5 5 5 5 5 , Ġcharacters Config ) Ċ } Ċ Ċ fun Ġrun Connect Client To Pool ( headless : ĠBoolean , Ġdisable Gui : ĠBoolean , Ġteam Index : ĠInt , Ġobserver : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġserver Connection Data Ġ= Ġrequest Game Server Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" localhost ", Ġ 5 5 5 5 5 ) ĊĠĠĠ Ġif Ġ( server Connection Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( observer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Observer ( server Connection Data , Ġhead less ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Client ( server Connection Data , Ġhead less , Ġdisable Gui , Ġteam Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Could Ġnot Ġconnect Ġto Ġserver ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġrun Server Client () Ġ{ ĊĠĠĠ Ġval Ġserver Pool Ġ= ĠSol Game Server Pool ( true ) ĊĊĠĠĠ Ġval Ġserver Connection Data Ġ= Ġserver Pool . create Server ( listOf ( Character Config (), ĠCharacter Config ())) ĊĊĠĠĠ Ġval Ġclient Ġ= Ġrun Client ( server Connection Data , Ġtrue , Ġtrue , Ġ 0 ) ĊĊĠĠĠ Ġclient . wait Until Finished () ĊĠĠĠ Ġserver Pool . stop All () ĊĠĠĠ Ġprintln (" Terminated ") Ċ } Ċ Ċ fun Ġrun Server (): ĠSol Game Server Ġ{ ĊĠĠĠ Ġval Ġserver Ġ= ĠSol Game Server ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Configs Ġ= ĠlistOf ( Character Config (), ĠCharacter Config ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug UI Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Gui Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġserver Connection Data : ĠServer Connection Data Ġ= Ġserver . setup () ĊĠĠĠ Ġprintln (" Server Ġconnection : Ġ$ server Connection Data ") ĊĠĠĠ Ġserver . start () ĊĠĠĠ Ġprintln (" server Ġstarted ") ĊĠĠĠ Ġreturn Ġserver Ċ } Ċ Ċ fun Ġrun Client ( server Connection Data : ĠServer Connection Data , Ġhead less : ĠBoolean , Ġdisable Gui : ĠBoolean , Ġteam Index : ĠInt ): ĠSol Game Client Ġ{ ĊĠĠĠ Ġval Ġclient Ġ= ĠSol Game Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . address , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . port , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . game Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . teams Players Keys [ team Index ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSol Random Test Player :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Frame Time Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Ġ= Ġhead less , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug UI Ġ= Ġ! headless , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Gui Ġ= Ġ! disable Gui ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclient . setup () ĊĠĠĠ Ġclient . start () ĊĠĠĠ Ġreturn Ġclient Ċ } Ċ Ċ fun Ġrun Observer ( server Connection Data : ĠServer Connection Data , Ġhead less : ĠBoolean ): ĠSol Game Client Ġ{ ĊĠĠĠ Ġval Ġclient Ġ= ĠSol Game Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . address , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . port , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . game Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . observer Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Observer Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSol Test Observer :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Frame Time Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Ġ= Ġhead less , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug UI Ġ= Ġ! headless , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Gui Ġ= Ġ! headless ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclient . setup () ĊĠĠĠ Ġclient . start () ĊĠĠĠ Ġreturn Ġclient Ċ } Ċ Ċ fun Ġrun Many Fast Sim ulations () Ġ{ ĊĠĠĠ Ġval Ġteam W ins Ġ= Ġ( 0 .. 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 1 0 Ġ|| Ġit Ġ% Ġ 1 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" starting Ġsimulation Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Fast Simulation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprintln (" player Ġ 0 Ġwon : Ġ${ team W ins . filter Ġ{ Ġit Ġ== Ġ 0 Ġ}. count () }") ĊĠĠĠ Ġprintln (" player Ġ 1 Ġwon : Ġ${ team W ins . filter Ġ{ Ġit Ġ== Ġ 1 Ġ}. count () }") ĊĠĠĠ Ġprintln (" ties : Ġ${ team W ins . filter Ġ{ Ġit Ġ== Ġ- 1 Ġ}. count () }") Ċ } Ċ Ċ fun Ġrun Fast Simulation (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġserver Ġ= ĠSol Game Server ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Configs Ġ= ĠlistOf ( example Config , Ġexample Config ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Frame Time Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġserver Connection Data : ĠServer Connection Data Ġ= Ġserver . setup () ĊĠĠĠ Ġserver . start () ĊĊĠĠĠ Ġval Ġclients Ġ= Ġ( 0 .. 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġteam Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSol Game Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . game Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . teams Players Keys [ team Index ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSol Random Test Player :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Frame Time Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġit . setup () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġval Ġobserver Ġ= ĠSol Game Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . address , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . port , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . game Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Connection Data . observer Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Observer Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSol Random Test Player :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Frame Time Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead less Ġ= Ġtrue ĊĠĠĠ Ġ) Ċ // ĠĠĠ Ġserver . wait Until Finished () Ċ // ĠĠĠ ĠThread . sleep ( 3 0 0 0 ) ĊĠĠĠ Ġclients [ 0 ]. wait Until Finished () ĊĠĠĠ Ġserver . terminate () ĊĠĠĠ Ġclients . forEach Ġ{ Ġit . terminate () Ġ} ĊĠĠĠ Ġreturn Ġserver . get Team Index W on () Ċ }