kedd, október 01, 2024

az játék előrehaladottáról

Elkészült egy újabb vidió.

Jó két éve dolgozom a pályageneráláson. Mielőtt még nekifogtam ezen dolgozni, kellett néhány tesztpálya a többi algoritmus teszteléséhez. Ezeket az elején én építettem fel kézzel C++-ban, mindenféle primitívek egymás mellé rakásából. Ez elég jól működött, aztán amikor eljött a pálya generálás ideje, akkor persze egy jobb rendszert akartam. Igazából mielőtt nekifogtam a projektnek, végig gondoltam, hogy nagyjából mire lesz szükség és akkor úgy gondoltam, hogy ezt valamilyen megszorítás alapú rendszerrel fogom megoldani, nem lesz kedvem meghatározgatni a méreteket magam, hanem csak annyit, hogy mi mivel kapcsolódik és majd a rendszer kisakkozza, hogy akkor mekkora is az akkora. De mire eljutottam ahhoz, hogy dolgozzak is rajta, már nem tartottam ezt olyan fontosnak, elég jól működött az, hogy mégis csak meghatározott méretű és típusú elemeket rakosgatok össze, már csak a szabályokat kellett hatékonyan leírni. Az elején a szabályok json fájlokban voltak tárolva, de nehezen ment az, hogy egymásra hivatkozzanak (azaz, hogy mondjuk az egyik szabályt úgy hívják, hogy kis-ajtó és az kapcsolódjon a nagy-szoba szabályhoz, ugyanis nem tudtam kitalálni egy nomenklatúrát, azaz elnevezési szabályokat, néha a méreteket találtam fontosnak, néha a kapcsolódási pontokat, mondjuk kis-ajtó-előre, stb, mindig kellett keresgélni a json fájlban, több időt vett el a keresés, mint maguknak a szabályoknak a meghatározása). Ezért nekifogtam egy grafikus szerkesztőnek, amiben már könnyű volt a szabályokat kiválogatni, de aztán rájöttem, hogy ezek nem elég általánosak, ezért elkezdtem mindenféle behelyettesítési szabályokat is hozzárakni, aztán egyre többet és többet kísérletezgettem a rendszerrel és egyre több és több elemi primitívre lett szükségem. Szóval bevezettem jó sokat, az eredeti három primitívből (alapvető primitív, (mint mondjuk kocka, lépcső, valamely oldalán nyílt kocka, stb), szabály, ami alapvető primitívek és más szabályok sorozata és változó, amely ezeknek kombinációja és addig próbálkozik amíg egyet alkalmazni nem tud, vagy ha egyik sem megy, akkor hibát jelez) 31 lett (most nem fogom mindet leírni, majd ha véget ér a projekt, talán). Aztán ahogy egyre hosszabbak lettek a szabályok és több lett belőlük, rájöttem, hogy ez a grafikus szerkesztő sem jó, mert nehéz volt egész szabály családokat létrehozni és a válogatásuk is nehézkes volt egy kis listából több száz szabály közül kibökni pont azt ami kell. Meg néha ugye az is van, hogy egy szabálynak vannak különböző verziói, de azok abban is eltérnek, hogy egy hivatkozott szabály megfelelő verzióit használják, ezt a fajta függőséget is lehetetlen volt kifejezni, kézzel csinálni meg munkás volt. De leginkább szerintem az általános copy-paste hiányzott, szóval lemondtam a szerkesztőről, hogy majd lua-ban generálom a szabályokat, ez egy amolyan metaprogramozás. Aztán rájöttem, hogy bizonyos típusú szabályokat még könnyebben is generálhatnék, mondjuk azokat amelyek csak primitívekből állnak egymás után, na erre akkor a lua metaprogramozás metaprogramozásába kezdtem. Aztán kezdtem kapisgálni, hogy jó lenne, ha bizonyos döntéseket bonyolultabb logikával döntenék el, amit nem lehet kifejezni a rendszeremben, vagy nem könnyen. Szóval az előző vidió ugye arról szólt, hogy most már a szabályrendszer kiértékelése, azaz a pálya generálása alatt is meg tudok hívni lua függvényeket, amelyek elérnek valamennyi információt a kiértékelési fából és az alapján bonyolultabb logikát használhatnak, mint annyit, hogy most itt éppen mit próbálunk ki. De mint annyiszor, rá kellett jönnöm, hogy debugger nélkül gyengécske lua programozó vagyok, szóval leges legutoljára rájöttem, hogy jobb lesz, ha C++-ban is írhatok meghívható függvényeket és ha már úgyis itt tartunk, akkor már ne csak egyetlen szabályprimitívet bocsáthasson ki ez a speciális primitív maga helyett, hanem akárhányat. Ez kb. olyan, mint az önmódosító kód volt valamikor, csak nem kell odafigyelni a relokációra. Ezzel ugyanakkor bezárult a kör, visszajutottam oda ahonnan kezdtem, C++-ban tudok mindenféle geometriai primitíveket egymás mellé tenni, ha akarok és ez lesz a pálya. Persze még mindig ott van az az egész kiértékelős infrastruktúra is, amit persze egyre inkább megtanultam használni, de mégis csak értelmezhető valahogy ez az egész, hogy amit két évig csináltam, az haszontalan volt.

Ettől egy hétre eléggé elment a kedvem a melótól.

Talán most kerültem a legközelebb ahhoz, hogy egyszerűen csak feladjam az egészet és visszamenjek munkát keresni. Illett volna előre látnom, hogy olyan típusú döntéseket, mint, "hogy legyen két párhuzamos út, amelyek 5 lépésenként keresztezzék egymást és ha mindig vált a játékos, akkor mindig a másik útra tegyük a jutalmat, de a cél előtt váljanak szét legalább 10 lépésre és már ne legyenek láthatóak", nem fogok tudni kifejezni egy mezei kis környezetfüggetlen grammatikával, amelyben mindig is odafigyeltem, hogy ne lehessen keresni a térbeli pozíció alapján, csak a kiértékelés fát lehessen esetleg bejárni (mert a térbeli keresés lassú 3 dimenzióban). Így aztán a legkisebb kanyar messzire visz a céltól, ha utána sokat megyünk rossz irányba, persze tudok már rátartani a jó irányra más módszerekkel, de akkor már könnyebb lett volna ha egy okos tervet készítek előre és csak azt hajtom végre, nem kell megkeresni a kijáratot, ha úgyis tudod előre...

Na de 5 év után már illene letenni valamit az asztalra, szóval a kognitív disszonancia győzött, újra hegesztem a kis kódokat, már miután befejezem ezt a bejegyzést. A mostani példa meg egy olyan szerkezet, amit nagyon nehéz lett volna a régi módszerrel megcsinálni, a gömb nem összerakható kockákból, mondjuk nem is sikerült valami jól, de aztán kis csápokat rakni belőle a normál vektor irányába, még nehezebb lett volna régebben. Most csak írtam egy kis C++-t és minden megoldódott. Most így utólag nézem, hogy nem annyira diszkó gömb ez, mint korona vírus, de hát ez már csak ilyen.

Persze, most neki lehetne fogni az egész szabály kiértékelési folyamatot láthatóvá tenni a C++ natív függvényeknek, hogy újabb meta szintet vezessek be, de remélem most már tényleg nem kell semmi komoly új dolgot bevezessek és képes leszek megcsinálni a pályákat a rendelkezésre álló primitívekkel. Az a programozó dolga, hogy egyre hatékonyabbá tegye a munkáját, de tényleg el kell jöjjön egyszer az a pillanat, amikor azt mondja, hogy elég volt, így már mindent meg tudok csinálni amit akartam. Remélem nekem eljött ez a pillanat. Már csak ki kell találni a pályák szerkezetét, aztán valami játékmenet szerű sem ártana... Aztán hangok, vindóz, és végső finomítások. Van még meló bőven...

Ez a mém elég jól leírja, hogy mit tanultam az utóbbi 2 évben. :)

Nincsenek megjegyzések: