Roguelike 10 i Basic AbbreviatorDrukuj stronę
2023-04-12
Moje najśmielsze oczekiwania przerósł fakt, że gra Roguelike 10 napisana na konkurs
Basic 10-Liner 2023 zajęła 5. miejsce w kategorii PUR-80. Tak! I jest to drugie
miejsce biorąc pod uwagę tylko komputery Commodore 64! Są więc powody do
świętowania, stąd też ten krótki artykuł!
Od 2021 roku tworzę gry na konkurs Basic 10-Liner. Uczestniczyłem także w konkursie ASCII BASIC GAME 10Liner. Po prostu uwielbiam pisać te któtkie programy, bez wyjątku więc chciałem coś zgłosić również w tym roku! Napisanie gry w BASIC-u, która mieści się w 10-ciu liniach nie jest zadaniem prostym. Ale o to w całej zabawie chodzi! Mam kilka niedokończonych gier z poprzedniego roku, które nie spełniły moich oczekiwań, w tym grę logiczną o nazwie Pairs 10, ale zdecydowałem się zaszaleć i zamiast tego stworzyć grę typu roguelike!
Pierwsze kroki
Bądźmy realistami. Gry roguelike są dość złożone. Nie jest tajemnicą, że by stworzyć dziesięciolinijkowca, musiałem zapomnieć o wielu aspektach jak zdobywanie doświadczenia, posiadanie różnorodnej broni lub różnych potworów, oraz mnóstwo innych rzeczy, które można znaleźć w grach typu roguelike, takich jak magiczne zaklęcia, sklepy itp. Mam tylko 10 linii do wypełnienia kodem, 80 znaków w linii. Tak więc, dopóki podstawowe elementy takie jak eksploracja, nagradzanie i walka pozostaną - nadal z definicji będzie to gra typu roguelike. I jeszcze jedno, w Roguelike 10 nie ma „permadeath”, choć koniec końców poprawiłem sposób poruszania się potworów więc czasami gra może być w tym aspekcie bezlitosna. I dobrze, bo to gra typu roguelike. Ale o tym później.
Prace zacząłem od algorytmu generowania świata. Napisanie generatora lochów, który by mnie usatysfakcjonował nie zajęło mi na szczęście zbyt dużo czasu. Wpadłem na prosty pomysł, by kolejne cele lochów o różnych rozmiarach rysowały się jedna za drugą. Wynik końcowy okazał się być zaskakująco dobry biorąc pod uwagę zajmowane miejsce kodu. Projekt zapowiadał się naprawdę obiecująco!
Napisanie kodu odpowiedzialnego za ruch postaci gracza, gdzie odkrywane jest krok po kroku otoczenie, było łatwym zadaniem. Napisanie procedur ruchu potworów okazało się jednak o wiele trudniejsze. Początkowo chciałem umieścić w lochach losową liczbę potworów, które mogłyby samodzielnie podążać w kierunku postaci gracza. Dodanie tablicy pozycji potworów i kontrolowanie ich ruchu zajmowało jednak zbyt dużo miejsca. Musiałem podjąć pierwszą decyzję odnośnie designu gry: w każdym lochu może znajdować się tylko jeden stwór. Czy ta opcja była satysfakcjonująca? Absolutnie nie. Ale to jest 10-linijkowiec. Dobre więc i to, prawda? Chociaż pokręciłem nosem... Koniec końców powróciłem do tego, ale o tym później. Program więc zaczął powoli stawać się grą!
Wyzwanie zaczęło rosnąć, gdyż komfort związany z liczbą wolnych linii (a raczej znaków!) nie trwał zbyt długo. Na tym etapie projekt nie posiadał jeszcze żadnej interakcji z obiektami poziomu, takimi jak schody, złoto czy mikstury uzdrawiające! Nie wspominając o całym mechanizmie ataku. Edycja i przeprojektowanie kodu zaczęło przyprawiać o ból głowy.
Piękno konkursu Basic 10-Liner polega na tym, że w kategorii PUR-80 („czyste” 80 znaków w linii) można używać skrótów poleceń BASIC-a. Jeśli nie znacie tego pojęcia, sprawdźcie listę wszystkich poleceń, które można skrócić: https://www.c64-wiki.com/wiki/BASIC_keyword_abbreviation. Jeśli myślicie, że użyłem np. poleceń PRINT, THEN i GOSUB, wcale tak nie jest. Bowiem, zamiast polecenia PRINT można użyć znaku „?”, THEN można skrócić do „tH” zaś „goS” jest skrótem polecenia GOSUB. Na tym polega piękno tych skrótów - więcej znaków mieści się w jednym wierszu! Minusem jest jednak to, że skróty nie są zachowane, gdy program jest wylistowany. Niestety, zostaną one rozwinięte do swoich „normalnych” odpowiedników. Oznacza to w konsekwencji, że podczas edycji tych linii mogą one zająć więcej niż 2 wiersze. Każdy wiersz ma 40 znaków, więc 2 wiersze zawierają 80 znaków. Gdy linia składa się z więcej niż 2 wierszy, jeśli spróbujecie zapisać linię z powrotem w pamięci, trzeci wiersz zostanie pominięty! W praktyce oznacza to, że trzeba ponownie przepisać całą linię za pomocą skrótów, aby zmieściła się w 2 rzędach. Praktycznie rzecz biorąc, wszelkie zmiany w liniach oznaczają, że wszystko trzeba w kółko przepisywać ze skrótami. W ten sposób napisałem 3 gry. W przypadku mojego pierwszego 10-linijkowca, Mimizuku Saga 10, w ogóle nie użyłem skrótów. Ale w kolejnych projektach już tak! I nie chciałem pisać kolejnego w ten sam sposób...
Basic Abbreviator na ratunek
Co by było, gdyby istniał sposób na wyświetlanie programów ze skrótami? BASIC rozumie skróty, ale dlaczego nie jest wbudowany by wylistować je z powrotem w programie? Co by było, gdyby istniało do tego narzędzie? Zdecydowałem, że czas coś napisać! Poprzez desasemblowanie lokalizacji $0801, wydedukowałem w jaki sposób linie BASIC-a są przechowywane w pamięci. Co ciekawe, BASIC przechowuje słowa kluczowe nie jako słowa, ale jako tokeny. Uzbrojony więc nie w miecz i łuk a w zdobytą wiedzę, mogłem więc przystąpić do prac. W ciągu jednego dnia powstał praktycznie działający Basic Abbreviator. W obecnej wersji jest to dość proste narzędzie, które znajduje się w pamięci nad lokalizacją programu napisanego w BASIC-u. Czasami jest nadal niestabilny, dlatego postanowiłem go jeszcze nie wydawać, ale przez większość czasu po prostu działa. Jak? Klawiszem F1 wyświetlony zostaje sprogram BASIC ze skrótami. Proste! Zaś za pomocą klawisza F3, można uruchomić program.
Podczas pracy nad Basic Abbreviatorem, do kodu wkradł się mały błąd, więc wyświetlanie skrótów dało dość imponujący efekt uboczny. Ciekawostka i drobna rozrywka dla wszystkich kochających takie glitche: https://youtu.be/WYECsIGmGm0. Nikt nie lubi błędów, ale trzeba przyznać, że piękno niektórych „usterek” naprawdę sprawia, że programowanie jest przyjemniejsze.
Podczas korzystania z tego narzędzia przyszło mi do głowy wiele pomysłów, jednak wiedziałem, że siedzę przed komputerem nie z powodu Basic Abbreviatora, ale ze względu na grę Roguelike 10, naszego głównego bohatera!
Rozgrywka
Pierwsze testy gry poszły gładko, żadnych błędów, żadnych dziwnych zachowań, gotowe! Ale po 5 minutach grania gra zaczęła robić się po prostu nudna... Pamiętacie jaką wcześniej podjąłem decyzję odnośnie designu? By wrzucić tylko jednego potwora na każdy loch? Ten pomysł spalił na panewce. Balans gry po prostu nie istniał. Unikanie stwora było przysłowiową bułką z masłem. Ale chwila chwila! To dlatego przecież, że nie miałem już wolnego miejsca! Pamiętacie? I to jest ta część, która najbardziej mnie zaskakuje w 10-linijkowcach. Zawsze (no... nie zawsze-zawsze) jest trochę miejsca, gdzieś, jakoś... A z moją główną bronią - Basic Abbreviatorem - zabawa z kodem powinna być teraz prostsza! A gdybym tak mógł dodać więcej potworów? Gdyby mogły otoczyć gracza, trudność gry powinna potencjalnie wzrosnąć. Ale nie miałem miejsca na żadne tablice, by kontrolować każdego potwora, i żadne inne sztuczki nie wydawały się w ogóle tego problemu rozwiązywać!
Nie trzymając was zbyt długo w niepewności, nie potrzebowałem zbyt dużo czasu na zwycięski okrzyk eureki! Co by było, gdyby ruch potworów odbywał się przy odkrywaniu obszaru w trakcie ruchu postaci gracza? Co łączy te dwie rzeczy? Nic! Ale wtedy kod wcale nie musi w ogóle przechowywać pozycji przeciwników. Pozycja każdego potwora bowiem jest znana, i znajduje się tuż pod odkrytym polem. Więc kod musi tylko sprawdzić, gdzie przenieść tego przeklętego, bezbożnego potwora. Aby zaoszczędzić jeszcze więcej miejsca, napisałem również testy dla tej części, dzięki czemu mogłem uprościć równania i nadal mieć pewność, że kod wykonuje obliczenia poprawnie. Dzięki testom znacznie szybciej można było zweryfikować, czy stwór będzie poruszał się w kierunku postaci gracza zgodnie z oczekiwaniami.
I wierzcie mi lub nie, dzięki temu mogłem wyświetlić liczniki (tzw. HUD), ponieważ udoskonalona metoda ruchu potworów zwolniła potrzebną przestrzeń w programie. Tak, HUD, statystyki dotyczące PUNKTÓW WYTRZYMAŁOŚCI gracza, na którym POZIOMIE lochu się znajduje i ile ZŁOTA posiada. Prawie o tym zapomniałem. A przecież i to jest niezbędny element w grach typu roguelike, prawda? Proszę bardzo, coś jeszcze dodać? Udało mi się dodać RIP (z ang. rest in peace, z łac. requiescat in pace) na wypadek zakończenia gry. I szczerze mówiąc, na tym etapie nie wydaje mi się, żeby jeszcze coś więcej można było wcisnąć do kodu. Ostatecznie zostało 15 wolnych znaków, ale rozproszonych w różnych linijkach. Ostatecznie istnieje limit dla 10-linijkowców.
Wyniki konkursu Basic 10-Liner
Podsumowując, jest to mój piąty ukończony 10-linijkowiec napisany w BASIC-u. Mam nadzieję, że przysporzy Wam sporo dobrej zabawy! W klasyfikacji generalnej PUR-80, Roguelike 10 uplasował się na 5. miejscu na 37 gier, co jest dla mnie naprawdę świetnym wynikiem! Spośród gier dla samych komputerów Commodore 64, uplasował się na 2. miejscu, ustępując pierwszego miejsca bardzo fajnej grze Lumberjack autorstwa Romana Wernera, twórcy takich świetnych gier na Amigę, jak Traps 'n' Treasures czy Leonardo.
Wszystkie wyniki znajdziecie na oficjalnej stronie konkursu: https://gkanold.wixsite.com/homeputerium/results-2023
Basic Abbreviator - od prostego narzędzia do całej zestawu?
Nie jestem pewien, czy ukończyłbym tę grę na czas, gdyby nie mój drogi towarzysz, Basic Abbreviator. Stworzenie tego narzędzia i wykorzystanie go do napisania gry było świetną przygodą. Na pewno nie jest to ostatnia gra jaką chciałem napisać w 10-ciu linijkach, rozważam więc rozszerzenie funkcjonalności tego narzędzia dla przyszłych projektów. Aby stworzyć potężny i kompletny zestaw narzędzi z tego małego programu. Listowanie ze skrótami to świetne udogodnienie, usuwa ciężar przepisywania części programu na skróty poleceń BASIC-a. Ale podczas pracy nad grą brakowało mi wielu innych funkcji, które zdecydowanie jeszcze bardziej ułatwiłyby życie. Wyszukiwanie zmiennych w pogmatwanym kodzie lub przepisywanie części z jednej linii do drugiej wymaga czasu i wysiłku. I jest to duży rozpraszacz. Funkcja kopiowania i wklejania, inteligentne przełączanie poleceń do następnej/poprzedniej linii, wyszukiwanie - to tylko kilka rzeczy, które naprawdę uważam za świetne narzędzia, które powinny być integralną częścią tego programu.
Dajcie mi znać, jeśli jesteście zainteresowani przyszłym rozwojem Basic Abbreviatora i jeśli chcecie go wypróbować! Mógłbym nawet rozważyć wydanie go na kartridżu. Czemu nie? Tworzenie tak szalonych projektów to świetna zabawa!
Chwała konkursowi Basic 10-Liner za inspirujące wyzwania! Do zobaczenia za rok... w kolejnym konkursie!
Gdzie można zagrać w Roguelike 10?
Możecie ją pobrać lub grać w przeglądarce internetowej na stronie: https://commocore.itch.io/roguelike-10
Udanej próby przetrwania w lochach... w dziesięciu linijkach!
Udanej próby przetrwania w lochach... w dziesięciu linijkach!