M4nfo
A macro library for generating nfo code for TTDPatch and OpenTTD newgrfs
Eine Makrosammlung zur Generierung von nfo code für TTDPatch und OpenTTD newgrfs
Michael Blunck
Oktober 2009
Einleitung
Programmieren in
"Bytecode", zB die Erstellung von
nfo-Code für Transport Tycoon (TTDPatch und OTTD)
newgrf Sets ist bekanntermassen nicht jedermanns Sache. Auch die Pflege von vielen tausend Zeilen Bytecode in den grösseren Sets ist für geübte Programmierer nicht einfach. Die Idee, eine "höhere Sprache" für diesen Zweck zu entwickeln ist deshalb genauso alt wie die Entwicklung des nfo-Bytecodes durch Josef Drexler. Aber trotz vieler Versuche und intensiver Diskussionen ist diesbezüglich bisher nichts Brauchbares entstanden.
Ein Grund liegt natürlich darin dass die Entwicklung einer neuen "Sprache" und die Entwicklung eines Übersetzers (Compiler, Interpreter) dafür nicht unbedingt zu den Vorhaben gehört die man schnell an einem Wochenende erledigen kann.
Zum zweiten ist die Umsetzung von nfo-Bytecode in eine höhere Sprache kein leichtes Unterfangen, da nfo-Bytecode diverse Fallstricke gegenüber einer einfachen Umsetzung bereit hält. Zum einen kann der Code selbstverändernd geschrieben werden ("action6"), zum anderen ist die Behandlung der verschiedenen newgrf Objekte (Fahrzeuge, Gebäude, Industrien, ...) nicht uniform, sondern kann bei gleicher (oder ähnlicher) Behandlung verschiedener Objekte mehr oder weniger variieren.
Darüber hinaus ist die Syntax abseits der am meisten verwendeten "actions" (action0, action1, action2, varaction2, action3, action4) aufgrund ihrer extrem maschinennahen Implementierung, relativ komplex (s. zB action7/9, actionD, advancedaction2, die Benutzung von Registern, "subroutines" oder (externen) Parametern, usw.).
Trotzdem hat wohl jeder nfo-"Coder" der lange genug dabei ist, sich einige Hilfsmittel geschaffen, die die Code-Erstellung einfacher und weniger mühselig machen. Auch ich gehöre zu diesem Kreis.
Nachdem ich am letzten Wochenende eine kleinere Erleuchtung diesbezüglich hatte, habe ich mich mal zwei Abende hingesetzt, und alles was ich zu früheren Zeiten schon mal ausprobiert hatte zusammengefasst und überarbeitet. Nicht ohne einen gewissen Erfolg.
Trotzdem: mein Ansatz ist höchst pragmatisch, und das Ergebnis ist nicht die schon lange erwartete Hochsprache die es (fast) jedem ermöglicht ein beliebiges Vorhaben in einfacher Weise in eine lauffähige newgrf umzusetzen. Abgesehen von dem doch eher kleinen Sprachumfang, der zZt lediglich die Programmierung von Schienenfahrzeugen ermöglicht, ist auch hier die Kenntnis des Aufbaus einer newgrf und der grundlegenden Struktur des nfo Konzepts zwingende Voraussetzung für einen Einstieg.
Statt einer Universallösung inklusive dem dazugehörigem Compiler bietet sie (im Moment) wie gesagt lediglich eine Lösung für den Bereich Schienenfahrzeuge. Eine Erweiterung auf den Bereich Strassenfahrzeuge, Flugzeuge und Schiffe ist aber leicht möglich. Anders sieht dies für den Bereich Gebäude oder Industrien aus, hier würde man noch einmal ganz von Neuem entwickeln müssen, obwohl man sicher manche Funktionen der aktuellen Entwicklung nutzen und ausbauen können wird.
Der derzeitige Implementierungsstand erlaubte jedenfalls bereits die Neuimplementierung meiner derzeitigen Arbeitsversion des DB Sets v0.9*. Das ist mMn nicht schlecht, denn der Set hat trotz einer komprimierten Programmierweise 10000 Sprites (Codezeilen) und ist wesentlich komplexer als die aktuelle Version 0.82.
[*] einige wenige exotische Konstrukte sind dabei noch in nfo, das wird sich aber noch ändern.
Zum Technischen.
--------- Ende Teil 1 -------------------------------------
Gruß
Michael