Technische Überarbeitung der Förderbänder und globaler Planungsmodus

Hinweis: Dieser Blogpost wurde maschinell aus dem englischen Original übersetzt. Zum englischen Original.

Überblick

Diesen Monat wurden ein paar wichtige Entwicklungen zusammengeführt.

Die erste davon ist, dass dem Spiel gewissermaßen "Zweck" hinzugefügt wurde. Die Demo vom Oktober 2025 bekam einiges an Feedback dazu, dass Leute nicht wussten, was sie tun sollten, selbst wenn sie das Spiel mechanisch verstanden hatten. Das war berechtigt und bis zu einem gewissen Punkt auch erwartet. Wie verwirklicht man sich selbst als KI in einem Spiel, und wie spiegelt sich das mechanisch wider? Mit dem globalen Planungsmodus gehen wir beides an, Details dazu unten.

Die zweite Entwicklung war, die inhärente Spannung zwischen dem tile-/voxel-basierten Ansatz bei Förderbändern, Gebäuden und Welt anzugehen. Die stärkste Personifizierung davon ist: "Wie bauen wir eine Fabrik auf einem glatten, organischen Hang, wenn Förderbänder Tiles in einem voxelbasierten Raum sind?" Nachdem ich das Thema viel zu lange vermieden habe, lautet die Antwort, glaube ich: gar nicht. Unten ist ein Überblick über das neue, noch nicht ganz fertige spline-basierte System.

Wie immer: Wenn du diesen Post interessant findest oder dich das Spiel interessiert, würde ich empfehlen, es auf Steam auf die Wunschliste zu setzen. Das hilft enorm.

Globaler Planungsmodus

Gebäude im Global-View-Modus platzieren und sie im Exoframe bauen.

In Exofactory gibt es den Spinnennetz-Tech-"Baum", in den man hineinwächst, basierend darauf, wie man spielt. Aber es gibt auch einen Quality-of-Life-Baum, der erklommen wird, während Spielende in der Bedürfnishierarchie der KI aufsteigen.

Der globale Planungsmodus ist der erste dieser Quality-of-Life-Unlocks. Er erlaubt es Spielenden, Fabriken in der uneingeschränkten globalen Ansicht zu platzieren und zu planen. Danach, sobald man in einen Exoframe einsteigt, können diese Pläne schnell in echte Gebäude und Produktionsketten verwandelt werden.

Die genauen Bedingungen für den "Unlock" sind ein cooler Story-Moment, den man meiner Meinung nach ungespoilert erleben sollte. Ich sage nur, dass der dauerhafte Zugang zum globalen Planungsmodus unter anderem voraussetzt, dass konstant 64/min strukturelles Eisen verfügbar sind.

Freue mich darauf, Leute das erleben zu sehen.

Seltsamere 2.5D-Förderbänder in einem seltsamen 3D-Land

Animiertes Bewegungsbeispiel
Damals, als Exofactory noch ein 2D-Prototyp war.

Exofactory hatte schon immer eine Art interne Spannung zwischen der frei fließenden organischen Welt und dem internen voxelbasierten Rastersystem, das Förderbänder, Gebäude und im Grunde alles verwenden. Bis zu einem gewissen Grad leiden, glaube ich, alle Fabrikspiele unter dieser Spannung, aber bei Exofactory wurde das wirklich zu einem wachsenden Problem, das angegangen werden musste.

Gedankengang

Exofactory begann ursprünglich als 2D-Prototyp eines Fabrikspiels, basierend auf dem hervorragenden bevy_ecs_tilemap. Als die Zeit verging und das Spiel vom 2D-Prototyp zum 3D-Spiel wurde, blieb ein großer Teil der ursprünglichen Logik erhalten (und sparte damals Aufwand), indem ich auf ein voxelbasiertes System wechselte.

Das funktioniert ziemlich gut, solange das Gelände flach ist oder selbst voxelbasiert ist, Minecraft-artig. Das Problem war, dass ich nicht wollte, dass das Gelände flach oder voxelbasiert ist.

Beim Spielen mit auch nur leicht nicht-flachem Gelände wurde es richtig schlecht. Damit alles ins Voxelraster passte, schwebten Gebäude entweder in der Luft oder sanken in den Boden ein.

Ich habe ein paar Optionen in Betracht gezogen, nämlich die Voxelhöhe zu verkleinern, damit der Effekt weniger schlimm wird, nur ein horizontales Raster zu haben und keine Voxels mit zusätzlichem vertikalem Prüfcode, dynamisches Aufteilen/Zusammenführen von Voxeln oder ein paar andere ehrlich gesagt schlechtere Ideen.

Nach einigen Tests und etwas Nachdenken habe ich letztlich entschieden, dass jede Lösung rund um Voxels angesichts der Richtung des Spiels nur ein Hack wäre.

In Zukunft wird das Voxelsystem schrittweise entfernt und durch 3D-nativere Ansätze ersetzt, nämlich Bevy-Splines, avian3d-Collider, Sensoren und Ähnliches.

Arbeit an Spline-Förderbändern

Der erste Bereich, in dem ich das gemacht habe, waren die Förderbänder, vor allem weil es ohne Spline-Förderbänder unmöglich wäre, Gebäude zu verbinden, außer sie sind exakt 1 m vertikal versetzt oder stehen auf mathematisch perfekt ebenem Boden.

Ich bin das schrittweise und stückweise angegangen.

Schritt 1 - Das einfachste mögliche Spline-Förderband

Das einfachste mögliche Spline-Förderband

Das ist so simpel, wie ich ein Spline-Förderband hinbekommen konnte. Der Kopf des Splines ist der erste Klick, das Ende der zweite. Wenn man den Fokuspunkt bewegt, rastet das Spline-Ende am nächsten Rasterpunkt ein. Ich habe ein paar einfache Rechtecke generiert und dann Bevys Mesh Builder verwendet, um das Mesh entlang des Splines zu "extrudieren".

An diesem Punkt ist alles rein visuell. Die meiste Arbeit hier bestand darin, Boilerplate für ein neues Gebäude usw. hinzuzufügen.

Schritt 2 - Förderband-Visuals & Geometrie verfeinern

Die aktualisierte Förderbandoberfläche und das Profil mit einer sauberen Kurve.

Als Nächstes habe ich die Extrusionsprofile der Förderbänder verfeinert, damit sie zum Profil der alten tile-basierten Förderbänder passen, und spezielle Logik für Kopf/Ende des Förderbands hinzugefügt, damit wir nicht einfach quadratische Enden haben. Ich wollte die unveränderten Texturen des alten Förderbands verwenden, also musste die Geometrie passen.

Da ich mit FreeCAD besser bin als mit Blender, habe ich tatsächlich die alte belt-glb-Datei in FreeCAD geöffnet, einen Querschnitt genommen und mit den Messwerkzeugen von FreeCAD die Maße ermittelt.

Ich habe den alten Shader, den ich bei den alten Förderbändern verwendet hatte, angepasst, damit die Förderbandoberfläche korrekt funktioniert, und mit der Arbeit an der Textur für die Förderbandgeländer begonnen. Ich brauche noch etwas Klärung zur Geländertextur, also ist das noch nicht erledigt. Vorerst haben wir standardmäßige graue Geländer.

Bei der Geometrie wird es interessant. Ich wollte, dass das Standard-Exofactory-Förderband eines ist, das sauber aussieht, wenn man viele davon zusammen platziert. Visuelle Befriedigung ist das Ziel. Der Fall, gegen den ich getestet habe, ist: Wenn man 12 Förderbänder auf einer Plattform über dem Boden platziert, sollte man sie durch eine 90-Grad-Kurve verlängern können, während sie auf saubere Weise absteigen. Sie sollten alle in einem vorhersehbaren Muster nebeneinander liegen, ohne Clipping. Bin zufrieden mit dem, was ich hier habe.

Technisch gesprochen ist das Förderband horizontal eine kardinale X/Z-Route mit einer begrenzten Hermite-Viertelkurve und einem Mindestbiegeradius. Vertikal ist es eine Smoothstep-Rampe, die nach der Routenkonstruktion darübergelegt wird.

Die finalen Meshes werden erzeugt, indem ein 2D-Querschnitt entlang des Splines durch die 2D-Profile gezogen wird.

An diesem Punkt sieht das Förderband deutlich besser aus, ist aber immer noch nur visuell.

Schritt 3 - Dem Förderband das Fördern beibringen

Ein funktionierendes Förderband, das Erz entlang eines komplexen Pfads transportiert.

Hier wurde viel Arbeit erledigt. Die gute Nachricht ist, dass ich viele der Komponenten (mit ihrer zugehörigen Logik) wiederverwenden konnte, die vom alten Tile-Förderbandkettensystem genutzt wurden.

Ironischerweise war das eine MASSIVE Vereinfachung. Ich muss mich nicht mehr darum kümmern, Förderbandketten zu platzieren, Ketten aufzuteilen oder zusammenzuführen, den Bewegungsspline von Items über viele Ketten hinweg zu aktualisieren oder diese Bewegungssplines mit den zugrunde liegenden, ziemlich komplizierten und voller Relationships steckenden Chain-Component-Mappings synchron zu halten.

Jetzt hat jedes Belt einen einzigen autoritativen Spline, von dem alles deterministisch abgeleitet wird, einschließlich der Item-Bewegung über das Förderband. Zwischen dem und ein paar anderen grundlegenden Spline-Förderbandkomponenten sind die Dinge viel leichter zu warten und zu debuggen.

Ich musste etwas Refactoring rund um Gebäude-Eingänge und -Ausgänge machen, die bisher voxelbasierte Logik verwendet hatten, um gültige Verbindungen zu prüfen. Innerhalb von Gebäuden nutzen sie weiterhin Voxel-Logik, um zu bestimmen, wo Ein- und Ausgangsports sind und wie sie ausgerichtet sein sollten, aber tatsächliche Verbindungen werden über eine Kombination aus avian-Sensoren und Component-Checks geprüft. Sobald der Verbindungscode eine gültige Verbindung markiert, bauen wir eine Relationship auf, die das Platzieren und Entfernen von Dingen auf den Förderbändern performant und aus Coding-Sicht ergonomisch einfach macht.

Die Förderbandkosten wurden leicht überarbeitet. Statt ein Eisen pro Förderband-Tile zu kosten, kosten Förderbänder jetzt 1 Eisen pro Meter, aufgerundet. Dasselbe gilt für die Prüfung der Förderbandkapazität, aber abgerundet.

Nachdem ein paar Dinge wie maximal erlaubte Förderband-Baulänge und maximale Förderbandsteigung hinzugefügt wurden, haben wir einen funktionierenden Ersatz für die alten tile-basierten Förderbänder.

Das alte Förderband-Tile-System danach zu entfernen, war gelinde gesagt sehr befriedigend.

Noch zu erledigende Arbeit

Das spline-basierte Förderbandsystem funktioniert, ist aber noch nicht ganz fertig. Mindestens möchte ich noch:

  1. Die echte Textur für die Förderbandgeländer verwenden. In der Theorie simpel, aber nervig sauber umzusetzen.
  2. Förderbandstützen hinzufügen. Im Moment schweben die Förderbänder einfach. Ich vermute, das wird niiiicht allzu schlimm. Ich muss nur ein bisschen Designarbeit machen.

Fazit

Bin wirklich froh, endlich die interne 2.5D/3D-Spannung des Spiels anzugehen. Ich habe viel zu lange damit gezögert, das zu fixen.

Auch super happy, mein erstes cooles In-Game-Story-Element vollständig ausprogrammiert zu haben. Fühlt sich komisch an, nicht alle Details zu nennen.

Wie auch immer, kein schlechter Monat. Und wieder einmal: Wenn du das hier angenehm, informativ oder einfach das Spiel gut findest, würde ich vorschlagen, das Spiel auf die Wunschliste zu setzen.