Alt-F4 #53 - Automatisierung und Faulheit 26.11.2021
übersetzt von EDLEXUS, lektoriert von marceljoint
Für den besten Platz im Haus, Ausgabe #53 von ALT-F4, feiern wir die Rückkehr von Großmeister Therenas mit einem neuen Artikel. Nachfolgend auf seine vorigen Meisterwerke, welche hauptsächlich von seinen eigenen Mods handelten, kommt jetzt noch ein weiterer Artikel über genau dasselbe. Es geht darum, wie automatisch Bildschirmaufnahmen im Spiel gemacht werden können. Bestehend aus nur 20% technischen Details, 40% tiefsinniger Philosophie und 50% schlechten Witzen. Ja, richtig gelesen, wir geben immer 110%.
Faulheit durch Automatisierung Therenas
Ich tue mich oft schwer damit, angemessene Bildschirmfotos für meine Mods aufzunehmen. Es ist viel Arbeit, ein Szenario aufzubauen, was sowohl gut aussieht, als auch das Kernkonzept der Mod bildlich erklärt. Meiner Meinung nach haben viele Mods keine guten Fotos, nicht weil es die Autoren nicht interessiert, sondern weil es sehr schwer ist, gute Fotos zu machen. Sie müssen viel Informationen in einer sehr limitierten “Sprache” rüberbringen, selbst wenn ein Bild mehr als 1000 Worte sagt.
Nun klingt das ganze sehr nach Meckern auf hohem Niveau, was es ohne Zweifel ist. Das tatsächliche Problem ist es nicht, die Bildschirmfotos selber zu machen. Es ist in Ordnung, auf sie einige Stunden zu verwenden, nachdem man bereits Hunderte Stunden in seine Mod gesteckt hat. Das Problem ist es, sie aktuell zu halten. Jede Änderung in einer Mod sollte im Optimalfall auch in den Fotos repräsentiert sein. Veraltete Fotos erwecken für mich den Eindruck, dass die Autoren nicht sorgfältig sind, vielleicht bin ich aber auch nur einfach komisch.
Wie oft sie aktualisiert werden müssen, hängt natürlich von der Mod ab. Wenn es um Bottleneck geht, was nicht viele Updates bekommt, werden auch die Fotos nicht so schnell veraltet sein. Wenn es aber um einen visuell komplexen GUI-Mod geht, verändert aber jedes Update das Interface Pixel für Pixel. Idealerweise sollte jede schnelle GUI-Reparatur mit neuen Fotos verbunden sein, aber das würde bedeuten, viel mehr Zeit für die Fotos aufzuwenden, als das tatsächliche Problem zu reparieren. Niemand hat darauf Lust, und die Fotos sind über die Zeit nicht mehr aktuell.
Das führt leider dazu, dass es oft verschleppt wird. Wenn du weist, dass du deine Fotos aller paar Updates neu machen musst, denkst du dir, dass du es ja nur dieses eine Mal auslassen kannst, weil sich beim nächsten Mal ja wieder etwas ändert, also warum solltest du sie jetzt ändern. Wenn nun das nächste Update kommt, wird sich dasselbe Denkmuster wiederholen, so das du es noch einmal auslässt. Ein einziges Mal, nicht wieder. Das wiederholt sich nun bis in die Unendlichkeit.
Vielleicht bin ich nur unglaublich faul, und andere haben damit kein Problem, sie updaten ihre Fotos einfach in regelmäßigen Abständen und halten sie so aktuell. Aber ich nicht. So ein Plan würde dazu führen, dass ich jedes halbe Jahr neue Bildschirmfotos mache, wenn es hochkommt. Es störte mich, dass sie nicht aktuell sind, aber die “das mache ich nächstes Mal”-Mentalität gewann trotzdem jedes Mal, wenn es darum ging, etwas zu tun, was in der nächsten Woche bereits wieder veraltet wäre.
Ich wollte trotzdem eine Lösung. Ich brauchte eine Lösung, und wenn es nur dafür war, mich nicht mehr selbst dafür zu hassen, veraltete Fotos zu haben. Es sollte natürlich auch einfach sein. An mir als Mensch und meiner Person zu arbeiten, fiel raus, das wollte ich nächste Woche machen. Automatisierung schien wie immer wie das goldene Mittel, was es auch manchmal ist.
Ich habe vorher bereits einige Schritte der Modentwicklung automatisiert, hauptsächlich den Bündelungsprozess, der zu jeder neuen Version gehört, und all die Kleinigkeiten, die noch dazugehören. In diesem Fall ging es Nichteinmal darum, das ich keine Lust hatte, für jede Version (aktuell 169 Stück für Factory Planner) dieselben Schritte immer wieder zu wiederholen, sondern eher darum, mich daran zu hindern, dabei Fehler zu machen, die dann dazu führen würden, das User am Ende fehlerhafte Versionen verwenden.
Komm doch endlich mal zu den Bildschirmfotos!
Na gut, na gut, dann kommen wir jetzt zum spaßigen Teil. Meine Idee war relativ simpel: Schreib ein Python-Script, welches Factorio in einem besonderen Szenario startet, welches dann das tatsächliche Aufnehmen der Bilder übernimmt (wofür es in Factorio glücklicherweise eine extra API-Funktion gibt) und danach die Bilder in den richtigen Ordner verschiebt und vielleicht noch etwas zuschneidet. Der erste Teil ist relativ einfach, ich muss nur herausfinden, welche Command Line Argumente ich brauche, sie aneinanderreihen und das Szenario läuft. Bisher nicht so schwer.
Das tatsächliche Szenario ist dafür aber etwas schwieriger. Um inhaltsvolle Fotos aufzunehmen, muss ich verschiedene GUIs in verschiedenen Zuständen öffnen, um die Funktionalität zu zeigen, die ich wichtig finde. So etwas für Entitäten auf der Karte zu machen ist einfacher, da man dafür auf die ganzen APIs zurückgreifen kann, welche man normalerweise verwendet, um mit der Welt zu interagieren. GUIs sind aber ihr ganz eigenes Ding, wofür es keine fertigen Systeme gibt, du musst dir also selbst etwas ausdenken.
Das größte Problem ist es, das man nicht simulieren kann, das der tatsächliche User irgendwo hinklickt. Das Spiel hat keine API-Funktionen dafür, da es für eine Mod nicht nötig ist. Das bedeutet aber, dass man irgendeinen Weg braucht, um Klicks zu emulieren. Das ist in der Regel schlecht, da entweder deine Mod von Anfang an darauf ausgelegt sein muss oder sehr gut strukturiert sein muss, da du sonst den Event Handler neuschreiben musst oder halt irgendwas zusammenpfuschts. Ihr könnt euch vielleicht denken, welchen Weg ich gewählt habe.
Nachdem ich mich in meinen Pfusch reingefuchst habe, konnte die Konstruktion das Spiel starten, die Interfaces in interessanten Szenarien darstellen und Bilder machen. Ich muss an dieser Stelle darauf hinweisen, dass die ganze Sache eher gepfuscht ist und wahrscheinlich bei der nächsten Änderung komplett zerfällt. In diesem Fall gibt es aber nicht wirklich eine Alternative, so das ich mich erst mal damit zufriedengeben muss. Es macht sowieso viel mehr Spaß, einen großen Berg Spaghetti-Code zu produzieren, als jedes Mal die Bilder per Hand aufzunehmen, es ist also eine Win-Win-Situation.
Ich war zufrieden mit dem, was ich bisher geschafft habe, aber das war noch nicht die maximale Automatisierungsstufe. Es gab immer noch die Aufgabe, die Bilder zuzuschneiden, da viele Dialoge in Factory Planner sehr klein sind und die Welt im Hintergrund vom wichtigen ablenkt. Ich könnte das zuschneiden von Hand machen, aber war dann irgendwie doch zu faul. Ich hatte schon eine Idee im Hinterkopf, allerdings würde das noch mehr Drecksarbeit bedeuten.
Die grundlegende Idee war, während das Szenario Bilder aufnimmt, auch zu speichern, in welcher Größe die Dialoge dargestellt werden. Diese Metadaten könnten auch in eine Datei geschrieben werden und vom Pythonskript verwendet werden, um die Bilder automatisch zuzuschneiden. Das klingt in der Theorie nach einer guten Idee, hat aber in der Realität einen kleinen Haken: Das Spiel verbietet es, die Größe von GUI-Fenstern auszulesen, man darf sie nur schreiben.
Das ist auch aus einem guten Grund verboten, da die Dimensionen nicht in jedem Fall deterministisch sind, da beispielsweise eine andere Sprache die Größe bestimmter Elemente verändern würde. Das Auslesen und Verwenden dieser teilweise nichtdeterministischen Werte in Multiplayerspielen würde zu Desyncs führen und die Mod Multiplayerinkompatibel machen. Das schien wie eine Sackgasse. War ich dazu verdammt, die Bilder per Hand zuzuschneiden? Es stellt sich heraus, glücklicherweise nicht.
Nun konnte ich nicht das Problem lösen, dass das Auslesen der Dimensionen zu Desyncs führte, das ist einfach das grundlegende Prinzip des Spiels. Ich verwende das Spiel aber nicht im Multiplayermodus, um die Bilder zu machen, und es stellt sich heraus, man kann das Spiel im Instrument Mode starten, welcher den Multiplayer verhindert, dafür aber einige unsichere Funktionalitäten bereitstellt. Das scheint wie der perfekte Ort um eine streng geheime Methode einzuschleusen, die mir das verbotene Wissen über die Fensterdimensionen verrät. Also hab ich sie hinzugefügt. Bei Wube zu arbeiten hat auch seine Vorteile.
Nach mehreren Tagen gepfusche erwachte meine Kreation endlich zu leben und nimmt vollautomatisch Bilder für mich auf. Wobei vollständig automatisch nicht ganz richtig ist. Es stellt sich heraus, dass es doch nicht vollständig ist. Natürlich nicht, warum sollte ich auch vollständig zufrieden sein können. Es gibt zwei Schritte, die ich noch selbst machen muss.
Der erste ist, das Spiel zu schließen, damit das Pythonskript weitermachen kann. Es stellt sich heraus, eine Mod kann nicht dafür sorgen, dass das Spiel zum Desktop beendet wird. Das ist total verständlich, um Missbrauch zu verhindern, wäre aber trotzdem schön für den Instrument Mode. Allerdings ist zur richtigen Zeit Alt-F4 (ding) zu drücken etwas, was ich mir durchaus zutraue. Ein anderer Weg wäre, das Spiel absichtlich zum Absturz zu bringen. Ich hab euch gewarnt, hier ist nichts ordentlich. Das Problem damit ist, das es im Spiel nur sehr wenige Bugs gibt, und wenn neue gefunden werden, kann man sich darauf verlassen, das der Bug-Swatter sie sofort zerquetscht.
Der zweite ist, die neuen Bilder auf Modportal hochzuladen. Es gibt im Moment keine richtige API, um mit dem Modportal zu interagieren, also hab ich da kein Glück. Aktuell muss ich meinen Browser öffnen, meine alten Bilder einzeln löschen und die neuen einzeln hochladen. Tragisch, ich weiß. Vielleicht gibt es Hoffnung für solch eine API in Zukunft, mal schauen.
Abgesehen von diesen zwei Dingen bin ich durchaus mit meinem Ergebnis zufrieden. Ich glaube, es war den Aufwand wert, da ich den Nutzen in Zukunft unendlich lange herausziehen kann. Die Freuden der Automatisierung: unendlicher Nutzen. Zumindest bis es das erste Mal kaputt geht, was wahrscheinlich sehr bald sein wird. Na ja.
Beitragen
Wie immer suchen wir nach Leuten, die zu Alt-F4 beitragen wollen, sei es mit einem Artikel oder durch Hilfe bei Übersetzungen. Wenn du etwas Interessantes im Kopf hast, das du mit der Community in einer eleganten Art teilen möchtest, hier kannst du das tun. Falls du dir unsicher bist, beantworten wir gerne Fragen zu Inhalt und Struktur. Falls das nach etwas klingt, woran du interessiert bist, tritt unserem Discord bei, um es nicht zu verpassen!