Szabadulószoba szerver

A clueQuest Origenes szobához rengeteg olyan játékot terveztünk, amely mikrovezérlőkön alapszik. A szerver tervezésénél fő szempont volt, hogy minél kevesebbet kelljen a több mint 40 mikrovezérlő kódján módosítani. Így ezekre csak egy ún. “buta” kód került, mely nem tartalmazott játéklogikát, mindössze a rá csatlakoztatott fizikai eszközök kezelését végezte.

“Buta” client példával demonstrálva

Egy arduinora kötöttünk egy gombot és egy ledet. A led felvillantásához szükséges logikát nem a mikrovezérlőn tároljuk. Az eszköz csak üzenetet küld a gomb megnyomásáról a szervernek, mely egy másik üzenetet ad vissza arról, hogy az eszköz kapcsolja fel a ledet. Ez a módszer egyetlen helyre, a szerverre központosította a szoba működésének logikáját.

De miért kell “butának” lennie?

A szoba játékmenete sokat változott a tervezés fázisától a megjelenésig. Komplett játék is került ki a rendszerből, és adódtak kisebb-nagyobb változtatások a játékmeneten. Ezzel a megoldással a mikrovezérlők kódját egyszer sem kellett módosítani, így rengeteg időt sikerült magunknak spórolni.

Kommunikáció

Az Mqtt protocol-ra támaszkodtunk, amely egy TCP/IP alapú protokoll. Mqtt library-k elérhetőek a legtöbb nyelven és a legtöbb eszközre (pl. mikrovezérlőkre), így nem kellett foglalkoznunk low level szinten az adat küldés-fogadással, mely szintén rengeteg időt megspórolt.

Szerver

Egy olyan rendszer kialakítására volt szükség, amellyel gyorsan és dinamikusan módosíthatjuk a játékmenet logikáját. Alap patternek a “State machine”-t vettem, erre egyszerűen fel lehet építeni grafikus megjelenítést.

Pár további funkció

  • A játékban történő események továbbítása és parancsok fogadása WebSocketen (Egyedi felületek készítéséhez, pl. játékvezérlő panel)
  • Gif lejátszás UDP artnet protokollon keresztül led szalagokon
  • Replay system, amellyel visszajátszható egy korábbi játék (hibakereséshez)
  • WebHook - Webes apik egyszerű integrálásához

A szerver kódja c#-ban íródott és egy raspberry-n zökkenőmentesen képes futni.

Szobalogika tervezése

A szoba logikáját a State machine dinamikusságának köszönhetően programozás nélkül “kattingathatjuk” össze. Ehhez írtam egy böngészőben futtatható vizuális szerkesztőt. WebSocketen kapcsolódik a szerverhez, melyen keresztül megnyithatóak, módosíthatóak az ott tárolt játéklogikák. Ez a megoldás nagyon dinamikussá tette a játék logikájának összerakását, a szerver csak értelmezi az editor által készített JSON fájlt, majd felépíti a State machine-t. Így a szerver kódján sem kell változtatni a szoba logikájának módosításakor. Egyetlen JSON fájl módosul az editor által. Így szinte “realtime” hajthatunk végre változtatásokat a szoba logikájában, melyek azonnal életbe is lépnek.

A másik nagy előnye a grafikus szerkesztőfelületnek, hogy az editor megkapja a szervertől, éppen milyen state-ben tartózkodik és milyen változó értékek vannak. Így vizuálisan debugolható a szoba az editoron keresztül, ahol azonnal elvégezhető a logikai hiba javítása.

Így kaptunk egy olyan rendszert, mellyel bármilyen új szabadulószoba logikáját egyszerűen össze tudjuk “kattintgatni”.

Burcz Alex, 2019.11.07.

C# mono JavaScript TypeScript