Die Zwergenfestung Tarn Adams spricht über die Spieleentwicklung

Bild

Eine der besten Möglichkeiten, leistungsstarke Prozessoren für Unterhaltungszwecke zu verwenden, war lange Zeit Dwarf Fortress - ein Spiel, bei dem die ganze Welt aus ASCII-Zeichen besteht und das gerne ein Gigabyte Speicher und einen großen Teil der Prozessorzeit verbraucht.

Aber im Gegensatz zu einigen anderen Spielen hat die Spielerin im Fall von DF das Gefühl, dass sie wirklich alles braucht, was sie benötigt. Ihre detaillierten Berechnungen erschaffen eine ganze Welt mit Gebäuden, Städten, Kaufleuten, Flüssen, Vulkanen, Monstern und natürlich Gnomen. Wenn eine Person all dies erschaffen würde, wäre dies eine großartige Leistung. Dwarf Fortress ist ein Programm, das all diese Objekte selbst erstellt.

Der Autor des Spiels, Tarn Adams, erklärte sich bereit, unsere Fragen zu seiner Kreation zu beantworten, die trotz vieler Imitationen immer noch ein völlig einzigartiges Spiel ist.

Gamasutra: Wir haben gehört, dass Dwarf Fortress auf Steam und itch.io in einer kostenpflichtigen Version mit einer vereinfachten Oberfläche herauskommt. Sie sagen, dass dies auf Ihre bevorstehenden Behandlungskosten zurückzuführen ist. Ist es für einen Indie-Entwickler schwierig, über Wasser zu bleiben?

Adams: Ja, Sie müssen sich viel Mühe geben, um das Geschäft nicht zu verlassen, und fast alle Entwickler sind gezwungen, kreative Wege zu finden, um Miete und andere Grundbedürfnisse bezahlen zu können. Und manchmal stoßen Sie auf Probleme, die Sie nicht bewältigen können. Bisher hatten wir Glück, aber wir müssen uns im Laufe der Zeit ändern: Kündigen und einen neuen Job bekommen, zu Patreon wechseln und jetzt bei Steam jucken oder Bleistiftzeichnungen zeichnen, was weit davon entfernt ist, Videospiele zu erstellen.

Wie sieht Ihre tägliche Code-Erstellung für die Zwergenfestung aus? Welche Sprachen benutzt du? Welche Bibliotheken? Welche IDEs, wenn Sie sie verwenden? Auf welchem ​​Computer entwickeln Sie das Spiel?

Ich arbeite an einem normalen, unauffälligen Toshiba-Laptop mit Windows 10. Ich schreibe Code auf einem schrecklichen C / C ++ - Mix in der MSVC-Community. Für die Legacy-Version verwende ich OpenGL, für die Hauptversion SDL und für den Sound FMod. Ich verwende unter Windows nichts anderes, mit Ausnahme eines Teils der Header von MSVC (und früher), die ich seit Jahrzehnten verwende. Ich weiß nicht genau, was in den Linux / Mac-Versionen passiert, da ich sie nicht regelmäßig entwickle.


Die Zwergenfestung befindet sich seit fast 17 Jahren in der Entwicklung, und ihre Codebasis muss gigantische Ausmaße erreicht haben. Auf meinem Computer erfordert das Erstellen einer Welt mit Standardeinstellungen mehr als 1,2 Gigabyte RAM. Das Problem bei solchen Megaprojekten ist, dass sie zu groß werden und nicht vollständig in das Gehirn passen. Mit welchen Strategien halten Sie das Projekt für die Arbeit verständlich und verständlich?

Ich habe ein striktes Benennungssystem und speichere keine langen Namen von Variablen und Funktionen, sodass auch nach einigen Jahren alles lesbar ist. Im Allgemeinen versuche ich, mich selbst um die Zukunft zu kümmern. Alle meine Kommentare im Code zielen darauf ab. Ich benutze aktiv die Funktion "In Dateien suchen". Es gibt jedoch Situationen, in denen ich erneut herausfinden muss, was passiert, beispielsweise wenn das alte System erweitert oder der Fehler behoben wird. In diesem Fall kann die Recherche nur eine Stunde oder länger dauern. Dadurch kann ich zusätzliche nützliche Kommentare hinterlassen, über die ich anfangs nicht nachgedacht habe.

Ich erinnere mich, dass Threetoe (Tarns Partner in der Spieleentwicklung) Geschichten schreibt und Sie dann versuchen, eine Spiel-Engine zu erstellen, in der sie passieren können. Es scheint mir immer noch, dass dies eine inspirierende Art zu arbeiten ist. Waren die Geschichten, die Sie abgelehnt haben, zu kompliziert, um sie umzusetzen? Ist es jemals passiert, dass die Handlung eines von ihnen im Spiel vollständig wiederholt wurde?

Ha, ich denke in gewisser Weise sind sie alle zu kompliziert. Charaktermotivationen, Ziele setzen usw. bleib zurück, wie sie in Geschichten passieren. Dies ist jedoch immer noch ein nützlicher Prozess, da es immer leichtere Elemente zum Generieren von Verlauf gibt. Darüber hinaus können wir uns der grundlegenden Mechanik der Charaktere nähern, auch wenn wir sie nie erreichen.

Wikipedia sagt, dass die Versionsnummer des Spiels (jetzt .44) zeigt, wie weit Sie vom Abschluss entfernt sind (d. H. 44%). Was erwartet die Zwergenfestung in der Zukunft? Haben Sie Vorahnungen darüber, was passieren wird? Welche ernsten Aspekte müssen Sie noch umsetzen?

Ich beende die Veröffentlichung mit den Bösewichten, die in den nächsten Monaten veröffentlicht werden. Er sollte ziemlich neugierig sein. Dann werden wir die Grafiken implementieren und die Benutzerfreundlichkeit des Spiels für Versionen auf Steam / itch verbessern. Dann werden wir den Belagerungsprozess verbessern und weitere Arbeiten ausführen und dann zu Big Wait übergehen. Dies ist die größte Umstrukturierung und Erweiterung in der Geschichte von DF . Es wird uns ermöglichen, Mythen über die Schöpfung zu generieren und vollständig prozedurale Magiesysteme zu schaffen sowie mehrere Fenster zu öffnen, um verschiedene Teile der Welt usw. zu betrachten. Dies wird eine großartige Ergänzung sein. Dann wird es eine Freigabe mit Eigentum / Gesetzen / Zoll geben. Danach steht die Reihenfolge noch nicht fest, aber wir werden an der Wirtschaft, den Schiffen und anderen wichtigen Komponenten arbeiten, die noch nicht verfügbar sind. Wir haben noch viel zu tun! Wir sind noch nicht einmal auf halbem Weg zu Version 1.0 gegangen. Aber Version 1.0, die Entwicklung des Spiels wird nicht wirklich enden ... vielleicht werden wir zum Zeitpunkt seiner Veröffentlichung einfach nicht mehr viel Zeit haben.


In Spielen besteht ein Gleichgewicht zwischen Handlung und Simulation, zwischen einer vorab geschriebenen Geschichte, die in den meisten Spielen enthalten ist, und der Schaffung einer tiefen Welt mit einer Reihe von Regeln, nach denen viele verschiedene Geschichten entstehen können. Ich würde sagen, dass die Zwergenfestung eines der schwerwiegendsten Argumente für die Simulation ist. Tun die Charaktere in der Phase der Generierung der Welt oder während des Spiels etwas, das Sie sogar überrascht? Können Sie interessante / eingängige Beispiele nennen?

Ja, das passiert die ganze Zeit! Dies liegt zum Teil daran, dass es beim Spielen schwierig ist, alle Regeln zu beachten. Alle meine denkwürdigen Geschichten sind jedoch Fehler, da ich selten die Gelegenheit habe, das Spiel lange genug zu spielen. Aus Sicht des unabhängig auftretenden Gameplays sind sie daher von geringem Interesse (auch wenn sie mich überraschen). Gute Geschichten finden Sie in Foren, Streamern und so weiter.

Die Grenze zwischen Mikro und Makro: Warum hast du es so gemacht, zwischen dem, was die Gnome selbst können und dem, was der Spieler den Festungen befiehlt?

Dies ist ein schwieriges Gleichgewicht, und es ist nicht immer leicht aufrechtzuerhalten, aber im Moment ist das Konzept, dass der Spieler der „offizielle Sprecher des Willens der Festung“ ist und die Zwerge Autonomie zeigen, die außerhalb ihrer offiziellen Pflichten vorhanden sein sollte. Dies ermöglicht es ihnen, Akteure in ihren eigenen Geschichten zu sein, die die Hauptquelle der aufkommenden (aufstrebenden) Erzählung sind. Gleichzeitig sollte der Spieler in der Lage sein, den Hauptfluss seines Teils des Spiels zu steuern (dies ist zwar nicht kritisch, aber oft interessanter als das Beobachten der Simulation).

Diese beiden Ziele können in Konflikt geraten, und dies ist häufig darauf zurückzuführen, dass der Spieler das Spiel weiterhin genießt. Wenn beispielsweise der Nothebel wirklich abgesenkt werden muss, kann das Aufgabenprioritätssystem den Gnom praktisch dazu bringen, dies autonom oder nicht zu tun, je nachdem ob er davon „wissen“ sollte oder nicht. In der Vergangenheit hatten wir Probleme, zu viel Bürokratie hinzuzufügen, als wir beispielsweise einen Quartiermeister-Zwerg hatten, der an der Lieferung der Ausrüstung beteiligt war. Aber dieses System war zu langsam, anfällig für Fehler und verwirrte Spieler. Es ist sehr wichtig darüber nachzudenken, wie jede einzelne Spielmechanik potenzielle Geschichten hinzufügen kann, und der Quartiermeister spielte dabei fast keine Rolle.

Welche Schritte unternimmt das Programm, um die Welt aufzubauen?

Sie reserviert Speicher für die Karte. Dann wählt sie aus, welche Stange sie haben soll (zum Beispiel Nord, Süd) (oder berücksichtigt die vom Spieler übergebenen Parameter). Der Samen des Zufallszahlengenerators legt die Grundwerte der Kartenfelder (Höhe, Niederschlag, Temperatur, Entwässerung, vulkanische Aktivität, Wildtiere) für ein Gitter variabler Größe unter Berücksichtigung verschiedener Parameter (Ozeane, Inselgrößen, andere Variabilität) fest, und das Programm füllt sie dann fraktal aus. Die Temperaturänderung hängt von den Polen ab, und das Programm wählt Punkte für die höchsten Spitzen aus. Hier macht sie den ersten Durchgang, um zu sehen, wie der Prozess ausgeführt wird, und versucht, die Höhen so zu ändern, dass die Karte in die gewünschten Parameter passt. Wenn die Welt zu diesem Zeitpunkt nicht korrigiert werden kann, wird sie verworfen und alles beginnt von neuem.

Dann wird das erste abgeleitete Feld festgelegt - Vegetation - abhängig von der Höhe, der Niederschlagsmenge, der Temperatur usw. Das Programm prüft, ob die Biome den in den Parametern angegebenen Intervallen entsprechen. In diesem Stadium werden die Höhen des mittleren Niveaus geglättet, um flachere Bereiche zu schaffen, und Vulkane werden entsprechend dem Feld der vulkanischen Aktivität platziert.

Dann gehen wir weiter zur Erosions- und Flussbühne. Kleine Ozeane werden entwässert, das Programm findet die Ränder der Berghänge, von denen aus es Testflüsse laufen kann. Außerdem hat sie eine Kamera an einer von ihnen, damit der Spieler den Vorgang verfolgen kann. Viele gefälschte Flüsse fließen von diesen Punkten herab und brechen Kanäle, wenn sie keinen Weg zum Meer finden. Zu hohe Höhen werden manchmal abgeflacht, damit die gesamte Karte nicht zu Canyons wird. Idealerweise müssten hierfür mineralische Substanzen verwendet werden, aber bisher verwenden wir sie nicht. Seen wachsen an mehreren Stellen in den Flüssen.


Die Höhen werden wieder von den Bergen bis zum Meer geglättet, und für Gipfel und Vulkane werden lokale Anpassungen vorgenommen. Nach Abschluss der Höhenerstellung nimmt das Programm Anpassungen der Niederschlagsmenge basierend auf Regenschatten und Niederschlag in den Bergregionen vor. Basierend auf der Höhe und dem Niederschlag sowie der einschränkenden Wirkung der Wälder werden die Temperaturen neu eingestellt. Anschließend verwendet das Programm die neuen Werte, um den Vegetationsgrad endgültig festzulegen. Die Salzgehaltswerte werden für den Ozean und seine benachbarten Kacheln festgelegt.

Nachdem wir uns für all dies entschieden haben, können wir nun die Grenzen der letzten Bereiche der Biome finden, um ihnen Namen und Persönlichkeit zu geben. Hier fügen wir auch geologische und unterirdische Schichten hinzu, obwohl, wie oben erwähnt, geologische Informationen früher hinzugefügt werden sollten. Als nächstes wird der endgültige Überprüfungsprozess für die Einhaltung der Parameter durchgeführt, um sicherzustellen, dass wir nicht zu sehr von den Abweichungen des Spielers abweichen. Danach generiert das Programm die ersten Populationen der Tierwelt für jede Region und legt die Wettervariablen fest.

Die Geschichte selbst beginnt in diesem Moment. Dann werden Zivilisationen und Höhlen lokalisiert. Es ist ziemlich schwierig zu erklären, was als nächstes passiert, aber die Hauptidee ist, dass ein riesiges strategisches Spiel mit null Spielern mit eher willkürlichen Bewegungsregeln und schlechter KI (aber mit Tausenden von Agenten) simuliert wird, basierend darauf, welche Geschichte geschrieben wird. Die prozedurale Generierung von Storys mithilfe der Simulationsprotokollierung ist ein vollständig funktionierender Ansatz, hat jedoch auch Nachteile. Dies ist ein großer Arbeitsaufwand. Es ist erforderlich, eine Nachbearbeitung und ein Studium durchzuführen, um gute Punkte zu finden, die Sie hervorheben möchten. Wenn die Dynamik und die Mechanismen nicht ausreichen, ist das Ergebnis möglicherweise langweilig.

Was mir an DF am besten gefällt, ist, dass das Spiel kein explizites Trefferpunktesystem enthält. Alles, was mit der Stärke und dem Schaden des Charakters zusammenhängt, ist Teil eines komplexen Modells von Körperteilen. Was sind die Vorteile eines solchen Systems? Wenn jemand beschließt, etwas Ähnliches zu schaffen, welche Hindernisse kann er dann erwarten?

Dieses Modell erstellt detailliertere Plotmomente, langfristige Konsequenzen und bietet eine bessere Systemkonnektivität. Es ist leicht, zu weit zu gehen, und wir sind an einigen Stellen wirklich zu weit gegangen, zumindest zum gegenwärtigen Zeitpunkt - einige Eigenschaften von Materialien werden nirgendwo anders verwendet. Darüber hinaus gibt es Möglichkeiten, das System zu entschärfen. Beispiele hierfür sind Spiele, in denen beispielsweise ein gemeinsamer Pool von Verschlusszeit / Energie / Trefferpunkten vorhanden ist. Bestimmte Wunden entstehen jedoch entweder durch kritische Treffer oder als Folge des Erreichens von Null- oder Nullwerten im Pool. Die richtige Systemauswahl hängt vom Spiel ab. Wir bemühen uns, Zahlen so wenig wie möglich zu verwenden, da Zahlen normalerweise nicht gut zu Geschichten passen.

Wie sieht die Hauptspielschleife aus?

Nehmen Sie zum Beispiel den Gnomenmodus. Es beginnt mit der Überprüfung von Anzeigen und dem Lesen von Autosaves usw. Der größte Teil des restlichen Zyklus findet nicht in jeder Maßnahme statt. Zum Beispiel überprüft das Programm nach jeweils hundert Uhren zugewiesene Aufgaben und „seltsame Stimmungen“. Armeen bewegen sich auf der Weltkarte. Nach jeweils hundert Uhren verarbeitet das Programm die den Zwergen übertragenen Aufgaben. Dies ist eine Art unsichtbare Auktion, mit der verschiedene widersprüchliche Prioritäten verwaltet werden. Alle zehn Ticks ändern sich die Jahreszeiten, was sich auf das Wetter und die Karte (sowohl vor Ort als auch auf der ganzen Welt) auswirkt. Außerdem wird die Entwicklung von Handlungselementen (Diplomaten, Belagerungen usw.) überprüft und überprüft, ob das Fort noch lebt.

Dann übernimmt das Programm, was in jeder Maßnahme getan wird. Flüssigkeiten bewegen sich und andere Informationen der Kartenkacheln ändern sich (es gibt jedoch verschiedene Optimierungen, so dass nicht jede Kachel bei jeder Bewegung überprüft werden muss; außerdem gibt es Flags, mit denen Sie ganze Bereiche der Karte überspringen können, wenn nichts in ihnen passiert ist.) Die Bewegung von Raubtieren wird aktualisiert und verarbeitet andere „Ereignisse“ der Karte, zum Beispiel aktive Brände.

Wenn die Flagge gesetzt ist, erhalten die verwundeten / durstigen / hungrigen Gnome, die nicht auf sich selbst aufpassen können, ein Update. Tote Zwerge „denken“ an ihre Bestattungsrituale, damit diese Aufgaben anderen zugewiesen werden können. In Zellen und Ketten eingeschlossene Wesen aktualisieren regelmäßig ihre Gedanken und Situationen.

Wenn die Kreaturen dann die Ränder der Karte überqueren, werden sie von ihr entfernt.


Alle fünfzig Maßnahmen werden die Informationen aller Tavernen, Tempel, Bibliotheken usw. in Abhängigkeit von anderen Maßnahmen aktualisiert. Lieferungen, auch abhängig von anderen Maßnahmen, funktionieren ähnlich. Ebenso die Erstellung von Aufgaben zur Speicherung. Trotz der Tatsache, dass dieser Prozess durch verschiedene Optimierungen ergänzt wird, ist er immer noch recht langsam und ab einem bestimmten Punkt können über 50.000 Steine ​​Probleme verursachen.

Alle tausend Takte werden Objekte, die zum Löschen aus dem Spiel markiert wurden, tatsächlich gelöscht, und der ihnen zugewiesene Speicher wird freigegeben. Dies geschieht häufiger bei Objekten, einmal alle fünfzig Maßnahmen, sowie bei der Überprüfung der Nutzung von Gebäuden (im Grunde handelt es sich um Aktualisierungen für Brunnen und einige andere Flaggen, die häufig überprüft werden müssen).

Als nächstes führen wir ein weiteres Update durch, das in jeder Maßnahme funktioniert. Von der Waffe abgefeuerte Granaten werden entfernt. Die Aktionen (vom Tanz- und Kampfsporttraining bis zum Geschichtenerzählen) werden nach Bedarf aktualisiert. Zwerge und andere Kreaturen treffen Entscheidungen und führen ihre Sofortaktionen aus (Umzug auf ein benachbartes Plättchen, Arbeiten in einer Werkstatt usw.) - der Hauptteil ihrer KI (mit Ausnahme der Auswahl von Aufgaben) wird hier ausgeführt.

Alle hundert Maßnahmen verderben Gegenstände. Jede Messung des Vegetationswachstums wird durchgeführt (obwohl es viele Abhängigkeiten und Flaggen gibt). Falls erforderlich, wird der Zustand der Gebäude in jeder Messung aktualisiert und die Wagen werden bewegt. Fortschritt auf Transportwegen. Die Temperatur wird aktualisiert (es gibt hier viele Optimierungsflags, aber bisher ist dies noch ein ziemlich langsamer Prozess.)

Schließlich wird die Kamera entsprechend der Kreatur aktualisiert, die der Spieler beobachtet.

Die Zwergenfestung verwendet eine gitterbasierte Kachelkarte, um die Welt darzustellen, eine einfache und effiziente Art, sie darzustellen. Mir ist aufgefallen, dass es viele Möglichkeiten gibt, Fliesen zu zeichnen, und dies hängt davon ab, was die Kreatur tut oder wie sie sich anfühlt, wie viele Elemente sich auf der Fliese befinden, ob sich etwas darüber befindet, ob die Fliese fließendes Wasser ist oder unter einem Stein vergraben ist. Was macht DF , wenn er entscheidet, wie die Kachel angezeigt werden soll? Wie haben Sie diesen Prozess optimiert?

Es ist nur ein Symbol (Byte) mit ein paar weiteren Farbbytes, daher ist das System überhaupt nicht teuer. Wir können die ausgewählte Lösung einfach ersetzen, bevor sie auf dem Bildschirm angezeigt wird, und nicht versuchen, alles gleichzeitig zu lösen. Für die meisten Kacheln reicht nur ein Erd- / Wandsymbol aus. Das Programm läuft gewissermaßen von unten nach oben unter Verwendung der "Höhe" (Kreaturen befinden sich über Objekten, Objekte befinden sich über der Erde) und ändert von Zeit zu Zeit die Entscheidung. Trotz des Vorhandenseins verschiedener Flags und Hilfsarrays kann noch viel mehr getan werden. Es gibt eine kleine Anzahl möglicher Einheiten, die in jedem Plättchen angezeigt werden können, sodass das Programm eine Frame-für-Frame-Animation implementieren kann, mit der Sie jedes Element auf dem Plättchen sehen können, auch wenn das Spiel unterbrochen ist.

Source: https://habr.com/ru/post/de454912/


All Articles