niedziela, 26 stycznia 2014

XX5 - o wyrafinowanym oszukiwaniu w grach, czyli jak zaliczyć przedmiot za pomocą Final Fantasy VII

Stali bywalcy zapewne zauważyli, że ostatnio po blogu wieje nuda i brak nowości - cóż poradzić, że do dziennego zestawu obowiązków dodatkowo wskoczyła ukochana przez wszystkich studentów sesja. Nawet i teraz brak wytchnienia, jako że początek roku upłynął pod znakiem kolokwiów, a końcówka - egzaminów i oddawanych projektów. Ale że póki co udaje mi wychodzić na czysto ze wszystkim, to postanowiłem w końcu zdmuchnąć 20-centymetrową warstwę kurzu z tego bloga i postukać nieco w klawiaturę. Dzisiaj postanowiłem wam nieco pobajać o jednym ze wspomnianych projektów, jako że jest on, nie przymierzając się, okołogierkowy. Można zaliczyć przedmiot za pomocą FFVII? Jak okazuje się - owszem!

Pozwolicie, że o samym FFVII mówił nie będę, gdyż, nie oszukujmy się, jest to gra, którą każdy przynajmniej kojarzyć powinien. Ma tylu zwolenników, co przeciwników, lecz jedno nie ulega wątpliwości - jest jedną z TYCH gier, które wywołują niesamowite emocje. Jeżeli chodzi o mnie to uznaję FFVII za kawał solidnej giery, nie czczę tego jako dziewiąty cud świata, czy fanboję na potęgę - ot po prostu wciągająca i grywalna produkcja, do której czasami można powrócić. Tak akurat się składa, że podczas świątecznej wyprzedaży na Steamie (znanej także jako 'masowy morderca portfeli graczy') w łapki wpadł mi re-release wspomnianej gierki z 2012 roku, bodajże za 3,73 euro. Cena jak najbardziej fajna, samą produkcję też można sobie przypomnieć, jako że już dawno w nią nie grałem (ostatni raz chyba w 2008 roku jako obraz eboot na PSP? O ile pamięć mnie nie myli). I na tym kończy się akt pierwszy tej opowieści - 1,53 gigowa gierka wylądowała na dysku, nieco w nią pograłem podczas przerwy świątecznej, można na razie opuścić kurtynę i wyciemnić światła.

Akt drugi, akcja! Początki stycznia, znana wszystkim uczelnia. Jednym z przedmiotów w naszym planie jest elektronika. Jak najbardziej ciekawe zajęcia, gdyż dają duże pole do popisu w budowaniu układów. Są to zajęcia projektowe, czyli aby uzyskać zaliczenie, każdy musi zbudować układ, który działa i wypluwa jakieś wyniki (w dowolnej formie). Wymogiem jest użycie jakiegokolwiek mikrokontrolera do działania. Czemu nie, pomyślałem, i czym prędzej zabrałem się za mały research. Podczas oglądania oferty przeróżnych mikrokontrolerów z serii ATMega, nagle przypomniała mi się rozmowa ze znajomymi, którą przeprowadziłem nie tak dawno temu, a podczas której dyskutowaliśmy o używaniu przeróżnych programów do nagrywania makr (sekwencji klawiszy) i oszukiwania dzięki nimi w grach - a raczej ich wadach, jako że pole popisu jest mocno ograniczone samym stanem, w jakim obecnie znajduje się gra, a którego z poziomu owego programu zobaczyć w żaden sposób nie można. Czym prędzej rzuciłem się na stertę moich notatek i literatury fachowej i wygrzebałem artykuł o przeróżnych sposobach odczytywania informacji z otoczenia przez mikrokontrolery i układy elektryczne. Były tam opisane termometry, czujniki ruchu, mikrofony oraz fotorezystory. Ten ostatni dał mi sporo do myślenia, a jako że historia już udowodniła, że takie rozwiązanie byłoby dobre, do mojej główki wpadł nieco szalony pomysł. Jeszcze tylko szybkie guglowanie informacji o tym, który mikrokontroler obsługiwałby wymagane przeze mnie rzeczy i voila - wybór padł na Arduino Micro. Kilka kabelków, przycisków, rezystorów, diod i, dokładnie, 246 linijek kodu później powstało coś, co ochrzciłem nazwą Auto jRPG Grinder. Układ prezentuje się następująco (zdjęcie troszkę przedawnione, bo do zestawu dorzuciłem jeszcze dodatkowo bzyczek, czyli klasyczny buzzer):


Wygląda jak jakaś rzecz prosto z kosmosu, nieprawdaż? Całość tak naprawdę opiera się na prostym pomyśle, który jednak jak najbardziej działa - fotorezystor, przyklejony do ekranu czarną izolacją, sprawdza jasność ekranu w danym punkcie (ważne, by materiał NIE przepuszczał żadnego innego światła, gdyż chcemy zczytywać jedynie wartość jasności samego ekranu, bez żadnych zakłóceń z zewnątrz w postaci żarówek, światła słonecznego itd.). Z kolei do jednego z analogowych pinów procesora podłączony jest kabelek, który odczytuje wartość obecnego oporu fotorezystora - dzięki temu wiadomo co dzieje się na ekranie, gdyż podczas normalnej pracy wartość rezystancji, w zależności od koloru w punkcie przyklejenia, oscyluje od 95 do 390. Z kolei podczas wyciemnienia ekranu (czarny kolor) opór spada do 50-70. Nadążacie za moim rozumowaniem? Dzięki takiemu rozwiązaniu można sprawdzić co się dzieje w grze i czy nastąpiło wyciemnienie ekranu i np. wejście do walki lub przejście do innej lokacji. Co prawda bardzo analogowe i prymitywne - ale przynajmniej działa, czyż nie! Mając już takie założenia postanowiłem wypróbować prototyp w akcji. Ale potrzebujemy do tego jakiegoś produktu elektronicznej rozrywki. Hmm. I nagle w mych oczach zapaliły się diabelskie ogniki - tak, sprawimy, że Final Fantasy VII będzie grał sam w siebie, i to bez żadnych trainerów czy innych Gamesharków.

Tak oto czym prędzej napisałem kod dla Arduino, który spełni moje dzikie fantazje - początkowo puścić postać w kręcenie się w kółko (gdyż algorytm zakłada, że nasza epicka drużyna pierścienia w stanie początkowym znajduje się na mapie świata), a gdy tylko napotkamy potworki (czyli ekran na moment się wyciemni - rezystancja na fotorezystorze spada), to procesor zmienia zestaw wysyłanych komend do komputera z chodzenia w kółko do naciskania przycisku odpowiadającego za zatwierdzenie ataku (w tym wypadku X). Kiedy wygramy epickie batalie (kolejna seria wyciemnień), algorytm wraca na początek. Z kolei podłączone przyciski i diody odpowiadają za modyfikacje wewnętrznego licznika, odmierzającego ilość walk - domyślnie (gdy żadna diódka jest niezaświecona - wartość 0) algorytm po każdej bitwie odpala specjalne makra, które ma zdefiniowane w kodzie - na tym przykładzie makro do automatycznego zapisu gry. Gdy z kolei naciśniemy przycisk, to wartość licznika wzrasta, co symbolizują zapalające się diody (w formacie binarnym, czyli 001, 010, 011 itd.) - wtedy znajdujące się w kodzie makra będą wywołane po wartości na diodzie plus jedna walka (więc maksymalnie 8 walk w tym przypadku). Tak, tak, nie dość, że układ sam leveluje i zdobywa kasę, to dodatkowo co określoną ilość walk zapisze grę, abyśmy nie stracili żadnego postępu. Więc innymi słowy możemy podłączyć układ do kompa i iść na herbatę, a w między czasie postacie w FFVII same będą wbijać expy i złoto. :) W podobny sposób mogą zostać zaprogramowanie inne makra, jak np. leczenie postaci czy podmiana materii - ważne by tylko wszystko było na swoim omówionym miejscu. Dopóki postępowanie danego makra nie będzie dosadnie skomplikowane, tak wszystko jest możliwe. Dodatkowo kolejnym atutem jest fakt, że układzik tak naprawdę działać będzie na dowolnym jRPGu, który spełnia podobne założenia do FFVII (czyli wyciemnienie, lub jakakolwiek gwałtowna i nagła zmiana koloru na ekranie, przy przejściu do walki), więc działanie algorytmu nie ogranicza się wyłącznie do jednej gry.

Aby nie być gołosłownym prezentuję filmik przedstawiający układ w akcji (jakość nie jest najgorsza, ale też nie idealna, widać nie mam szczęścia do kamer, hah):


Naturalnie cudów i innych zmartwychwstań nie należy się spodziewać, gdyż układ jest mocno analogowy i ograniczony, więc posypie się, gdy nie spełnimy określonych wymogów (przyklejenie fotorezystora do punktu, który ma w miarę stałą wartość podświetlenia/koloru, wszystkie rzeczy w inwentarzu na odpowiednich pozycjach itd.), lecz gdy je spełnimy to działa aż miło popatrzeć. Z pewnością można by było go jeszcze w jakiś sposób udoskonalić, lub w ogóle zmienić co niektóre założenia, aby działał lepiej - jednak na potrzeby zaliczenia jak najbardziej wystarczy, plus póki co nie mam tyle wolnego czasu by zasiąść i go udoskonalać. Ale kto wie, może w przyszłości...?

4 komentarze:

  1. Niemożliwe :D Jakieś firmy od jrpg myślały podobno o sprzedawaniu expa i leveli jako DLC, ciekawe co oni na to :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Zawsze kombinuję jak mogę, więc ja ich klientem z pewnością bym nie był. ;) Dzięki!

      Usuń
  2. O.O Jesteś genialny. Połowy z tego co napisałeś nie rozumiem (fizyka i elektronika nigdy nie była moja mocna stroną) ale podziwiam Twoją smykałkę do tego.

    OdpowiedzUsuń
  3. Brawo za pomysł i wykonanie! Można powiedzieć, że stworzyłeś pewnego rodzaju "bota" do FFVII ;-)

    OdpowiedzUsuń

Komentarze, sugestie, przemyślenia? Wal śmiało!