Kommuniká ció s protokoll Verzió 1.0
Tartalomjegyzék 1
Architektúrális felépítés .................................................................................................................. 3
2
Egy kör menete ............................................................................................................................... 3
3
Üzenetek formális leírása................................................................................................................ 4
4
Példa üzenetek ................................................................................................................................ 6
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 2/8
1 Architektúrális felépítés A játék kommunikációs modell szempontjából master slave felépítésű. A játékvezérlő a master és ő szólítja meg az egyes játékosokat. A kommunikáció http protokollra épül, a játékvezérlő http post üzenetben szólítja meg a játékosokat, a játékosok erre válaszolnak. Az üzenetek JSON formátumban vannak sorosítva. Játékos 1 (Slave) HTTP Post Response Játékvezérlő (Master)
HTTP Post Response
Játékos n (Slave)
1. ábra Kommunikációs architektúra
A kliensnek beállított időlimitje van a válaszolásra, a verseny során ez 3 másodperc. Ha nem sikerül időben válaszolni, kimarad a körből, három egymást követő körből kimaradás az aktuális játék elvesztését vonja maga után.
2 Egy kör menete Az üzenetek pontos formai leírásai a következő fejezetben megtalálhatók. A játék egy inicializáló 0. körrel kezdődik, a játékvezérlő sorra regisztráltatja a játékosokat: •
0. kör: A játék kezdetén a szerver egy register üzenetben közli a játékossal a hozzá tartozó azonosítót a timeout értékét és a körök hosszát. Erre válaszul a kliens elküldi a készítő/csapat nevét.
Egy normál játékmenet lefutása: 1. A kör kezdetén a szerver kérést küld az kliensnek. A kérés egy JSON üzenet formájában érkezik. Tartalmazza a játékosok aktuális fejlettségi szintjét,a térképet1, az aktuális kör sorszámát, a térképen lévő egységeket, városok és befolyás alatt álló területek listáját. 2. A kliens eldönti, hogy mit szeretne tenni a kör folyamán, ennek megfelelő JSON üzenetet állít össze és ad meg válaszként a kérésre. 3. A szerver feldolgozza a lépést majd ismét kérést intéz a klienshez ezúttal a frissített játékállapottal illetve a legutóbbi parancs kimentének sikerességével kiegészítve. 4. A kliens egy pass üzenetben jelzi ha befejtettnek tekinti a kört A játék menete során használt kommunikáció szekvencia diagramját ismerteti a 2. ábra.
1
Ezt csak az első fordulóban teszi meg
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 3/8
2. ábra Üzenetváltások szekvencia diagramja
Az egy körben kiadható parancsok típusának sorrendje kötött az alábbiak szerint: egységmozgatás, fejlesztés vásárlás, város vásárlás, egység vásárlás. Természetesen egy kliens kezdheti a körét város vásárlásával ám abban a körben nem mozgathatja az egységeit és nem vásárolhat fejlesztéseket.
3 Üzenetek formális leírása Regisztrációs JSON üzenet az alábbi formában épül fel. A körök hossza az egy játékosra szánt maximális idő, a timeout hossza pedig a POST kérésre várt válasz ideje. Mindekét érték másodpercben értendő.
register ::= { 'yourid': Int, 'timeout': Int (másodpercben) 'round_length': Int (másodpercben) 'available_units': [available_unit] 'available_upgrades': [available_upgrade] } available_upgrade ::= { 'upgradeid': Int, 'name': String, 'price': Int, 'productivity_bonus': Int, 'dependency': Int, 'defense_bonus': Int } available_unit ::= {'attack_power': Int, 'name': String,
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 4/8
'price': Int, 'dependency': Int, 'defense_level': Int, 'unitid': Int, 'speed': Int }
Az erre várt válasz: register_response ::= { 'name': String }
A parancs kérésekor küldött üzenet: round_info ::= { 'round_number': Int, 'player_info': [playerinfo], 'map': [node] <- Ez csak az első körben kerül kiküldésre! 'units': [unit] 'towns': [town] 'territories': [territory] 'last_command_status': String} player_info ::= {'playerid': Int 'money': Int 'upgrades': [Int] } node ::= [String, String]
A térképek a gráf él listájával adjuk meg. Azaz egy node elem egy élet jelent a gráfban. A gráf nem irányított, azaz mindkét irányban lehet az élen mozogni. unit ::= [String, Int, String, Int]
sorrend: Unit azonosító, típus, node azonosító, játékos azonosítója town ::= [ String, Int ]
Térkép node azonosító és játékos azonosító territory ::= [ String, Int ]
Térkép node azonosító és játékos azonosító A klienstől várt üzenetek: move ::= { type: 'move', 'unitid': String , 'from': String, 'to' String } buy_upgrade ::= { type: 'buy_upgrade', 'upgradeid': Int } buy_town ::= { type: 'buy_town', 'nodeid': String } buy_unit ::= { type: 'buy_unit', unittype, nodeid } pass ::= { type: 'pass' }
Játék végét jelző üzenet: gameover ::=
'gameover'
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 5/8
4 Példa üzenetek Első körben küldött üzenet: { 'available_upgrades': [ { 'upgradeid': 1, 'name': 'Bronzmuvesseg', 'price': 5, 'productivity_bonus': 10, 'dependency': 0, 'defense_bonus': 0 }, { 'upgradeid': 2, 'name': 'Vasmuvesseg', 'price': 5, 'productivity_bonus': 5, 'dependency': 1, 'defense_bonus': 0 }, { 'upgradeid': 3, 'name': 'Kiralysag', 'price': 12, 'productivity_bonus': 25, 'dependency': 1, 'defense_bonus': 50 } ], 'round_length': 20, 'yourid': 1, 'timeout': 5, 'available_units': [ { 'attack_power': 1, 'name': 'Harcos', 'price': 4, 'dependency': 0, 'defense_level': 1, 'unitid': 1, 'speed': 1 }, { 'attack_power': 1, 'name': 'Falanx', 'price': 5, 'dependency': 2, 'defense_level': 2, 'unitid': 2, 'speed': 1 } ] } A várt válasz: {name: 'Elek'}
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 6/8
Parancsok között küldött üzenet:
{ "player_info": [ { "playerid": 1, "money": 7, "upgrades": [] }, { "playerid": 2, "money": 7, "upgrades": [] } ], "map": [Ez itt egy első körös üzenet, ezért van itt a map ["A","B"], ["A","F"], ["C","H"], ["C","B"], ["B","A"], ["B","C"], ... (ez hosszasan így) ... ] "territories": [ ["B",1], ["F",1], ["H",2], ["L",2] ]
"units": [ ["1_1_1",1,"A",1], ["1_1_2",1,"A",1] …stb ] "towns": [["A", 1 ],["M",2] ], "round_number": 1 }
Egy egység mozgatása: {'type': 'move', 'from': 'A', 'to': 'B', 'unitid':'1_1_1'}
fejlesztés vásárlása: {type': 'buy_upgrade', 'upgradeid': 1}
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 7/8
Egység vásárlása: {'type': 'buy_unit', 'unittype': 2,'nodeid': 'B'},
Kör végének jelzése {'type': 'pass'}
Szerző Kovács Ferenc – Dávid Zoltán – Illés János
Verzió 1.0
Oldal 8/8