Z ogromną przyjemnością chciałbym przedstawić Wam moją grę wysłaną na konkurs ABBUC Software Contest 2023.
Time Wizard jest platformową grą, w której gracz posiada zdolność manipulacji upływem czasu.
Historia z gry: Roboty z przyszłości próbują zmienić historię, żeby rządzić światem. Jedynym ratunkiem dla ludzkości jesteś ty, Time Wizard (Czasodziej ;)). Musisz udać się do przyszłości, do świata robotów, żeby zapobiec katastrofie. Twoim zadaniem jest zebranie całej energii zgromadzonej w klepsydrach, żeby roboty nie mogły cofnąć się w czasie. Misja jest trudna, ale twoją przewagą jest umiejętność manipulacji czasem. Możesz go zatrzymać, cofnąć albo przewinąć do przodu. Bądź jednak czujny! Niektóre obiekty są odporne na manipulację czasem i nie możesz ich kontrolować.
Podczas gry naciśnij przycisk w dżojstiku, żeby zacząć manipulację czasem. Kiedy przycisk jest wciśnięty przesuń w lewo, żeby cofnąć czas lub w prawo, żeby przywrócić zapisaną historię. Możesz zmieniać tempo upływu czasu poprzez wychylenie dżojstika w lewo lub prawo. Zwolnij przycisk, żeby przywrócić normalny upływ czasu. Jeśli zginiesz, naciśnij przycisk i wychyl dżojstik w lewo, żeby cofnąć czas. Naciśnij klawisz Start, żeby zrestartować poziom. Naciśnij klawisz Select, żeby przejść do główngo ekranu.
Dodatkowe informacje: Na głównym ekranie jest możliwość wyboru jednego z 15-tu poziomów. Na początku wszystkie poziomy za wyjątkiem pierwszego są zablokowane. Musisz przejść dany poziom, żeby odblokować następny. Aby to zrobić należy zebrać wszyskie klepsydry a następnie przejść do portalu czasowego. Masz ograniczony czas na zaliczenie poziomu, ale pamiętaj, że zawsze możesz cofnąć czas jeśli tego potrzebujesz. Czas, którego nie wykorzystasz jest wynikiem danego poziomu. Im więcej, tym lepszy wynik. Wartość sumaryczna ze wszystkich poziomów jest twoim całkowitym wynikiem widocznym na ekranie głównym.
Minimalne wymagania: Komputer lub emulator Atari 8-bit z co najmniej 128kB RAM. Dodatkowa pamięć RAM jest wykorzystywana do zapisywania i odtwarzania historii gry. Dżojstik albo inny kontroler wpięty do portu 1. Rekomendowane jest odblokowanie zapisu na dyskietce, żeby zachowywać wyniki oraz informację o aktywnych poziomach.
@VLX >Wydanie na cartridge? Tak tylko pytam... :) Nie wykluczam. Jeśli będzie takie zainteresowanie w przyszłości to kto wie...
@Peri Noid >Rozumiem, że dostępność tradycyjnie dopiero po rozstrzygnieciu konkursu? Tak, grę będę mógł udostępnić dopiero po ogłoszeniu wyników konkursu czyli pewnie gdzieś na początku listopada. Chyba, że jesteś członkiem ABBUC, to otrzymasz wcześniej. Ja nie jestem.
@maly_swd >Ale od kiedy na Abbuc można wystawiać gry na Amigę? Oops, chyba odkryłeś całą prawdę o filmiku ;)
@ilmenit >Mały Braid :-) Tak, inspiracja jest dość oczywista. Ale zależało mi na przygotowaniu gry o nieco innym charakterze i elementach. Mam nadzieję, że się udało.
Nie można nie pochwalić - elegancko to się zapowiada i rzeczywiście to co bije po oczach do dopracowanie szczegółów. To jak pojawia się level, ekran "intermissinon", menu. Widać kupę roboty włożoną w te elementy, których zazwyczaj programistom nie chce się robić (tzn. przynajmniej mi).
Będąwszy w latach 80. z takim oprogramowaniem byłbyś królem programistów Atari.
@Mq >Powodzenia w konkursie, trzymam kciuki. Dzięki :)
@mgr_inz_rafal >Będąwszy w latach 80. z takim oprogramowaniem byłbyś królem programistów Atari.
Podoba mi się to stwierdzenie, ale... 1. W latach osiemdziesiątych nie było Internetu i forów takich jak AtariOnline lub AtariAge, więc nie miałbym skąd czerpać wiedzy. 2. W latach osiemdziesiątych nie było MadPascala oraz wielu pożytecznych bibliotek, więc byłoby mi trudniej zaprogramować grę np. w assemblerze. 3. W latach osiemdziesiątych nie było komputerów PC jakie są teraz, więc nie mógłbym tak łatwo tworzyć oprogramowania z użyciem np. emulatora z wbudowanym debuggerem. 4. W latach osiemdziesiątych nie było takich gier jak Braid, więc nie miałbym odpowiedniej inspiracji. 5. W latach osiemdziesiątych nie miałem komputera (tzn. miałem od 1989 roku moje Atari 130XE z magnetofonem). 6. W latach osiemdziesiątych chodziłem do podstawówki i moje pojęcie o programowaniu było praktycznie żadne.
@slaves >Amarok, ile czasu zajęła produkcja? Trudno ocenić ile realnie spędziłem czasu, na pewno było to wiele wieczorów i zarwanych nocy od marca do lipca tego roku.
dokładnie takich gier brakło w przeszłościowie. dałbyś radę jakoś time wizardować i wysłać grę w 1988? chylę czoła. bardzo fajne logo madpaskala btw. jakbym był tebe to bym używał wszędzie.
@amarok: Skoro tak bardzo proszą... umieść w grze informację 5 pierwszych osób które nadeślą opis zakończenia gry do 1 lipca 1988 roku otrzyma specjalny egzemplarz Twojej następnej gry. A w grze napisz kopyrajt i w ogóle 1988 :) I o!
Too bad, that the Apple Macintosh in 1984, the Atari ST in 1985 and the Amiga in 1985/86 appeared... so in 1988 you cannot stop the 16Bit era, as it is already there.
If I had a time machine (or a Time Wizard) I would go back to the early 80s and make sure that IBM BIOS is well copy-protected, patented and trademarked - and anyone trying to copy it will be sued. As a result, no IBM-compatible computers will enter the market and this will change the future or better the present as we know it today... ;-)
Dla zainteresowanych mam garść technicznych informacji na temat gry Time Wizard. Przy okazji chciałbym podziękować całej społeczności Atari za ogrom wiedzy, którą chętnie się dzielą. W szczególności wyróżniłem niektóre osoby, których narzędzia użyłem podczas tworzenia mojej gry.
[Czas trwania projektu] Prace nad projektem zajęły mi mniej więcej 5 miesięcy od końca lutego do końca lipca. Historia gita zawiera 175 commitów, które zostały wprowadzone w przeciągu 93 dni.
[Środowisko programistyczne] Gra została zaimplementowana w MadPascalu, któego autorem jest Tomasz Biela (@tebe). Moje środowisko programistyczne to Visual Studio Code z rozszerzeniem do Pascala, którego autorem jest Allesandro Fragnani. Kod źródłowy zajmuje około 10k linii, w tym około 2k to kod w assemblerze. W assemblerze zaimplementowałem głównie obsługę przerwań, silnik dźwiękowy oraz najbardziej krytyczne elementy wymagające szybkich obliczeń. Kod wynikowy, czyli plik xex zajmuje niecałe 54 kB pamięci a całość znajduje się na dyskietce 90 kB i uruchamiana jest pod kontrolą systemu DOS 2.5.
[Środowisko testowe] Do testowania i debugowania programu wykorzystywałem emulator Altirra, którego autorem jest Avery Lee (@phaeron). Użyłem także swojego wysłużonego komputera Atari 130XE z SIO2PC jako emulator stacji dyskietek.
[Grafika tytułowa i końcowa] Ekrany tytułowy oraz końcowy (widoczny po przejściu całej gry) są wyświetlane w bitmapowym trybie Antic E. Widoczna większa ilość kolorów niż 4 jest wynikiem przerwań DLI oraz użyciem grafiki graczy i pocisków. Obrazy pierwotnie narysowałem w programie Inkscape, następnie wyeksportowałem je do bitmap o docelowej rozdzielczości dla Atari. Ostatnie szlify i korekty obrazów dokonałem w programie MS Paint. Następnie przygotowałem skrypty w Pythonie konwertujące bitmapy do wynikowych plików do Atari. W ten sposób mogłem wygenerować pliki grafiki 2-bitowej głębii kolorów do formatu Antic E jak i dane grafiki graczy i pocisków. Dodatkowo generowany jest szkielet programu obsługi przerwań DLI do zmiany kolorów oraz pozycji graczy i pocisków w poszczególnych liniach ekranowych.
[Grafika plansz] Wszystkie elementy planszy oraz elementy ponad nią są w znakowym trybie ANTIC 4. Przygotowałem w sumie 4 fonty - jeden do tekstów i elementów GUI (widocznych też w menu głównym), drugi to elementy graficzne na planszy. Pozostałe 2 fonty zawierają grafikę wykorzystywaną podczas animacji elementów na planszy. Fonty przygotowałem w programie Atari Font Maker, którego autorami są Martin Šimeček (@matosimi) oraz Peter Hinz (@RetroCoder).
[Grafika bohatera] Bohatera jest rysowany przy pomocy grafiki graczy pocisków - całkowity rozmiar bohatera to 10x18 pikseli. Wykorzystałem nałożenie na siebie odpowiednich par graczy i pocisków, żeby uzyskać więcej kolorów. W sumie powstało 36 klatek animacji zawierających różne elementy ruchu bohatera. Do projektowania grafiki użyłem edytora SprEd, którego autorem jest Wojciech Bociański (@bocianu).
[Muzyka i dźwięki] Jedną z idei gry Time Wizard jest możliwość przewijania czasu gry w tym odtwarzanych efektów dźwiękowych i muzyki. Zdecydowałem się na stworzenie prostego silnika umożliwiającego odtwarzanie muzyki i dźwięków z różną prędkością w tym również wspak. Silnik ten ma pewne ograniczenia i nie daje takiej elastyczności odtwarzania jak np. Raster Music Tracker w kontekście efektów, filtrów itp. Jednak w tym przypadku nie to było istotne - ważniejsze było wydajne odtwarzanie dźwięku z różnymi prędkościami. Ostatecznie 3 kanały są wykorzystywane do odtwarzania muzyki a czwarty do efektów dźwiękowych. Muzykę oraz efekty przygotowałem w programie Raster Music Tracker, którego autorami są Radek Sterba oraz Vin Samuel (@VinsCool).
Tak przy okazji, w grze można usłyszeć następujące utwory: - "Kyrie Eleison" W.A. Mozarta - "Waltz of the Flowers" P.I. Czajkowskiego - "Dance of the Little Swans" P.I. Czajkowskiego - "Voices of Spring" J. Straussa - "Sonata No. 8 Op. 13" L. Van Beethovena
[Kompresja] Gra wykorzystuje dane graficzne, dźwiękowe i inne, które zajmują sporo miejsca. Dlatego zdecydowałem się na wykorzystanie kompresji danych, żeby wszystko pomieścić w pamięci RAM. Po kilku próbach zdecydowałem się na wykorzystanie (de-)kompresora zx5, które autorami są Einar Saukas oraz Krzysztof Dudek (@xxl). Prawie 45 kB danych udało się skompresować do rozmiaru niecałych 16 kB co daje poziom kompresji na poziomie około 35%.
[Poziomy] Przygotowałem bardzo prymitywny edytor poziomów w języku Python i biblioteki PySimpleGUI. Edytor nie jest zbyt wygodny w użytkowaniu, ale nie miałem czasu na implementowanie czegoś bardziej wyrafinowanego.
I to właściwie wszystkie podstawowe informacje techniczne. Gdybyście mieli jakieś pytania, to śmiało piszcie - postaram się wyjaśnić w miarę możliwości.
@VLX, to nie jest tak do końca, że muzyka wykorzystuje tylko proste, podstawowe dźwięki. Jest możliwość zdefiniowana brzmienia danego instrumentu, ale w sposób stały nie proceduralny.
Przykładowo wyciszanie dźwięku można w RMT zrealizować w postaci jednego parametru odpowiadającego za tempo wyciszania. W moim przypadku jest to zrealizowane poprzez ustalone na sztywno i zapisane w definicji instrumentu zmiany głośności w czasie.
Dlaczego tak musiałem zrobić? Chodziło o wydajną metodę odtwarzania dźwięku dla dowolnego miejsca w czasie a nie tylko próbka po próbce, ponieważ gra może odtwarzać muzykę także wspak.
Tak więc nie wchodziło w grę obliczanie wartości dla rejestrów w sposób proceduralny. Podobnie jest ze zmianą wysokości dźwięku w czasie np. do wibarto.
Co prawda używanie muzyki klasycznej w grach atari to spora norma, to jednak szkoda, że nie pokusiłeś się (lub któryś z muzyków) o stworzenie własnych kompozycji :) choć domyślam się, że ograniczone możliwości playera zawężały liczbę osób, które chcą / mogą to ogarnąć. Natomiast z drugiej strony oczywiście granie w rewersie muzyki to kozak pomysł :) Dobra robota, czekam na pliczki do ogrania :D
@krzysztofk_atari, nie widzę przeszkód w udostępnieniu źródeł gry po zakończeniu konkursu. Sam często korzystam z kodów innych programistów i traktuję to jako materiał edukacyjny. Moje kody nie są jakoś specjalnie wartościowe, ale kto wie, może komuś się przydadzą.
@mav, zastanawiałem się czy nie spróbować skomponować czegoś własnego, ale zabrakło czasu oraz weny twórczej. W kwestii silnika do muzyki to dodam, że jest jeszcze jedno wymaganie - stała długość ścieżki oraz stałe tempo odtwarzania. To pozwala na szybkie obliczenie co dokładnie zagrać dla dowolnej ramki animacji, ale z drugiej strony ogranicza możliwości twórcze kompozytora.
amarok: napisałem wypasioną grę, gdzie cofa się czas, muzyka jest grana wspak, a w dodatkowej pamięci przechowywana jest historia, żeby można było manipulować tym czasem
też amarok: moje kody nie są jakoś specjalnie wartościowe
W sumie to na razie większość widziała tylko filmik i pewnie niewielka grupa z ABBUC miała okazję sobie zagrać. Tak więc może okazać się, że wcale nie warto wydawać gry w formie fizycznej. Jeśli jednak będzie zainteresowanie to czemu nie. :)
Dobry wzrok :) Pierwotny tytuł gry to faktycznie Kryształy Czasu.
Na początku bohater, który nie wyglądał jak czarodziej, zbierał kryształy, które swoją drogą też nie bardzo wyglądały jak kryształy.
Nie byłem zadowolony z wyglądu tych kryształów i dlatego zmieniłem je na klepsydry. Przesypujący się piasek, który dodatkowo może podlegać manipulacji czasem bardziej pasuje do koncepcji gry.
Nie podobał mi się również wygląd bohatera, był jakiś taki bez charakteru. Pokombinowałem trochę i zamieniłem go w czarodzieja. A wtedy to już była krótka droga do zmiany tytułu gry.
Może jak znajdę więcej czasu to przygotuję filmik jak gra wyglądała na poszczególnych etapach tworzenia.
@Amarok: Twój opis zasługiwał na stronę główną, więc pozwoliłem sobie go tam umieścić (po szeregu drobnych zmian, w tym poprawieniu nazwiska Bocianu :) ) ->link<-
@Adam, dziękuję bardzo za opublikowanie na stronie mojego opisu oraz wprowadzenie do niego poprawek. Jest to dla mnie wyróżnienie oraz bardzo miła niespodzianka.
W szczególności dziękuję za zwrócenie uwagi na błąd w nazwisku a szanownego Pana Bociańskiego ogromnie przepraszam za pomyłkę. Od razu poprawiłem to w poście 26-tym, żeby innych nie wprowadzać w błąd.
@tebe, dzięki za udostępnienie linku do grafiki kryształów, są bardzo ładne.
Wyglada super, ale zastanawia mnie kwestia licznika czasu planszy. Zbylu robi taki "numer" np. na planszy 6, gdzie cofa się prawie na początek rozgrywki na mapie. Przecież w ten sposób można "obejść" licznik i ukończyć mapę kilka sekund po rozpoczęciu (dokłądnie to czas od pozycji zero do wyjścia :) ) nie wiem, czy to bug, czy feature, ale nieco zakłamuje realny licznik czasu przejścia planszy. Poza tym, wygląda na niesamowicie dopracowaną w każdym szczególe, efekty rysowania plansz niczym przejścia z programu montażowego :D Możliwe, że bym taką grę kupił, zaraz po Tensorze. Czapka z głowy, winszuję. Życzę powodzenia w konkursie!!
@mav, nie zawsze jest możliwość "obejścia" licznika. Wszystko zależy od tego czy obiekty są odporne na manipulację czasem czy nie. Może zdarzyć się, że zbierzesz klepsydrę a jak cofniesz czas to klepsydra wróci na swoje miejsce.
@zbylu, gratuluję wytrwałości w ogrywaniu Time Wizard!