Mein selbst programmiertes Basic-Game: Fertig jetzt!
Mein irres Projekt, ein Spiel für den C64 zu basteln, ist endlich fertig. Das ist gut so. Der Code hat eine Grösse erreicht, die nicht mehr praktikabel ist.
Es ist das am sehnlichsten erwartete Game des Jahres 2023 – für mich. Für den Rest der Welt eher nicht. Unter anderem, weil der Rest der Welt nichts davon weiss. Ausser vielleicht du, wenn du untenstehenden Beitrag gelesen oder den digitec-Podcast Nummer 136 gehört hast.
Es geht um das Spiel «Herzschmerz», das ich selbst programmiert habe. In der Programmiersprache Basic. Für den Commodore 64. Jaja, ich weiss: Der «WTF»-Faktor des Projekts ist hoch, aber das passiert, wenn Nerds nostalgisch werden. Ende 2022 war die erste Version fertig, aber eine zweite, grössere sollte folgen. Im Fazit meines Berichts schrieb ich: «Jetzt, wo ich das Fundament habe, kann ich es relativ leicht erweitern: Mehr Levels anfügen, andere Sprites einbauen und neue Gegner mit anderen Laufwegen programmieren.» In den letzten drei Monaten habe ich genau das gemacht. Allerdings war es alles andere als «relativ leicht».
Die neue Version des Spiels heisst «Die Heart» und umfasst zwanzig Levels statt nur acht. Für jedes dritte vollendete Level bekommst du ein Zusatzleben – maximal sieben. Vor allem aber sind die Gegner abwechslungsreicher.
In der ersten Version gab es nur einen Typ von Gegner – ein böse aussehender Kopf, der dich verfolgt. Es konnten höchstens zwei davon gleichzeitig auf dem Bildschirm erscheinen. Jetzt gibt es sieben Arten von Gegnern und das Spiel kann bis zu vier Gegner im gleichen Level verarbeiten.
Ein Basic-Programm eskaliert
Die Vielzahl von Gegnern und Levels hatte zur Folge, dass ich die Programmstruktur ändern musste. Das ist in Basic mühsam. Besonders bei sehr langen Programmen mit vielen Subroutinen. Subroutinen sind Programmteile, die immer wieder und von verschiedenen Stellen aus aufgerufen werden müssen. In Basic können diese nicht benannt werden, sondern du musst die Zeilennummer kennen, bei der die Routine beginnt. Diese Zeilennummern ändern sich auch immer wieder. Dies verleitet mich dazu, Subroutinen zu meiden, wenn sie nicht unbedingt nötig sind.
In der ersten Game-Version werden die Bewegungen der Verfolger direkt in der Hauptroutine berechnet. In der zweiten Version wird zuerst der Typ des Gegners abgefragt und dann die entsprechende Subroutine aufgerufen, um die Bewegung zu berechnen.
Die einzelnen Levels sind schon in der ersten Version Subroutinen. Neu rufen die Level-Subroutinen ihrerseits wieder Subroutinen auf. Diese zeichnen die Mauern und sonstigen Hindernisse der Levels. Das hat den Vorteil, dass sie nach dem Baukastenprinzip mehrfach verwendet und miteinander kombiniert werden können. Zum Beispiel habe ich einem bestehenden Level eine Wand hinzugefügt. Dadurch kannst du nicht mehr am Rand anhalten, was die Sache einiges kniffliger macht.
Das Programm umfasst etwa 500 Zeilen oder 16 Kilobytes und ist damit etwa doppelt so gross wie Version 1.
Einen Gegnertyp hab ich nicht geschafft
Ich wollte die Verfolger dahingehend verbessern, dass sie nicht mehr durch die Mauern hindurch laufen, sondern ihnen ausweichen müssen wie die Spielfigur. Die Hindernisse würden sich so stärker auf das Spiel auswirken und für mehr Abwechslung sorgen. Leider bin ich damit gescheitert.
Die dafür nötigen Berechnungen sind nicht einfach, aber ich hatte zumindest die Grundlagen nach einiger Zeit raus. Das Programm erkannte, wenn ein Gegner an ein Hindernis gelangte und änderte die Richtung.
Aus Gründen, die ich nie herausgefunden habe, funktionierte das nur, wenn das Spiel direkt in Basic lief. Sobald ich es kompilierte, wurden die Hindernisse nicht mehr zuverlässig erkannt. Manchmal ja, manchmal nein, ohne erkennbare Systematik.
Eine Kompilierung ist unbedingt nötig, weil das Spiel in Basic viel zu langsam läuft. Damit ist die Idee gestorben.
Musik? Vergiss es
Liebend gerne hätte ich das Game mit einem selbst komponierten Chiptune hinterlegt. Der C64 eignet sich gut dafür. Aber dafür hätte ich das Spiel in Assembler programmieren müssen.
Es ist zwar möglich, Musik in Basic zu erzeugen, aber es ist kompliziert und vor allem kann sie nicht im Hintergrund laufen. Ich hätte also in der Hauptroutine immer mal wieder die Erzeugung eines Tons einstreuen müssen. Es wäre unmöglich gewesen, das mit dem richtigen Timing hinzukriegen. Ausserdem würde der Code dadurch unverständlich.
Herunterladen und spielen
Wenn du bis hierher gelesen hast, willst du das Game wohl auch ausprobieren. Du kannst es hier herunterladen. Die entzippte .d64-Datei ziehst du am einfachsten in das Drag-and-Drop-Feld des Online-Emulators. Alternativ gibt es auch Offline-Emulatoren wie VICE.
Falls du es spielst, würde mich dein Feedback interessieren. Ist ein bestimmtes Level zu leicht oder zu schwierig? Oder das Spiel als Ganzes? Macht es überhaupt Spass? Wenn ja, wie lange?
Mir hat das Entwickeln – abgesehen von der erfolglosen Hinderniserkennung – Spass gemacht. Mit zunehmender Programmgrösse wird es jedoch immer mühsamer. Darum betrachte ich das Game nun als fertig – auch wenn ich bestimmt noch viel verbessern könnte.
Durch Interesse an IT und Schreiben bin ich schon früh (2000) im Tech-Journalismus gelandet. Mich interessiert, wie man Technik benutzen kann, ohne selbst benutzt zu werden. Meine Freizeit ver(sch)wende ich am liebsten fürs Musikmachen, wo ich mässiges Talent mit übermässiger Begeisterung kompensiere.