Archive for the ‘roguelike’ tag
Was macht ein roguelike zu einem roguelike?
Vor einiger Zeit gab es eine Umfrage auf Andrew Doulls Seite Ascii Dreams welche Features ein roguelike unbedingt haben muss um ein roguelike zu sein. Zur Auswahl standen viele Dinge, hier eine Liste mit den am häufigsten genannten Punkten:
- Randomly generated levels 102 Stimmen (75%)
- Turn based combat 77 Stimmen (56%)
- Permadeath 77 Stimmen (56%)
- Character advancement 68 Stimmen (50%)
- Overhead view 53 Stimmen (38%)
- Unknown items / identify system 48 Stimmen (35%)
- Lots of items 47 Stimmen (34%)
Da 136 Leute abgestimmt haben hat die Abstimmung durchaus etwas Gewicht und spiegelt wider was die Besucher unter einem Roguelike verstehen. ASCII Grafik kam übrigens nur auf 32 Stimmen (23%)! Zum Spass kann man diese Liste mal als Maßstab nehmen um Spiele auf ihre roguelike-heit zu untersuchen:
Diablo:
Diablo hat zufällig erstellte Level, man kann den Protagonisten immer weitere Skills verpassen, sieht von oben schräg auf ihn herab und es gibt eine Menge von Gegenständen, von denen viele erst identifiziert werden müssen bevor man ihren wahren Wert erkennt. Das macht fünf Übereinstimmungen von sieben Möglichen. Diablo kann man nach dieser Skala also gut und gerne als roguelike bezeichnen.
Dwarf Fortress:
Die meisten Leute werden wohl sagen, dass Dwarf Fortress durch seine Ascii Grafik nur den Anschein erweckt als sei es ein Roguelike. Betrachten wir nur den Fortress-Mode und machen den Test. Die Level werden zwar vom Spieler erst so richtig mit Inhalt gefüllt, aber dennoch generiert das Spiel eine riesige, zufällige, persistente Welt zu Spielbeginn. Ich würde sagen das zählt als “randomly generated levels”. Mit kann das Spiel zu jeder Zeit angehalten werden, aber im Endeffekt ist es nicht rundenbasiert. Speichern ist nur möglich wenn man das Spiel verlassen will und wenn ein Zwerg stirbt, dann ist das ziemlich permanent. Ein Punkt für die roguelikes also. In DF steuert man keinen einzelnen Protagonisten, aber oft eine ganze Horde davon, die durchaus besser auf ihrem Gebiet werden können. Noch ein Punkt fürs Roguelike. Die Ansicht der Welt kann durchaus als “overhead view” bezeichnet werden und Gegenstände gibt es in Hülle und Fülle, allerding ist von allen klar was sie machen. Nochmal zwei Punkte aufs Roguelikekonto. Alles in Allem macht das fünf von sieben möglichen Punkten und Dwarf Fortress ist genauso ein Roguelike wie Diablo.
Ihr findet Dwarf Fortress kann trotzdem nicht als Roguelike bezeichnet werden oder es fehlen noch wichtige Punkte auf der Liste? Schreibt mir!
Roguelike Programmierung
Seit einiger Zeit nun versuche ich mich selbst daran ein kleines roguelike zu schreiben. Noch gibt es nicht viel zu sehen, deswegen keine Screenshots. Nebenbei lese ich auch die entsprechende Newsgroup rec.games.roguelike.development um einen Überblick zu erhalten und Links zu Tutorials und so weiter zu finden. Eine Seite fand ich dabei besonders gut: Ascii Dreams. Der Autor entwickelt, soweit ich das richtig mitbekommen habe, ein altes Roguelike (Angband) weiter und dokumentiert dabei die wichtigsten Schritte und was ihm wichtig ist. Erst kürzlich hat er eine Reihe von Artikeln über die Levelgenerierung veröffentlicht, die sehr interessant waren.
Ich habe den ersten Schritt hinter mir und mich für eine Darstellung entschieden. Klassischerweise würde man wohl farbige Konsolenausgabe für die Grafik wählen, doch da ich mich für Java als Programmiersprache entschlossen habe fällt das flach. Java kennt keine Farbe in der Konsole und dies durch Tricks zu umgehen war mir zu aufwendig. Die zweite Möglichkeit ist eine der vielen Curses Bibliotheken zu benutzen die es so gibt. Da die meisten aber für C++ sind und ich nur eine für Java gefunden habe (JCurses) und mit dieser auch nicht besonders gut zurechtgekommen bin habe ich auch dies wieder verworfen. Entschieden habe ich mich dann für Alternative drei: Mit Hilfe von OpenGL zeichne ich einfach Quads auf den Bildschirm die die Ascii-Zeichen als Textur haben und habe somit auch gleich die volle Kontrolle über die Auflösung, verschiedene Zeichensätze usw.
Zeichnen lasse ich dann alles über VertexArrays, wobei sich nur die Arrays für die Farbe und die Textur ändern, die Geometrie ist statisch. Gerendert wird in zwei Schritten: Zuerst wird der Hintergrund ohne Textur mit Hintergrundfarbe gerendert und danach kommt nochmal ein Durchgang mit angeschalteten Texturen. In Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //render background //fill color buffer colorBuffer.position(0); colorBuffer.put(colorArrayBackground); colorBuffer.flip(); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); GL11.glEnableClientState(GL11.GL_COLOR_ARRAY); GL11.glVertexPointer(3, 0, vertexBuffer); GL11.glColorPointer(3, 0, colorBuffer); GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, resX * resY * 6); //render foreground //fill colorbuffer colorBuffer.position(0); colorBuffer.put(colorArrayForeground); colorBuffer.flip(); texCoordBuffer.position(0); texCoordBuffer.put(texCoordArray); texCoordBuffer.flip(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); GL11.glTexCoordPointer(2, 0, texCoordBuffer); GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, resX * resY * 6); GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); GL11.glDisableClientState(GL11.GL_COLOR_ARRAY); |
Die Klasse die für das Rendern zuständig ist merkt sich die Farben und Texturen der einzelnen Tiles (also die Positionen an denen ein Buchstabe oder Zeichen stehen soll), sodass nicht in jedem Durchlauf alles erneut ausgelesen werden muss.
Sobald man mal mehr als nur ein paar Debugausgaben sehen kann werde ich auch einen Screenshot posten.
English