Tatsächlich geht es mir auch um Rollenspiele.
Da Du DDD erwähnst, gehe ich davon aus, daß Du die Ultima-Darstellung meinst, bei der die Landschaftsanzeige aus 11x11 Kacheln besteht, wobei jede Kachel 2x2 Zeichen groß ist. Das Landschaftsscrollen erledigst Du am besten in Assembler. Ich meine mich zu erinnern, daß DDD für die Berechnung der Sichtbarkeit der Kacheln ebenfalls auf eine Assemblerroutine zurückgegriffen hat. Die Frage wäre, wie gut Deine Assemblerkenntnisse sind, um solch eine Scrollroutine zu schreiben. (Besonders schwierig ist es nicht.)
Was die Speichereinteilung anbelangt, so würde ich Dir zu dem oben genannten Modell raten, d. h. die Landschaft wird ab $a000 abgelegt. Bei $cc00 befindet sich der neue Zeichenspeicher (Textram) und ab $e000 könnte man einen neuen Zeichensatz ablegen. (Ich vermute mal, Du möchtest wie bei DDD den Zeichensatzmodus verwenden trotz aller Einschränkungen und nicht wie Ultima die Hires-Bitmap-Darstellung.)
Normalerweise wird bei solchen Rollenspielen die Karte beschränkt auf eine Größe von 32x32 oder 64x64, wobei ein Byte einer bestimmten Kachel (wie z. B. Mauer oder Wald) entspricht. Für eine Karte von 32x32 benötigt man folglich 32*32=1024 Bytes = 1 kb. Oder halt 64*64 = 4096 Bytes = 4 kb.
Große Landschaften wie z. B. die Außenwelt würde man in verschiedene Karten zerstückeln. Die einzelnen Kartenteile werden dann automatisch nachgeladen, wenn die Spielfigur eine Karte verläßt. Hierbei muß rundherum ein Rand definiert werden von 5 Kacheln, die zwar angezeigt, aber nicht betreten werden können. Dieser Rand ist identisch mit den ersten 5 Kacheln der umliegenden Karten, d. h. an dieser Stelle überlappen sich die Karten. Wird die Spielfigur in die Randzone bewegt, wird die neue Karte geladen, die ihrerseits eine Randzone von 5 Kacheln hat, die der alten Karte entsprechen. (Ich hoffe, das war klar genug ausgedrückt...
)
Bei DDD wird zu jeder Stadt auch stets ein neues Basicprogramm geladen, weshalb die Tastenkommandos auch unterschiedlich sind. Das gesamte Spiel besteht also aus jeder Menge einzelner Basicprogramme. Da sollte man sich vorab genau überlegen, welche Programmteile in jedem Basicprogramm vorkommen, und ob man diese nicht vielleicht in Assembler schreibt und in eine Programmbibliothek packt, die dann bei $c000 liegt.
Was die Ausgabe von Text auf dem Bildschirm betrifft, so kann man die Zeiger für den Textspeicher in der Zeropage etc umändern, so daß die Kernal-Zeichenausgabe auch für den verlegten Textspeicher bei $cc00 verwendet werden kann. Es fragt sich jedoch, ob nicht auch hier eine Zeichenausgabe in Assembler die bessere Wahl ist, da man hierbei gleichzeitig einen automatischen Wortumbruch einbauen kann, so daß man sich später beim Programmieren von Textnachrichten nicht mehr darum kümmern muß. Schreibt man die Ausgabe in Assembler, so bietet es sich an, einer Variablen in Basic, z. B. S zu Beginn des Programms den Wert der Sprungadresse in der Sprungliste für diese Routine zuzuweisen. Im Programm selbst braucht man dann nur noch zu schreiben SYS S"Text...", und die Assemblerroutine liest direkt aus dem Basic-Programm die Textnachricht heraus und schreibt sie auf den Bildschirm.
Aber da ich weder am C64 beruflich programmiert habe und ich denke, dass auch bei vielen Indiegame-Entwicklern die Planung (anfangs) hinten an steht, ist mein Punkt schon valide.
Davon möchte ich dringend abraten. Ein Rollenspiel ist schon ein großes Programm. Ohne ausreichende Planung vorab geht da gar nichts. Es gibt mehrere Sachen, die Du unbedingt geklärt haben mußt, bevor Du auch nur eine Zeile programmierst:
- Was genau soll Dein Programm machen. Welche Tastendrücke/Menüs soll es geben? Was soll passieren?
- Wie sieht die Anzeige aus? Wo steht was auf dem Bildschirm?
- Wie sehen die Algorithmen aus für die Kämpfe? Welche Spielmechanik soll verwendet werden?
- Welche Ausrüstungsgegenstände gibt es? Welche Charakterattribute? Was bewirken sie?
- Welche weitere Elemente sollen verwendet werden? Nahrung wie bei Ultima? Tag- und Nachtzyklus? Eingeschränkte Sichtbarkeit der Landschaft?
- Wie ist die Landschaft organisiert? Gibt es nur eine große Karte oder wird beim Betreten einer Stadt etc in die Karte gezoomt?
- Welche Gegner gibt es? Wie werden diese gehandhabt? Wann erscheinen sie? Wie verhalten sie sich?
- Wie funktioniert die Interaktion mit NPCs? Erscheinen bei Kontakt fertige Menüs, z. B. zum Kaufen von Gegenständen oder zur Auswahl von bestimmten Fragen, oder kann man wie bei Ultima Stichwörter eingeben, auf die die Charaktere reagieren?
- Was passiert mit Gegenständen z. B. Schatztruhen oder Pferden, die vom Spieler nicht mitgenommen werden? Verbleiben diese am Ort? Falls ja, wie wird das gespeichert? Oder verschwinden sie nach einiger Zeit?
Und noch viele weitere Grundfragen mehr. Und wie man sieht, sind dies nur technische Fragen und keine Fragen zum (Handlungs)Inhalt des Rollenspiels.
Nebenbei: Routinen, die man in Assembler schreiben sollte (aus Gründen der Geschwindigkeit):
- Kopieren der Karte in den Landschaftsausschnitt auf dem Bildschirm. Hierbei müssen die Kachelwerte aus der Karte in die 2x2-Kacheln umgewandelt werden.
- Falls gewünscht: Eingeschränkte Sichtbarkeit
- IRQ für Animation des Zeichensatzes (z. B. Wellen oder Feuer)
- Scrollen des Textausgabefensters
- Weitere häufig genutzte Routinen für die Ein- und Ausgabe wie z. B. Einlesen eines Strings oder Ausgabe eines Textes auf den Bildschirm.
Wie gesagt, am besten packt man eine ganze Reihe von Routinen in die Assemblerbibliothek, damit sie a) schnell ausgeführt werden, so daß das Spiel nicht zu sehr lahmt (wie das bei DDD manchmal der Fall sein kann) und b) nur einmal programmiert werden müssen und immer wieder von verschiedenen Basic-Programmen aufgerufen werden können.