Alt-F4 #55 - Die dunklen Nebengassen im Modding  17.12.2021

Geschrieben von stringweasel, MagmaMcFry, raiguard, Deadlock989, Anachrony, PFQNiet, Earendel, editiert von Nanogamer7, Conor_, Therenas, MyNameIsTrez, Firerazer,
übersetzt von EDLEXUS

Inhaltsverzeichnis

Für Ausgabe #55 hat stringweasel etwas ganz besonderes für uns alle vorbereitet. Verschiedene Modder erzählen von ihren finstersten, frechsten und komischsten Hacks, auf die sie zurückgegriffen haben, um ihre Mods zum laufen zu bekommen. Wir haben MagmaMcFry, raiguard, Deadlock989, Anachrony, PFQNiet und Earendel, welche heute ihre dunkelsten Geheimnisse lüften werden!

Hinter den Kulissen des Moddings stringweasel

Es ist wichtig, erneut zu betonen, das Factorio eine unglaubliche Moddingcommunity hat. Du kannst dir aber vielleicht nicht vorstellen, wie unglaublich viel Arbeit manche Modder in ihre Meisterwerke stecken, insbesondere wenn sie an den Punkt kommen, wo sie von der Engine limitiert werden. Die Factorioentwickler versuchen bereits, die Engine zu erweitern um Moddern mehr Möglichkeiten zu geben, aber es ist unpraktisch, Moddern alles zu erlauben. Wenn Modder diese Grenzen erreichen, müssen sie Kreativ werden, um ihre Vision in die Realität umzusetzten. Die Wege dahin sind meistens interessante Hacks, welche dem Spieler nicht auffallen. Ich finde diese Wege immer faszinierend, und habe deshalb einige Modder angeschrieben und sie nach ihren Lieblingsgeschichten gefragt, wie sie Factorio ihren Willen aufgezwungen haben.

Factorissimo: Unterscheide deine eingesammelten Fabriken MagmaMcFry

Früher, in Version 0.13, unterstützte Factorio Metadaten noch nicht so gut wie heute, so das der einzige Weg, der mir einfiel, um Daten in Items zu speichern (und bei Platzierung zu lesen), ihre Haltbarkeit war. In Factorissimo 1 wird deshalb dem Fabrikgebäude in dem Moment des Aufnehmens eine Haltbarkeit zugeordnet, welche für jedes Gebäude individuell ist und vom Inhalt des Gebäudes abhängt. Wenn das Gebäude platziert wird, wird dieser Wert ausgelesen, um herauszufinden, was sich im Gebäude befindet, und anschließend auf den Wert zurückgesetzt, den das Gebäude hatte, befor es aufgenommen wurde.

Ein Beispiel für ein Factorissimo 1 Gebäude im Inventar in Version 0.14. Jedes Gebäude hat eine kleine Haltbarkeit. Auch ist im Hintergrund das alte Factorissimogebäude zu sehen.
Ein Beispiel für ein Factorissimo 1 Gebäude im Inventar in Version 0.14. Jedes Gebäude hat eine kleine Haltbarkeit. Auch ist im Hintergrund das alte Factorissimogebäude zu sehen.

Als ich Factorissimo 2 schrieb, deuteten die Entwickler an, das in Zukunft teilweise zerstörte Items gestackt werden können, was mein System zerstören würde. Auch war das Metadatensystem noch nicht so weit, so das mein Weg zum Ziel noch gepfuschter war: Anstatt die Informationen in der Haltbarkeit zu speichern, speicher ich die Daten im Itentyp. Immer wenn du also ein FAbrikgebäude aufnimmst, nimmst du in Wahrheit ein völlig neues Item auf, was nur zufällig den selben Namen und das selbe Icon hat, allerdings mit jeweils anderer interner Struktur. Aufgrund eines anderen, damit zusammenhängenden Problems in der API ändert sich auch der Typ der Entität, sobald sie zum Abriss markiert wurde, und nicht erst, wenn ein Roboter sie tatsächlich abgerissen hat. Da man neue Items nicht nebenbei generieren kann, gibt es eine festgelegte Anzahl an Prototypen für jede Fabrikgrößen (welche ich einfach auf 90 gesetzt habe). Wenn du also nicht sehr konsequent deine alten Gebäude wiederverwendest, oder noch schlimmer, alte Gebäude in Itemform zerstörst (was eine Mod nicht tracken kann), kannst du mit einer Fehlermeldung konfrontiert werden, welche sagt:”Can’t pick up more than 90 factory buildings of one size at once” (de: Du kannst nicht mehr als 90 Fabrikgebäude gleichen Typs auf einmal aufnehmen). Das ist auch der Grund, warum die Fabrikanforderungskiste existiert: da die spezielen Entitäten vom Logistiknetz versteckt werden, gibt es keine andere Möglichkeit, benutzte Fabrikgebäude aus dem Logistiknetz anzufordern.

Dieser Umweg ist im Editor klar zu erkennen, da rechts alle Gebäude einzeln aufgelistet werden.
Dieser Umweg ist im Editor klar zu erkennen, da rechts alle Gebäude einzeln aufgelistet werden.

Einige andere erwähneneswerte Hacks: Erkennen von Flüssigkeitsverbindungen zu FAbrikgebäuden über Dummy-Rohre, Transport von Signalen zwischen Oberflächen mit Kombinatoren für Konstanten, Energieübertragung über das Umladen von Akkumulatoren (deswegen funktioniert Energie in jeweils nur eine Richtung), zusätzliche Entitäten, mit denen nur durch Rotation interagiert werden kann, unsichtbare Erzförderer, welche Pfeile im Alt-Nodus bereitstellen, unsichtbare Kisten mit Items, welche die Symbole fürs Overlay bereitstellen, und vieles mehr.

Heute sind viele dieser Hacks nicht mehr nötig, da die API die nötigen Features nativ unterstützt (oder einfachere Wege für Hacks bereitstellt). Einige wurden erfolgreich gestrichen, andere hängen tief im alten Code fest. Vielleicht werde ich sie einmal beheben, falls ich einmal Factorissimo 3 schreiben sollte.

Tapeline: Dragging-Funktionalität raiguard

Ein Beispiel für ein normales, spielergeneriertes Maßband
Ein Beispiel für ein normales, spielergeneriertes Maßband

Die originale Version von Tapeline war sehr einfach: du wählst eine Fläche mit einem Auswahltool aus und es zeichnet ein Maßband in der Größe des ausgewählten Bereichs auf den Boden. Ich wollte allerdings auch die Möglichkeit, Markierungen via Dragging zu zeichnen. Es gibt keine einfachen Wege, das zu tun, also musste ich kreativ werden.

Die erste Implementierung benutzte unsichtbare Granaten mit einem 2 Tickcs langen Cooldown. Hält man die Maustaste gedrückt werden kontinuierlich diese Granaten geworfen, was die Mod erkennen würde und die Position entsprechend anpasst. Das Ende des Markiervorgangs würde erkannt werden, wenn der Spieler nicht mehr aller 2-Ticks eine Granate schmeißt.

Dieser Weg hatte allerdings einige Probleme. Erstens war es nicht möglich, die Kartenansicht zu verwenden, was die sinnvolle ANwendung der Mod einschränkte. Es gab auch Probleme mit Multiplayerlatenz, wo das Timing zwischen den einzelnen Granaten nicht 100% gleich wie im Singleplayer war. Man konnte die Mod auch nicht verwenden, wenn die Zeit im Karteneditor pausiert war. Ingesamt war es eher eine halbe Implementation.

Nach langer Zeit hatte ich eine Idee: Was wäre, wenn ich ein Auswahlwerkzeug verwende, aber währenddessen Entitäten platzieren, um zu markieren, wo die Maus aktuell ist? Das würde mir ermöglichen, das Maßband währenddessen zu updaten, und zzu erkennen, wann der Vorgang beendet ist, durch das reguläre Auswahltoolevent. Auch würde ich erkennen können, ob währenddessen Shift gedrückt wurde.

Eine Visualisierung der versteckten Entitäten, welche platziert werden, während du das Band ziehst.
Eine Visualisierung der versteckten Entitäten, welche platziert werden, während du das Band ziehst.

Ich habe einen Test gemacht, indem ich einfach einem Selection-Tool ein Place-Result zugeordnet habe, und auf wundersame Weise hat es einfach funktioniert! Die Mod ist jetzt auch im Multiplayer nutzbar und funktioniert auch auf der Kartenansicht. Es gibt hier und da noch einige kleine Probleme, zum Beispiel tötet Shift-Dragging deine Ohren mit dem Ghost-Placement-Sound, aber die Verwendung eines Selectiontools erlaubte mir, komplett auf eine Mod-GUI zu verzichten und die Mod insgesamt intuitiver zu machen. Ich bin immer wieder überrascht davon, wie viel man mit der Factorio-Engine machen kann, auch wenn sie dafür überhaupt nicht gemacht wurde.

Industrial Revolution 2: Das Transmat Deadlock989

Ich muss den Spieler während der Teleportation in der Transmat-Sequenz verstecken und das bedarf aktuell jeder Menge Tricksereien mit unsichtbaren und unzerstörbaren Autos welche verfolgt und am Ende wieder vernichtet werden müssen. Das ist der Fall, da Spieler (und die dazugehörigen Charaktere) zwischen Oberflächen teleportiert werden können, Fahrzeuge zwischen Oberflächen teleportiert werden können, aber Charaktere ohne dazugehörige Spieler können nicht teleportiert werden, und während einer Cutscene ist der Spieler nicht mit dem Charakter verbunden. IN der Sequenz, die ich erzeugen wollte, musste der Charakter manchmal, aber nicht immer unsichtbar sein. Der einfachste Weg dazu war es, ein unsichtbares, nicht kollidierendes Auto zu erschaffen und dann den Charakter im Auto auf eine temporäre Halteoberfläche zu teleportieren, während die Cutscene-POV sich von einer zur anderen Seite bewegt.

Es gibt einige andere Möglichkeiten, welche kein besonders Fahrzeug beinhalten, aber die meisten hatten sehr nervige Nebeneffekte (z.B. wenn ein Charakter zu einer weit entfernten Stelle auf der selben Oberfläche teleportiert wird, während er von Beißern angegriffen wird, zerschießt die Beißer-KI das gesamte Betriebssystem). Es musste auch ein Weg sein, der robust damit klar kommt, wenn ein Spieler im Multiplayer während der Cutscene disconnected, was destruktives Klonen zu kompliziert gemacht hätte (man kann keinen einzelnen Charakter teleportieren, allerdings kann man ihn auf eine andere Oberfläche klonen und dann das Original zerstören, was philosophisch interessant wird). Es stellte sich einfach heraus, das es sehr viel aufwand ist, die Reste aufzuräumen, falls die Cutscene von einem Disconnect oder einer anderen Mod unterbrochen wurde. Es gibt mit Sicherheit bessere Wege, das Problem zu lösen, aber wie oft im Factorio-Modding ist es ein langes Suchen in der Dunkelheit, bis man einmal etwas fidnet, was funktioniert.

Der Spieler wird mit Hilfe der schönen Transmats von Industrial Revolution 2 teleportiert.

Nullius: Verteilte Windkraftwerke Anachrony

Es ist vorgesehen, das Nullius Windkraftwerke mit 32 Feldern Abstand verwendet werden. Sie sind Low-Tech, günstig und effektiv, aber ihre Ausgangsleistung verändert sich unvorhersehbar und sie benötigen viel Fläche aufgrund der Abstandsbedingung. Es ist aber nicht verboten, innerhalb der 32 Felder etwas anderes zu bauen, nur weitere Windturbinen sind verboten. Die Spiel-Engine macht es einem nicht leicht, solche differentierten Regeln zu implementieren. In einer älteren Version der Mod fügte ein Skript jeder Turbine ein großes, unsichtbares Quadrat zu, welches verhinderte, das weitere Turbinen in der Nähe gebaut wurden, aber nichts anderes. Ein großes Problem an dieser Lösung war aber, das dieses unsichtbare Quadrat auch mit der eigentlichen Turbine in der Mitte kollidierte, so das es unmöglich war, sie schnell gegen eine Turbine höheren Levels auszutauschen. Im Gegensatz zu anderen vergleichbaren Strukturen musstest du die Turbine erst abreißen und dann die Neue setzten, was den gesamten Prozess nicht intuitiv und nervig aufwändig macht. Die Lösung war es, das große Quadrat in vier REchtecke aufzuteilen, welche durch ihre Überlagerung ein Feld erzeugten, in dem die einzig gültigen Positionen entweder 32 Felder weit weg oder genau über der eigentlichen Turbine waren, was das schnelle Ersetzen von Turbinen ermöglicht. Das Bild zeigt im Folgenden die Kollisionsrechtecke, welche eine zu nahe Platzierung verhidern.

Beispiel für die Kollision der unsichtbaren Kollisionsbox einer Turbine und der Platzierung einer anderen Turbine.
Beispiel für die Kollision der unsichtbaren Kollisionsbox einer Turbine und der Platzierung einer anderen Turbine.

Satisfactorio: Awesome-Sink-Verbauchsgeschwindigkeit PFQNiet

Viele Mods haben ein System, welches ungewollte Gegenstände automatisch löscht. Angel’s/Bob’s hat den Flare Stack für ungewollte Gase, Krastorio den Crusher und Industrial Revolution den Incinerator, um ungewollte Items loszuwerden.

Satisfactory hat die Awesome-Sink, welche ich natürlich für meine Satisfactoro-Mod nachbauen musste. Die Sink nimmt (fast) jedes Item als Input an und produziert Punkte, mit denen man Coupons bekommt, welche dann im Awesome-Shop ausgegeben werden können. Sie verbraucht Items so schnell wie ihr sie reinbekommt und bedarf 30MW an elektrischer Leistung.

Alle “void machines” in Factorio funktionieren nach dem selben Prinzip: baue eine Ofen-Entität und erstelle ein Rezept für jedes Item im Spiel, welches das entsprechende Item verbraucht und nichts produziert. Den Rest übernimmt sie Engine. In meinem Fall habe ich das Rezept schnell genug gemacht, damit Items von einem Mk.5 Fließband verbraucht werden können. Das führte aber dazu, das die Maschine die meiste Zeit inaktiv war, wenn ein langsameres Fließband angeschlossen war, wodurch der Stromverbrauch stark ungewollt schwankte.

Bild der zackigen Leistungsaufnahme

Es dauerte eine Weile, bis ich zu einer Lösung kam, aber eventuell kam ich darauf, das Rezept gerade so schnell genug für ein Mk.1 Fließband (das langsamste!) zu machen und dann einen unsichtbaren Effektverteiler zu nutzen. Dieser besondere Effektverteiler hat 100% Effizienz (Vanilla-Effektverteiler transportieren nur 50% ihres Effektes) und akzeptiert ein besonderes Geschwindigkeitsmodul, welches +100% Geschwindigkeit mit keinen zusätzlichen Kosten gibt. Dann überprüft das Skript, welche Fließbandgeschwindigkeit angeschlossen ist und fügt oder entfernt eine entsprechende Anzahl an Modulen hinzu. Mk.2 Fließbänder transportieren doppelt so viel wie Mk.1 Fließbänder, also wird ein Modul verwendet. Das gilt für jedes Fließband, außer Mk.5, welches 7mal so viel transportiert, so das 6 Module verwendet weden.

Bild des unsichtbaren Effektverteilers mit zwei Modulen

Dieses Setup sorgt dafür, dass, egal welches Fließband angeschlossen ist, die Geschwindigkeit angepasst wird und die Items in genau der richtigen Geschwindigkeit verarbeitet werden und es nicht zu unvorhergesehenen Leistungsspitzen und Stromausfällen kommt!

Bild des korrigierten Leistungsbedarfs

AAI Programmable Vehicles: Beißer-Fahrer Earendel

Meine Fahrzeuge müssen von A nach B kommen, können aber nicht immer in einer geraden Linie fahren sondern müssen einen Weg um Hindernisse herum finden. Einen Pfadfinderalgorithmus zu schreiben ist an sich nicht schwer, benötigt aber eine korrekte Karte, welche man nicht in einer Factorio-Mod bekommt. Die Karte in sinnvoller Art und Weise zu analysieren wäre unglaublich langsam und Zugriff auf Factorios C++ -Pfadfinder war nicht möglich (zu dieser Zeit), also musste ich etwas kreativer werden. Das Spiel hat einen eingebauten “Einheiten”-Typ für Beißer, dem gesagt werden kann, das er eine bestimmte Position mit dem Pfadfinder aufsuchen soll. Das Problem ist, das Einheiten keine Fahrzeuge sind: sie können keine Passagiere aufnehmen, haben kein Inventar und können keine Munition verwenden.

Earendel’s Warden findet automatisch den Weg um eine Klippe herum

Mein etwas verrückter Weg ist es, eine unsichtbare Einheit vor das Fahrzeug zu spannen, genannt “Der Navigator”, welche die selben EInstellungen für Größe und Kollisionen hat. Ich gebe ihm ein Ziel, verfolge die Bewegung und nutze den Pfad für mein Fahrzeug. Man könnte also sagen, dass das Fahrzeug von einem unsichtbaren Beißer gesteuert wird. Dies funktionierte relativ gut, hatte aber eine Menge an komischen Nebenwirkungen. Beispielsweise würde der Navigator manchmal Feuer fangen und der Spieler, welcher nichts von der Existenz des Navigators weis, sieht dann einfach ein einzelnes Feuer, welches sich scheinbar grundlos über die Karte ausbreitet. Manchmal würde der Navigator auch nicht den richtigen Pfad finden oder von irgendetwas abgelenkt werden und dann immer im Kreis fahren, aber es war nicht möglich zu sagen, ob es sich um einen ordentlichen Pfad handelt oder der Navigator nur wieder glitchte, das Fahrzeug musste dem Pfad erstmal für eine Weile folgen, bevor es erkannte, das es im Kreis fuhr.

Irgentwann öffnete Wube auf mein Drängen hin den Zugang zum C++ -Pfadfinder für Modder und die ganze “Beißer-Fahrer”-Geschichte ist vorbei, stellt aber für mich immernoch den schrägsten Workaround dar.

Teile deine Geschichte!

Was du gerade gelesen hast ist nur eine kleine Anzahl der Geschichten, welche ich gehört habe, und wir werden in Zukunft einen weiteren Artikel mit solchen Geschichten veröffentlichen. Wenn die also ein Modder mit einer interessanten Workaround-Geschichte bist, dann meld dich gerne bei uns! Wir würden uns freuen, davon zu hören und der Welt davon zu erzählen! Es ist auch wichtig, eimal über solche traumatischen Ereignisse zu reden, man kann das nicht immer nur einfach in sich reinfrassen. Soetwas könnte das Wachstum der Fabrik verhindern, und das muss umbedingt verhindet werden.

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!