Fairtris — a fair implementation of Classic Tetris®

2

Pojawił się port na Linuksy. ;)

Repozytorium — https://github.com/chronoscz/Fairtris
Snapcraft — https://snapcraft.io/fairtris

0

Kolejna wersja dostępna do pobrania — Fairtris 3.0.0.3 beta 2

Trzy zmiany w tej odsłonie. Po pierwsze, dodane zostało resetowanie ”soft-dropu” pomiędzy spawnami klocków — jest to ostatnia poprawka, mająca na celu odwzorowanie oryginalnej mechaniki z wersji na konsole NES. Teraz klasyczna mechanika jest wiernie odwzorowana, każdy szczegół. Natomiast mechanika MODERN oferuje wszelkie poprawki i ulepszenia, więc w niej dostępny jest ”wielospawnowy soft-drop”, ”hard-drop”, ładowanie DAS-u w ”entry-delay” oraz ”wall-kick”. Po drugie, ”hard-drop” został lekko poprawiony, dzięki czemu łatwiej się go używa w speedrunach (wybacza mikro-błędy w sterowaniu).

A po trzecie, jeszcze raz zmodyfikowałem zachowanie generatora BALANCED — zmniejszyłem maksymalną długość susz i powodzi (odpowiednio do 10 i 3), dzięki czemu sekwencje są mniej uprzykrzające życie. Zmiana ta nie wpływa na jakość generowanych sekwencji — nadal poziom trudności jest wysoki, sekwencje wymagające, ale istnieje możliwość gry perfekcyjnej przy mocnym skillu i odrobinie szczęścia (czyli kasowania samych tetrisów, jeden za drugim aż do ”killscreena”).

Feedback mile widziany. ;)

3

Ostatnia wersja została wydana — Fairtris 3.0

Wszystko jest już zrobione, wszystkie opcje przetestowane, nowych błędów nikt nie zgłaszał. Tak więc ten projekt można uznać za zakończony, więcej czasu na niego poświęcać nie będę — obecna forma spełnia swoje zadanie.

1

@furious programming nie chce robic nowego watku, ale jestem ciekaw Twojej opini, faktycznei to taka sensacja? https://geekweek.interia.pl/technologia/news-wczesniej-nie-osiagnal-tego-zaden-czlowiek-13-latek-pokonal-,nId,7247205

2

Tytuł tego artykułu jest nieprawdziwy i mylący — ta wersja Tetrisa właśnie została zaprojektowana w taki sposób, aby uniemożliwić granie w nieskończoność (w odróżnieniu od Tengena). Funkcja automatycznego przesuwania klocków na boki, dostępna dzięki trzymaniu strzałki w bok, przesuwa klocki na tyle wolno, że na poziomie 29 fizycznie nie da się dosuwać klocków do bocznych ścian pola gry. To powoduje, że nie da się układać normalnego stosu i czyścić kolejnych linii, więc poziom ten został nazwany kill screenem.

Gracze zaczęli wymyślać nowe techniki, aby szybciej przesuwać klocki na boki, tak aby móc również grać na poziomie 29 i kolejnych. Hypertapping, czyli wibrowanie kciukiem, pozwala uzyskać większą prędkość przesuwania klocków — niektórzy potrafią wciskać D-Pad nawet 16 razy na sekundę i dzięk itemu przesuwać klocek dużo szybciej niż automat. Ale to jest zbyt wyczerpujące, aby grać w nieskończoność i nadal zbyt wolne, aby grać swobodnie.

Niedawno wymyślono nową technikę, zwaną rollingiem, która nie wymaga dużych ilości energii, a za to pozwala wciskać D-Pad nawet ponad 20 razy na sekundę. To umożliwia swobodne granie na poziomach 29 i kolejnych.


W teorii, gra została zaprojektowana w taki sposób, że nie ma ostatniego poziomu — nikt nie przewidział, że ktokolwiek będzie w stanie dojść dalej niż do poziomu 29, w którym fizycznie nie da się już grać. W kodzie tej gry nie ma zabezpieczeń przeciwko przekręcaniu różnych liczników, w tym wewnętrznych. Dzięki rollingowi, możliwe jest więc granie dotąd, aż konsola zacznie przetwarzać dane gry jako kod maszynowy, co w losowym momencie spowoduje po prostu soft lock (gra się zawiesi).

To co ten dzieciak zrobił to właśnie doszedł do momentu, w którym gra zaczęła interpretować dane gry jako instrukcje — code pointer nie wskazywał na komórkę pamięci z instrukcjami, a na komórkę z danymi. To spowodowało, że gra się zawiesiła bezpowrotnie (soft lock), czyli można powiedzieć, że on jako pierwszy faktycznie doszedł do końca gry — doszedł tak daleko, że konsola się wykrzaczyła. Efekty przekręcania liczników i krzaczenia się gry widać było dużo wcześniej, bo kolory klocków były określane nieprawidłowo (adres wskazujący na tablicę z kolorami klocków wyszedł poza obszar tablicy, przez co kolory były śmieciowe).

Ale to nie jest ostateczne osiągnięcie. Soft lock nie występuje w konkretnym momencie — może zaistnieć w konkretnych wartunkach, czasem wcześniej, a czasem później. Zrewersowano tę grę i wyznaczono to co trzeba zrobić, aby gra się wykrzaczyła — np. wyczyścić jeden wiersz będąc na poziomie 89 (przykład wymyśliłem). A to oznacza, że wiedząc czego nie robić, można uniknąć soft locku i faktycznie grać w nieskończoność. Da się to zrobić i po przejściu poziomu 255, licznik poziomu się przekręci na 0 i gra będzie się toczyć dalej.

Podsumowując, ten dzieciak zrobił coś, czego nikt do tej pory nie dokonał — grał tak długo, że wykrzaczył konsolę. Da się grać dłużej i nie tylko opóźnić soft lock, ale i w ogóle go pominąć. Tak więc gracze będą próbować dalej, dojść do dalszych poziomów, a ostatecznie do całkowitego uniknięcia soft locku i przekręcenia licznika poziomu do wartości 0. Myślę, że to będzie ostatecznym celem tetrisowców — przejście najwyższego możliwego poziomu, czyli 255 i zresetowanie gry do stanu początkowego.


Dla cieawych, dobre wyjaśnienie znajduje się w poniższym filmie:

0
WhiteLightning napisał(a):

@furious programming nie chce robic nowego watku, ale jestem ciekaw Twojej opini, faktycznei to taka sensacja? https://geekweek.interia.pl/technologia/news-wczesniej-nie-osiagnal-tego-zaden-czlowiek-13-latek-pokonal-,nId,7247205

po obejrzeniu tego filmiku wyżej naprawdę robi się ekscytujące, właśnie mi się dzisiaj pokazał w proponowanych na youtubie :)

furious programming napisał(a):

Ale to nie jest ostateczne osiągnięcie. Soft lock nie występuje w konkretnym momencie — może zaistnieć w konkretnych wartunkach, czasem wcześniej, a czasem później. Zrewersowano tę grę i wyznaczono to co trzeba zrobić, aby gra się wykrzaczyła — np. wyczyścić jeden wiersz będąc na poziomie 89 (przykład wymyśliłem). A to oznacza, że wiedząc czego nie robić, można uniknąć soft locku i faktycznie grać w nieskończoność. Da się to zrobić i po przejściu poziomu 255, licznik poziomu się przekręci na 0 i gra będzie się toczyć dalej.

Właściwie streściłeś w tym poście ten film, w 11:10 widać konkretne warunki i przejście poziomu 157 może nie być możliwe bo jest 73% szansa na crasha przy skreśleniu pojedynczej linii więc trzeba by było skreślać za każdym razem po kilka lub mieć niesamowite szczęście.

Pytanie czy fairtris ma killscreen

1
obscurity napisał(a):

Właściwie streściłeś w tym poście ten film, w 11:10 widać konkretne warunki i przejście poziomu 157 może nie być możliwe bo jest 73% szansa na crasha przy skreśleniu pojedynczej linii więc trzeba by było skreślać za każdym razem po kilka lub mieć niesamowite szczęście.

Dlatego pisałem, że da się uniknąć soft locka, wiedząc czego nie robić. Nie jest tego dużo do zapamiętania, ale nawet jeśli się zapamięta czego nie robić, nadal trzeba mieć odpowiednio przygotowany stos oraz po prostu szczęście co do RNG.

Pytanie czy fairtris ma killscreen

Nie ma killscreena — nie da się go wykrzaczyć tak jak gry na NES-a.

Soft lock czy inny crash nigdy nie nastąpi, dlatego że rejestr CPU z code pointerem zawsze wskazuje na pamięć faktycznie zawierającą instrukcje do wykonania. Musiałbym celowo napisać kod w asmie i ustawić code pointer na pamięć z losowymi danymi (np. zawartość stosu czy segmentu danych) i musiałaby to być pamięć przydzielona procesowi. Tyle że w takim przypadku proces gry zostałby ubity przez system operacyjny, ze względu na istniejące w nim mechanizmy ochrony pamięci — dane mogą być wyłącznie odczytywane i modyfikowane, a kod maszynowy wyłącznie wykonywany. Bugów w kodzie logiki gry nie ma, więc nie da się zepsuć logiki po prostu grając długo. Tak więc sam kod gry jest w porządku, nie da się go wykrzaczyć.

Jeśli chodzi o palety kolorów, to tutaj również niczego nie da się uzyskać. Wersja na NES-a posiada dużą tablicę z paletami, a w Fairtrisie nie ma żadnej tablicy palet kolorów. Fairtris używa atlasu z dziesięcioma zestawami kostek — z tych kostek renderowana jest mi.in. zawartość stosu. Nie da się wyjść poza te dziesięć zestawów i czytać śmieciowe dane z tekstury, bo współrzędne kostek obliczane są robiąc modulo na numerze poziomu. W ten sposób, co każde 10 poziomów, następuje powrót do pierwszego rzędu kostek.

Można zglitchować Fairtrisa, ale proces gry ani nie umrze, ani nie oszaleje. Żeby to zrobić, trzeba by przekręcić licznik punktów lub dojść tak daleko, że matematyka na liczbach spowoduje przekręcenie inta. Problem polega na tym, że wszystkie liczniki w Fairtrisie są 32-bitowymi intami ze znakiem — typu Integer. Maksymalną wartością możliwą do przechowania w takim incie jest 2,147,483,647, czyli tyle punktów trzeba by zdobyć, aby int się przekręcił. A to oznacza, że trzeba by dojść do poziomu o numerze pewnie dziesiątek tysięcy, co jest niemożliwe dla człowieka (musiałby grać bez przerwy pewnie całymi dniami). Ale nawet jeśli by zdołał to zrobić, to int się po prostu przekręci i tyle — proces nie zawiesi się ani nie zostanie ubity, bo wersja release jest wygenerowana bez kodu sprawdzania zakresów.

Coż, Fairtrisa po prostu nie da się wykrzaczyć. Jedyne co można zrobić to przekręcić mu któryś z liczników i wykoślawić obliczenia, ale tego żaden człowiek nie będzie nigdy w stanie zrobić. Tylko TAS mógłby zglitchować liczniki i matematykę na intach, choć pewnie musiałby grać przez wiele godzin, aby dojść do tego momentu.

0

No i drugi zepsuł Tetrisa. ;)

0

Jest nowe wideo, z dokładnym wyjaśnieniem tego jak grać na zglitchowanej grze i co trzeba zrobić, aby przeżyć, przekręcić licznik poziomu i powrócić do poziomu 0. Kiedyś ktoś to zrobi, pytanie tylko kiedy. ;)

0

Skoro scena tetrisowa zaczyna tak przeginać, to może czas na nową wersję — Fairtris: Ultimate Challange? ;)

Mogę zmodyfikować źródła, tak aby dać możliwość grania na tych popsutych kolorach, a kiedy przejdzie się poziom 255, to nastąpi ”reborn” gdy, czyli powrót do poziomu 0 i najniższej prędkości. Choć lepiej by było, gdyby przejście poziomu 255 po prostu kończyło grę i wyświetlało specjalny ekran. Żeby każdy mógł tego dokonać, ustawię maksymalną szybkość opadania klocków na jeden wiersz co dwie klatki — taka prędkość jest w pełni grywalna. Dodać zglitchowane kolory to żaden problem.

Jedyny problem to layout — bug jeden wie jak dużą liczbę musiałby pomieścić. Tu nie chodzi o samo przechowanie liczby, bo 32-bitowy int ze znakiem da radę (w razie czego można użyć 64-bitowego), a o layout, bo obecny nie przewiduje więcej niż 9 znaków. Natomiast klasyczny layout (zgodny z NES) bym usunął, bo on służył jedynie do tego, aby pasował do narzędzia zwanego Maxout Club, czyli na potrzeby grania przez sieć. Zostawiłbym więc ciemny motyw, odpowiednio dostosowany do tak horendalnie dużych wyników.

Co o tym sądzicie?

0

Jak już glitchujesz kolory to przydałaby się opcja pozostałych glitchów. W prawdziwej wersji możesz też sobie odsapnąć kilka razy dzięki glitchom bo włącza się pauza w pewnych okolicznościach na ostatnich poziomach a jeden z poziomów trwa tyle co 80 innych ;)
Tak serio, moim zdaniem ograniczenie prędkości żeby dało się grać do końca i koniec po 255 poziomie brzmi spoko, ale kopiowanie jednego glitcha nie ma za bardzo sensu

2

Idzie nowe — od wczoraj pracuję nad sequelem. Za kilka dni będzie gotowy.

screenshot-20240310183512.png

Dla nowej wersji będzie nowy wątek, tutaj tylko mała wspominka dla tych, którzy śledzili powstawanie pierwowzoru.

0

Fairtris ma popsute obliczenia proporcji obrazu — tak mi się wydaje. Robię teraz sequel, w którym rozdziałką nie będzie 256x240, a 336x240. Dodałem wsparcie prostokątnych pikseli, aby utrzymać wygląd obrazu klatki taki jak na CRT i ekskluzywny tryb wideo nie reaguje. W dodatku format okna (jeśli gra się w małym okienku) nie jest zgodny z formatem w trybach pełnoekranowych. Coś ten Fairtris zjanuszowany. 😉

Przerobiłem kod obliczający rozmiar okna oraz proporcje obrazu, pisząc go w sumie od nowa. Format pikseli jest 8:7, wymnożony przez rozdzielczość 336x240 (tylko poziom) daje 384x240, czyli ładnie 16:10, bo takie proporcje obrazu mają być w sequelu. Teraz cudnie się wszystko wylicza, na fullscreenie obraz klatki wypełnia cały ekran (w laptopie mam 1280x800, więc 16:10), natomiast jeśli proporcje klatki nie są zgodne z proporcjami ekranu, to puste miejsce jest wypełniane czarnym kolorem.

Dobrze, że robię ten sequel, bo wsparcia proporcji pikseli jeszcze nie dodałem do swojego silnika. Teraz mam gotowe obliczenia i wiem jak to działa, więc pójdzie gładko. Kwadratowe piksele ssą pałkę — to nie retro.

1

Zostało mi jeszcze tylko tło zrobić (dwie grafiki) i nowa odsłona gotowa. ;)

2

W sumie to sequel można uznać za gotowy. Co prawda jeszcze pokombinuję, aby dało się odpalić ekskluzywny fullscreen na dodatkowym monitorze (mam to w silniku do Kidsów zaimplementowane), ale gra ma już ostateczny kształt i gra się świetnie. Niżej kilka zrzutów ekranu. Z efektu końcowego jestem bardzo zadowolony. ;)

screenshot-20240314160501.png
screenshot-20240314160518.png
screenshot-20240314160534.png
screenshot-20240314160548.png
screenshot-20240314161032.png

0

Dobra, tryb ekskluzywnego fullscreenu naprawiony. SDL niestety nie do końca ogarnia odpalanie ekskluzywnego fullscreenu na dodatkowych monitorach i nie udało mi się go zmusić do poprawnej obsługi dodatkowych monitorów, więc ograniczyłem użycie trybu wideo tylko do głównego monitora. To ograniczenie jest konieczne, bo jeśli się go nie oprogramuje, to włączenie trybu wideo powoduje zapętlone miganie ekranów i przenoszenie okna pomiędzy nimi. Badałem różnice pomiędzy kodem Fairtrisa a moim silnikiem i niczego sensownego nie znalazłem — w silniku działa, w Fairtrisie nie. Magia. 🤣

Gra skończona, teraz czas na przystosowanie do nowej gry głównego readme oraz wiki w GitHub i będzie można ujawnić repo oraz wydać release. Może dziś uda mi się wszystko ogarnąć, a jeśli nie to jutro dokończę.

0

A możesz opisać jakie są różnice w porównaniu do pierwszej wersji? I czemu zasługują na miano sequela?

0
obscurity napisał(a):

A możesz opisać jakie są różnice w porównaniu do pierwszej wersji?

Zmian jest bardzo dużo, więc mogę co nieco podać, tak w skrócie.

Usunąłem z kody gry niemal wszystko, co było zgodne z wersją na NES-a. Nie ma wsparcia dwóch skórek, bo sequel nie będzie przystosowany do grania przez narzędzia takie jak Maxout Club — została jedna skórka, nowoczesna, bardziej w stylu SNES-a. Rozszerzyłem tylny bufor do proporcji 16:10, aby dopasować obraz klatki do współczesnych ekranów. Dodałem animowane tło, na wzór menu z gry Chase Ace 2, którą uwielbiam. Dodałem dwukolorowe liczniki, z ciemnymi placeholderami, gradienty dla sprajtów tekstu oraz kostek stosu gry — ogólnie skórka jest wzorowana na tej z pierwszego Fairtrisa, ale ją odpicowałem.

Jeśli chodzi o mechanikę gry, to usunąłem hipotetyczne regiony (które nie istniały na NES-ie) — zostały tylko NTSC i PAL. Dla obu regionów ograniczyłem wybór startowego poziomu do 19. Zestaw generatorów pozostał taki jaki był, czyli nadal jest ich siedem, ale ustawiłem domyślny na multi-bag, bo jest najciekawszym (7-bag wywaliłem na koniec listy).

Klasyczna mechanika zgodna z NES-em istniała tylko dla testów, a że jest toporna, to wstyd taki szajz trzymać w kodzie. Usunąłem więc ją i została tylko nowoczesna, bardzo wygodna, responsywna i intuicyjna. Dodałem też możliwość ustawienia szybkości przesuwania klocków na boki (osobno dla NTSC i PAL), podczas trzymania strzałki w bok — domyślnie jest zgodnie z NES-em, czyli dość łatwo to ogarnąć, ale można ją przyspieszyć (opcja dla wyjadaczy). Usunąłem też hard-drop — strzałka w górę nie jest używana do grania.

Jeśli chodzi o rozgrywkę, to usunąłem wszystkie dodatkowe tryby — kwalifikacje, mecze i speedrun. Nie mają one zastosowania w sequelu, ze względu na porzucenie zgodności z Tetrisem na NES-a. Został tylko maraton, który teraz jest nieskończenie długi. Maksymalna prędkość opadania została obniżona do tej zgodnej z poziomem 19, więc wyjadacze mogą grać tyle ile ugrają (nie ma killscreena). Nie ma już liczenia punktów transition, zamiast tego liczone są points per line do statystyk gry.

Żeby było ciekawie, dodałem wsparcie zgliczowanych kolorów klocków, zgodnie z NES-em. Poziomy z nieprawidłowymi kolorami klocków to te od 138 do 255 — kto śledzi poczynania graczy Tetrisa na NES-a, ten wie o co chodzi. Przy czym aby nie było zbyt chamsko, czarne klocki mają jasny gradient — nadal są bardzo słabo widoczne, ale nieco bardziej niż na NES-ie, więc jest fair.

Przejście 255 powoduje glitch rozgrywki, którym jest… niespodzianka — dojdziesz tak daleko to się dowiesz. 😉

Pomniejszych zmian jest dużo więcej, bo usprawniłem też sterowanie menu, dodałem opcję włączania/wyłączania trybu wideo dwuklikiem, dodałem opcję zmiany rozmiaru okna za pomocą klawiszy + i - i wiele innych pierdółek. Wszystkie dostępne możliwości obsługi gry i rozgrywki będą opisane w wiki, tak samo jak w przypadku pierwszego Fairtrisa.

Pierwszy Fairtris miał 15,428 LoC, sequel ma 11,413 LoC.

I czemu zasługują na miano sequela?

Pierwsza wersja była podstawą dla graczy ze sceny klasycznego Tetrisa i wspierała mniej więcej to, do czego gracze klasyka byli zdolni. Obecnie ci sami gracze glitchują grę, więc nowa wersja Fairtrisa jest dopasowana do tych wyczynów. Pisząc sequel, mam bardziej na myśli skill graczy tetrisowych, niż samą grę — w końcu ta fabuły nie ma.

Mimo że Fairtris jest silnie wzorowany na Tetrisie z NES-a, tym od Nintendo, to jego funkcjonalność oraz rozgrywka są dostosowane do ogółu, a nie dla hardkorowców klasyka. A że Fairtris ma zdecydowanie lepsze sterowanie, a także teraz obniżoną maksymalną prędkość opadania klocków, to każdy może zglitchować kolory, dochodząc tam, gdzie potrafi w klasyku dojść — na dzień dzisiejszy — trzy osoby z całego świata. Dzięki tej grze, każdy fan klasycznego Tetrisa może się poczuć jakby był jednym z tej trójki.

2

Fairtris 2 właśnie stał się publiczny — https://github.com/furious-programming/Fairtris-2-UC

Jutro uzupełnię readme oraz dodam release w repozytorium i zrobię osobny wątek na forum — dziś już nie mam siły. Ale jeśli masz zainstalowanego Lazarusa, możesz pobrać źródła, otworzyć projekt, skompilować i grać. Źródła przystosowane dla Windows 64-bit, portami zajmą się znajomki (albo ktokolwiek chętny). No, można się częstować, miłego grania. ;)

0

Oficjalnie potwierdzam, że da się przejść Fairtrisa 2 — trwa to około 90 minut. Po przejściu poziomu 255 jest sekretny ekran, nie zdążyłem zrobić zrzutu ekranu z ekranu gry (z zawartością stosu i licznikami), więc musicie się zadowolić zrzutem statystyk (po zamknięciu sekretnego ekranu) oraz listą najlepszych wyników z lobby gry.

Trzy razy dziś próbowałem, udało się za trzecim razem. 😉

screenshot-20240316182813.png
screenshot-20240316182912.png

Trzeba mieć niezłą wytrzymałość żeby tak długo grać na najwyższej możliwej prędkości i przy okazji dobry wzrok, bo niektóre zgliczowane kolory są praktycznie niewidoczne i granie na nich to masakra. Ale o to właśnie w tym chodzi — kolory są zaczerpnięte z oryginalnego Tetrisa na NES-a i takie pozostaną. Bardzo zadowolony jestem ze sequela, gra się świetnie, a przejście tej gry jest bardzo trudne, więc poprzeczka ustawiona jest tak wysoko jak przypuszczałem. Czyli sukces. 😄

1 użytkowników online, w tym zalogowanych: 0, gości: 1