Proboj je aktivita, ktorej cieľom je naprogramovať vlastného bota to počítačovej hry. Boti následne proti sebe súťažia.
Štandardný Proboj sa skladá z niekoľkých častí:
- server: program, ktorý získava od hráčov ich ťahy, posiela im zmeny v hre a pod.
- observer: program, ktorý vie prehrávať replay-e hier
- runner: program, ktorý zabezpečuje spúšťanie a management hráčskych procesov, ich komunikáciu s ostatnými časťami systému
- bot: samotný hráč, ktorý hrá hru
Tento repozitár sa primárne zameriava na funkčnosť runnera a špecifikáciu komunikácie v Proboji.
Runner komunikuje so Serverom prostredníctvom stdin/stdout vo forme správ. Každá správa má nasledujúci formát:
HEADER (1 line)
PAYLOAD (0+ lines)
.
Na začiatku hry Runner spustí proces Servera a pošle mu úvodnú konfiguráciu. Header CONFIG
, payload sa skladá z riadku
so zoznamom hráčov oddelených medzerou a potom môže nasledovať niekoľko riadkov, ktoré načítavame z game configu args
.
Zároveň Runner pospúšťa všetkých hráčov.
Od tohto momentu je kontrola nad priebehom hry na strane Serveru, ktorý príkazmi ovláda Runner.
Server posiela Runneru príkazy, pomocou ktorých ovláda hru. Formát príkazov je:
COMMAND [args]
DATA
.
Odpoveď od Runnera je vo formáte:
STATUS
DATA
.
Kde status je jedna z hodnôt OK
, ERROR
, DIED
. Dáta obsahujú výsledok operácie, resp. chybu, môžu sa skladať z viacerých riadkov.
TO PLAYER player comment...
Príkaz pošle hráčoviplayer
celý obsah dát na stdin. Ak je uvedená hodnotacomment
, vypíše sa do hráčovho logu.READ PLAYER player
Prečíta dáta od hráčaplayer
až po prvý riadok.
a pošle ich ako dáta odpovede.TO OBSERVER
Zapíše celý obsah dát do observer logu.KILL PLAYER player
Ukončí proces hráčaplayer
(pošle muSIGKILL
).PAUSE PLAYER player
Pozastaví proces hráčaplayer
(funguje iba na Linuxe/MacOS, pošleSIGSTOP
).RESUME PLAYER player
Obnoví beh procesu hráčaplayer
(funguje iba na Linuxe/MacOS, pošleSIGCONT
).SCORES
Očakáva formát dát ako riadkyplayer score
(score jeint
). Tieto dáta uloží do súboruscore.json
v priečinku hry vo formáte{player: score}
.END
Oznámi Runnerovi, že hra skončila. Runner pozabíja zvyšné procesy (vrátane Servera) a poupratuje po sebe.
Server vie komunikovať pomocou TO PLAYER
a READ PLAYER
príkazov. Obsah týchto dát nie je pre Runnera zaujímavý, je
na implementácií hry, aké dáta posiela. Hráč dostáva dáta na stdin a odosiela dáta na stdout.
Hráč obdrží dáta ukončené riadkom .
, rovnako sa očakáva, že dáta od hráča budú ukončené týmto riadkom.
Ak hráč po zavolaní READ PLAYER
neukončí svoje dáta .
do času nastaveného v timeout
configu, Runner mu zabije
proces.
Čokoľvek, čo hráč vypíše na stderr sa uloží do jeho log súboru.
Runner chce dva konfiguračné súbory -- config.json
a games.json
.
config.json
hovorí o nastaveniach runnera. Aktuálne obsahuje tieto voľby:
server
: cesta k binárke serveraplayers
: mapovanie názov hráča → cesta k jeho binárke a jazyk (command
,language
)processes_per_player
: počet procesov na hráča (default 1, ak viac, tak sa vyrobiaplayer_0
,player_1
...)timeout
: maximálny čas, ktorý môže hráč využiť pri čakaní na výstup v sekundách, pre každý jazyk (mapping jazyk -> timeout)disable_logs
: ak jetrue
, deaktivuje ukladanie logov hráčov a serveradisable_gzip
: ak jetrue
, deaktivuje gzipovanie logovgame_root
: cesta, kde sa budú ukladať dáta hier
games.json
obsahuje definíciu hier:
gamefolder
: názov priečinka hry, ktorý sa vyrobí vgame_root
players
: zoznam hráčov, ktorý sa v hre vyskytnúargs
: dáta, ktoré dostane server vCONFIG
u
Ak sa rozhodneš programovať Server v jazyku Go, v tomto repozitári nájdeš balík client
, ktorý obsahuje všetko potrebné
na komunikáciu s Runnerom.