EÖTVÖS LORÁND TUDOMÁNYEGYETEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK
Monopoly játék továbbfejlesztése
Témavezető:
Készítette:
Kitlei Róbert
Gönczöl Mátyás
Tanársegéd
Programtervező Informatikus BSc Nappali tagozat
Budapest, 2015.
Tartalomjegyzék 1
Bevezetés .................................................................................................................. 3
2
Felhasználói dokumentáció....................................................................................... 4 2.1
A játékról röviden ............................................................................................. 4
2.2
Hardver- és szoftverigény ................................................................................. 4
2.3
Üzembe helyezés .............................................................................................. 4
2.3.1 XAMPP működtetése ..................................................................................... 5 2.4
A program használata, működése ..................................................................... 6
2.4.1 Hot seat game ......................................................................................... 8 2.4.1.1
New Game ............................................................................................ 8
2.4.1.1.1 Üres telek ...................................................................................... 12 2.4.1.1.2 Foglalt telek ................................................................................... 13 2.4.1.1.3 Irány a börtön ................................................................................ 14 2.4.1.1.4 Meglepetés és szerencse kártya ..................................................... 16 2.4.1.1.5 Adó ................................................................................................ 16 2.4.1.1.6 Egyéb mezők ................................................................................. 17 2.4.1.1.7 Build & Mortgage ......................................................................... 17 2.4.1.1.8 Trade ............................................................................................. 20 2.4.1.1.9 Csőd, játék vége ............................................................................ 22 2.4.1.2
Load Game .......................................................................................... 24
2.4.1.3
Settings................................................................................................ 25
2.4.2 Network Game ............................................................................................ 27
3
2.4.2.1
New Game .......................................................................................... 29
2.4.2.2
Load Game .......................................................................................... 31
2.4.2.3
Settings................................................................................................ 32
Fejlesztői dokumentáció ......................................................................................... 33 3.1
Felhasználói felület ......................................................................................... 33
3.2
Fontosabb függvények .................................................................................... 38
3.2.1 NetworkBoardScript fontosabb függvényei ............................................... 38 3.2.2 PlayerScript ................................................................................................. 41 3.2.3 PropertyScript ............................................................................................. 41 3.2.4 CameraScript .............................................................................................. 42
3.3
Adatbázis szerkezete ....................................................................................... 42
3.3.1 CardDrawingTable+saveFileID tábla ......................................................... 42 3.3.2 CardsManager+saveFileID tábla ................................................................ 43 3.3.3 LogTable+saveFileID tábla ........................................................................ 43 3.3.4 MiscellaneousActionTable+saveFileID tábla ............................................. 43 3.3.5 MovingTable+saveFileID tábla .................................................................. 44 3.3.6 PayingTable+saveFileID tábla .................................................................... 44 3.3.7 PlayersManager+saveFileID tábla .............................................................. 44 3.3.8 PropertyActionTable+saveFileID tábla ...................................................... 45 3.3.9 PropertyManager+saveFileID tábla ............................................................ 45 3.3.10
RollingTable+saveFileID tábla ............................................................... 46
3.3.11
Savedgames tábla .................................................................................... 47
3.3.12
SaveManager+saveFileID tábla .............................................................. 47
3.4
Konfigurációs fájl ........................................................................................... 49
3.5
Tesztelés.......................................................................................................... 51
4
Összefoglalás .......................................................................................................... 62
5
Irodalomjegyzék ..................................................................................................... 63
1 Bevezetés Az általam korábban elkészített társasjáték számítógépes változatát bővítettem bizonyos funkciókkal, amely növelheti a játékélményt. A korábbi változatban egymás ellen csak egy gépen lehetett játszani, nem volt lehetőség elmenteni a játékot, csak az alapértelmezett adatok alapján volt lehetőség játszani. A program bővített verziója lehetővé teszi, hogy a felhasználók több gépen játszhassanak egymással helyi hálózaton, illetve az adatbázisba való mentéssel bármikor folytathatják, vagy akár újrajátszhatják a korábban befejezett játékot. Itt tárolja a program a játék történéseit, kizárólag a legfontosabb adatokat elmentve, amiből értelmes szöveget generál az alkalmazás. Valamint egy konfigurációs fájlban át lehet írni az értékéket, amellyel a játékban szereplő árak, díjak nagyságát lehet változtatni. Az autentikusabb élményért a program néhány animációval is gazdagabb lett.
3
2 Felhasználói dokumentáció 2.1 A játékról röviden A játékosok ingatlanok adásával, vételével, bérbeadásával növelik vagyonukat, és a leggazdagabb – a legokosabban befektető játékos – lesz a végső győztes. A „GO” feliratú mezőről indulva, aszerint, hogy a dobókockákkal a játékos hányat dob, előrelép a bábujával. Ha egy tulajdonos nélküli ingatlan mezőre lép, azt megveheti a Banktól. Amennyiben nem a vásárlás mellett dönt, elárverezik és a legtöbbet kínáló versenytárs kapja azt meg. Az ingatlanok birtoklásának az a célja, hogy a versenytársaktól bérleti díjat tudjanak beszedni, ha a tulajdonban lévő ingatlan mezőre lépnek. A bérleti díj annál magasabb, minél több ház illetve szálloda található a területen, így bölcs dolog az erre kijelölt házhelyeken annyit felállítani, amennyi csak lehetséges. Mind a szerencsekártyák, mind a meglepetés-kártyák utasításait követni kell. A győztes játékos, az az egy játékos, aki nem megy csődbe.
2.2 Hardver- és szoftverigény A program Windows operációs rendszeren futtatható. Windows 7-es gépeken volt tesztelve, működik egyaránt a 32 és 64 bites operációs rendszereken. A program helyes működéséhez szükség lesz az ingyenesen letölthető XAMPP nevű programcsomagra. Legalább 549 MB memóriát, valamint 1,26 GB tárhelyet igényel a két program. Ha a játék hálózati üzemmódját szeretné a felhasználó használni, akkor szüksége lesz stabil internetkapcsolatra. Előfordulhat, hogy a hálózati játék nem jön létre, ugyanis a szerver offline üzemmódban van, vagy a portok blokkolva vannak (23466, 50005-as portok), esetleg a tűzfalon nincs átengedve a program. [1]
2.3 Üzembe helyezés A XAMPP programcsomag telepítéséhez a felhasználó indítsa el a mellékelt xamppwin32-1.8.3-5-VC11-installer.exe fájlt. A telepítés során kattintson végig a „Next >” gombra, viszont a második lépésnél mindenképp legyenek bepipálva az első ábrán látható komponensek, a többire nem lesz szükség.
4
1. ábra: A XAMPP programcsomag telepítésének második lépése
Az alkalmazás egy Monopoly.exe fájlból és egy Monopoly_Data nevű mappából áll, utóbbi a játék forrásfájljait tartalmazza. A mappának és az exe fájlnak ugyanazon a helyen kell szerepelnie. A játék működéséhez nincs szükség telepítésre, elég a „Monopoly.exe”-t futtatni.
2.3.1 XAMPP működtetése A XAMPP telepítése után indítsa el a XAMPP Control Panel alkalmazást, amit a telepítő telepített, és a Start menüből elérhető.
2. ábra: A Start menüben található XAMPP mappa és futtatható fájljai
A 3. ábrán látható Apache és a MySQL sorában kattintson a „Start” gombra, ezzel elindítja a web- és az adatbázisszervert. Az ábrán a „Start” helyett „Stop” szerepel, ugyanis a két szerviz már el lett indítva. [2]
5
3. ábra: A XAMPP vezérlő felülete és egy helyes működése
Egy szerviz indításánál hiba léphet fel, ha az adott port foglalt, mert egy másik alkalmazás már éppen használja azt. Ebben az esetben át kell állítani az adott programnak a port használatát, majd újra lehet indítani a szervizt. Például a Skype program használhatja ugyanúgy a 80-as és 443-as portot, mint az Apache szerver. Az adott program kapcsolat beállításai között lehetőség van letiltani a szükséges portok használatát. A két szerviz helyesen működik, ha a szövegük háttere zöldre vált. Ha a felhasználó befejezte a játékot a „Stop” gombra kattintva leállíthatja a szerverek működését, ugyanis a vezérlő felület leállásától ezek függetlenek. Másolja be a mellékelt unity_test mappát teljes egészében (mappával együtt) a XAMPP program fájljai közé, ezen belül a „htdocs” nevű mappába. Ezt az útvonalat legkönnyebben a vezérlő felületen lehet elérni, az Explorer gombra kattintva (3. ábrán látható) egy böngészőt nyit, amely a XAMPP telepített helyére navigálja a felhasználót, ahol már a „htdocs” mappa is megtalálható.
2.4 A program használata, működése A Monopoly.exe-t elindítva a 4. ábrán látható ablak jelenik meg a felhasználó előtt:
6
4. ábra: Az alkalmazás képi beállításai, indítóablaka
A játék megkezdése előtt lehetőség van beállítani a játékos számára szimpatikus felbontást (a maximális felbontás függ a monitortól), teljes képernyős módot, illetve a grafika minőségét is (Fastest beállítás minimális minőséget, viszont a leggyorsabb játékélményt kínálja). A játék több felbontáson is tesztelve volt, a javasolt minimális felbontás 1280x720, viszont optimális a nagyobb, szélesebb, 16:9 arányú felbontást választani a menüelemek jó elhelyezkedése és a betűk jó láthatósága miatt. A „Play!” gombra kattintva a játékprogram elindul egy új ablakot nyitva, míg ezt a konfigurációs ablakot bezárja. „Quit” gombra kattintva program futtatását leállítja, bezárva az ablakot. A „Play!” gomb (4. ábra) lenyomása esetén a főmenü fogadja a felhasználót (5. ábra), ahol lehetőség van választani, hogy a játékosok egy gépen szeretnének játszani egymással, vagy több gépen egyszerre, helyi hálózatra kapcsolódva. Előbbihez a Hot seat game gombra (2.4.1), utóbbihoz a Network game (2.4.2) gombra kell kattintani. A játékszabályok azonosak mindkét módban. Lehetőség van kilépni a játékból a „Quit Game” gombra kattintva.
7
5. ábra: A főmenü elemei
1
2.4.1 Hot seat game A bal szélső Hot seat game gombra kattintva (5. ábra) az ugyanerre a névre hallgató játékmódba navigál az alkalmazás, ahol a tábla már elő van készítve. Egy újabb menü kerül elő (6. ábra) négy gombbal, ezek sorrend szerint. „New Game” – egy teljesen új játékot lehet kezdeni. „Load Game” – egy előzőleg az ugyanazon a gépen félbehagyott játékot lehet folytatni. „Settings” – Az új játék megkezdése előtt az alapadatokat lehet megváltoztatni, ezzel is változatosabbá tenni a játék menetét. „Quit game” – Kilépés a programból.
6. ábra: Hot seat game főmenüje
2.4.1.1 New Game Új játék esetén ki kell választani, a játékosok számát, ami minimum 2, maximum 4 lehet (7. ábra).
1
A jobb láthatóság érdekében az ábrák a játék különböző felbontásaiból készülnek, illetve a lényegesebb
részek lesznek kivágva
8
8. ábra: Játékosok neveit szerkesztő, illetve bábuikat kiválasztó menü
7. ábra: Játékosok számát kiválasztó menü
Ezután mindenki adhat egy-egy avatarnevet, amivel a program hivatkozni fog a játékosokra,
maximum
10
karakterből
állhat,
alapértelmezett
névként
a
Player+játékos sorszám van megadva (például a 2. sorban: Player2, 8. ábra). Emellett 6 féle bábu közül választhatnak egyet, amelyet a játék során mozgathatnak táblán.
9. ábra: A választható figurák sorrendben: Hajó, ágyú, cilinder, vasaló, gördeszka, talicska
Ugyanazt a bábut egynél több játékos nem használhatja, így például a 8. ábrán látható, hogy Player1-nél a hajó van kiválasztva, így a többi játékos nem tudja azt választani. A nyilakkal lehet váltani a figurák között, az adott sorban levő névhez az ugyanabban a sorban található figura fog társulni. A „Play Game” gombra kattintva a nevek és a bábuk véglegesítve lesznek és elkezdődik a játék.
10. ábra: Egy új játék első jelenete
9
A játékosok nevei, vagyonuk (amely a játék folyamán változni fog) és bábuik ikonja a képernyő különböző sarkaiban fognak elhelyezkedni, a piros játékos megkapja a bal felső sarkot, a sárga a jobb felsőt, a zöld a jobb alsót, a kék pedig a bal alsót, ahogy ez a 10.
ábrán
is
látható.
A
színekre
szükség
lesz
a
telkek
tulajdonosainak
megkülönböztetése érdekében. A figurák a tábla jobb alsó sarkában található GO mezőn sorakoznak fel átlósan. Hagyományos kockadobással dől el ki lesz a kezdő játékos. Minden alkalommal két kockával történik a dobás. Egymás után dob mindenki az óramutató járásával megegyezően, így a piros színnel ellátott személy dob először, utána a sárga, és ha van, akkor a zöld és végül a kék játékos. A későbbiek során is marad ez a sorrend. A legnagyobb számot dobó játékos kezd, egyenlőség esetén csak a legnagyobbat dobók dobnak újra, amíg győztes nem születik. A „Roll” gombra kattintva a bal alsó és a jobb felső sarokból, animálva érkezik 1-1 kocka a tábla közepe felé. Amint mindkét dobókocka megállt a kockák eltűnnek, és a következő játékos ugyanígy dobhat. A 11. ábra Game History ablakában látható, hogy Player1 és Player3 a legnagyobbat dobták (8), megelőzve Player2 és Player4 játékosokat, így az előbbi páros dobhat újra. Player1 a 10-est, míg Player3 6-ost dob, így Player1 kezdheti a játékot. A táblát láthatatlan hengerek veszik körül, amelyek segítenek megakadályozni a dobókockák leesését a tábláról. Előfordulhat extrém helyzet, mikor is nem lehet megállapítani, hogy melyik oldala van felül a dobókockának (például az egyik úgy áll meg, hogy a láthatatlan határfal vagy éppen másik kocka kitámasztja az oldalával), vagy leesik a tábláról, ekkor az adott kocka automatikusan újradobódik, vagy utóbbi esetben a tábla felett jelenik meg újra.
11. ábra: Kezdő játékos kisorsolva, illetve naplózás ablak
A játék kezdetével a képernyő bal oldalán, középen megjelent egy papír+toll ikon, rákattintva a Game History ablak jelenik meg, amelyet a fejlécnél fogva mozgatni 10
lehet. Ebben az ablakban fog megjelenni, hogy mi történik a játék során. A naplózás a betöltésnél fog előkerülni (2.4.1.2). Amint a szöveg meghaladja az ablak területét, abban az esetben megjelenik a görgetősáv is. A papír+toll ikon újbóli kattintására az ablakot el lehet tüntetni. Megjelenik a képernyő tetején, középen a „Turn: X” felirat, amely számolja, hogy épp melyik körben tart a játék, ez segít a történések azonosításában. A 0. kör a kezdőjátékos kisorsolása, ezután kezdődik az első kör, és ez folyamatosan növekszik, amennyiben minden játékos befejezi cselekvéseit egy teljes kör során. A dupla dobás nem számít plusz körnek. A kisorsolás után a játékosok dobással kezdik meg a saját körüket, a dobás értéke határozza meg a lépésszámot (például 9-es dobás esetén a bábu 9 mezőt lép előre), a bábuk az óramutató járásával megfelelően haladnak előre a táblán. A kamera ráközelít a mozgó bábura, követve annak mozgását.
12. ábra: A hajó játékos éppen mozgásban van és duplát dobott.
Ha mindkét kockán ugyanaz a szám szerepel, vagyis a játékos duplát dob, akkor az adott körben dobhat újra, ezzel is +1 kört nyerve (12. ábra), viszont ha egymás után három alkalommal ugyanez megtörténik, akkor a játékos figurája azonnal a börtönbe kerül (bal alsó mező, 13. ábrán látható) és be kell fejeznie a körét. A megérkezett mezőtől függően a következőek történhetnek.
11
2.4.1.1.1 Üres telek A 40 mezőből álló táblát leginkább a telekmezők foglalják el, ezek színes sávval, vonat, villanykörte, vagy vízcsap ikonnal illetve névvel vannak ellátva. Egy teleknek nincs tulajdonosa, ha alatta nincs egy játékos színével ellátott csík.
13 ábra: A Vermont Avenue birtok a piros játékos tulajdonában áll, így az foglalt, míg a mellette levő Connecticut Avenue üres telek, mivel nincs alatta egyáltalán csík
Amennyiben egy ilyen telekre lépett egy játékos, felbukkan a hozzá tartozó információs lista (telek ára, bérleti díj, zálogba adás értéke stb.), lehetősége van azt megvásárolni („Buy Property”) vagy árverésre bocsájtani („Auction”) (14. ábra). Vásárlás esetén a telek az aktuális játékos tulajdonába kerül, megjelenik a táblán a telek alatt egy csík a játékos színével ellátva, illetve a vásárolt telek ára levonódik vagyonából.
14- ábra: Üres telek esetén megjelenő menü
15. ábra: Aukció négy játékos esetén
12
Aukció esetén a még játékban levő személyek licitálhatnak a telek tulajdoni jogáért. Az aukció során minden játékos licitálhat a telekért, ha van elegendő pénze, ha nincs. Licitáláshoz meg kell nyomni az adott játékoshoz tartozó gombot a billentyűzeten (ezek a Q, X, M és P gombok a játékosok számától függően), az aukció 0 dollárról indul, és 5 másodperc van minden licit után, hogy a legnagyobb árat ajánló játékost egy másik felülmúlja. Minden licit 10 dollárral növeli meg a telek végső árát. Az aukciót éppen megnyerő játékos a saját ajánlatát nem múlhatja felül. Amennyiben a legutolsó ajánlat után 5 másodpercen belül nem érkezik újabb licit a legnagyobbat ajánló megkapja a telek tulajdoni jogát, ugyanúgy, mint a vásárlásnál megjelenik alatta egy csík a játékos színével ellátva, és a telek eredeti ára helyett a liciten felajánlott ár vonódik le a vagyonából. Amennyiben nem érkezik egyetlen licit sem, akkor a telket az aukciót kezdeményező játékos kapja meg méghozzá ingyen. A 15. ábrán látható, hogy a Baltic Avenue nevezetű birtok került aukcióra, amely alapból 60 dollárba kerül. Látható, hogy Player3 ajánlotta a legnagyobb összeget, méghozzá 100 dollárt, a következő ajánlat 110 dollár lesz, ha 5 másodpercen belül egy másik játékos megnyomja a hozzá tartozó betűt a billentyűzeten. 2.4.1.1.2 Foglalt telek Ha a játékos figurája olyan telekmezőre lép, amely már tulajdonban van, fizetnie kell bérleti díjat, amennyiben az nem saját telek és nincsen zálogba adva. Ha a telek csoportban van (teleksor mindegyike a játékos tulajdonában áll) és nincs rajta ház, akkor a bérleti díj dupláját kell fizetni. Ha van rajta ház vagy hotel, akkor a házak számától vagy a hoteltől függően kell bérleti díjat fizetni. (Minél több ház van rajta, annál nagyobb összeget kell fizetni, a hotel bérleti díja a legmagasabb). A 16. ábrán látható, hogy Player1-nek 200 dollárt kell fizetnie, mivel a Player2 tulajdonában álló St. James Place mezőn állt meg a bábuja.
13
16. ábra: Bérleti díj fizetése menü
Szintén fizetni kell, ha más vasúttársaságára vagy közművére lépett a játékos. Ha vasúttársaságra (vonat ikon) lépett, akkor annak bérleti díja a tulajdonban levő vasúttársaságoktól függ. Amennyiben közműre (villanykörte vagy vízcsap ikon) lépett, akkor a bérlet díja a tulajdonban levő közművektől függ, emellett ezt az összeget még be kell szorozni az adott körben dobott számmal. 2.4.1.1.3 Irány a börtön Ha az épp soron levő játékos a jobb felső sarokban található mezőn fejezi be a lépését akkor azonnal a börtönbe kell mennie (bal alsó sarok), nem kapja meg a „GO” mező átlépésért járó díjat (alapértelmezetten 200 dollár), illetve be kell fejeznie körét.
17. ábra: A tábla jobb felső sarkában található „Irány a börtön” mező (bal oldali kép), az ágyú játékosa börtönben van, ha a tábla bal alsó sarkában található narancssárga mezőben foglal helyet (jobb oldali kép)
Ha a következő körben a börtönben kezdi meg a körét, akkor 18. ábrán látható menü jelenik meg a felhasználó előtt. Csak úgy juthat ki a börtönből, ha a szerencsére bízza magát és megpróbál duplát dobni, vagy kifizeti a bírságot (alapértelmezetten 50 dollár), vagy ha használja a tulajdonában lévő kiszabadító kártyát („Get out from jail
14
free”
kártya), amelyet meglepetés- és szerencse kártyából szerezhet. Utóbbi
menüelem csak akkor jelenik meg, ha a játékosnak van kiszabadító kártyája, ahogy az a 19. ábrán látható a piros játékos esetében.
18. ábra: Börtönben levő játékos körének kezdetén megjelenő menü (a 3. gomb csak abban az esetben jelenik meg, ha a játékosnak van kiszabadító kártyája)
Utóbbi két esetben a játékos dobhat is és folytathatja tovább a játékot a börtönből szabadulva. Ha a dupla dobással próbálkozik sikeresen, akkor egyúttal léphet is. Sikertelen dobás esetén be kell fejeznie a körét. Ha három körön keresztül egyszer sem sikerült duplát dobnia elhagyhatja a börtön, de ki kell fizetnie a bírságot, ekkor a legutóbb dobott értékkel léphet előre. A bebörtönzött játékos továbbra is megkapja a telkei után a bérleti díjat, részt vehet az aukcióban, illetve köre végén üzletelhet, kezelheti tulajdonban lévő telkeit. Börtönbe kerülhet a játékos még meglepetés vagy szerencse kártya által, illetve ha egymás után három alkalommal duplát dob.
19. ábra: Player1-nek két kiszabadító kártyája van.
15
2.4.1.1.4 Meglepetés és szerencse kártya
20. ábra: Szerencse- és meglepetéskártya
Amennyiben a játékos figurája egy kérdőjel (Chance) vagy kék láda (Community Chest) mezőre lép (20. ábra), akkor húznia kell az adott mezőhöz tartozó szerencse (Chance
card) vagy meglepetés kártyát (Community
Chest
card) és
kötelezően követnie kell annak utasításait. Ezek egyaránt lehetnek jók és rosszak is. A kártyák utasításai szerint lehet például: a Banknak kell fizetni, a Bank fizet a játékosnak, lépjen adott mezőre, lépjen vissza pár mezőt, menjen a börtönbe, szabaduló kártyát kap a játékos. 16-16 darab kártya van mindkét féléből, ha valamelyik elfogy, akkor a pakli újra feltöltődik. 2.4.1.1.5 Adó Ebből két mező van a táblán (21. ábra), amennyiben a játékos rálép, akkor az adó mértéke alapján kell a banknak fizetni (alapértelmezetten 100 vagy 200 dollár).
21. ábra: A két adómező (kék keret).
16
2.4.1.1.6 Egyéb mezők GO mező: Jobb alsó sarokban helyezkedik el. Minden játékos idehelyezi a bábuját, itt kezdik a játékot. Ha sikerül a táblán egy teljes kört megtenni, vagyis áthaladni vagy rálépni a GO mezőre, akkor a játékos a banktól jutalomösszeget kap, ami alapértelmezetten 200 dollár. Nem kapja meg, amennyiben a játékos börtönbe jut, hiába haladna át a GO mezőn. Free Parking mező: Bal felső sarokban található mező, nem történik semmi. Börtön mező: Bal alsó sarokban található mező, nem történik semmi. Áthaladásnál, illetve ha a játékos ott fejezi be a lépését, akkor mindenféleképpen a narancssárga mezőn kívülre kerül. A lépés és a mező utasításai után be kell a kört fejezni, ha nem sikerült duplát dobni.
22. ábra: Kör végén megjelenő menü, ha a játékos duplát dobott az End Turn helyett a Roll Again felirat jelenik meg
Előtte mindenféleképp lehetőség van kezelni a tulajdonban levő birtokokat: zálogba adni, zálogból kivenni, házakat/hoteleket építeni/eladni („Build & Mortgage”), játékostársakkal üzletelni („Trade”), vagy dönthetünk a játék feladása mellett („Declare Bankruptcy”) (22. ábra). A kör befejezése után az óramutató járása szerint a következő játékos megkezdheti körét, dobhat, léphet és így tovább folytatódik a játék. 2.4.1.1.7 Build & Mortgage A kör befejezése előtt a játékos kezelheti a birtokait, ehhez a Build & Mortgage-ra kell kattintania. Megjelenik a saját tulajdonában levő birtokainak a listája. Kiválaszthatja, hogy melyiken szeretne változtatni. A 23. ábrán 3 telek lett felsorolva,
17
látható a táblán, hogy ezeknek a telkeknek a sárga játékos a tulajdonosa, a táblán található sárga csíkok alapján.
23. ábra: A játékos tulajdonában álló telkek listája
A kiválasztás után az adott telekről szóló információk jelennek meg. Minden esetben lehetőség van zálogba adni azt, így a banktól a játékos megkapja a telek árának felét, a birtokon átlósan egy piros csík jelzi a zálogba adást. Viszont ezután nem kaphat bérleti díjat, ha egy másik játékos rálép, míg a zálogot fel nem oldja. Ha fel akarja oldani a zálogot, akkor fizetnie kell a banknak méghozzá a zálog összegét +10%-ot. Lehetőség van házakat/hoteleket építeni olyan telkekre, amelyek nem vasúttársaság vagy közmű, illetve csoportban vannak, vagyis az adott színhez tartozó összes telek a játékos tulajdonában van, és egyiken sincs zálog. Két birtoksor kivételével mindegyikhez három telek tartozik. A két kivételhez csak két telek tartozik (Barna és sötétkék teleksor).
18
24. ábra: Birtok kezelési menüje
Választhatunk, hogy csak az adott telekre akarunk építkezni, vagy mindegyik telekre egyet-egyet, ekkor a tábla adott birtokán zöld házak jelennek meg, növelve annak bérleti díját, a vagyonból a házak ára levonódik. Egy telekre maximum négy ház építhető, utána már csak hotel (piros ház), ennek van a legmagasabb bérleti díja. Feltételhez van kötve, hogy az adott csoport telkein nem lehet egynél több vagy kevesebb ház egymáshoz képest, például ha az egyik telken két ház van, a másikon három, akkor a harmadikon is két vagy három ház van, vagy ha két telken négy ház van és a harmadikon három, akkor a négy házból nem lehet hotel, amíg a harmadik telken sincs négy ház. Házakat/hoteleket el is lehet adni, így a játékos pénzhez juthat (az építkezés árának a felét visszakapja), viszont a bérleti díj csökken, a tábláról lekerülnek a házak/hotelek. Itt is él az előző szabály. Tehát ha minden telken van például 4-4 ház, addig nem lehetséges eladni az egyik telekről az összes házat, míg a játékos a többiről el nem adja sorban egyaránt. A 24. ábrán látható, hogy a Baltic Avenue birtokot kezeli a játékos, amelyen már van két ház. A táblán látható, hogy a másik birtokon három ház épült, így a játékos nem tud eladni a Baltic Avenue-ról több házat, 19
amíg a másikról el nem adja. Megjelenik a „Sell a house” opció, de nincs lehetőség rákattintani. Ugyanígy nem fog tudni a másik telken építkezni, míg az előbb említett telken nem épít fel egy házat. 2.4.1.1.8 Trade Üzletelésnél egymás birtokait, kiszabadító kártyáikat cserélhetik a játékosok, adhatnak egymásnak pénzt. A „Trade” gombra kattintva megjelennek a még játékban levő ellenfeleink nevei. A 25. ábrán látható, hogy az aktuális játékos tud Player1-gyel, Player2-vel, illetve Player3-mal is üzletelni.
25. ábra: A választható üzleti partnerek
Amennyiben a játékos üzletelni szeretne valamelyikükkel, akkor a kiválasztáshoz kattintson a partner nevére. Egyszerre egyikükkel lehet üzletelni. Ebben az esetben megjelenik egy ablak kettéosztva. Bal oldalon az üzletelést kezdeményező játékos felajánlható pénze, felajánlható kiszabadító kártyáinak száma, illetve felajánlható birtokaink listája látható. Ugyanígy jobb oldalon üzlettársa felajánlható értékeit láthatjuk.
20
26. ábra: Trade menü
Az üzletet kezdeményező játékos határozza meg az ajánlatát partnerének, méghozzá, bal oldalon növelheti az általa felajánlott összeget, kiszabadító kártyákat (ezeket a nyilak segítségével), illetve a telkeket (kattintson felajánlandó birtokokra, ezek a saját ablakában átkerülnek a másik oldalra, amiket vissza is vonhat, ha ugyanúgy rákattint). Jobb oldalon partnere által felajánlott összegét, kiszabadító kártyáit növelheti, illetve a telkeit ajánlhatja fel. A felajánlható összeg minimum nulla, maximum a meglévő vagyon (kiszabadító kártyánál a kártyák száma). Egyszerre csak egyikük adhat át másiknak pénzösszeget, ha valamelyiknél megváltoztatjuk ezt, akkor a másiknál a szám nullára változik. Ugyanez a két szabály érvényes kiszabadító kártyára. Az ábrán látható, hogy a játékos nem ajánl fel pénzösszeget, sem pedig kiszabadító kártyát, viszont a 6 telkéből 2-t felajánl (Pennsylvania Railroad, Kentucky Avenue). Míg a partnerétől kérni fog 110 dollárt, illetve a Baltic Avenue birtokot.
21
27. ábra: Üzletelést véglegesítő menü
Amennyiben készen van, az „Offer” gombra kattintva az ajánlatot elküldi partnerének, aki a döntés előtt ellenőrizheti a felajánlott javakat, és a kért igényeket (továbbra is bal oldalon található a kezdeményező ajánlata, és jobb oldalon a partnertől kért tulajdonok listája). A partner a „Yes” gombra kattintva elfogadja az üzleti ajánlatot, az ajánlott pénzösszeget egyik a másiktól megkapja, ugyanígy a kiszabadító kártyákat is, és az ajánlatban szereplő telkek gazdát cserélnek. A „No” gombra kattintva a partner elutasítja az ajánlatot, a kezdeményező, ha szeretne, akkor felajánlhat újabb üzletelést, ugyanis ez nincs korlátozva. 2.4.1.1.9 Csőd, játék vége A játéknak akkor van vége, ha egy játékos kivételével a többi játékos a játék folyamán csődbe jut és kiesik a játékból. Egy játékos adósságba kerül, ha nem tud fizetni a bérleti díjat ellenfelének, vagy a banknak telek vásárlás, aukció, adó, bírság vagy egyéb tartozás miatt. Ilyenkor kénytelen eladni házait/hoteleit, telkeit zálogba adni, vagy üzletelés során pénzhez jutni, különben nem fejezheti be a körét. Ha sikerül összeszednie a tartozás törlesztéséhez szükséges összeget, akkor a „Pay Off Debt” gombra kattintva törleszthet, vagyonából levonódik ez a pénzösszeg. Az ábrán látható, hogy Player1-nek 1440 dollárja van, viszont 1510 dollárt tartozik, így legalább 70 dollárt össze kell szednie, ha nem akar kiesni a játékból.
22
27. ábra: Player1 vagyona, illetve a kör végén megjelenő menühöz hasonló adósság törlesztő menü
Amennyiben nincs már mit eladnia, zálogba adnia, vagy kereskedés során nem tud pénzhez jutni, akkor a játékot – csődöt mondva - fel kell adnia a „Declare Bankruptcy” gombra kattintva, így a játékból kiesik. Ha a bank felé volt tartozása, akkor a megmaradt pénzét, kiszabadító kártyáit a bank megkapja, a telkeinek nem lesz tulajdonosa, így a házak/hotelek/zálog is eltűnik róla, a többi játékban maradt játékos ezeket a telkeket később megszerezheti. Ha egy másik játékos felé volt tartozása, amit nem tudott számára törleszteni, akkor a kedvezményezett kapja meg a kieső játékos megmaradt pénzét, kiszabadító kártyáit, illetve a telkeit is, amennyiben volt rajta zálog az megmarad továbbra is, ha volt rajta épület, akkor azok eltűnnek és minden ház/hotel árának a felét megkapja. Ha egy játékos kiesett, és még legalább ketten játékban maradtak, akkor a következő játékossal folytatódik a játék. Ha egy kivételével minden játékos kiesett, akkor megvan a győztes, megjelenik a játék vége menü (Game over menü) ezután a Hot seat mód főmenüje kerül újra elő.
23
28. ábra: Játék vége menü
2.4.1.2 Load Game Korábban félbehagyott, vagy akár befejezett játékunkat újra elővehetjük, és lehetőségünk van meghatározni, honnan szeretnék folytatni. Csak azok a játékok kerülnek mentésre, melyek alatt a XAMPP program két szervize (Apache, MySQL) működött, és legalább a kezdő játékos befejezte a saját körét. Egy adott játék betöltésénél lehetőség van eldönteni, hogy a játékosok melyik körtől szeretnék folytatni a játékot. Először is ki kell választania felhasználónak, hogy melyik korábbi játékot szeretné folytatni, vagy újrajátszani, ebben segítségre van a játék kezdésének időpontja másodpercre pontosan, illetve az akkor résztvevő játékosok nevei.
29. ábra: Betölthető játékok listája
A kiválasztás után a program előveszi az adott játékhoz tartozó Game History-t segítve a tájékozódásban, és minden befejezett kör végén egy gomb helyezkedik el („Restore from this point”), a gombra rákattintva a játék folytatódni fog az 24
adott ponttól, a következő játékos megkezdheti a körét, a táblán a Game History szerint megjelennek a figurák, a játékosok tulajdonukba kapják birtokaikat, házaik/hoteleik/zálogaik megjelennek.
30. ábra: Egy betölthető játék állás történései
Csak a legutolsó befejezett körig lehet egy korábbi játékot betölteni (befejezett körnek számít az, mikor átadtuk egy másik játékosnak az irányítást, vagy az egyik játékos kiesett). Egy teljesen új, különálló mentés készül a betöltött játékról, így a későbbiek során azt is újra elővehetjük. Lehetőség van törölni az elmentett játékot, amennyiben a felhasználó a „Delete” gombra kattint.
2.4.1.3 Settings Új játék kezdése előtt lehetőségünk van változtatni bizonyos értékeken. Ezek lehetnek a telkek adatai, illetve egyéb adatok. Csak a számokat lehet változtatni, a neveket a jobb megjegyezhetőség miatt nem engedélyezzük.
25
31. ábra: Beállítások menü
A „Property settings” felsorolja az összes telket, ahogy a táblán felsorakoznak a „GO” mezőtől kezdve az óramutató járásával megegyező irányban a hozzá tartozó színnel ellátva a könnyebb felismerhetőség érdekében (a vasúttársaságok fekete háttéren, a közművek fehér háttéren jelennek meg), kiválasztva az adott telket megváltoztathatjuk annak értékeit. Ha vasúttársaság, akkor meghatározhatjuk az adott telek árát, illetve a bérleti díjat 1, 2, 3 és 4 vasúttársaságért, ami egyaránt vonatkozik mindegyik telekre. Ha közmű, akkor szintén meghatározhatjuk az adott telek árát, illetve a bérleti díjat 1, és 2 közműért, ami egyaránt vonatkozik mindegyik telekre. Ha ingatlan, akkor változtathatjuk a telek árát, bérleti díjat (ha csoportban van akkor a bérleti díj duplázódik), bérleti díjat 1, 2, 3, 4 házért, valamint hotelért, illetve a házak árát (hotelért mindig ugyanannyit kell fizetni mint a házért). A zálog értéke minden esetben a telek árának a fele.
32. ábra: Telek kiválasztó menü
33. ábra: Telek értékének beállításai menü
26
A „Miscellaneous settings” egyéb adatokat sorol fel, amelyeket szintén meg lehet változtatni: Kezdőtőke, a táblán szereplő két adó, a „GO” mező átlépésért járó díj, börtönbírság. Ezeket az értékeket az ár két szélén található nyilakkal lehet megváltoztatni,
a
legszélső
nyilakkal
(<>>)
nagy
mértékben
tudjuk
csökkenteni/növelni az adatokat, elég lenyomva tartani a gombot. A belső nyilakkal (>) kis mértékben lehet változtatni, minden kattintás egy dollárral csökkenti/növeli az adatokat. Nullánál lejjebb nem lehet csökkenteni. A különböző bérleti díjak nem szárnyalhatják túl a tőle nagyobbat, például a két házért járó bérleti díj nem lehet nagyobb a három házért járó bérleti díjnál, ebben az esetben az ahhoz az értékhez tartozó nyilak eltűnnek. A „Back”-re kattintva ezek a változások el lesznek fogadva, új játék kezdésénél életbe lépnek, a program befejezésekor az alapértelmezett értékek visszaállítódnak.
2.4.2 Network Game A hálózati játék nem különbözik a szabályokban, sokkal inkább a játék elkezdésében, betöltésében, illetve a játék menetében csak az aktuális játékosnak van beleszólása a játékba (kivéve üzletelés, lásd később), a többi játékos addig csak megfigyelőként van jelen. Szükségünk lesz stabil internetkapcsolatra, a játékban résztvevő játékosoknak ugyanarra a hálózatra kell csatlakozniuk. Ha mégis többen szeretnének egy gépen játszani, akkor több példányban kell a programot elindítani, vagyis futassuk a Monopoly.exe-t újra.
34. ábra: Network mód főmenüje
A főmenüben a „Host game” és a „Join game” gomb szerepel a kilépés mellett. A „Host game”-re kattintva a felhasználó elvállalja, hogy ő lesz a szervergép, így ő
27
neki a játék befejezéséig jelen kell lennie, vagy legalábbis nem szakíthatja meg a kapcsolatot, mert különben a játéknak abban a pillanatban vége szakad, ha nem készült mentés, folytatásra sincs esély. A host játékosnak meg kell adnia egy nevet, amivel azonosítani tudja magát (maximum 10 karakter), erre szükség lehet egy játék betöltésénél, illetve egy szervernevet, ami segít a becsatlakozó játékosoknak az azonosításban, ez a kettő lehet egy karakter is, illetve egy portszámot, aminek szabadnak kell lennie és csak szám lehet. Ezek helyes kitöltése után létre lehet hozni a szervert a „Create Server” gombra kattintva.
35. ábra: Szerver létrehozása menü
A szerver játékosnak várakoznia kell, míg legalább egy, maximum három további játékos csatlakozik (egy szerveren maximum négyen lehetnek egyszerre), ezután lehetőség van a Hot seat game módhoz hasonlóan új játékot kezdeni, egy korábbit betölteni, az alapértékeket változtatni, vagy lecsatlakozni, így a létrehozott szerver megszűnik, a csatlakozott játékosok is szétkapcsolódnak, mindenki visszatér a hálózati játék főmenüjébe.
28
36. ábra: Szerverhez csatlakozás menü
A „Join game” gombra kattintva kilistázódik az elérhető szerverek listája névvel illetve játékosok számával. Ez a lista folyamatosan frissül, így egy új szerver létrejöttekor a lista bővül, de megszűnés esetén, vagy ha megtelik a szerver, vagy a játék már elkezdődött, akkor a listáról lekerül. Csatlakozni csak a nevünk megadása után lehetséges, ez lehet egy karakter is, de a könnyebb azonosítás érdekében érdemes felismerhető nevet megadni. A felhasználó kattintson a „Connect”-re, ha az adott sorban levő szerverre szeretnénk csatlakozni, így a játékos egy kliens lesz. A kliens játékosok nem tehetnek semmit egy játék megkezdéséig vagy betöltéséig, maximum lecsatlakozhatnak a szerverről, hiszen a „Disconnect” itt ugyanúgy megjelenik. Új játékos csatlakozása esetén alul egy üzenet jelenik meg mindenki képernyőjén („XYZ connected to the game!”), lecsatlakozás esetén csak a szerveren maradt játékosok kapják meg az üzenetet („XYZ disconnected from the game!”).
2.4.2.1 New Game A host játékos, ha új játékot kezd a játékosok száma a csatlakozott kliensektől fog függeni. Ugyanúgy megjelenik a 8. ábrán látható menü, azonban mindenki csak a saját adatait változtathatja meg. A 37. ábrán is látható (felső kép szerverjátékos, alsó kép kliens játékos), hogy a felső játékos tudja a felső sorban levő figurákat változtatni, de a másikat nem, hiszen azt nem ő irányítja. Valamint nem tudja elindítani a játékot, amíg a kliens játékos nem nyomja meg a „Ready” gombot.
29
37. ábra: Avatarnevek megadása, illetve figurák kiválasztása hálózati játék esetén
Ha a választás megtörtént, akkor a klienseknek a „Ready” gombra kattintva jelezniük kell, hogy készen állnak, amelyet megfontolhatnak az „Not Ready”-re kattintva. Ha az összes kliens készen áll, akkor a szervernél megjelenik a „Play Game” gomb, amely megnyomásával elkezdődik a játék. Ugyanúgy a kezdő játékos kisorsolásával kezdődik a játék, viszont míg Hot seat game módban bárki megnyomhatta a „Roll” gombot, itt mindig csak az aktuális játékosnak van erre lehetősége, a többi játékos addig figyelemmel kíséri az eseményeket, és vár a sorára.
38. ábra: A bal oldali az aktuális játékos képernyője, a jobb oldali egy másik játékos képernyője
30
Ez értelemszerűen nem csak a dobásra vonatkozik, hanem a vásárlásra, az üzenetek elfogadására, stb. Két alkalommal lehet átvenni az irányítást egy másik játékos köre alatt: Aukció, üzletelés elfogadása során. Hálózati játék során az aukció ugyanúgy működik, mint Hot seat módban, viszont itt nem a Q,X,M és P gombot kell használni a licitáláshoz, hanem mindenki a SPACE billentyűt használja, ez azonban zavaró lehet, ha egy gépen több példány van megnyitva, ugyanis ilyenkor mindig csak az aktív játékablak licitál. Ha a licitálás során nem az aktuális játékos nyer, és az adott személy adósságba kerül, mert az ajánlat nagyobb, mint a jelenlegi vagyona, akkor ő átveszi az irányítást, míg nem törleszti az adósságát, tehát kezelheti telkeit, üzletelhet. Ha sikerült törlesztenie, akkor az aktuális játékos visszakapja az irányítást és folytathatja a körét. Üzletelés során az aktuális játékos ajánlatot tehet egy másik játékosnak, a többi játékos (beleértve a partner is) ezt figyelemmel kísérheti, bele nem avatkozhatnak. Ha az aktuális játékos elküldte az ajánlatot a partnerének, akkor ő (a partner) veszi át az irányítást, aki elfogadhatja vagy elutasíthatja azt, mindkét esetben az aktuális játékos visszakapja az irányítást. Ha az aktuális játékos lecsatlakozik a szerverről játék közben, akkor a játékos kiesik, és még legalább ketten játékban vannak, akkor a következő játékos megkezdheti a körét, ellenben a játéknak vége. Ha a lecsatlakozott játékos nem az aktuális játékos volt, akkor a játékos kiesik, és a játék gondtalanul folytatódik. Ha a lecsatlakozott játékos a host játékos volt, akkor a játéknak abban a pillanatban vége szakad és mindenki visszakerül a főmenübe.
2.4.2.2 Load Game Azokat a játékokat lehetséges csak betölteni, amelyek az adott gépen korábban elmentésre kerültek, még akkor is ha a játékos kliens játékos volt, így akár egy kliens később egy szerver szerepét betöltheti. Ha egy játék során a szerver játékos kiesik, akkor érdemes a játékot félbeszakítani, lekapcsolódni minden játékosnak a szerverről és az egyik kliensnek a szerver szerepét átvenni, így a szerver játékosnak nem kell megvárnia a játék végét, ha esetleg be szeretné zárni a programot. A betöltés ugyanúgy működik, mint a Hot seat game módnál. A szerver játékos kiválasztja a betöltendő játékot, szintén kezdési idő és a játékosok nevei alapján lehet azonosítani, ezután csak azt a játékállást lehet betölteni, amely megegyezik a szerveren levő játékosok számával és az adott játékállásban megmaradt játékosok számától, így ha a betöltendő játék első 31
felében 4 játékos volt, a másikban 3, és a szerveren 4 játékos van akkor csak az első feléből tudjuk visszatölteni játékot. Ezután ki kell osztani az irányításokat, vagyis melyik játékos melyik bábut fogja irányítani.
39. ábra: Irányítások kiosztása betöltött játék során (szerver játékos képe)
Az irányítás kiosztása a host játékos feladata. A bal oldali neveken kattintva a következő a szerveren levő játékos neve fog megjelenni. A bal oldalon szereplő játékos az adott sorban levő már betöltött játékost fogja irányítani. A kliensek látják a saját gépükön a változásokat. A kliensek a „Ready” gombra kattintva elfogadhatják a szerverjátékos által kiosztott irányításokat. Amennyiben az irányítások változnak, akkor a klienseknek újra a „Ready” menüelem jelenik meg. Ha minden kliens játékos megnyomta a „Ready” gombot, akkor a szerverjátékos gépén megjelenik a „Play Game” gomb, amely lenyomásával a játék a betöltött állás szerint folytatható.
2.4.2.3 Settings A szerver képes csak az alapértékeket megváltoztatni, a klienseknek továbbra is várakozniuk kell. Az adatok megváltoztatása nem különbözik a Hot seat mód Settings-étől, új játék kezdésekor minden játékos megkapja a megváltozott értékeket.
32
3 Fejlesztői dokumentáció A szakdolgozat célja egy háromdimenziós társasjáték készítése volt, melyen több felhasználó tud játszani egyszerre, akár egy, akár több gépen, melyet folyamatosan el lehet menteni, így bármikor lehet folytatni vagy újrajátszani egy korábban befejezetett. A program mechanikája C# nyelven lett megírva a Unity3D (3.5.6f4 verzió) játékfejlesztő környezetében. A játékban megjelenő modelleket illetve a hozzájuk tartozó animációkat az Autodesk
Maya
2011 modellező programmal lett
elkészítve. A tökéletes működés érdekében szükség lesz egy MySQL adatbázis szerverre, továbbá egy Apache webszerverre és ehhez egy PHP értelmezőre. Ezt a problémát oldja meg a XAMPP programcsomag. Az alkalmazás PHP fájlok segítségével kommunikál az adatbázissal, amely tartalmaz MySQL utasításokat. [3] [4] [5] [6] [7]
3.1 Felhasználói felület A program három Scene-ből áll, vagyis fejezetekből. A különböző Scene a játék különböző szintjeit tartalmazza, használható főmenükhöz, különböző játékmódokhoz. Az alkalmazás 3 Scene-ből áll fel, a program indításakor megjelenő főmenü mellett a program két nagy részre osztható fel, a Hot seat, azaz egygépes, vagy Network, azaz hálózati játékra. A Scene-k GameObject-ekből állnak fel, azaz 3D-s modellekből, amelyekhez lehetőség van csatolni komponenseket, például textúrákat, scripteket, fizikai komponenseket, animációkat és egyéb dolgokat, meg lehet adni a pozícióját, normálvektorait, amelyeket scriptekkel változtatni lehet. Minden Sceneben megtalálható a Main Camera (fő kamera), amely ugyanúgy GameObject, megléte elengedhetetlen, hiszen nélküle a játékból nem lehetne látni semmit. A játék áll egy Board GameObjectből, amelyhez tartozik egy script, a két játékmód két különböző scriptet használ. A játék generálása során a script létrehozza a szükséges Player, Property, illetve a többi, játékhoz szükséges GameObjecteket, amelyeket Prefab-okból állít elő. A Prefab olyan GameObject, amelyből a játék során többre is szükség lesz, többnyire saját scripttel rendelkeznek, amelyek a generáláskor különböző értékeket kapnak. Az ugyanabból a Prefab-ból létrehozott GameObjectek komponensei megegyeznek, hacsak a script nem változtatja meg.
33
A két játékmód között nincs különbség a játék menetében, utóbbi nagyobb és részletesebb a plusz funkciók miatt. Emiatt a hálózati játékot fogom részletezni, és minden fejezetnél külön ki fogok térni az eltérésekre:
34
40. ábra: A hálózati játékmód navigációs diagramja
35
41. ábra: A Hot seat játékmód navigációs diagramja
36
A játék úgynevezett Mode-okkal (enumerációs típus) lett elkülönítve, amelyek a játék különböző helyzeteire utalnak (Főmenü, kockadobás, aukció, stb), ezeken navigálva juthatunk el egyikből a másikba. A főmenüben lehetőség van választani, hogy a felhasználó betölti-e a szerver szerepét (Host game), vagy csatlakozik egy szerverhez (Join game), illetve lehet dönteni a program bezárása mellett is. Host játékosként létre kell hozni egy szervert, annak nevet és portszámot adva, míg join játékosként ki kell választani a szervert, amelyhez a felhasználó csatlakozni szeretne, lehetőségünk van természetesen visszalépni a főmenübe. Ezt a részt a Hot seat game nem tartalmazza, hanem egyből az a menü jelenik meg mint, ami a szervert létrehozó játékosnak, mégpedig a játék másik főmenüje, ahol új játékot lehet kezdeni, egy régebbit betölteni, vagy változtatni a játék menetén az alapértékek változtatásával. A kliens játékosok itt most várakoznak, lehetőségük van a szerverjátékossal egyaránt lekapcsolódniuk. Új játék esetén a felhasználók nevei és figuráik kiválasztása után megkezdhetik a játékot (Hot seat módban ezelőtt még ki kell választani a játékosok számát, ugyanis hálózati játék esetén ez a szerveren lévő felhasználók számától függ). Régebbi játék betöltésénél ki kell választani a betöltendő játékot, majd kiválasztani, hogy hol szeretnék folytatni azt. Ezután már csak ki kell osztani a hálózati játékosok között az irányítást (Nincs jelen az egygépes játéknál, hiszen nincs lehetőségünk külön irányítani). Új játéknál elsősorban ki kell választani a kezdő játékost, ekkor a dobás, és a kockákra várakozás közötti Mode fog váltakozni, míg meg nem lesz a legnagyobbat dobó. Betöltésnél ez nem lehetséges, hiszen a legkorábbi elmentett állás az az első befejezett kör utáni állás. A kezdőjátékos kisorsolása után a felhasználó dobni fog a kockákkal, majd azokra várakozni, a bábu eszerint lépni fog, így annak az animációjára is kénytelenek a játékosok várakozni. Ezután a lépett mező szerint lehetséges:
Bérleti díjat kell fizetni.
Adót fizetni.
Meglepetés vagy szerencsekártya alapján fizet, banktól pénzt kap a felhasználó, vagy léphet bizonyos mezőre.
Üres birtok esetén: o Meg lehet azt vásárolni o Aukcióra bocsájtani, ez esetben megkezdődik az aukció.
A játékos börtönbe kerülhet
Nem történik semmi.
37
A felsoroltak után az aktuális játékos befejezheti a kört, átadva az irányítást. Ha adósságba került, akkor a kör befejezése előtt össze kell szednie a szükséges összeget üzletelésből, birtokok kezeléséből, ezután fejezhetjük be a körünket, vagy ha ez nem sikerül csődöt mondva kiesünk a játékból. Ha a következő játékos börtönben van, akkor mindenféle esetben dobni fog a következő lépésben, lépni csak akkor fog tudni, ha fizetett bírságot, duplát dobott, kiszabadító kártyát használt vagy a harmadik körét töltötte el a börtönben. Ha a börtönben marad egyből a kör befejezése menü kerül számára elő. Amennyiben az utolsó előtti játékos is csődöt mond, vagyis egy játékos maradt, akkor a játéknak vége, és az alkalmazás az elejéről indul.
3.2 Fontosabb függvények A hálózati mód fő scriptje a NetworkBoardScript.cs script. A legfontosabb az OnGUI() függvény, amely a menüelemek elhelyezésére szolgál, illetve tartalmaz egy nagy switch-case elágazást. Ez az elágazás az éppen aktuális Mode alapján kerül elő az ahhoz tartozó menü és a cselekvéseink a menüelemek által biztosított lehetőségekre korlátozódik (pl kockadobásnál csak egy gombot van lehetőségünk megnyomni, ami után a program elindítja a két kockát). Ezek az események minden játékos gépén életbe fognak lépni az RPC függvényhívások segítségével, ugyanúgy mint mikor a szerver új játékot kezd, vagy betölt egy régebbit. Ezeket a kliensek is használhatják. A függvényt meghívódhat mindenkinél, csak szervernél, a küldő kivételével mindenkinél, vagy csak bizonyos játékosoknál. Van egy Update() függvény, amely minden frame során meghívódik (Frame = a játék egy adott pillanata). Ez hasznos, ha olyan esemény történik, amely időhöz vagy, várakozáshoz van kötve, pl kockadobásnál meg kell várni míg mindkét kocka megáll. A legtöbb függvény
a
Network
előtaggal
kezdődik,
ezt
az
RPC
függvényhívások
megkülönböztetése miatt lett így elnevezve, Hot seat módban legtöbb függvény ugyanúgy megjelenik a Network előtag nélkül. Amikor az alkalmazás kommunikál az adatbázissal egy WWW
formot küld el. Ezt csak az IEnumerator vezérlési
szerkezettel lehet megtenni. A szálakhoz lehet leginkább hasonlítani, ezek a függvények egy időben futnak le, tehát nem kell megvárnia a programnak, amíg a függvény befejezi az adatbázis műveleteket.
3.2.1 NetworkBoardScript fontosabb függvényei Függvény
Megjegyzés 38
Beépített függvény, eseménykezelő, amennyiben egy új játékos kapcsolódik a OnPlayerConnected() szerverhez, akkor a szükséges adatok el void lesznek neki küldve, pl a játékos sorszáma. Nincs a Hot seat módban Beépített függvény, eseménykezelő, amennyiben egy szerveren levő játékos lekapcsolódik, akkor a függvény ezt lekezeli. Ha még nem kezdődött el a játék, akkor a játékos új sorszámot kap, ha elkezdődött, OnPlayerDisconnected(NetworkPlayer akkor attól függően, ha ő az aktuális játékos, disconnectedPlayer) akkor kiesik a játékból és a következő void játékossal folytatódik a játék. Ha nem, akkor egyszerűen kiesik a játékból, míg az zavartalanul folytatódik tovább. Vége a játéknak, ha egy játékos marad. Nincs a Hot seat módban Beépített függvény, eseménykezelő, ha a szerver lecsatlakozik a játékról, akkor a kliens OnDisconnectedFromServer() játékosok visszakerülnek a főmenübe, a void szerverről természetesen ők is lekapcsolódnak. Nincs a Hot seat módban A játék kezdésénél a program a szükséges Generate(int playersCounter) GameObject-eket létrehozza: bábuk, void kártyák, telkek NetworkRefreshDices(Vector3 d1pos, Quaternion d1rot, A dobókockák helyzetét (pozícióját, Vector3 d2pos, forgástengelyét) frissíti a többi gépen a Quaternion d2rot) dobóéhoz képest. Nincs a Hot seat módban void A játékos kiesik a játékból, bábuja lekerül a tábláról, a hozzátartozó GameObject PlayerLose() teljesen megsemmisül, játékosok száma csökken Megvizsgálja, hogy a hálózati játékos sorszáma és a jelenlegi játékos száma AreYouTheCurrentPlayer() megegyezik, így a hálózati játékban csak egy bool valaki tudja a játékot egyszerre irányítani, a menüelemek csak számára jelennek meg. Nincs benne a Hot seat módban Elmenti a kör végén a legalapvetőbb adatokat SaveDatas() az adatbázisba PHP fájlon keresztül void kommunikálva, IEnumerator függvény tartozik hozzá Elmenti a kör végén a birtokok adatait az LogProperties() adatbázisba PHP fájlon keresztül void kommunikálva, IEnumerator függvény tartozik hozzá LogNewGame() Feljegyezi az adatbázisba az új játékot PHP void fájlon keresztül kommunikálva, melyet később 39
UpdateSavedGame() void LogPaying(string playername, int amount, string payedPerson, int currentPlayerMoney, int turn) void WritePayingIntoHistory(int relogGameHistory, int gameHistoryID) void
LogTheHistory() void
Saving() void
GetSavedGames() void
CopyNewGame() void NetworkCreateTables() void LoadPreviousGame(int id) void NetworkFinishLoad(int id, string oldFileID, string newFileID) void Start() void
lehetőség van visszatölteni. IEnumerator függvény tartozik hozzá Frissíti az elmentett játék mentési azonosítóját az adatbázisban PHP fájlon keresztül kommunikálva. IEnumerator függvény tartozik hozzá Naplózza a fizetési eseményt az adatbázisba PHP fájlon keresztül kommunikálva. IEnumerator függvény tartozik hozzá. Az adatbázisból lekéri az adatokat, a Game Historyba beírja a történéseket. IEnumerator függvény tartozik hozzá. Ugyanígy a maradék ötféle akció naplózásának is megvan a saját Log+akció, Write+akció+IntoHistory függvény a szükséges adatokkal Az adatbázisból lekéri az adatokat a betöltésnél, segítve a betöltendő játékállás kiválasztását, ehhez meghívja az előzőleg feltüntetett Write+akció+IntoHistory() függvényeket. IEnumerator függvény tartozik hozzá. Meghívja az összes Save függvényt, elmentve az adott játékállást az adatbázisba. Külön menti a játékosok, telkek, kártyák, illetve az alap és a kör megkezdéséhez szükséges adatokat. Megkapja az elmentett játékok listáját az adatbázisból, amelyekből a felhasználó választhat. IEnumerator függvény tartozik hozzá Ha a felhasználó betölt egy játékot, akkor az adatbázisban lemásolódnak az adott játékhoz tartozó táblák, így alkotva egy teljesen különálló mentést. A naplózások is másolódnak. IEnumerator függvény tartozik hozzá Elkészíti új játéknál a szükséges táblákat, a Date függvény alapján Meghívja az összes Load függvényt, a kiválasztott játékállás alapján Betöltés végső fázisa, ami a játék folytatásához szükséges, az még itt elrendeződik, új saveFileID-t kap a program Date függvény által Beépített függvény, a Scene indulásánál, azaz csakis legelső frame-ben hívódik meg. 40
Update() void DefaultConfig() void SaveConfig() void LoadConfig() void CreateDatabase() void
Beépített függvény, minden frame-ben meghívódik, kezeli a visszaszámlálásokat, időpillanathoz/időhöz köthető eseményeket A konfigurációs fájl értékei az alapértelmezettre változnak A konfigurációs fájl értékei elmentődnek, ha azok változnak A konfigurációs fájl értékei betöltődnek a játékba a játék elején illetve új játék kezdésénél Scene indulásánál elkészül az adatbázisa, illetve az alapvető SavedGames tábla, amennyiben azok nem léteznek. IEnumerator függvény tartozik hozzá
3.2.2 PlayerScript Az adott játékos figuráját kezeli az alábbi script. Függvény GoToJail() void OnGUI() void SetCurrentPlace(int currentPlace) void LogPlayers(int saveID) void Move(int number) void MoveBack(int number) void
Megjegyzés A figura a börtön mezőre kerül, a játékos sorszáma szerint helyezkedik el, előre nézve Beépített függvény, az adott játékoshoz tartozó menü jelenik meg a sorszámtól függő sarokban, látva a játékos nevét, színét, vagyonát, figuráját Betöltésnél a figura a játékállástól függően elhelyezkedik a táblán Elmenti a kör végén a játékosok adatait az adatbázisba PHP fájlon keresztül kommunikálva. IEnumerator függvény tartozik hozzá Meghatározza, hogy a bábu hova fog lépni, az Update függvény pedig ezáltal mozgatni és forgatni fogja azt Meghatározza, hogy a bábu hova fog vissza lépni, az Update függvény pedig ezáltal mozgatni és forgatni fogja azt
3.2.3 PropertyScript Az adott birtok adatait kezeli az alábbi script. Függvény Start() void MortgageProperty () void UnmortgageProperty () void BuildHouse() void DestroyHouse ()
Megjegyzés Beépített függvény, a GameObject létrejöttekor hívódik meg, beállítja a helyét, a táblán elfoglalt helye alapján A játékos zálogba adja a birtokot, megjelenik egy áthúzott piros csík A játékos a zálogból kiveszi a birtokot, az áthúzott piros csík eltűnik Házak jelennek meg a birtokon, ha 4 ház van, akkor helyükbe egy különálló hotel jelenik meg Házak eltűnnek a birtokon, ha különálló hotel van, akkor 41
void SetOwner(int owner) void
helyébe 4 ház jelenik meg Új tulajdonos esetén megjelenik a csík a tulajdonosnak megegyező színnel
3.2.4 CameraScript A kamera helyzetét kezelő script. Függvény SetCameraPosition(Vector3 CamPos) void
Megjegyzés A kamera helyzete alaphelyzetből változik, követi a bábu mozgását, aztán visszakerül az alaphelyzetbe
3.3 Adatbázis szerkezete A játék mentésére és naplózására egy MySQL alapon működő adatbázis szolgál. A XAMPP kezelői felület MySQL sorában levő „Admin” gombra kattintva megnyílik az alapértelmezett böngésző, amely a localhost/phpmyadmin/ oldalra irányítja a felhasználót. A játék indításakor készít – ha még nem létezik – egy „gamedb” nevű adatbázist, amelyet a játék folyamatosan tölt fel adatokkal. A játék egy adott állása mentésre kerül, ha egy játékos befejezte a saját körét vagy kiesett a játékból, ekkor az alapadatok, a birtokkal, játékosokkal és kártyákkal kapcsolatos adatok kerülnek elmentésre, illetve a SavedGames táblában az adott játékhoz tartozó SaveID frissül. Naplózásánál az adatbázis tárolja a játék történéseit, ez lehet: Dobás, lépés, fizetés, kártyahúzás, birtokkal kapcsolatos, illetve egyéb történések. Továbbá ez a LogTableben
is fel lesz jegyezve a későbbi újranaplózás érdekében. A program a
SavedGames tábla saveID és a saveFileID alapján azonosítja a mentett állás adatait. A Manager szóval ellátott táblákban a program a SavedGames saveID azonosítója alapján fog betölteni egy korábbi játékot. Naplózásnál a LogTable és a saveFileID alapján fogja a játék történéseit újranaplózni.
3.3.1 CardDrawingTable+saveFileID tábla A meglepetés- és szerencsekártyák húzását naplózza az alábbi tábla. Oszlop neve
Típus
ID
int(11)
LogID Player
int(11) varchar(10)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null
WhichKind
varchar(10)
Nem null
Description
varchar(100)
Nem null 42
Megjegyzés Azonosító Könyvelési azonosító A játékos neve (ki húzta) Milyen típusú a húzott kártya (Meglepetés vagy szerencse) A kártya
Turn SaveID
int(11) int(11)
Nem null Nem null
szövege/utasítása Melyik körben húzták Mentési azonosító
3.3.2 CardsManager+saveFileID tábla Az alábbi táblában mentődnek el a játék során még fel nem húzott meglepetés- és szerencsekártyák. Ha az egyik fajtából ki lett húzva mind a 16, akkor az összeset újrakeveri a program és újra ki lehet húzni a későbbiek során. Oszlop neve saveID
Típus int(11)
Megszorítások Nem null
CardIndex
int(11)
Nem null
CardType
varchar(10)
Nem null
Megjegyzés Mentési azonosító Kártya azonosítója, húzásnál az index alapján derül ki, hogy mit rejt a kártya Milyen típusú a húzott kártya (Meglepetés vagy szerencse)
3.3.3 LogTable+saveFileID tábla Az újranaplózás szerepét tölti be. A betöltésben a felhasználó segítségére van, ha ismerheti az adott játék történéseit. Ez a tábla, amolyan kulcsként szolgál. A TableName oszlop megmondja, hogy melyik táblában kell keresni, majd a LogID azonosító szerinti adatok alapján fog értelmes szöveget generálni a program. Oszlop neve
Típus
LogID
int(11)
TableName SaveID
varchar(50) varchar(10)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null
Megjegyzés Naplózási azonosító Tábla neve Mentési azonosító
3.3.4 MiscellaneousActionTable+saveFileID tábla Egyéb események bekövetkeztét naplózza az alábbi tábla (kezdőjátékos kisorsolása, játékos kiesett, aukció megnyerése, üzletelés stb.): Oszlop neve
Típus
ID
int(11)
LogID Player
int(11) varchar(10)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null
Action
varchar(15)
Nem null
Turn SaveID
int(11) int(11)
Nem null Nem null 43
Megjegyzés Azonosító Naplózási azonosító A játékos neve Konkrétan milyen egyéb dolog történt (pl: ki a kezdő játékos, börtönbe került stb.) Melyik körben történt Mentési azonosító
3.3.5 MovingTable+saveFileID tábla A bábuk mozgását naplózza a tábla. Oszlop neve ID LogID Player MoveFrom MoveTo Turn SaveID
Típus int(11) int(11) varchar(10) varchar(30) varchar(30) int(11) int(11)
Megszorítások Elsődleges kulcs Nem null Nem null Nem null Nem null Nem null Nem null
Megjegyzés Azonosító Naplózási azonosító A játékos neve (ki dobott) Melyik mezőről indult Melyik mezőre érkezett Melyik körben történt Mentési azonosító
3.3.6 PayingTable+saveFileID tábla Minden pénzügyi változás ebben a táblában tárolódik. Ha a névnél a Bank szó szerepel, akkor nem egy másik játékosnak/játékostól ad/kap pénzt, hanem a Banknak (gépnek). Oszlop neve
Típus
ID
int(11)
LogID Payer
int(11) varchar(10)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null
Amount
int(11)
Nem null
PaidPerson PayerCurrentMoney Turn SaveID
varchar(10) int(11) int(11) int(11)
Nem null Nem null Nem null Nem null
Megjegyzés Azonosító Naplózási azonosító Fizető neve Összeg, ha negatív a Payer ad pénzt a PaidPersonnak, ha pozitív akkor ugyanez fordítva, a 0-t nem naplózzuk Fizető partner neve A fizető jelenlegi vagyona Melyik körben történt Mentési azonosító
3.3.7 PlayersManager+saveFileID tábla A játékos adatai mentődnek el ebben a táblában. A betöltésnél lesz rá szükség, az adott körben a játékos milyen statisztikákkal folytatja a játékot. Oszlop neve SaveID PlayerName PlayerNumber
Típus int(11) varchar(10) int(11)
Megszorítások Nem null Nem null Nem null
CurrentPlace
int(11)
Nem null
Money
int(11)
Nem null
GetOutOfJailFreeNumber int(11)
Nem null
IsInJail
tinyint(1)
Nem null
JailTurn
int(11)
Nem null 44
Megjegyzés Mentési azonosító Játékos neve Játékos sorszáma A játékos táblán elfoglalt helye A játékos vagyona A játékos kiszabadító kártyáinak a száma Börtönben van-e a játékos Hányadik körét tölti a
TokenID
int(11)
Nem null
játékos börtönben Választott bábu azonosítója
3.3.8 PropertyActionTable+saveFileID tábla A birtokkal kapcsolatban történt eseményeket naplózza az alábbi tába (birtokvásárlás, zálogba adás, építkezés, stb). Oszlop neve
Típus
ID
int(11)
LogID Player
int(11) varchar(10)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null
Action
varchar(10)
Nem null
Property
varchar(30)
Nem null
HousesNumber
int(11)
Nem null
Turn SaveID
int(11) int(11)
Nem null Nem null
Megjegyzés Azonosító Naplózási azonosító Játékos neve Mi történt a telekkel (zálogba adás, zálogból kivétel, házépítés, házeladás) Melyik birtokon történt az esemény A telken levő házak száma, ha a szám 5, akkor az hotel Melyik körben történt Mentési azonosító
3.3.9 PropertyManager+saveFileID tábla A birtok adatai a kör végén kerülnek mentésre. Tartalmaznak alapadatokat, illetve a játék menete során változó adatokat. Oszlop neve SaveID
Típus int(11)
Megszorítások Nem null
ID
int(11)
Nem null
Name
varchar(30)
Nem null
Price
int(11)
Nem null
HousesPrice
int(11)
Nem null
RentWithoutHouse
int(11)
Nem null
RentWith1House
int(11)
Nem null
RentWith2House
int(11)
Nem null
RentWith3House
int(11)
Nem null
RentWith4House
int(11)
Nem null
RentWithHotel
int(11)
Nem null 45
Megjegyzés Mentési azonosító Birtok azonosítója (hol van a táblán) Birtok neve Birtok tulajdoni jogának ára Egy ház/hotel ára Bérleti díj értéke ház nélkül Bérleti díj értéke 1 házzal Bérleti díj értéke 2 házzal Bérleti díj értéke 3 házzal Bérleti díj értéke 4 házzal Bérleti díj értéke
PropertyGroups
int(11)
Nem null
MortgageValue
int(11)
Nem null
MortgageBackValue
int(11)
Nem null
NumberOfHouses
int(11)
Nem null
Owners
int(11)
Nem null
IsInGroup
tinyint(1)
Nem null
IsMortgaged
tinyint(1)
Nem null
CanMortgageAndTrade
tinyint(1)
Nem null
CanBuildHouses
tinyint(1)
Nem null
3.3.10
hotellel Birtok csoport azonosítója Birtok zálogba adásának értéke (Price/2) Zálog visszavásárlásának az értéke ((Price/2)*1.1) A telken levő házak száma, ha a szám 5, akkor az hotel Telek tulajdonosának sorszáma Csoportban van-e a telek, vagyis egy játékos tulajdonában áll-e a teleksor A telek zálogban van-e Lehet-e zálogba adni, illetve üzletelni (ez akkor nem igaz, ha az adott telekhez tartozó teleksoron van legalább egy ház) Lehet-e házat építeni a telekre (igaz, ha az adott teleksor egy játékos tulajdonában áll és egyik sincs zálogban)
RollingTable+saveFileID tábla
A dobókockával való dobást naplózza az alábbi tábla. Oszlop neve
Típus
ID
int(11)
LogID Name Dice
int(11) varchar(10) int(11)
Megszorítások Elsődleges kulcs, nem null Nem null Nem null Nem null
Turn
int(11)
Nem null
isDouble
tinyint(1)
Nem null
SaveID
int(11)
Nem null 46
Megjegyzés Azonosító Naplózási azonosító Játékos neve (ki dobott) A dobott szám Melyik körben történt a dobás (ha 0, akkor a kezdőjátékost sorsolták ki) Duplát dobott-e a játékos (mindkét kockán ugyanaz a szám szerepel) Mentési azonosító
3.3.11
Savedgames tábla
Ebből a táblából csak egy darab van, itt tároljuk a korábban már megkezdett és elmentett játékokat. Oszlop neve
Típus
Megszorítások
saveFileID
int(11)
Elsődleges kulcs, nem null
GameName SaveID
varchar(50) varchar(10)
Nem null Nem null
3.3.12
Megjegyzés Mentett állás azonosítója (Date függvény által generált string yyyyMMddHHmmssfffff formátumban), ez alapján tudjuk beazonosítani a betöltendő játékhoz tartozó táblákat Játék neve Mentési azonosító
SaveManager+saveFileID tábla
Itt tárolódnak a betöltött játékhoz szükséges alapvető adatok, illetve amelyek szükségesek a következő kör megkezdéséhez a soron következő játékos számára. Oszlop neve SaveID PlayersCounter
Típus int(11) int(11)
Megszorítások Nem null Nem null
CurrentPlayerIsInJail
tinyint(1)
Nem null
PlayerJailTurn
int(11)
Nem null
GetOutJailFreeNumber
int(11)
Nem null
StartingMoney
int(11)
Nem null
IncomeTax
int(11)
Nem null
LuxuryTax
int(11)
Nem null
AdvanceGoReward
int(11)
Nem null
PayToJail
int(11)
Nem null
RailRoad1
int(11)
Nem null
RailRoad2
int(11)
Nem null
47
Megjegyzés Mentési azonosító A játékosok száma A jelenlegi játékos börtönben van-e A jelenlegi játékos hányadik körét tölti a börtönben A kiszabadító kártyák száma Mekkora vagyonnal kezdi a kört a játékos Az income tax mértéke A luxury tax mértéke A GO mező átlépésért járó díj A börtönből való kiszabadulás díja Vasúttársaság bérleti díja, amennyiben 1 van a tulajdonban Vasúttársaság bérleti díja, amennyiben 2 van a
RailRoad3
int(11)
Nem null
RailRoad4
int(11)
Nem null
Utility1
int(11)
Nem null
Utility2
int(11)
Nem null
CurrentPlayer
int(11)
Nem null
LogID
int(11)
Nem null
PayingID
int(11)
Nem null
MovingID
int(11)
Nem null
RollingID
int(11)
Nem null
CardDrawingID
int(11)
Nem null
PropertyActionID
int(11)
Nem null
MiscellaneousActionID
int(11)
Nem null
Turn
int(11)
Nem null
TurnCounter
int(11)
Nem null
48
tulajdonunkban Vasúttársaság bérleti díja, amennyiben 3 van a tulajdonban Vasúttársaság bérleti díja, amennyiben 4 van a tulajdonban Közmű bérleti díja, amennyiben 1 van a tulajdonban Közmű bérleti díja, amennyiben 1 van a tulajdonban A soron levő játékos azonosítószáma A naplózás azonosítója A Paying (fizetések) naplózás azonosítója A Moving (bábumozgások) naplózás azonosítója A Rolling (dobások) naplózás azonosítója A Card drawing (meglepetés és szerencsekártya húzások) naplózás azonosítója A Property Action (birtokkal történt események) naplózás azonosítója A Miscellaneous Action (egyéb események) naplózás azonosítója Melyik körtől folytatódik a játék Az körön belül hol tart a játék (ez a szám függ a
ChanceCardsNumber
int(11)
Nem null
CommunityChestCardsNumber int(11)
Nem null
játékosok számával, ha a kettő egyenlő akkor a Turn növekszik, a TurnCounter nulláról indul) A megmaradt szerencsekártyák száma (maximum 16, a nullát sose fogja elérni, hiszen ebben az esetben az elhasznált kártyák újra meg lesznek keverve és újra lehet használni őket) A megmaradt meglepetéskártyák száma (maximum 16, a nullát sose fogja elérni, hiszen ebben az esetben az elhasznált kártyák újra meg lesznek keverve és újra lehet használni őket)
3.4 Konfigurációs fájl A program indulásakor, létrehoz a Monopoly_data mappában egy config.cfg nevű fájlt az alapértelmezett értékekkel, amennyiben az nem létezik. Itt tárolódnak a játékban szereplő bérleti díjak, telkek értékei, egyéb alapértékek. Ha létezik a fájl, a program betölti, és rögtön átírja a programon belül az adatokat. Ezeket az értékéket lehet a programon belül változtatni a Settings menün keresztül (2.4.1.3, 2.4.2.3), a változtatott értékek a „Back” gombra kattintva elmentődnek mind a fájlon belül is, vagy szövegesen átírhatjuk a fájlban az egyenlőség után szereplő számokat, így változtatva az értékeken. A Settings menüben vissza lehet állítani az értékeket az alapértelmezettekre a „Default Settings” gombra kattinva. Új játék indításakor a fájlból töltődnek be az adatok, hálózati játék esetén a szerver küldi el a klienseknek a saját adatait. A játék eszerint fog elmentődni, tehát a fájlra a játék menete során nincs szükség többé.
49
A konfigurációs fájl szerkezete szerint áll szögletes zárójelekkel ellátott csoportokkal, illetve az alatt szereplő adatokkal. A program nem veszi figyelembe a whitespace karaktereket, kivétel az end line karaktereket. A sorrend számít, hiszen a csoport alatti adatok az adott csoport információt tartalmazza. A csoportok szerint lehet: Miscellaneous (alapértékek), Railroads (Vasúttársaságok bérleti díjai), Utilites (Közművek bérleti díjai), a többi csoport a telkek neveit és adatait tartalmazza. Egy csoport szerepelhet többször is, akár ugyanazon adatok különböző értékekkel, ilyenkor a legutolsó érték kerül a program során betöltésre. Ha az adott csoport alatt olyan adat szerepel, amelyet a program nem ismer fel, akkor azt figyelmen kívül hagyja. Ha az egyenlőség után nem természetes szám szerepel, akkor az adott változó a default értékét kapja vissza. Minden mentés után, ami a program során történt a fájl szerkezete visszaáll az alapértelmezettre, a megváltozott értékek viszont mentésre kerülnek.
42. ábra: A konfigurációs fájl első 33 sora
50
3.5 Tesztelés A játékot az aukción való licitáláson kívül a menüelemekre való kattintással lehet irányítani. Az alábbi táblázat bal oldalán a felhasználó interakció szerint az alkalmazásban a jobb oldali oszlopban szereplő változások fognak lezajlani (például egy menüelem lenyomása milyen akciót fog eredményezni a program részéről). Az idézőjelekkel ellátott interakciók az adott szöveggel rendelkező gombra való kattintást jelentik. A program írása során a funkciók legalább egy alkalommal tesztelve lettek, sikeresen működnek. Interakció
A program válasza
Hálózati játék főmenüje: „Host game”
Megjelenik a szerver létrehozása menü
„Join game”
Megjelenik a szerverhez csatlakozás menü
„Quit game”
A program bezáródik
Szerver létrehozása menü (Host menu) Játékos neve mező nincs kitöltve
Please enter your name szöveg jelenik meg a Portszámot kitöltő mező alatt (kérjük adja meg a nevét)
Szerver neve mező nincs kitöltve
Please enter the name of the server szöveg jelenik meg a Portszámot kitöltő mező alatt (kérjük adja meg a szerver nevét)
Olyan szervernév megadása, mely már foglalt
The servername is already taken szöveg jelenik meg a Portszámot kitöltő mező alatt (a szervernév már foglalt)
Portszám mező nincs kitöltve
Please enter the port szöveg jelenik meg a Portszámot kitöltő mező alatt (kérjük adja meg a port számát)
Portszám nem számokból áll
Only numbers allowed for port szöveg jelenik meg a Portszámot kitöltő mező alatt (csakis számokból állhat a portszám)
„Create Server”
Megjelenik a játék főmenüje
„Back”
Visszatérés a hálózati játék főmenüjébe
51
Szerverhez csatlakozás menü (Join menu) Nincs elérhető szerver
Játékos név mező alatt There are no servers szöveg jelenik meg (nincs szerver)
Van elérhető szerver
Játékos név mező alatt megjelennek az elérhető szerverek listája névvel, illetve a játékosok számmal együtt
Egy a listán szereplő szerver eléri a maximális játékosok számát, vagy lecsatlakozik
Eltűnik az adott szerver a listáról
Játékos neve mező nincs kitöltve
A szerverek mellett nem jelenik meg a „Connect” gomb
Játékos nevének megadása
Az adott szerverek mellett megjelenik a „Connect” gomb
„Connect”
A játék főmenüje jelenik meg, a többi játékos ablakának alján megjelenik <Játékos neve> connected to game üzenet 5 másodpercig
Back
Visszatérés a hálózati játék főmenüjébe
Játék főmenüje (Main menu) Ha a játékos: host, és egy másik felhasználó már csatlakozott a szerverre
Megjelennek a New Game, Load Game, Settings, Disconnect menüelemek
Ha a játékos: host, és még nincs egy kliense játékos se a szerveren
Megjelennek a Settings, Disconnect menüelemek
Ha a játékos: kliens
Csak a „Disconnect” menüelem jelenik meg
„New Game”
A játékos neveinek megadása, illetve bábuválasztó menü kerül elő minden gépen
„Load Game”
Load Game menübe kerül elő
„Settings”
Settings menübe kerül elő
„Disconnect”
Visszatérés a hálózati játék főmenüjébe, ha kliens játékos nyomta meg a gombot, akkor a szerveren maradtak ablakának 52
alján megjelenik <Játékos neve> disconnected to game üzenet 5 másodpercig, ha a host játékos, akkor mindenki visszakerül a hálózati játék főmenüjébe. A játékos neveinek megadása, illetve bábuválasztó menü Játékosnév mező átírása
Minden gépen frissül az adott négyszögben levő név
Bábu bal/jobb oldalán található nyíl megnyomása
Cserélődik a bábu, minden gépen frissül az adott négyszögben levő bábu
Ha a játékos: kliens
A menü alján a „Ready” gomb jelenik meg
Ha a játékos: host
A menü alján a „Back” gomb jelenik meg
„Ready”
A Ready gomb Not Ready-re vált
„Not Ready”
Az Not Ready gomb Ready-re vált
Ha minden kliens megnyomta a „Ready” Host menüjének alján a Play Game gombot és a „Not Ready” látható gomb jelenik meg mindegyiküknél Az egyik kliens játékos megnyomja az „Not Ready” gombot
Host menüjének alján a Play Game gomb eltűnik
„Back”
Visszatérés a játék főmenüjébe
„Play Game”
A kamera helyet változtat, méghozzá a tábla felett arra fókuszálva. Megjelennek a választott bábuk és a játékosok száma szerint a GO mezőn felsorakoznak átlósan. A játékosok nevei, színei, vagyonuk, kiválasztott figuráik megjelennek a sorszámukhoz tartozó sarok szerint. Megjelenik a Roll the dices <Játékos neve> menü, a host játékosnál a „Roll” gomb is, elkezdődött a játék.
Játék betöltése menü (Load game) Ha van az adatbázis SavedGames táblában legalább egy kitöltött sor
Dátummal, játékosnévvel ellátott gombok jelennek meg a menüben a táblában
53
elfoglalt sorok száma alapján Ha üres a SavedGames tábla
Csak a Back felirat látható
„Back”
Visszatérés a játék főmenüjébe
Dátummal, játékosnévvel ellátott gombra való kattintás
A betöltött játék Game History menüjébe kerülünk, ahol kilistázódik az adott játék történései, illetve Restore from this point szöveggel ellátott gombok jelenhetnek meg
Betöltött játék Game History menü:
Szerverre csatlakozik egy új játékos/szervert elhagyja egy játékos
„Restore from this point!” gomb(ok) eltűnhet(nek) bizonyos helyekről, míg más helyeken megjelenhetnek. Csatlakozás esetén az ablak alján üzenet jelenik meg: „XYZ connected to the game!”), szerver elhagyás esetén: „XYZ disconnected from the game!”
„Restore from this point!”
A kamera helyet változtat, méghozzá a tábla felett arra fókuszálva. Megjelennek a választott bábuk a betöltött játékállás szerint a legutóbbi mezőn állva. A játékosok nevei, színei, vagyonuk, kiválasztott figuráik megjelennek a sorszámukhoz tartozó sarok szerint. Megjelenik egy menü, amely tartalmazza a szerveren levő játékosokat, és a betöltött játékállásban szereplő játékosokat, itt fogja a szerver kiosztani az irányításokat. A klienseknél megjelenik még egy „Ready” gomb is.
„Delete”
Visszatérés a játék főmenüjébe (a betölthető játék törlődik az adatbázisból)
„Back”
Visszatérés a játék betöltése menübe
Betöltött játék irányítás kiosztása menü „<Szerverre csatlakozott játékos neve>”
A gombon a szerveren levő következő játékos neve jelenik meg. A klienseken az „Not Ready” gomb „Ready”-re vált. A „Play Game” gomb eltűnik a
54
szerver gépén. „Ready”
A „Ready” gomb „Not Ready”-re vált
„Not Ready”
Az „Not Ready” gomb „Ready”-re vált
„Play Game”
Megjelenik a Roll the dices <Játékos neve> menü, a betöltött állás szerinti aktuális játékosnál a „Roll” gomb is, elkezdődött a játék.
Settings menü (Beállítások) „Property settings”
Az összes telket felsoroló menü jelenik meg az adott telekhez tartozó színnel
„Miscellaneous settings”
Megjelenik az egyéb adatokat tartalmazó menü, nyilakkal, értékekkel együtt
„Back”
Megjelenik a játék főmenüje
Property settings menü (Telkek listáját tartalmazó menü) „
”
Megjelenik a telek adatait tartalmazó menü, nyilakkal, értékekkel együtt
„Back”
Megjelenik a Settings menüje
Property settings és Miscellaneous settings menü
„<<”
Az adott sorban levő érték nagy mértékben csökken minimum a nulláig, vagy egy alacsonyabb értékű díjig, ha van ilyen. Ha eléri a minimumot, akkor a nyíl eltűnik
„<”
Az adott sorban levő érték eggyel csökken minimum a nulláig, vagy egy alacsonyabb értékű díjig, ha van ilyen. Ha eléri a minimumot, akkor a nyíl eltűnik
„>”
Az adott sorban levő érték eggyel növekszik maximum egy magasabb értékű díjig, ha van ilyen. Ha eléri a maximumot, akkor a nyíl eltűnik
55
„>>”
Az adott sorban levő érték nagy mértékben növekszik maximum egy magasabb értékű díjig, ha van ilyen. Ha eléri a maximumot, akkor a nyíl eltűnik
„Back”
Visszatérés a Settings menübe
A játék során bekövetkező interakciók:
„Roll!”
Két kocka jelenik meg két sarokból, animálva. Ha megálltak a bábu haladni fog előre a dobott szám értéke alapján. Ha ez a harmadik eset, hogy egymás után duplát dobott a játékos, akkor a bábu egyből a börtön mezőre kerül, ezután megjelenik a kört befejező menü. Ha a játékos a börtönben van, és a „Roll Double”-t választotta ki előzőleg, akkor csak abban az esetben fog lépni, ha duplát dobott, vagy harmadik alkalommal nem sikerült a börtönben tartózkodva duplát dobnia, utóbbi esetben vagyonából levonódik a börtönbírság. Ha nem dobott duplát, akkor a börtönben kell maradnia, és megjelenik a kört befejező menü
Ha a játékos háromszor dob egymás után duplát
A játékos bábuja a börtön mezőre kerül, megjelenik a kört befejező menü
Ha a játékos a köre kezdetén a börtönben van
Roll The Dices menü helyett, a Börtön menü jelenik meg a „Roll Double”, „Pay $50” gombok, illetve ha a játékosnak van kiszabadító kártyája, akkor a Use Get Out Of Jail Free Card gomb is.
Börtön menü „Roll Double”
Megjelenik a Roll The Dices menü
„Pay $50”
Levonódik a játékos vagyonából a börtönbírság (alapértelmezett 50 dollár), megjelenik a Roll The Dices menü
„Use Get Out Of Jail Free Card”
A játékosnál eltűnik az egyik kiszabadító kártya ikon, megjelenik a Roll The Dices menü
56
Ha a játékos üres telekre lép
Megjelenik a telekhez tartozó információs lista, illetve a „Buy Property” és az „Auction” gomb
„Buy Property”
Az adott telek alatt megjelenik egy csík a játékos színével. Megjelenik a kört befejező menü
„Auction”
Megjelenik az aukciós menü a telek nevével, árával. Illetve megjelenik a legmagasabbat ajánló neve, legmagasabb ajánlat, és annak értéke, következő ajánlat, és annak értéke, hátralevő idő, a licitáláshoz szükséges gomb megnyomás
Licitálásnál a SPACE billentyű (Network game esetén), Q/X/M/P (Hot seat game esetén) billentyű megnyomása
Legmagasabbat ajánlónál a gombot leütő játékos neve jelenik meg, az legmagasabb ajánlat és a következő ajánlat 10 dollárral növekszik, az idő újraindul 5 másodperccel
Licitálásnál lejár az idő
Az adott telek alatt megjelenik egy csík a licitálást megnyerő játékos színével. Megjelenik a kört befejező menü
A játékos foglalt telekre, adóra, szerencseAz interakcióhoz tartozó menü jelenik , meglepetés kártyára, irány a börtön meg az „OK” gombbal. mezőre lép. „OK”
Megjelenik a kört befejező menü
A kört befejező menü
Ha a játékos nem kerül adósságba
A kört befejező menü megjelenik az End Turn, Build & Mortgage, Trade, Declare Bankruptcy gombbal
Ha a játékos nem kerül adósságba és duplát dobott
A kört befejező menü megjelenik a Roll Again, Build & Mortgage, Trade, Declare Bankruptcy gombbal
„End Turn”
Megjelenik a Roll The Dice menü, a következő játékos dobhat
„Roll Again”
Megjelenik a Roll The Dice menü, az aktuális játékos dobhat
57
Ha a játékos adósságba kerül
A kört befejező menü az End Turn gomb helyett a Pay Off Debt menüelemmel jelenik meg
Ha a játékos összegyűjti az adósság törlesztéséhez szükséges pénzt
A Pay Off Debt menüelem kattintható gombra változik
„Build & Mortgage”
Kilistázódik a játékos tulajdonában álló telkek listája, illetve a Back gomb
„<Játékos tulajdonában levő telek>”
Kilistázódik a telek információt tartalmazó lista, illetve a menüelemek.
„Trade”
A játékban maradt játékosok neveit listázza ki, illetve a Back gombot
„<Ellenfél neve>”
Megjelenik két ablak: Your Trade Menu, Trade Partner’s Menu, mindkettőben szerepel Cash: $0 menüelem, illetve Get Out Jail Cards: 0 menüelem a hozzá tartozó nyilakkal, illetve bal oldalt kilistázódik a játékos tulajdonában levő telkei, jobb oldalt a választott ellenfél tulajdonában levő telkek egymás alatt
„Declare Bankruptcy”
Az aktuális játékos kiesik a játékból, bábuja eltűnik, valamint az ő sarkában található ikon is, a telkeiről a csík eltűnik, valamint, ha volt, akkor a házak/hotelek/zálogcsíkok is. Ha esetleg tartozott egy másik játékosnak, akkor a játékos vagyona a kieső játékos vagyonával illetve a házai értékének felével nő, a kieső játékos telkein a csík a kedvezményezett játékos színét veszi fel, a házak/hotelek/zálogcsíkok ugyanúgy eltűnnek. Ha egy játékos maradt, akkor megjelenik a játék vége menü, ha nem akkor a következő játékos következik.
Build & Mortgage Ha a telek nincs zálogban
Megjelenik a Mortgage Property + ár gomb
Ha a telek zálogban van
Megjelenik az Unmortgage Property + ár gomb
58
„Mortgage Property”
A játékos vagyona a gombon levő értékkel növekszik, a táblán az adott telekhez tartozó mezőn egy piros csík jelenik meg átlósan
„Unmortgage Property”
A játékos vagyona a gombon levő értékkel csökken, a táblán az adott telekhez tartozó mezőn a piros csík eltűnik
Ha az adott telekhez tartozó teleksor a játékos tulajdonában áll
Megjelennek a Buy és a Sell menüelemek
Ha a telken maximum 4 ház van építve, és a teleksor többi telkén is legalább ennyi van, akkor meg lehet nyomni a „Buy House” gombot
Az adott telekre egy ház épül, ha 4 ház van, akkor a 4 ház eltűnik és helyette egy piros ház jelenik meg
Ha a telken maximum 4 ház van építve, és a teleksor többi telkén is maximum 4, vagy egymáshoz képest eggyel kevesebb vagy több, akkor meg lehet nyomni a „Buy Set” gombot
Az adott telkekre egy-egy ház épül, ha 4 ház van, akkor a 4 ház eltűnik és helyette egy piros ház jelenik meg
Ha a telken minimum 1 ház van építve, és a teleksor többi telkén is minimum ennyi van, akkor meg lehet nyomni a „Sell House” gombot
Az adott telekről egy ház eltűnik, ha piros ház van, akkor helyette 4 ház jelenik meg
Ha a telken minimum 1 ház van építve, és a teleksor többi telkén is egymáshoz képest eggyel kevesebb vagy több van, akkor meg lehet nyomni a „Sell House” gombot
Az adott telkekről egy-egy ház eltűnik, ha piros ház van, akkor helyette 4 ház jelenik meg
„Back”
Kilistázódik a játékos tulajdonában álló telkek listája, illetve a Back gomb
Trade menü (üzletelés) Ha a Cash menüelemben a szám 0
A hozzátartozó nyíl gomb nem jelenik meg bal oldalt
Ha a Cash menüelemben a szám egyenlő a játékos vagyonával
A hozzátartozó nyíl gomb nem jelenik meg jobb oldalt
Ha a Cash menüelemben a szám 0 és a játékos vagyona között van
A hozzátartozó nyíl gombok megjelennek mindkét oldalt
Ha a Get Out Jail Cards
A hozzátartozó nyíl gomb nem jelenik 59
menüelemben a szám 0
meg bal oldalt
Ha a Get Out Jail Cards menüelemben a szám egyenlő a játékos kiszabadító kártyáinak számával
A hozzátartozó nyíl gomb nem jelenik meg jobb oldalt
Ha a Get Out Jail Cards menüelemben a szám 0 és a játékos kiszabadító kártyáinak száma között van
A hozzátartozó nyíl gombok megjelennek mindkét oldalt
„<”
A mellette levő menüelemben található szám csökken
„>”
A mellette levő menüelemben található szám növekszik
A Your Trade Menüben található, Your Properties alatt valamelyik telek gombra kattintva
Az adott telek a The properties offered by you szöveg alá kerül
A Your Trade Menüben található, The Az adott telek a Your Properties properties offered by you alatt szöveg alá kerül valamelyik telek gombra kattintva A Trade Partner’s Menüben található, Trade Partner’s Properties alatt valamelyik telek gombra kattintva
Az adott telek a The properties offered by your trade partner szöveg alá kerül
A Trade Partner’s Menüben található, The properties offered by your trade partner alatt valamelyik telek gombra kattintva
Az adott telek a Trade Partner’s Properties szöveg alá kerül
„Offer”
Megjelenik bal és jobb oldalt, az előbb felajánlott összeg, kiszabadító kártyák, illetve telkek listája, illetve a Yes és a No gomb
„No”
Visszatérés a kört befejező menübe
„Yes”
Visszatérés a kört befejező menübe, a táblán a felajánlott telkeknél található csíkok színt változtatnak az üzletelésben részt vevő játékosok szerint, ha volt felajánlott pénz akkor az egyik játékostól levonódik, míg másiknak ugyanennyivel növekszik, ugyanez történik a kiszabadító 60
kártyákkal Disconnect, vagyis egy játékos lecsatlakozik játék közben Ha a host játékos csatlakozik le
A játéknak vége, mindenki visszakerül a főmenübe
Ha kliens csatlakozik le, és ő az aktuális játékos, és már csak egy játékos maradt
A játékban maradt játékos nyer, megjelenik a Game Over menü, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja eltűnnek
A soron következő játékos veszi át az irányítást, a Roll the Dices vagy a Ha kliens csatlakozik le, és ő az aktuális játékos, és még marad legalább két játékos Börtön menü jelenik meg, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja a játékban eltűnnek Ha kliens csatlakozik le, de nem ő az aktuális játékos, és még marad legalább két játékos a játékban
A játék folytatódik tovább, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja eltűnnek
Ha kliens csatlakozik le, de nem ő az aktuális játékos, és még marad legalább két játékos a játékban, az aktuális játékos üzletel
A játék folytatódik tovább, az aktuális játékos visszatér a kört befejező menübe, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja eltűnnek
A soron következő játékos veszi át az Ha kliens csatlakozik le, és ő az aktuális irányítást, a Roll the Dices menü játékos, és még marad legalább két játékos jelenik meg, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja a játékban, illetve ő lett a kezdő játékos eltűnnek Ha kliens csatlakozik le, de nem ő az aktuális játékos, és még marad legalább két játékos a játékban, és épp aukció zajlik, amelyet ő nyerne meg
Az aukció az elejéről indul, a lecsatlakozott játékos bábuja, telkei/házai/hotelei, ikonja eltűnnek
61
4 Összefoglalás Egy nagyobb kihívást jelentő játék elkészítése volt a cél, amely a tervek szerint elkészült. A hálózati játék és az adatbázisba való mentés implementálása a fejlesztés során sok nem várt problémát okozott, amely segített, hogy szakmai tudásom fejlesszem, olyan ismereteket szerezzek, amelyek alapvetőek, megoldó készségem jobb lett, illetve gyorsabb programozóvá válhattam. Célom az, hogy a jövőben sikeres játékfejlesztő legyek, és úgy gondolom e munkám csak egy kicsi, de meghatározó és alapvető lépése annak érdekében, hogy ezen az úton továbbra is előre haladhassak. Szeretném megköszönni Kitlei Róbert Tanár Úrnak, hogy elvállalta a témavezetést, illetve figyelemmel kísérte és tanácsaival segítette a szakdolgozatom fejlesztését.
62
5 Irodalomjegyzék [1] XAMPP programcsomag https://www.apachefriends.org/hu/ Letöltés dátuma: 2015.05.03. [2] MySQL http://dev.mysql.com/doc/refman/5.6/en/ Letöltés dátuma: 2015.05.03. [3] C# Programming Guide https://msdn.microsoft.com/en-us/library/67ef8sbd.aspx Letöltés dátuma: 2015.05.03. [4] Unity 3D fejlesztőprogram https://unity3d.com/ Letöltés dátuma: 2015.05.03. [5] Unity Script Reference http://docs.unity3d.com/ScriptReference/index.html Letöltés dátuma: 2015.05.03. [6] Autodesk Maya 2011 modellező program http://www.autodesk.com/products/maya/overview Letöltés dátuma: 2015.05.03. [7] PHP: Hypertext preprocessor http://php.net/ Letöltés dátuma: 2015.05.03.
63