Kommunika cio 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 Kovács Ferenc Dávid Zoltán Illés János 1.0 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. HTTP Post Játékos 1 (Slave) Játékvezérlő (Master) Response 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épet 1, 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 Kovács Ferenc Dávid Zoltán Illés János 1.0 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, Kovács Ferenc Dávid Zoltán Illés János 1.0 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' Kovács Ferenc Dávid Zoltán Illés János 1.0 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' Kovács Ferenc Dávid Zoltán Illés János 1.0 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 Kovács Ferenc Dávid Zoltán Illés János 1.0 7/8
Egység vásárlása: 'type': 'buy_unit', 'unittype': 2,'nodeid': 'B', Kör végének jelzése 'type': 'pass' Kovács Ferenc Dávid Zoltán Illés János 1.0 8/8