Noch ein paar Worte zur Implementierung:
Die Grundlage bildet eine json-Datei, in der die verfügbaren Technologien spezifiziert sind:
Um den Überblick zu behalten, hatte ich mir dazu mal ein Python-Skript geschrieben, um den Inhalt nach GraphViz zu konvertieren und mir als hübsch übersichtlichen Graphen anzeigen zu können:
Das gefiel mir dann so gut, dass ich auch gerne eine ähnliche Struktur im Spiel haben wollte.
Nun ist es aber naturgemäß so, dass sich dieser Tech-Baum häufig mal ändert. Sei es, weil neue Technologien hinzukommen, oder weil die Abhängigkeiten aus Gamebalance-Gründen verändert werden. Das handgebautes Layout hat man zwar in recht vertretbarer Zeig erzeugt, aber bei jeder kleinen Änderung wieder etwas anpassen zu müssen, wird schnell super nervig und führt dann eben dazu, dass man lieber nichts anpasst. Alternativ könnte man den Graph natürlich auch selber erzeugen, aber das ist halt auch kein wirklich einfaches Problem und wenn es gut werden soll, kann das durchaus ein paar Tage Arbeit in Anspruch nehmen. Und die Zeit ist anderswo ja wirklich besser investiert.
Die Lösung war es also, das Layout aus dem GraphViz Output zu übernehmen. Glücklicherweise gibt es einen Text-Output, von dem man die Node-Positionen übernehmen kann. Die Pfeile sind aber tatsächlich eine Bitmap, die mit einem angepassten GraphViz Template erstellt wurde, in dem alle Nodes gleich große, unsichtbare Quadrate sind. Danach mussten nur noch ein paar Koordinatensysteme konvertiert werden und schon können im Spiel die Buttons an der richtigen Stelle angezeigt werden.
Von Hand hätte man das Layout vielleicht noch etwas besser hinbekommen. Aber erstens habe ich sicherlich noch nicht alle GraphViz Kommandos ausgereizt, zweitens kann man das Layout für die finale Version ja auch nochmal anpassen und drittens ist es irgendwo auch einfach gut genug. Für mich lebt dieses Hobbyprojekt von guten Kompromissen, und mit dem heutigen bin ich ganz zufrieden :)