<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Exofactory Dev Blog</title>
      <link>https://exofactory.net</link>
      <description>Development updates and insights on Exofactory</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://exofactory.net/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sun, 03 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Technical Rework of Belts, and Global Planning Mode</title>
          <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-05-03/</link>
          <guid>https://exofactory.net/blog/2026-05-03/</guid>
          <description xml:base="https://exofactory.net/blog/2026-05-03/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;This month a few important developments were brought together.&lt;&#x2F;p&gt;
&lt;p&gt;The first of these is that &quot;purpose&quot; was, in a sense, introduced to the game. The October 2025 demo did receive some feedback around players not knowing what to do, even if they understood the game mechanically. This was valid and, to a point, expected. How does one &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Self-actualization&quot;&gt;self-actualize&lt;&#x2F;a&gt; as an AI in a game, and how is that reflected mechanically? By adding the global planning mode, we address both, and there are details below.&lt;&#x2F;p&gt;
&lt;p&gt;The second of these was addressing the inherent tension between the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Voxel&quot;&gt;tile&#x2F;voxel&lt;&#x2F;a&gt; based approach taken between the belts, the buildings, and the world. The strongest personification of this being &lt;em&gt;&lt;strong&gt;&quot;How do we build a factory on a smooth organic hillside if belts are tiles in a voxel-based space?&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;em&gt; After avoiding the topic for too long, the answer, I suspect, is that we can&#x27;t. Below is an overview of the new (not fully done) &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Spline_(mathematics)&quot;&gt;spline-based&lt;&#x2F;a&gt; system.&lt;&#x2F;p&gt;
&lt;p&gt;As always, if you find this post interesting, or if you are interested in the game, I would recommend wishlisting it on Steam. It helps a ton.&lt;&#x2F;p&gt;


&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
&lt;h1 id=&quot;global-planning-mode&quot;&gt;Global Planning Mode&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;global.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;global.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Placing buildings in Global View mode and building them in the Exoframe.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;In Exofactory there is the spider web tech &quot;tree&quot; that you grow into based on how you play. But there is also a quality-of-life tree that is climbed as the player ascends the AI&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Maslow%27s_hierarchy_of_needs&quot;&gt;hierarchy of needs&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Global planning mode is the first of those quality-of-life unlocks. It allows the player to place and plan factories in the unconstrained global view mode. Then, after entering an Exoframe, those plans can be quickly turned into real buildings and production chains.&lt;&#x2F;p&gt;
&lt;p&gt;The exact conditions of the &quot;unlock&quot; are a cool story moment that I think is worth experiencing unspoiled. I will say that maintaining access to global planning mode requires, among other things, a consistent 64&#x2F;min of structural iron be available.&lt;&#x2F;p&gt;
&lt;p&gt;Excited to see people experience this.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;stranger-2-5d-belts-in-a-strange-3d-land&quot;&gt;Stranger 2.5D Belts in a Strange 3D Land&lt;&#x2F;h1&gt;
&lt;figure style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem auto; max-width: 1280px;&quot;&gt;
  &lt;picture style=&quot;width: 100%; display: block;&quot;&gt;
    &lt;img src=&quot;&#x2F;media&#x2F;2025-04-19&#x2F;movement.webp&quot; alt=&quot;Animated movement sample&quot; style=&quot;width: 100%; height: auto; border-radius: var(--border-radius);&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;&#x2F;picture&gt;
  &lt;figcaption style=&quot;margin-top: 0.25rem; font-style: italic; font-size: 0.9rem; color: var(--muted-color); text-align: center;&quot;&gt;Back when Exofactory was a 2D prototype.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Exofactory has always had a sort of internal tension between the free-flowing organic world and the internal voxel-based grid system that belts, buildings, and basically everything use. To a degree, I think all factory games suffer from this tension, but with Exofactory, this really was a growing problem that needed to be addressed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thought-process&quot;&gt;Thought Process&lt;&#x2F;h2&gt;
&lt;p&gt;Exofactory initially started as a &lt;a href=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;blog&#x2F;2025-04-19&#x2F;&quot;&gt;2D prototype factory game&lt;&#x2F;a&gt; based around the excellent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;bevy_ecs_tilemap&quot;&gt;bevy_ecs_tilemap&lt;&#x2F;a&gt;. As time went on and the game went from 2D prototype to 3D game, a lot of the initial logic was preserved (and, at the time, effort saved) by moving to a voxel-based system.&lt;&#x2F;p&gt;
&lt;p&gt;This works quite well as long as the terrain is flat, or is voxel-based itself, Minecraft-style. The problem was that I didn&#x27;t want the terrain to be flat or voxel-based.&lt;&#x2F;p&gt;
&lt;p&gt;When playing with even slightly not-flat terrain, things got really bad. In order to have everything fit in the voxel grid, buildings would either float in the air or sink into the ground.&lt;&#x2F;p&gt;
&lt;p&gt;I did consider a few options, namely shrinking the voxel height to be smaller so the effect would be less bad, only having a horizontal grid and no voxels with additional vertical checking code, having dynamic voxel splitting&#x2F;joining, or a few other frankly worse ideas.&lt;&#x2F;p&gt;
&lt;p&gt;After some tests and reflection, ultimately I decided that any solution around voxels would just be a hack given the game direction.&lt;&#x2F;p&gt;
&lt;p&gt;Going forward, the voxel system will be gradually removed and replaced with more 3D-native approaches, namely &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;math&#x2F;cubic-splines&#x2F;&quot;&gt;Bevy splines&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;collider&#x2F;struct.Collider.html&quot;&gt;avian3d colliders&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;collider&#x2F;struct.Sensor.html&quot;&gt;sensors&lt;&#x2F;a&gt;, and the like.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;spline-belt-work&quot;&gt;Spline Belt Work&lt;&#x2F;h2&gt;
&lt;p&gt;The first area where I did this was with the belts, namely because without spline belts, unless the buildings are exactly 1m offset vertically, or on mathematically flawless level ground, they would be impossible to connect.&lt;&#x2F;p&gt;
&lt;p&gt;I took a step-by-step piecewise approach to this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;step-1-most-basic-spline-belt-possible&quot;&gt;Step 1 - Most Basic Spline Belt Possible&lt;&#x2F;h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;mvp.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;mvp.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Simplest Spline Belt Possible&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This is as simple of a spline belt as I could manage. The head of the spline is the first click, the tail is the second. As you move the focus point around, the spline tail snaps to the nearest grid point. I generated a few basic rectangles, then used &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;3d-rendering&#x2F;generate-custom-mesh&#x2F;&quot;&gt;Bevy&#x27;s Mesh Builder&lt;&#x2F;a&gt; to &quot;extrude&quot; the mesh along the spline.&lt;&#x2F;p&gt;
&lt;p&gt;At this point everything is just visual. Most of the work here was done around adding the boilerplate for a new building, etc.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;step-2-refine-belt-visuals-geometry&quot;&gt;Step 2 - Refine Belt Visuals &amp;amp; Geometry&lt;&#x2F;h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;surface.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;surface.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;The updated belt surface and profile with a clean bend.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Next up I refined the belt extrusion profiles to match the profile of the old tile-based belts and added some special belt head&#x2F;tail logic so we don&#x27;t just have square ends. I wanted to use the unmodified textures from the old belt, so matching the geometry was necessary.&lt;&#x2F;p&gt;
&lt;p&gt;Being better with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.freecad.org&quot;&gt;FreeCAD&lt;&#x2F;a&gt; than I am with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.blender.org&quot;&gt;Blender&lt;&#x2F;a&gt;, I actually opened the old belt glb file in FreeCAD, took a cross section, and used the FreeCAD measurement tools to get the dimensions.&lt;&#x2F;p&gt;
&lt;p&gt;I modified the old shader I used with the old belts to get the belt surface working correctly and began work on the belt rail texture. I need a bit of clarification on the belt rail texture, so that is yet to be done. For now we have default gray rails.&lt;&#x2F;p&gt;
&lt;p&gt;The geometry is where it gets interesting. I wanted the default Exofactory belt to be one that looks clean when you place a lot of them together. Visual satisfaction is the goal. The case I tested against is that if you have 12 belts placed on a platform above the ground, you should be able to extend them through a 90-degree turn while descending in a clean way. They should all line up next to each other in a predictable pattern with no clipping. Happy with what I have here.&lt;&#x2F;p&gt;
&lt;p&gt;Technically speaking, horizontally, the belt is a cardinal X&#x2F;Z route with a clamped Hermite quarter-turn and a minimum bend radius. Vertically, it is a smoothstep ramp layered on after route construction.&lt;&#x2F;p&gt;
&lt;p&gt;The final meshes are produced by sweeping a 2D cross-section along the spline through the 2D profiles.&lt;&#x2F;p&gt;
&lt;p&gt;At this point the belt is looking a lot better but is still just visual.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;step-3-making-the-belt-do-belting&quot;&gt;Step 3 - Making the Belt Do Belting&lt;&#x2F;h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;3d.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-05-03&#x2F;3d.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;A working belt carrying ore along a complex path.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Here major work was done. The good news is that I could reuse many of the components (with their corresponding logic) that were used by the old tile belt chain system.&lt;&#x2F;p&gt;
&lt;p&gt;Ironically enough, this was a VAST simplification. No longer do I have to worry about placing chains of belts, splitting or merging chains, updating the motion spline of items across many chains, or keeping those motion splines in sync with the underlying (rather complicated and full of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;3d-rendering&#x2F;parenting&#x2F;&quot;&gt;relationships&lt;&#x2F;a&gt;) chain component mappings.&lt;&#x2F;p&gt;
&lt;p&gt;Now each Belt has a single authoritative spline that everything is deterministically driven from, including item motion across the belt. Between that and a few other basic spline belt components, things are much easier to maintain and debug.&lt;&#x2F;p&gt;
&lt;p&gt;I did need to do some refactoring around building inputs and outputs, which had used voxel-based logic to check for valid connections. While in buildings, they still use voxel logic to determine where input and output ports are and how they should be oriented, actual connections are checked via a combination of avian sensors and component checking. Once the connection code marks a valid connection, we build a relationship that makes placing and removing things from the belts performant and ergonomically simple from a coding perspective.&lt;&#x2F;p&gt;
&lt;p&gt;Belt cost went through a minor rework. Instead of costing one iron per belt tile, belts cost 1 iron per meter rounded up. Same with checking belt capacity, but rounded down.&lt;&#x2F;p&gt;
&lt;p&gt;After adding a few things like maximum allowed belt build length and maximum belt grade, we have a working replacement for the old tile-based belts.&lt;&#x2F;p&gt;
&lt;p&gt;Removing the old belt tile system was very satisfying, to say the least, after this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;work-to-be-done&quot;&gt;Work to Be Done&lt;&#x2F;h3&gt;
&lt;p&gt;The spline-based belt system is working, but it isn&#x27;t fully done yet. At least I want to:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Use the actual texture for the belt rails. Simple in theory, but annoying to do cleanly.&lt;&#x2F;li&gt;
&lt;li&gt;Add belt supports. Right now the belts just float. I suspect this won&#x27;t be toooo bad. I just need to do a bit of design work.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;Really happy with finally addressing the internal 2.5D&#x2F;3D tension of the game. I have been stalling on fixing it for too long.&lt;&#x2F;p&gt;
&lt;p&gt;Also super happy to have my first cool in-game story element fully coded out. Feels weird to not give all the details.&lt;&#x2F;p&gt;
&lt;p&gt;Regardless, not a bad month. And once again, if you found this enjoyable, informative, or just like the game, I would suggest giving the game a wishlist.&lt;&#x2F;p&gt;


&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot; aria-label=&quot;Wishlist on Steam&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>Building Animation, Trailer, &amp; Pitch Deck Stuff</title>
          <pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-04-06/</link>
          <guid>https://exofactory.net/blog/2026-04-06/</guid>
          <description xml:base="https://exofactory.net/blog/2026-04-06/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;The past month has been a mix of a little technical work and a lot of pitch deck work, planning, and legal compliance. I am not in a place where too much can be said yet, but work is being done here.&lt;&#x2F;p&gt;
&lt;p&gt;So while I have less to show than usual, a lot of underlying work has been done. I do have two cool things to show off though. This month I added a new building animation when placing buildings, and put together a new more gameplay focused trailer.&lt;&#x2F;p&gt;
&lt;p&gt;If you are interested in the game I would encourage you to consider wishlisting it on Steam.&lt;&#x2F;p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
&lt;h1 id=&quot;new-building-animation&quot;&gt;New Building Animation&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-04-06&#x2F;fade_fab.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-04-06&#x2F;fade_fab.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;The fabricator being spawned in.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;I really wanted to have a &quot;building&quot; animation that reflected the digital nature of the AI you play as. I had considered a few things including pixelation, &quot;spawning from the void&quot;, and a matrix inspired approach. Ultimately, I went with something partially inspired from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Revelation_Space_series&quot;&gt;Revelation Space&lt;&#x2F;a&gt; sci-fi series, particularly my interpretation of how the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;revelationspace.fandom.com&#x2F;wiki&#x2F;Inhibitors&quot;&gt;&quot;Inhibitors&quot; (spoiler warning)&lt;&#x2F;a&gt; might have looked. That mixed with some of the skin shader logic I have been playing around with led me to an effect that I think is quite cool, and uniquely Exofactory.&lt;&#x2F;p&gt;
&lt;p&gt;Larger buildings take longer to spawn and smaller ones take less time. It ends up being a pretty elegant shader&#x2F;loading system.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-04-06&#x2F;fade_belt.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-04-06&#x2F;fade_belt.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Short belt segments have no spawning animation, long do.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;The effect scales really well to belts too. Pretty happy with it. The good news is that shorter belt segments do not need any loading animation, so worry not.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;trailer&quot;&gt;Trailer&lt;&#x2F;h1&gt;



&lt;div class=&quot;youtube-embed&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;wyFvr91OSk4&quot;
    title=&quot;YouTube video player&quot;
    loading=&quot;lazy&quot;
    referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
    webkitallowfullscreen
    mozallowfullscreen
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;As part of the pitch deck work, my partner helped me put together a new faster paced trailer that shows off gameplay and highlights the narrative elements in a more clear way. Much better I think, and definitely needed for the pitch deck.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;publishing-resource-management&quot;&gt;Publishing &amp;amp; Resource Management&lt;&#x2F;h1&gt;
&lt;p&gt;Most of the past month was dedicated to working on what I will call &quot;pitch deck stuff&quot;. Definitely not an area of my specialty, but I think I now have something that reflects Exofactory in a fair way.&lt;&#x2F;p&gt;
&lt;p&gt;Also I have started a bit of work around legal compliance. Not too exciting, but a necessity, particularly in Germany. Hopefully soon we should have a small GmbH that will become the indie studio.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;Not too much to be said in terms of technical advancement beyond the cool shader, but a lot of important background work is now in motion.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Optimizations, PRs, Tooling, &amp; Funds</title>
          <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-03-05/</link>
          <guid>https://exofactory.net/blog/2026-03-05/</guid>
          <description xml:base="https://exofactory.net/blog/2026-03-05/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;The past month has been full of a diverse set of work. From major optimizations, to a few issues found in those efforts, to new tooling, to the official start of work in looking for a partner publisher &#x2F; investor a ton of programming and non-programming work has been done.&lt;&#x2F;p&gt;
&lt;p&gt;If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot;&gt;wishlist on steam&lt;&#x2F;a&gt;. It helps a ton.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;optimizations&quot;&gt;Optimizations&lt;&#x2F;h1&gt;
&lt;p&gt;The main technical area of focus this month was around optimization. Over the past year a combination &quot;don&#x27;t preemptively optimize mindset&quot; mixed with a (un?)healthy dose of me missing Bevy domain knowledge, mixed in with a few genuine bevy bugs has resulted in an extremely unoptimized game when it came to memory usage.&lt;&#x2F;p&gt;
&lt;p&gt;Looking at the last pre-optimization build of the game we were looking at 7GB of system memory with just about the same amount of VRAM usage. (hint here) Given the complexity of Exofactory I knew the game would never be one of those 200MB runtime games, but this was atrocious, and frankly embarrassing. It was to the point where I could hardly run &lt;code&gt;--release&lt;&#x2F;code&gt; builds on my (admittedly old) 11th Gen Intel Framework.&lt;&#x2F;p&gt;
&lt;p&gt;Given this situation I set out to learn &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bevyengine&#x2F;bevy&#x2F;blob&#x2F;main&#x2F;docs&#x2F;profiling.md&quot;&gt;tracy and how it works in bevy&lt;&#x2F;a&gt;, and to take the time to actually clean things up.&lt;&#x2F;p&gt;
&lt;p&gt;Long story short I somewhat know how to use tracy even though I would describe myself as a total beginner. But I also fixed the issue, the process basically boiled down to these 4 areas:&lt;&#x2F;p&gt;
&lt;h2 id=&quot;storing-everything-in-system-memory&quot;&gt;Storing Everything in System Memory&lt;&#x2F;h2&gt;
&lt;p&gt;By default when you do a &lt;code&gt;asset_server.load(&quot;my_thing.png&quot;)&lt;&#x2F;code&gt; the asset is loaded into system ram and when spawned it is loaded into VRAM. With a smaller image this isn&#x27;t too bad, but when you load a complicated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;tools&#x2F;scene-viewer&#x2F;&quot;&gt;&lt;code&gt;.glb&#x2F;.gltf&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; file things can get heavy fast. If you have a GLB with 6 RGBA 4096x4096 textures in it. (i.e. norm, metallic, roughness, etc) that would use ~384MB of system memory. With &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mipmap&quot;&gt;mipmaps&lt;&#x2F;a&gt; make that ~512MB per GLB asset. This alone was responsible for the GREAT MAJORITY of the crazy amount of RAM Exofactory was using.&lt;&#x2F;p&gt;
&lt;p&gt;The good news is that you don&#x27;t have to store this all in system memory. In Bevy you can store things in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy_render&#x2F;latest&#x2F;bevy_render&#x2F;struct.MainWorld.html&quot;&gt;MainWorld&lt;&#x2F;a&gt; or in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bevyengine&#x2F;bevy&#x2F;discussions&#x2F;13494&quot;&gt;RenderWorld&lt;&#x2F;a&gt; or both. MainWorld is the the game as you might think of it. Just everything all in system memory. RenderWorld on the other hand is a sort of tag that marks things such as to only live on the GPU.&lt;&#x2F;p&gt;
&lt;p&gt;I could reduce system memory usage by simply not storing textures outside of the GPU when I don&#x27;t intend to do anything with them.&lt;&#x2F;p&gt;
&lt;p&gt;Bevy has several ways to do this, but the simplest for me was to use &lt;code&gt;.meta&lt;&#x2F;code&gt; files.&lt;&#x2F;p&gt;
&lt;p&gt;In Bevy, &lt;code&gt;.meta&lt;&#x2F;code&gt; files sit alongside your assets and let you override how the asset loader handles them. They use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;asset&#x2F;meta&#x2F;struct.AssetMeta.html&quot;&gt;Bevy&#x27;s RON-like format&lt;&#x2F;a&gt; and are named after the asset file they configure. So for &lt;code&gt;fabricator_01_icon.ktx2&lt;&#x2F;code&gt; you would have a &lt;code&gt;fabricator_01_icon.ktx2.meta&lt;&#x2F;code&gt; file right next to it.&lt;&#x2F;p&gt;
&lt;p&gt;For a simple image asset the meta file looks like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ron&quot;&gt;(
    meta_format_version: &amp;quot;1.0&amp;quot;,
    asset: Load(
        loader: &amp;quot;bevy_image::image_loader::ImageLoader&amp;quot;,
        settings: (
            format: FromExtension,
            is_srgb: true,
            sampler: Default,
            asset_usage: RenderAssetUsages(&amp;quot;RENDER_WORLD&amp;quot;),
        ),
    ),
)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The key line is &lt;code&gt;asset_usage: RenderAssetUsages(&quot;RENDER_WORLD&quot;)&lt;&#x2F;code&gt;. This tells Bevy to only keep the texture on the GPU, freeing up the system memory copy entirely.&lt;&#x2F;p&gt;
&lt;p&gt;For GLB files we can get more granular. Here is an example from one of the belt building models:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ron&quot;&gt;(
    meta_format_version: &amp;quot;1.0&amp;quot;,
    asset: Load(
        loader: &amp;quot;bevy_gltf::loader::GltfLoader&amp;quot;,
        settings: (
            load_meshes: RenderAssetUsages(&amp;quot;MAIN_WORLD | RENDER_WORLD&amp;quot;),
            load_materials: RenderAssetUsages(&amp;quot;RENDER_WORLD&amp;quot;),
            load_cameras: true,
            load_lights: true,
            load_animations: true,
            include_source: false,
            default_sampler: None,
            override_sampler: false,
            convert_coordinates: None,
        ),
    ),
)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Notice that &lt;code&gt;load_meshes&lt;&#x2F;code&gt; keeps both &lt;code&gt;MAIN_WORLD | RENDER_WORLD&lt;&#x2F;code&gt;. This is because I need mesh data in system memory for things like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;index.html&quot;&gt;collision detection&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;spatial_query&#x2F;struct.SpatialQuery.html&quot;&gt;raycasting&lt;&#x2F;a&gt;. But &lt;code&gt;load_materials&lt;&#x2F;code&gt; (which includes the textures) is set to only &lt;code&gt;RENDER_WORLD&lt;&#x2F;code&gt;. This gives us the best of both worlds. Meshes stay accessible in system memory where we need them, while the textures that make up the bulk of the memory usage only live on the GPU.&lt;&#x2F;p&gt;
&lt;p&gt;The nice thing about meta files is that they don&#x27;t require any code changes. You just drop them next to your assets and the loader picks them up automatically. One small &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fishshell.com&#x2F;&quot;&gt;fish&lt;&#x2F;a&gt; script later and I was done.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-non-gpu-native-bitmap-formats&quot;&gt;Using non GPU native bitmap formats&lt;&#x2F;h2&gt;
&lt;p&gt;The meta file changes above helped with system memory, but VRAM was still a problem. Exofactory was using PNG for standalone textures and embedded PNGs inside GLB files which was the root cause of the high VRAM usage.&lt;&#x2F;p&gt;
&lt;p&gt;Moving to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.khronos.org&#x2F;ktx&#x2F;&quot;&gt;KTX2&lt;&#x2F;a&gt; for textures was the solution. It&#x27;s a container format from Khronos that can hold &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BinomialLLC&#x2F;basis_universal&#x2F;wiki&#x2F;KTX2-File-Format-Support-Technical-Details&quot;&gt;many GPU native compressed formats&lt;&#x2F;a&gt;.
Of the formats available I considered UASTC and ETC1S because of native Bevy support. They have different tradeoffs:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;UASTC&lt;&#x2F;th&gt;&lt;th&gt;ETC1S&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Quality&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Near lossless&lt;&#x2F;td&gt;&lt;td&gt;Lossy, lower quality&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VRAM Usage&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;~1 byte&#x2F;pixel&lt;&#x2F;td&gt;&lt;td&gt;~0.5 bytes&#x2F;pixel&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Disk Size&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Larger (with Zstd)&lt;&#x2F;td&gt;&lt;td&gt;Much smaller&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Transcode Speed&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Fast&lt;&#x2F;td&gt;&lt;td&gt;Very fast&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Best For&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Normal maps, UI elements, detailed textures&lt;&#x2F;td&gt;&lt;td&gt;Textures where quality is less critical&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;For Exofactory I went with UASTC across the board mostly out of laziness. I should really be using ETC1S for textures where a lower quality would not be noticeable and the VRAM savings would be nice. That&#x27;s a TODO for later.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;finding-a-bug-in-bevy-around-ktx2&quot;&gt;Finding a bug in Bevy around KTX2&lt;&#x2F;h2&gt;
&lt;p&gt;In moving to KTX2 files one of the bugs I noticed is that Bevy was not honoring the &lt;code&gt;.meta&lt;&#x2F;code&gt; files for ktx2 files. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bevyengine&#x2F;bevy&#x2F;pull&#x2F;22992&quot;&gt;One small PR later&lt;&#x2F;a&gt; and it was fixed. This fix will be included in Bevy 0.18.1&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-ktx2-properly-in-glb-files&quot;&gt;Using KTX2 properly in GLB files&lt;&#x2F;h2&gt;
&lt;p&gt;A larger more serious problem I found is that Bevy does not properly support KTX2 textures in GLTF&#x2F;GLB files. While you can just hack the ktx texture into the file and it will work in Bevy the problem is that the resulting file is not a compliant GLTF&#x2F;GLB file.&lt;&#x2F;p&gt;
&lt;p&gt;The root cause of this problem is that Bevy is using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gltf-rs&#x2F;gltf&quot;&gt;gltf-rs&lt;&#x2F;a&gt; as part of its GLB&#x2F;GLTF pipeline. While the library is robust when it comes strictly to the official GLTF 2.0 spec. It is deeply deficient in those &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;KhronosGroup&#x2F;glTF&#x2F;blob&#x2F;main&#x2F;extensions&#x2F;README.md&quot;&gt;defacto mandatory extensions including ktx2&lt;&#x2F;a&gt; I have &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gltf-rs&#x2F;gltf&#x2F;pull&#x2F;467&quot;&gt;submitted a PR&lt;&#x2F;a&gt; but the last code change was in November 2025 and I am not hopeful.&lt;&#x2F;p&gt;
&lt;p&gt;For now Exofactory is using my fork of the library, but a longer term solution needs to be found.&lt;&#x2F;p&gt;
&lt;p&gt;I am currently working on a document with a few ideas to be pitched to the Bevy core team based on a their request.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results&lt;&#x2F;h2&gt;
&lt;p&gt;After implementing improvements in the above 4 areas the game is massively more optimized. The game went from 7GB of system ram to under 1GB. From 7GB of VRAM to under 2GB. My old laptop now gets 60fps on low which makes mobile development possible again. It was a big push but totally worth it.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;tooling&quot;&gt;Tooling&lt;&#x2F;h1&gt;
&lt;p&gt;As a small side project I worked on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevydex.dev&#x2F;&quot;&gt;BevyDex.dev&lt;&#x2F;a&gt; this month. It&#x27;s basically a thin wrapper around the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&quot;&gt;crates.io&lt;&#x2F;a&gt; api and a postgres database.&lt;&#x2F;p&gt;
&lt;p&gt;But it&#x27;s always up to date, shows important details and is lightning fast(tm).&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s a side project unrelated to Exofactory. But it was made so I could sort through the ecosystem and I hope others find it useful too.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;funds&quot;&gt;Funds&lt;&#x2F;h1&gt;
&lt;p&gt;Last but not least, Exofactory will soon officially be reaching out to several publishers. With recent personal events, while I can code, I can not finance the whole game on my own. Hopefully some interesting news comes out of that area soon. If you have any advice here I would be glad to hear it.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;I like programming more than I like working on pitch decks. I prefer fixing bugs upstream when I can. And I am happy to put out things I think may be useful.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Multiplayer, Bevy 0.18, and Fosdem</title>
          <pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2026-02-04/</link>
          <guid>https://exofactory.net/blog/2026-02-04/</guid>
          <description xml:base="https://exofactory.net/blog/2026-02-04/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;This month was basically solely focused on adding multiplayer functionality with a small break for a bevy 0.18 migration.&lt;&#x2F;p&gt;
&lt;p&gt;If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot;&gt;wishlist on steam&lt;&#x2F;a&gt;. It helps a ton.&lt;&#x2F;p&gt;
&lt;p&gt;I will say that I regret not starting the multiplayer code earlier. Like internationalization, and saving, multiplayer is something that should be architected for from the beginning. The good news is that the code was clean enough that it wasn&#x27;t &lt;em&gt;too&lt;&#x2F;em&gt; hard to refactor.&lt;&#x2F;p&gt;
&lt;p&gt;In other news &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;migration-guides&#x2F;0-17-to-0-18&#x2F;&quot;&gt;migrating from 0.17 to 0.18&lt;&#x2F;a&gt; was pretty painless. I had to drop a few more less maintained crates, but the core migration itself was simple.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, I took the time to head out to Fosdem to hang out with the Bevy community. While I didn&#x27;t give a talk &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.gamedev.place&#x2F;@Vrixyz&quot;&gt;Thierry Berger&lt;&#x2F;a&gt; gave an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fosdem.org&#x2F;2026&#x2F;schedule&#x2F;event&#x2F;NKVSUJ-bevy_engine_bof_-_demo_and_chat&#x2F;&quot;&gt;excellent one on mobile bevy game development&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;multiplayer&quot;&gt;Multiplayer&lt;&#x2F;h1&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-02-04&#x2F;join_menu.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-02-04&#x2F;join_menu.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2026-02-04&#x2F;join_menu.webp&quot; alt=&quot;The game supports simultaneous Direct Connect, LAN, and Steam multiplayer hosting and joining.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;The game supports simultaneous Direct Connect, LAN, and Steam multiplayer hosting and joining.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;For people writing games in Bevy I had been giving the advice to consider your internationalization, gamepad, and save stories early. I now regret that I missed likely the most important factor to consider early this being multiplayer and netcode.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;So with that my updated list of things to consider early are your:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Multiplayer &#x2F; Netcode Story&lt;&#x2F;li&gt;
&lt;li&gt;Gamepad Story&lt;&#x2F;li&gt;
&lt;li&gt;Save Story&lt;&#x2F;li&gt;
&lt;li&gt;Internationalization Story&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Adding these later will be annoying and painful. (Ask me how I know! &#x2F;s)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exofactory-specifics&quot;&gt;Exofactory Specifics&lt;&#x2F;h2&gt;
&lt;p&gt;Exofactory is a Factory game where the player plays as an AI who interacts with the world via little robots called &quot;Exoframes&quot; that must be built by the player. While not occupying an Exoframe the player can zip around their factories in the global camera mode.&lt;&#x2F;p&gt;
&lt;p&gt;This leads to a sort of natural co-optative approach where players can join the game in the global mode where they can look around, and can configure existing machines. Once there is an Exoframe that is not being occupied the new player can &quot;inhabit&quot; it building and exploring the world beyond the factory sensor range.&lt;&#x2F;p&gt;
&lt;p&gt;This leads to a nice sort of multiplayer metaplot while at the same time providing a clear technical story about what must be done in the netcode these being:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Interact with the world in Global mode including building interaction.&lt;&#x2F;li&gt;
&lt;li&gt;Selecting and controlling one of a Pool of Exoframes.&lt;&#x2F;li&gt;
&lt;li&gt;Running the rest of the world to update the relevant components.&lt;&#x2F;li&gt;
&lt;li&gt;Ensuring the client sees the world in an accurate way.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Personally, I think this naturally leads to a server authoritative model. The server instance of the game runs the world, and the client instances just participate in it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;picking-a-library&quot;&gt;Picking a Library&lt;&#x2F;h2&gt;
&lt;p&gt;At the time on Bevy 0.18 there seem to be two well supported crates these being &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;bevy_replicon&quot;&gt;bevy_replicon&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;lightyear&quot;&gt;lightyear&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I encourage you to take a look at both as both have their unique advantages. In my (potentially flawed) understanding, lightyear adds more features like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Client-side_prediction&quot;&gt;client side prediction&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cBournhonesque&#x2F;lightyear&#x2F;tree&#x2F;main&#x2F;examples&#x2F;deterministic_replication&quot;&gt;deterministic replication&lt;&#x2F;a&gt; and interest management (only syncing relevant data), at the expense of initial overhead and complexity, while replicon omits these features by default, but is simpler to setup with less dev time overhead. If my understanding is wrong here I would be happy to correct this if anyone reaches out.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;&#x2F;strong&gt; Someone did reach out! Turns out bevy_replicon &lt;em&gt;does&lt;&#x2F;em&gt; support deterministic replication and interest management. The features it lacks compared to lightyear are client-&amp;gt;server replication, lag compensation, client-side prediction, and interpolation. Also lightyear is planning to re-use replicon for replication.&lt;&#x2F;p&gt;
&lt;p&gt;For Exofactory, given that the game is definitively &lt;em&gt;NOT&lt;&#x2F;em&gt; a twitchy shooter, and my planned pace of feature development, and my relative newness to game dev net code I decided to go with the simpler to set up replicon.&lt;&#x2F;p&gt;
&lt;p&gt;This all being said, I suspect that if your game architecture is already well structured switching later would not be a painful process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;from-single-player-to-multi&quot;&gt;From Single Player to Multi&lt;&#x2F;h2&gt;
&lt;p&gt;At the heart of it replicon does two things. Replicate components, and handle network events&#x2F;messages to&#x2F;from clients.&lt;&#x2F;p&gt;
&lt;p&gt;In order to enable multiplayer I had to refactor several systems and logically group them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2026-02-04&#x2F;multiplayer_architecture.webp&quot; alt=&quot;Exofactory Multiplayer Architecture&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;authoritative-core-systems&quot;&gt;Authoritative Core Systems&lt;&#x2F;h3&gt;
&lt;p&gt;These only run on the server instance and update the world (all the components that store game state) for everything not directly manipulated by the player.&lt;&#x2F;p&gt;
&lt;p&gt;This includes things like the machine cycle that turns iron ore into iron ingots, what sounds should be played, and even the rate of mining that any exoframe is doing while the player watches. There are many many more systems but these are the type that run in the group.&lt;&#x2F;p&gt;
&lt;p&gt;These systems are allowed to write to components directly. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy_replicon&#x2F;latest&#x2F;bevy_replicon&#x2F;#replication&quot;&gt;Replicon automatically replicates these changes to the client instance of the components.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;player-ui-systems&quot;&gt;Player UI Systems&lt;&#x2F;h3&gt;
&lt;p&gt;These run only on game instances where a player plays. These play the sound, show the building UIs, and let the player know the state of the world. These systems read the state of the world by reading the local components that are kept in sync automatically.&lt;&#x2F;p&gt;
&lt;p&gt;The part that required major refactor work is that in these systems no direct manipulation of components is allowed. The clients must send &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy_replicon&#x2F;latest&#x2F;bevy_replicon&#x2F;#network-messages-and-events&quot;&gt;an event&#x2F;message to the server&lt;&#x2F;a&gt; which then manipulates the components on behalf of the client and updates the components which are replicated to the client.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;network-messages-events&quot;&gt;Network Messages &amp;amp; Events&lt;&#x2F;h3&gt;
&lt;p&gt;In the above diagram I only included one example, but in reality basically everything you do in the game beyond &lt;em&gt;&quot;looking at stuff&quot;&lt;&#x2F;em&gt; happens via event or message. This includes the player on the server instance of the game.&lt;&#x2F;p&gt;
&lt;p&gt;This I would say is the MOST important factor to consider when working on a bevy game that might eventually support multiplayer. If I had done this from the beginning adding the multiplayer functionality would have been easy. Even if you don&#x27;t want to think about networking at the beginning, just ensuring all player manipulations of the world go through the native &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;ecs&#x2F;event&#x2F;trait.Event.html&quot;&gt;bevy event systems&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;prelude&#x2F;struct.Messages.html&quot;&gt;message systems&lt;&#x2F;a&gt; will save you time later.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ramifications-outcomes&quot;&gt;Ramifications &amp;amp; Outcomes&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2026-02-04&#x2F;multiplayer_architecture_headless.webp&quot; alt=&quot;Exofactory Multiplayer Architecture Headless&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There were two sorts of artifacts that came out of this. The first one, was something that I was planning on working on later, but due to said refactoring became much easier. That being a headless server instance that the player can self host in docker&#x2F;podman etc. This would allow the factory to continuously run without anyone needing to keep the game running on their PC.&lt;&#x2F;p&gt;
&lt;p&gt;With the refactoring and a new feature based build of the game that uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;struct.MinimalPlugins.html&quot;&gt;MinimalPlugins&lt;&#x2F;a&gt; instead of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;struct.DefaultPlugins.html&quot;&gt;DefaultPlugins&lt;&#x2F;a&gt; we get a clean lean headless server instance of the game that can run basically anywhere including most RISC-V SBCs!&lt;&#x2F;p&gt;
&lt;p&gt;This still needs testing but things are looking good. Above is a similar diagram but for the headless version of the game.&lt;&#x2F;p&gt;
&lt;p&gt;The second interesting outcome is that I am using way fewer &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;quick-start&#x2F;getting-started&#x2F;resources&#x2F;&quot;&gt;Bevy resources&lt;&#x2F;a&gt; namely because Replicon does not replicate resources. Resultingly I am using way more &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Singleton_pattern&quot;&gt;pseudo-singletons&lt;&#x2F;a&gt; (aka an &quot;empty&quot; entity that just has the component that holds the data the resource used to.)&lt;&#x2F;p&gt;
&lt;p&gt;I am not a huge fan of object oriented design patterns, so it&#x27;s a bit funny and feels a bit dirty.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;bevy-0-18-migration&quot;&gt;Bevy 0.18 Migration&lt;&#x2F;h1&gt;
&lt;p&gt;I have seen the light! For real though any Bevy game that has light should prioritize migrating. Major work has been done and the game looks notably better. This being said, even if your game does not use light you should still prioritize migrating.&lt;&#x2F;p&gt;
&lt;p&gt;Overall beyond a few shader bind group things (i.e. BindGroupLayout -&amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;render&#x2F;render_resource&#x2F;struct.BindGroupLayoutDescriptor.html&quot;&gt;BindGroupLayoutDescriptor&lt;&#x2F;a&gt;) and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;3d-rendering&#x2F;atmosphere&#x2F;&quot;&gt;Atmosphere&lt;&#x2F;a&gt; changes it was a simple migration.&lt;&#x2F;p&gt;
&lt;p&gt;Glad to see the release schedule back on track.&lt;&#x2F;p&gt;
&lt;p&gt;I will say though, with each upgrade I see more and more plugins falling by the wayside. This makes me appreciate the maintainers of plugins even more. Keeping up with Bevy&#x27;s release schedule is a major task compared to any other game engine.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;fosdem&quot;&gt;Fosdem!&lt;&#x2F;h1&gt;
&lt;p&gt;Speaking of, I had the privilege to attend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fosdem.org&#x2F;&quot;&gt;Fosdem&lt;&#x2F;a&gt; a libre get together that is hosted in Brussels every year.&lt;&#x2F;p&gt;
&lt;p&gt;If you are interested in open source game engines, or in reality open source anything at all I would highly recommend going. There are a ton of fun and interesting talks, but the best part (in my book anyways) is being able to meet and see and hang out with the people whom you normally only talk to online. I know the Bevy dinner with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.gamedev.place&#x2F;@Vrixyz&quot;&gt;Thierry Berger&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;friz64.de&#x2F;&quot;&gt;Gee&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.online&#x2F;@nikl_me&quot;&gt;Niklas Eicker&lt;&#x2F;a&gt;,  &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Firestar99&#x2F;&quot;&gt;Firestar99&lt;&#x2F;a&gt; and several other charming individuals was very fun.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;I thought I could get multiplayer done in a week, but it took a month as somehow expected. I am a better game dev for the experience. You can&#x27;t just depend on back end patterns for everything.&lt;&#x2F;p&gt;
&lt;p&gt;Bevy 0.18 was simple to migrate to.&lt;&#x2F;p&gt;
&lt;p&gt;I strongly recommend going to Fosdem if you have the chance.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Real Time Settings, Save Overhaul, &amp; a Wiki</title>
          <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-12-30/</link>
          <guid>https://exofactory.net/blog/2025-12-30/</guid>
          <description xml:base="https://exofactory.net/blog/2025-12-30/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;Happy holidays! This month a good amount got done bringing yet more quality of life changes to the game. Namely an overhaul of the saving system, logging, crash reporting, and live settings! Those along with a new but empty wiki.&lt;&#x2F;p&gt;
&lt;p&gt;I am quite proud of the live settings stuff. Like it&#x27;s not anything I&#x27;ve seen elsewhere. If you find this interesting and find the game interesting I would encourage you to give the game a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot;&gt;wishlist on steam&lt;&#x2F;a&gt;. It helps a ton.&lt;&#x2F;p&gt;
&lt;p&gt;Also, I recently took the public demo down from Steam. At this point it &lt;em&gt;REALLY&lt;&#x2F;em&gt; does not reflect the quality and polish of the current state of the game. I eventually plan on putting up a &quot;Demo 2&quot; build on steam the reflects the work that will happen in the next upcoming months.&lt;&#x2F;p&gt;
&lt;p&gt;So without further ado here are the latest areas of work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;save-overhaul&quot;&gt;Save Overhaul&lt;&#x2F;h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;save_screen.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;save_screen.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;save_screen.webp&quot; alt=&quot;We can now continue the last game or load a specific save file.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;We can now continue the last game or load a specific save file.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;The most demotivating thing that can happen in a factory game is that you get a ton of work done, then lose the progress. I had a few players experience this and I wanted to come up with a solid approach that works. I ended up keeping things simple and used a looping timer to automatically save the game every 5 minutes with a looping set of 5 saves each new save overwriting the last. This was pretty trivial to do with just a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;time&#x2F;struct.Timer.html&quot;&gt;Bevy timer&lt;&#x2F;a&gt; and a a baby state machine.&lt;&#x2F;p&gt;
&lt;p&gt;This auto saves the game while allowing for manual saves when needed.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally the player can continue the most recent save OR manually pick an existing save. For now the load screen is just a minimal Bevy UI window. Lot safer to play for not too much effort in coding.&lt;&#x2F;p&gt;
&lt;p&gt;Right now the default is 5 saves each 5 min apart, but if you edit the &lt;code&gt;config.toml&lt;&#x2F;code&gt; file you can change that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;crash-reporting-logging-rework&quot;&gt;Crash Reporting &amp;amp; Logging Rework&lt;&#x2F;h2&gt;
&lt;p&gt;The top feature I wanted as a developer was proper logging and crash reporting in production builds. While I have been trying my best to keep things clean, an area where I  had neglected things was logging. I was using a mixture of &lt;code&gt;print!&lt;&#x2F;code&gt; &lt;code&gt;println!&lt;&#x2F;code&gt; &lt;code&gt;eprint!&lt;&#x2F;code&gt; &lt;code&gt;eprintln!&lt;&#x2F;code&gt; &lt;code&gt;info!&lt;&#x2F;code&gt; &lt;code&gt;warn!&lt;&#x2F;code&gt; &lt;code&gt;error!&lt;&#x2F;code&gt; all over the place. Debug prints became permanent output.&lt;&#x2F;p&gt;
&lt;p&gt;On the windows build you couldn&#x27;t see half of it even if you launched the game from powershell. I took a three step approach to fixing this.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Drop all the stdout&#x2F;err stuff except for &lt;code&gt;info!&lt;&#x2F;code&gt; &lt;code&gt;warn!&lt;&#x2F;code&gt; &lt;code&gt;error!&lt;&#x2F;code&gt; and &lt;code&gt;panic!&lt;&#x2F;code&gt;. Migrating one plugin at a time.&lt;&#x2F;li&gt;
&lt;li&gt;Added a non-blocking tracing capture system that appends the output to a log file.&lt;&#x2F;li&gt;
&lt;li&gt;Wrote logic around the log file. If there was no clean exit the user is given the option to automatically upload the logs as part of a crash report.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;crash_report.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;crash_report.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;crash_report.webp&quot; alt=&quot;After detecting a crash we can upload logs.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;After detecting a crash we can upload logs.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;The player now has logs the can check if they are so inclined, and the player can automatically upload those logs as part a crash report. I am sure legacy game engines have this sort of thing built in, but I am just happy to have it now. No more &lt;em&gt;&quot;what were you doing just before the game crashed?&quot;&lt;&#x2F;em&gt; discussions.&lt;&#x2F;p&gt;
&lt;p&gt;Lastly added a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;bevy-panic-handler&quot;&gt;small library that shows panics in the GUI&lt;&#x2F;a&gt;. Worst, worst case a player could copy paste the output.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;settings-overhaul&quot;&gt;Settings Overhaul&lt;&#x2F;h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;graphics_settings.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;graphics_settings.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;You can change graphics settings in real time.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This is the stuff I am super happy with. Before the most recent (internal) build you could not access the settings in the game, and changing and settings required a game restart. Not good.&lt;&#x2F;p&gt;
&lt;p&gt;I blame my backend programming history for that one. After hearing from players that the state of settings was not really acceptable I set off on overhauling it.&lt;&#x2F;p&gt;
&lt;p&gt;I took an ECS&#x2F;Bevy centric approach and think it went well.&lt;&#x2F;p&gt;
&lt;p&gt;The way that settings work now is that settings are serialized&#x2F;deserialized to&#x2F;from the &lt;code&gt;config.toml&lt;&#x2F;code&gt; file and is represented in game as a series of Resource structs.&lt;&#x2F;p&gt;
&lt;p&gt;I added a few systems that run when those structs are created or change and update the components that reflect the setting that was changed.&lt;&#x2F;p&gt;
&lt;p&gt;For example let&#x27;s consider changing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;pbr&#x2F;struct.ScreenSpaceAmbientOcclusion.html&quot;&gt;ScreenSpaceAmbientOcclusion&lt;&#x2F;a&gt; settings in the game.&lt;&#x2F;p&gt;
&lt;p&gt;In a ECS world this is easy. We find the global camera entity by getting entities with the Exofactory &lt;code&gt;GlobalCamera&lt;&#x2F;code&gt; component. Since the camera is just a bundle of components we can grab the  ScreenSpaceAmbientOcclusion component as well and modify it in real time keeping it in sync with the graphics setting resource.&lt;&#x2F;p&gt;
&lt;p&gt;The same can be applied to any setting.&lt;&#x2F;p&gt;
&lt;p&gt;All settings are just properties in a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;quick-start&#x2F;getting-started&#x2F;resources&#x2F;&quot;&gt;resource&lt;&#x2F;a&gt; struct that are mirrored onto specific components.&lt;&#x2F;p&gt;
&lt;p&gt;The result is that the player can edit any setting at and time in real time including language, graphics, window size&#x2F;mode, along with everything else.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;control_language.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-30&#x2F;control_language.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Language and everything else too.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Pretty cool in my book.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wiki&quot;&gt;Wiki&lt;&#x2F;h2&gt;
&lt;p&gt;The idea behind the wiki is to provide a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.exofactory.net&#x2F;&quot;&gt;community oriented wiki&lt;&#x2F;a&gt; that is performant, available, and not exploitive. Unless anyone has a better approach, I aim to have the wiki licensed under &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;creativecommons.org&#x2F;licenses&#x2F;by-nc-sa&#x2F;4.0&#x2F;&quot;&gt;Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While I agree that it is a bit early to set up the wiki I wanted to do so because of:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A genuine need for documentation around the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.exofactory.net&#x2F;index.php&#x2F;Technical_Reference&#x2F;config.toml&quot;&gt;config.toml&lt;&#x2F;a&gt; file.&lt;&#x2F;li&gt;
&lt;li&gt;A desire to short circuit any wikis being built on less community oriented platforms.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;There isn&#x27;t too much to be said except that as the game gets closer to launch the wiki will become even more useful.&lt;&#x2F;p&gt;
&lt;p&gt;For now account creation is closed, but will be open later as things become more playable. This all being said if anyone is a mediawiki theme specialist do reach out. The default theme is ok, but not exactly ideal.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;ECS once again shows how cool it is. Going from reboot for every setting change to all changes being applied live was shockingly easier than I expected.&lt;&#x2F;p&gt;
&lt;p&gt;That and the save system &lt;strong&gt;WITH&lt;&#x2F;strong&gt; crash reporting is a really nice to have.&lt;&#x2F;p&gt;
&lt;p&gt;Quite happy and I am excited to get working properly on the much better demo 2.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Draggable Belts, Electricity, &amp; View Modes</title>
          <pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-12-04/</link>
          <guid>https://exofactory.net/blog/2025-12-04/</guid>
          <description xml:base="https://exofactory.net/blog/2025-12-04/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;This month focused on a few new areas these being major game mechanics, visuals, and major quality of life belt placement changes.&lt;&#x2F;p&gt;
&lt;p&gt;We are getting closer to implementing all of the October Nextfest feedback that can be fixed via pure programming and I think the game shows that.&lt;&#x2F;p&gt;
&lt;p&gt;I am super happy to add electricity. It&#x27;s a core feature and while adding it wasn&#x27;t too hard the visualizations was harder. But I think the shader based approach looks really cool. Super happy with the productivity&#x2F;efficiency view mode shader below.&lt;&#x2F;p&gt;
&lt;p&gt;I will get a bit deeper in the relevant sections.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;draggable-belts&quot;&gt;Draggable Belts&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;belt_bend.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;belt_bend.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Dragging belts to connect buildings is now easy.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;A good amount of time was spent on adding draggable belts. While Factorio belt-by-belt placement works, in playing the game I realized it gets old fast. The feedback I got was universally in agreement.&lt;&#x2F;p&gt;
&lt;p&gt;The interesting thing is that Exofactory uses a &quot;tile&quot; based belt approach so the spline based approach of other factory games wasn&#x27;t really possible. After &lt;del&gt;playing a bunch of other factory games&lt;&#x2F;del&gt; doing a bunch of research I found that I could use an approach similar to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shapez2.com&#x2F;&quot;&gt;Shapez2&lt;&#x2F;a&gt; adapted for 3d and the peculiarities of Exofactory.&lt;&#x2F;p&gt;
&lt;p&gt;Long story short you place the first belt segment and can drag out a straight or &quot;L&quot; shaped segment of belts of any length that you have the resources for. The only real technical limitation is that you can only have 1 bend per dragged out segment. Adding any more just adds ambiguity and unpredictable results.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;belt_connect.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;belt_connect.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Longer belt connections take way less work now.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This makes the game way less tedious to play and I am super glad to have it coded out.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;electricity&quot;&gt;Electricity&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;power_new_building.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;power_new_building.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Building automatically connect to the nearest power source in range.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;I also added power recently to the game. All buildings now consume electricity and don&#x27;t function without it. Building in the range of a power source or extender will automatically connect and start consuming power.&lt;&#x2F;p&gt;
&lt;p&gt;Right now the Core generates enough power to build a little factory. Once I add fuels and piping properly it will be possible to really get the power cranked up.&lt;&#x2F;p&gt;
&lt;p&gt;From a coding perspective this was quite an easy feature to add. Just add some &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;quick-start&#x2F;getting-started&#x2F;ecs&#x2F;&quot;&gt;ECS&lt;&#x2F;a&gt; components and you are good to go, buildings update their components as they cycle and power systems query for them accordingly.&lt;&#x2F;p&gt;
&lt;p&gt;The hard part was visualization. I&#x27;ll cover that below.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;view-modes&quot;&gt;View Modes&lt;&#x2F;h1&gt;
&lt;p&gt;One piece of feedback I got was &lt;em&gt;&quot;What&#x27;s the point of the global mode?&quot;&lt;&#x2F;em&gt; and to be fair in the demo the global view mode is less useful than it should be. The primary reason being that the view mode features were not there.&lt;&#x2F;p&gt;
&lt;p&gt;I am happy to show them off now. Good god did I have to learn a lot about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;shaders&#x2F;custom-render-phase&#x2F;&quot;&gt;shaders&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;render&#x2F;render_resource&#x2F;struct.DepthStencilState.html&quot;&gt;stencils&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;pbr&#x2F;fn.setup_morph_and_skinning_defs.html&quot;&gt;skinning&lt;&#x2F;a&gt; to get things to work.&lt;&#x2F;p&gt;
&lt;p&gt;The view modes can be accessed in the global mode with the tab button or relevant controller button.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;power&quot;&gt;Power&lt;&#x2F;h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;power_global.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;power_global.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;You can see the powered zones, and which buildings and wires are powered or not.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This view mode lets you see what buildings are powered or not. It also let&#x27;s you see the powered zones and what wires are connected. Simple, fast and useful.&lt;&#x2F;p&gt;
&lt;p&gt;While the view modes are a feature for the global mode, when you place power extenders you can see the powered zones and the like, just for sanity preservation reasons.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;productivity&quot;&gt;Productivity&lt;&#x2F;h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;productivity.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-12-04&#x2F;productivity.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;The color of the buildings shows their productivity. Green for 100%, Red for 0%.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;I am quite proud of this and I think it brings something new to the factory game space. The productivity mode shows you at a glance the productivity of a whole landscape of machines. Red or yellow sections of a factory stand out clearly.&lt;&#x2F;p&gt;
&lt;p&gt;In the above video you can see the productivity level drop as the output buffer fills up. Like the power view mode this mode can be accessed via the tab key in global mode.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;It felt really nice to finally add a new feature after so many bug fixes. Super happy with that. Now I just need to change the emotional core&#x2F;dialogue system to reflect these new systems. Lots of fun and lots to do.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Real Factory Game Quality of Life Changes</title>
          <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-11-16/</link>
          <guid>https://exofactory.net/blog/2025-11-16/</guid>
          <description xml:base="https://exofactory.net/blog/2025-11-16/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;There were two driving forces when it came to the work done over the past month: feedback from the demo release and the porting from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;migration-guides&#x2F;0-16-to-0-17&#x2F;&quot;&gt;Bevy
0.16 to 0.17&lt;&#x2F;a&gt; as well as the switch to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;avianphysics&#x2F;avian&quot;&gt;Avian&lt;&#x2F;a&gt; physics engine.&lt;&#x2F;p&gt;
&lt;p&gt;I will go over a bunch of the new quality-of-life features resulting from the feedback below, but first I want to cover why I decided to switch to Avian and the work that came with that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;switching-to-avian&quot;&gt;Switching to Avian&lt;&#x2F;h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;collider_avian.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;collider_avian.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;collider_avian.webp&quot; alt=&quot;Autogenerated Avian Collider Meshes&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;Autogenerated Avian Collider Meshes&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;I had initially been using the venerable &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dimforge&#x2F;bevy_rapier&quot;&gt;Rapier3D&lt;&#x2F;a&gt; for physics but was unsatisfied for a few reasons.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;High development latency. Given the rapid changes in the Bevy ecosystem and major improvements in each version of Bevy, this was a motivational killer. At the time of this blog post Rapier still does not support Bevy 0.17.&lt;&#x2F;li&gt;
&lt;li&gt;Non Ergonomic APIs.&lt;&#x2F;li&gt;
&lt;li&gt;No collider generation.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This all being said, Rapier is a solid physics engine and the work that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dimforge.com&#x2F;&quot;&gt;dimforge&lt;&#x2F;a&gt; does for the Bevy community is amazing. They are just not the best fit for me.&lt;&#x2F;p&gt;
&lt;p&gt;Switching to Avian addressed all of these issues and made things like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;spatial_query&#x2F;struct.RayCaster.html&quot;&gt;raycasting&lt;&#x2F;a&gt; a breeze compared to what I was doing.&lt;&#x2F;p&gt;
&lt;p&gt;That, and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;collider&#x2F;enum.ColliderConstructor.html&quot;&gt;amazing collider constructor&lt;&#x2F;a&gt; system, sealed the deal. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;collider&#x2F;enum.ColliderConstructor.html#variant.ConvexDecompositionWithConfig&quot;&gt;&amp;lt;3 ConvexDecompositionWithConfig&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I did run into one snafu though: Avian does not have a native &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rapier.rs&#x2F;docs&#x2F;user_guides&#x2F;bevy_plugin&#x2F;character_controller&quot;&gt;character controller&lt;&#x2F;a&gt; like Rapier does. This being said, after reading the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;#frequently-asked-questions&quot;&gt;Avian FAQs&lt;&#x2F;a&gt;, I settled on using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;idanarye&#x2F;bevy-tnua&quot;&gt;bevy_tnua&lt;&#x2F;a&gt;, an excellent replacement.&lt;&#x2F;p&gt;
&lt;p&gt;Time-wise the whole port took a day. Approximately:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2 hours for all the colliders and tuning the parameters.&lt;&#x2F;li&gt;
&lt;li&gt;3 hours to replace all the ray casting and to set up &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;avian3d&#x2F;latest&#x2F;avian3d&#x2F;collision&#x2F;collider&#x2F;struct.CollisionLayers.html&quot;&gt;collision
layers&lt;&#x2F;a&gt;. (With enums, very pleasant to do.)&lt;&#x2F;li&gt;
&lt;li&gt;3 hours to rewire all the player controls through tnua.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Thanks to all the work done by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jondolf&quot;&gt;Joona Aalto&lt;&#x2F;a&gt; on Avian. I am super happy to sponsor him and if you like Avian you should consider it too.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;general-quality-of-life&quot;&gt;General Quality of Life&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;jump.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;jump.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;We can now jump!&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Given that the newly implemented tnua made it easy to add a jump, I opted to do so. With a little repurposing of an animation that will be fully revealed later, it was a snap.&lt;&#x2F;p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_menu.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_menu.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_menu.webp&quot; alt=&quot;Instead of the broken tool tips we now have the build costs shown in the build menu.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;Instead of the broken tool tips we now have the build costs shown in the build menu.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Here is where the first bit of feedback-based improvement comes in. It was made very clear that it is important that the cost of things should be made more explicit and clear, before, during, and when you can&#x27;t build buildings. Now when you hover over or select a building in the build menu the cost is evident.&lt;&#x2F;p&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_placement.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_placement.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;build_cost_placement.webp&quot; alt=&quot;We now see the costs and the available stock when we go to place buildings.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;We now see the costs and the available stock when we go to place buildings.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;h1 id=&quot;machine-productivity&quot;&gt;Machine Productivity&lt;&#x2F;h1&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;mining_machine.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;mining_machine.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;The mining machine now shows us ideal and real outputs.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This is where most of the work went. Based on the feedback of factory game enthusiasts, I was made painfully and embarrassingly aware that I had completely forgotten a major element of the genre: that players should have a clear understanding of what is being consumed, produced, and where optimizations can happen in their factories.&lt;&#x2F;p&gt;
&lt;p&gt;Like, I play and enjoy &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.satisfactorygame.com&#x2F;&quot;&gt;Satisfactory&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;factorio.com&#x2F;&quot;&gt;Factorio&lt;&#x2F;a&gt;. I don&#x27;t know how I missed this. That being said, it&#x27;s there now.&lt;&#x2F;p&gt;
&lt;p&gt;I will say this was a pleasure to program with Bevy&#x27;s ECS system. I don&#x27;t think there is a better way to track and do the math than ECS. We can just query for machines whose statistics we should update in a system, process them in parallel, and move on with life. Beautiful.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;furnace.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-11-16&#x2F;furnace.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;The furnace shows what we actually need to input and what we are and should be outputting.&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;settings&quot;&gt;Settings&lt;&#x2F;h1&gt;
&lt;p&gt;I will say part of why I was itching for Bevy 0.17 was due to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;ui-user-interface&#x2F;standard-widgets-observers&#x2F;&quot;&gt;new&#x2F;reworked UI using observers&lt;&#x2F;a&gt;. This let me step away from the buttons for all settings setup and let me use sliders. Much cleaner. Using observers makes writing UIs less painful. With the latest release, the settings page is much better.&lt;&#x2F;p&gt;
&lt;p&gt;A major quality-of-life improvement I made was regarding the controller guide. Before, it would show keyboard and mouse controls unless you had an Xbox or Steam controller plugged in. This led to a few situations where players were not being shown the correct controls. That is now fixed. By default, the control guide shows what was used last. Yay!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-11-16&#x2F;graphics_settings.webp&quot; alt=&quot;Graphics settings screen showing the new quality sliders, foliage detail toggle, and render scaling readout.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-11-16&#x2F;audio_settings.webp&quot; alt=&quot;Audio settings panel with separate sliders for ambience, UI, music, and machinery effects plus output device selection.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-11-16&#x2F;control_settings.webp&quot; alt=&quot;Control settings overview featuring rebinding support for keyboard&#x2F;mouse and controller prompts, including a Steam Deck preset.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;site-fancification&quot;&gt;Site Fancification&lt;&#x2F;h1&gt;
&lt;p&gt;In progress, but part of the feedback I got was that the site simply didn&#x27;t let people know anything about the game at all. In fairness, a plain text only site isn&#x27;t the norm for video game sites. As part of ongoing efforts to make the site more informative, we now have an animated homepage.&lt;&#x2F;p&gt;
&lt;p&gt;I will be continuing to work on fleshing out the rest of the site with rich media over the next few weeks, so keep an eye out.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;Lots of quality-of-life improvements based on lots of feedback, with lots more to come. Pretty happy with this. Going forward I am looking forward to adding new features.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Steam Next Fest Reflections</title>
          <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-10-21/</link>
          <guid>https://exofactory.net/blog/2025-10-21/</guid>
          <description xml:base="https://exofactory.net/blog/2025-10-21/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;Steam Next Fest was a success, although quite stressful. The good news is that I got a ton of feedback from players on Steam, Discord, and elsewhere, and a lot of edge case bugs were fixed.&lt;&#x2F;p&gt;
&lt;p&gt;I never knew that so many keyboards report to the operating system that they are Xbox-branded human interface devices. Crazy.&lt;&#x2F;p&gt;
&lt;p&gt;Based on all that I learned, I think I can solidify the timeline for the game going forward.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;next-fest-results&quot;&gt;Next Fest Results&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;more-good-things&quot;&gt;More Good Things&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;A ton of bugs were found and quickly fixed. Thank you very much to those who reported them.&lt;&#x2F;li&gt;
&lt;li&gt;A ton of interest was shown in the game, both in terms of wishlists and playtime.&lt;&#x2F;li&gt;
&lt;li&gt;Many ideas on how to fix and improve things were given.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;less-good-things&quot;&gt;Less Good Things&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;I didn’t foresee the diversity of hardware that exists in the real world outside of the soft-launched testers. Some players simply could not launch the game until several hot patches were released.&lt;&#x2F;li&gt;
&lt;li&gt;I thought the game was fully accessible for those who use accessibility devices and controllers, but from the feedback, I missed a few things.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;updated-timeline&quot;&gt;Updated Timeline&lt;&#x2F;h1&gt;
&lt;p&gt;Given the feedback from the demo and the very helpful advice from more experienced developers, along with guidance from people knowledgeable in producing successful games, I think it makes sense to adjust the timeline for the release of the game.&lt;&#x2F;p&gt;
&lt;p&gt;The Q4 2025 date was just unrealistic. Flat out.&lt;&#x2F;p&gt;
&lt;p&gt;Given this, a new plan is needed.&lt;&#x2F;p&gt;
&lt;p&gt;After consideration and reflection on what is best for the game, the plan is this:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Release a much more feature-rich and polished demo that can be used in a pitch deck and shows the quality we are aiming for in the game.&lt;&#x2F;li&gt;
&lt;li&gt;Consider options on how to fund the game further, whether that be Kickstarter, investment, or working with a publisher.&lt;&#x2F;li&gt;
&lt;li&gt;Aim to release the full game in late 2026.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;As someone once said: &lt;em&gt;&quot;A delayed game is eventually good, but a rushed game is forever bad.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Meme or not, I do want to release a game I am proud of.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;I am always learning and improving the game and my understanding of the video game industry. Next Fest, and those people who reached out to me, taught me a ton, and the game will be better for it. Exciting times ahead. I now have a ton of feedback to act on.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Demo Release and Polish</title>
          <pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-10-07/</link>
          <guid>https://exofactory.net/blog/2025-10-07/</guid>
          <description xml:base="https://exofactory.net/blog/2025-10-07/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;A LOT happened over the past month, but the biggest thing is that the demo has been soft launched on Steam in anticipation of Steam Next Fest. If you want you can download it at the link at the end of this post. Linux and Windows versions are both available.&lt;&#x2F;p&gt;
&lt;p&gt;The amount of work that has gone into this has been a lot, and we cover a good amount of it here.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;steam-next-fest&quot;&gt;Steam Next Fest&lt;&#x2F;h2&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;demo_steam.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;demo_steam.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;demo_steam.webp&quot; alt=&quot;Nice little Demo download button.&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;Nice little Demo download button.&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Big news is that we are officially participating in Steam Next Fest October. We finally have everything in place and approved. This was a shockingly difficult process and was more complicated than I thought. Turns out that you can&#x27;t simply upload an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Executable_and_Linkable_Format&quot;&gt;ELF&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;.exe&quot;&gt;.exe&lt;&#x2F;a&gt; file to Steam and have them distribute it. You have to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;partner.steamgames.com&#x2F;doc&#x2F;sdk&#x2F;uploading#Introduction&quot;&gt;quite a bit of Steam-specific tooling.&lt;&#x2F;a&gt; Which to Valve&#x27;s credit does run natively on Linux. It&#x27;s just a lot to learn and process, particularly when you gave yourself a day to do all the packaging and uploading to Steam.&lt;&#x2F;p&gt;
&lt;p&gt;I will say a major piece of advice I have for programmers turned game devs would be to give more time to packaging than you think you might need. For me, packaging a game for Steam was more difficult than preparing an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;RPM_Package_Manager&quot;&gt;RPM&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Deb_(file_format)&quot;&gt;DEB&lt;&#x2F;a&gt; distributable.&lt;&#x2F;p&gt;
&lt;p&gt;The good news was, in the end, the game made the deadline, but with intense timing difficulties.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;testing-mistakes-made&quot;&gt;Testing Mistakes Made&lt;&#x2F;h2&gt;
&lt;p&gt;This leads to the next major point. If you signed up for alpha&#x2F;beta testing you were not forgotten or passed over. Due to:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The unexpected (by me) delays in Steam approving the game.&lt;&#x2F;li&gt;
&lt;li&gt;The unexpected (by me) difficulties in packaging the game.&lt;&#x2F;li&gt;
&lt;li&gt;The sheer number of &quot;breaking&quot; bugs that I was crunch fixing found by friends and family.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I was not able to upload and get early testing keys before the Demo had to be soft launched for Next Fest.&lt;&#x2F;p&gt;
&lt;p&gt;My apologies. My plan going forward is to structure the game development process in a more streamlined way with dedicated feature, testing, and polishing time windows. So for the main game itself, we should have more structured testing periods.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;animations-mechanics&quot;&gt;Animations &amp;amp; Mechanics&lt;&#x2F;h2&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;belt_loop.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;belt_loop.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Lifters, Belts, Splitters, and Mergers&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This is where most of the crunch time was dedicated. I will say a disadvantage of ECS is that syncing independent animations is a bit harder. It feels like the world animations run on some &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Psychophysical_parallelism&quot;&gt;Leibniz-style pre-established harmony&lt;&#x2F;a&gt;. No linking or hierarchy to speak of. Just async systems running in such a way to give that illusion.&lt;&#x2F;p&gt;
&lt;p&gt;Long story short, the game now behaves like a game should, animations, sound, and all.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demo-released-trailer&quot;&gt;Demo Released + Trailer&lt;&#x2F;h2&gt;
&lt;p&gt;Here is the fun part. While no emails have been sent yet, the demo can be downloaded and played. I may be able to squeeze one more bug fix build in before Next Fest officially starts, so if you see any bugs you can report them in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;discord.com&#x2F;channels&#x2F;1393503401073180803&#x2F;1400190777136644157&quot;&gt;Exofactory Bug Report Discord Channel&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We also have a small gameplay trailer! In the interests of bandwidth and new YouTube accounts not being allowed to upload videos until they are verified, it can be watched on the Steam page.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;roadmap&quot;&gt;Roadmap&lt;&#x2F;h2&gt;
&lt;p&gt;The demo is just the start. The full game continues on with major improvements incoming. Among these are the following. This being said, I am open to player recommendations. You can provide them at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;discord.com&#x2F;channels&#x2F;1393503401073180803&#x2F;1400190867280629820&quot;&gt;feature suggestion channel in Discord.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I will be providing a more detailed roadmap on this site soon. These lists are preliminary and VERY VERY incomplete.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;coming-sooner&quot;&gt;Coming Sooner&lt;&#x2F;h3&gt;
&lt;div style=&quot;display: flex; flex-direction: column; align-items: center; margin: 1rem 0;&quot;&gt;
  &lt;figure style=&quot;width: 100%; max-width: 1200px; margin: 0;&quot;&gt;
    &lt;picture&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;gamepad.avif&quot; type=&quot;image&#x2F;avif&quot;&gt;
      &lt;source srcset=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;gamepad.webp&quot; type=&quot;image&#x2F;webp&quot;&gt;
      &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-10-07&#x2F;gamepad.webp&quot; alt=&quot;Accessibility Prioritized Steam Deck and Controller Support&quot; style=&quot;width: 100%; height: auto;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
    &lt;&#x2F;picture&gt;
    
    &lt;figcaption style=&quot;margin-top: 0.5rem; text-align: left;&quot;&gt;Accessibility Prioritized Steam Deck and Controller Support&lt;&#x2F;figcaption&gt;
    
  &lt;&#x2F;figure&gt;
&lt;&#x2F;div&gt;
&lt;ul&gt;
&lt;li&gt;Full accessibility prioritized Steam Deck and controller support.&lt;&#x2F;li&gt;
&lt;li&gt;Terrain and foliage asset rework.&lt;&#x2F;li&gt;
&lt;li&gt;Massive optimization overhaul.&lt;&#x2F;li&gt;
&lt;li&gt;The first diverging branches of technology unlocks in the tech web based on your in-game choices.&lt;&#x2F;li&gt;
&lt;li&gt;A public wiki like a proper factory game should have.&lt;&#x2F;li&gt;
&lt;li&gt;Continuing work on the &quot;real&quot; terrain.&lt;&#x2F;li&gt;
&lt;li&gt;Real power use.&lt;&#x2F;li&gt;
&lt;li&gt;Liquids.&lt;&#x2F;li&gt;
&lt;li&gt;German.&lt;&#x2F;li&gt;
&lt;li&gt;Test ELF binaries for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;AArch64&quot;&gt;aarch64&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;RISC-V&quot;&gt;RISC-V&lt;&#x2F;a&gt; if possible.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;coming-later&quot;&gt;Coming Later&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Game binaries for more &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;beta&#x2F;rustc&#x2F;platform-support.html&quot;&gt;Rust Tier 1 and 2 targets.&lt;&#x2F;a&gt; (Anyone want to help test on the BSDs?)&lt;&#x2F;li&gt;
&lt;li&gt;Steam-free way to play the game &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.factorio.com&#x2F;&quot;&gt;Factorio&lt;&#x2F;a&gt; style.&lt;&#x2F;li&gt;
&lt;li&gt;Officially supported &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flathub.org&#x2F;&quot;&gt;Flathub&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Flatpak&quot;&gt;Flatpak&lt;&#x2F;a&gt; images.&lt;&#x2F;li&gt;
&lt;li&gt;Continuing work on the &quot;real&quot; terrain.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;The demo is out and I look forward to working on the full game. I am looking forward to seeing what people make.&lt;&#x2F;p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Demo on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>Private Alpha, Steam, &amp; Core Functionality</title>
          <pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-09-08/</link>
          <guid>https://exofactory.net/blog/2025-09-08/</guid>
          <description xml:base="https://exofactory.net/blog/2025-09-08/">&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;Over the past 30 days the game went from &quot;a bit worried&quot; to &quot;back on track&quot; for release. I am happy to say we plan on participating in Steam Next Fest October! (more details below) A lot of the work was done on pure fundamental elements of the game from a coding perspective. So while the visuals haven&#x27;t changed too much the code is now in a great state. Next month the demo should be full of new visuals and and also new sounds! The month of September will be focused on visuals, polish, and testing. Exciting times!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;private-alpha&quot;&gt;Private Alpha&lt;&#x2F;h2&gt;
&lt;p&gt;I am aiming on releasing a small focused private alpha version of the game for player testing in the second half of this month. If you are interested you can sign up to test on the &lt;a href=&quot;&#x2F;&quot;&gt;homepage&lt;&#x2F;a&gt;. You should see a button where you can sign up there.&lt;&#x2F;p&gt;
&lt;p&gt;Just be aware, this will be a true technical alpha and may be full of bugs, UI, UX, and playability issues. If you are looking to play the game I would recommend waiting for Steam Next Fest. If you are interested in debugging and pointing out issues I welcome you to join.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;steam-next-fest&quot;&gt;Steam Next Fest&lt;&#x2F;h2&gt;
&lt;p&gt;We plan on, and are on schedule for, participating in Steam Next Fest October next month. We were approved and just need to make sure that we have our final release build submitted before the end of September.&lt;&#x2F;p&gt;
&lt;p&gt;The plan is to release a free vertical slice demo of the game that people can play. The goal is to let people build out a factory how they like and to see how the story changes based on that factory. I am aiming for a short small demo, but depending on how and where you build your factory the tone, feel, and direction should be different. Unless you are scripting, every playthrough should be a little different at the least or very different depending on how you build.&lt;&#x2F;p&gt;
&lt;p&gt;This is all managed by the emotional core and it&#x27;s pretty cool.&lt;&#x2F;p&gt;
&lt;p&gt;Just to set expectations though, this will be a shorter demo at about ~10-15 min if you play fast. The full game will be developed with the community via Early Access, with a full release sometime in 2026.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;belt-fundamentals-logistics&quot;&gt;Belt Fundamentals &amp;amp; Logistics&lt;&#x2F;h2&gt;
&lt;p&gt;The majority of the work on the development side was focused in this area. You simply can not have a factory game without a robust and performant belt and logistics system.&lt;&#x2F;p&gt;
&lt;p&gt;I think I did that. I never understood the pain that factory game devs felt when they talked about the pain of belt dev until now. Now I join that circle.&lt;&#x2F;p&gt;
&lt;p&gt;The cool thing is that I basically get performance for free with Bevy&#x27;s ECS architecture. Everything is fully parallel and the game will use every CPU core you have to make sure your factory runs smoothly. Visually I suspect you could bring fps down if you crank up the settings, but factory size in itself should never be a problem.&lt;&#x2F;p&gt;
&lt;p&gt;Included here is a rough technical explanation of how things work under the hood. Feel free to skip this if you find it boring.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-09-08&#x2F;belt_connect.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-09-08&#x2F;belt_connect.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Fancy Belt Stuff&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;how-belts-actually-work&quot;&gt;How Belts Actually Work&lt;&#x2F;h3&gt;
&lt;p&gt;Belts auto-organize themselves into directed “segments”. Segments are made of chains of belts from anything that can output items to anything that can accept them. Each belt entity gets a component that marks what belt segment it is part of. This is all done via observers and only happens when you place&#x2F;delete said belt.&lt;&#x2F;p&gt;
&lt;p&gt;To be clear there is no linked-list like structure anywhere. We are just tagging belt entities with a segment component.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;connections-and-segment-formation&quot;&gt;Connections and Segment Formation&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-09-08&#x2F;working_rotation.webp&quot; alt=&quot;Fabricators rotated at 90 degree increments. A blue or red cube is next to the entrance or exit&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Buildings and belts declare their belt inputs and outputs on the grid. When you place a building or belt, the building IO points, look one tile in the facing direction, and only connect if the neighbor is oriented in a compatible way. If it connects, the building adds a sink or source relationship with said belt segment. Above you can see some very large debug cubes that show the watched tiles.&lt;&#x2F;p&gt;
&lt;p&gt;As you place belts or buildings, I reorder belts from true start to end so the chain is coherent, and I rebuild a “visual path” spline straight from each belt’s world-space center. If you remove a belt, I recompute the actual connected groups, split the segment if needed, and reassign connected buildings to the correct new segments.&lt;&#x2F;p&gt;
&lt;p&gt;This was like 95% of the work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;item-movement&quot;&gt;Item Movement&lt;&#x2F;h3&gt;
&lt;p&gt;Items on a belt move along a piecewise set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;bevy&#x2F;latest&#x2F;bevy&#x2F;prelude&#x2F;struct.CubicHermite.html&quot;&gt;CubicHermite Splines&lt;&#x2F;a&gt; built from the location of the belts in the world. This is really cheap because all of the splines are pre-calculated. All we do is move stuff based on a timer which is also pre-calculated based on belt segment length and belt speed.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;capacity-throughput-and-backpressure&quot;&gt;Capacity, Throughput, and Backpressure&lt;&#x2F;h3&gt;
&lt;p&gt;Belt capacity was done ASAP (as simple as possible) aka one belt entity = one item. A 20 belt entity long segment can hold 20 items. Inserts only succeed if the segment has room. Machine sources hooked up to a belt segment push from a small output buffer into the segment whenever there’s space. If the segment is full, the buffer fills and production pauses naturally; when the line clears, it resumes automatically. A similar process happens with machine inputs.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-09-08&#x2F;working_input_output.webp&quot; alt=&quot;A series of buildings all with input and output debug cubes&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This is all ECS and fully parallel. Because segments are fully isolated and Bevy is cool I can just set up an async pool as wide as your CPU core count is. Segments all process their items and try to send via the relationship based source sink system. Above you can see a series of buildings with their input and outputs highlighted.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;new-buildings-resources&quot;&gt;New Buildings &amp;amp; Resources&lt;&#x2F;h2&gt;
&lt;p&gt;We&#x27;ve added a few new buildings since the last dev blog and they&#x27;re all pretty cool.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mining-platform-v1&quot;&gt;Mining Platform v1&lt;&#x2F;h3&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-09-08&#x2F;mining_machine.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-09-08&#x2F;mining_machine.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Mining Machine In Action&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;This is the first resource extractor that the player has access to. It will extract ores from the planet just as humans taught.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ancient-ai-core&quot;&gt;Ancient AI Core&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-09-08&#x2F;LostAICore_04.webp&quot; alt=&quot;The ancient AI core. It has a door and communication dishes. It is worn and covered in moss.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The core where you the player AI&#x27;s mind resides. Where you have been... for quite a while.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gas-extractor-sneak-preview&quot;&gt;Gas Extractor Sneak Preview&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-09-08&#x2F;Gas_Extractor_Rig.webp&quot; alt=&quot;Gas extractor in Blender. Many technical nodes are visible.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And here is a sneak preview of the gas extractor. Not everything is a mineral after all.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;music&quot;&gt;Music&lt;&#x2F;h2&gt;
&lt;p&gt;Super happy to be working with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.instagram.com&#x2F;kilianliccia&#x2F;&quot;&gt;Repto Eternef&lt;&#x2F;a&gt; They are creating some amazing music for the game and will be helping drive the exofactory music engine which we plan on open sourcing in 2026 before the game releases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dialogue-the-emotional-core&quot;&gt;Dialogue &amp;amp; The Emotional Core&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-09-08&#x2F;dialogue.webp&quot; alt=&quot;A dialogue box on top of a desert scene saying &amp;quot;I am alone here and things are not as they should be.&amp;quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Lastly, but certainly not least, the emotional core and dialogue system was added.&lt;&#x2F;p&gt;
&lt;p&gt;The emotional core is the heart of what makes Exofactory, Exofactory. Technically it watches what the players do by receiving and processing events that are triggered by any action the player takes. This includes all building, destruction, movements, production, everything. These along with looking at the totality of what you have built, how systems interact and how things don&#x27;t interact inform the story direction.&lt;&#x2F;p&gt;
&lt;p&gt;The goal is to have a user driven story based solely on their factory. I never want to put up a &quot;choose option A or B&quot; popup to advance the story. The game should know your priorities based on how, where, and what you are doing with your factories.&lt;&#x2F;p&gt;
&lt;p&gt;This is most evident to the player via the internal monologue of the AI that the player listens to as the game goes on. The thoughts and tones and direction of the dialogue&#x2F;monologue are given by the emotional core to the dialogue system which displays them and plays the audio. Currently I am examining open source TTS systems that can read the many many many lines of potential dialogue.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;Lots of core progress was made and things are on track. I am excited to see how players use the systems I am working on. :)&lt;&#x2F;p&gt;
&lt;p&gt;Exofactory is now available on Steam! If you are interested in the game I would encourage you to consider wishlisting it there.&lt;&#x2F;p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>Animation, Motion, &amp; Terrain v3</title>
          <pubDate>Thu, 07 Aug 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-08-07/</link>
          <guid>https://exofactory.net/blog/2025-08-07/</guid>
          <description xml:base="https://exofactory.net/blog/2025-08-07/">&lt;p&gt;Exofactory is now available on Steam! If you are interested in the game I would encourage you to consider wishlisting it there.&lt;&#x2F;p&gt;
&lt;div class=&quot;cta-buttons&quot; style=&quot;margin: 1.5rem 0;&quot;&gt;
  &lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;steam-button&quot;&gt;
    &lt;div class=&quot;steam-button-content&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_white.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-light&quot;&gt;
      &lt;img src=&quot;&#x2F;media&#x2F;home&#x2F;steam_logo_black.svg&quot; alt=&quot;Steam&quot; class=&quot;steam-logo steam-logo-dark&quot;&gt;
      &lt;span class=&quot;wishlist-text&quot;&gt;Wishlist on Steam&lt;&#x2F;span&gt;
    &lt;&#x2F;div&gt;
  &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;There were a few major goals that were met. The game is now animated, we have some resources, and the terrain system is getting closer to &quot;done&quot;. Not the most productive time period, but we are moving forward.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, I did give a presentation at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bornhack.dk&#x2F;bornhack-2025&#x2F;&quot;&gt;Bornhack 2025&lt;&#x2F;a&gt; about creating games in Bevy with Rust, but it is not yet available. When it is, I will include it in a future dev blog.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;animation&quot;&gt;Animation&lt;&#x2F;h1&gt;
&lt;p&gt;We now have animations in the game! Animating in Bevy was quite the fun thing to learn. The thing that saved the day (and a ton of work hours) was the bevy ecosystem, namely the excellent Bevy&#x2F;Blender plugin &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyskein.dev&#x2F;&quot;&gt;Skein&lt;&#x2F;a&gt; by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hachyderm.io&#x2F;@chrisbiscardi&quot;&gt;Chris Biscardi&lt;&#x2F;a&gt;. He is doing a ton for the Bevy community and I see his work everywhere.&lt;&#x2F;p&gt;
&lt;p&gt;Skein is both a Bevy and Blender plugin that enables the 3D artist to add Bevy components (if you are not familiar with Bevy, think of components as a sort of tag or label) to parts of the 3D asset. When the asset is exported as a glb&#x2F;gltf file those components are exported with as part of the file.&lt;&#x2F;p&gt;
&lt;p&gt;Skein on the Bevy side sees those embedded components and makes them available in Bevy&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;learn&#x2F;quick-start&#x2F;getting-started&#x2F;ecs&#x2F;&quot;&gt;Entity Component System&lt;&#x2F;a&gt;. This saves a ton of time and boilerplate code.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;motion_control.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;motion_control.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Programmatic Control of Lifter Animation&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;We are using Skein to add components to animation &quot;bones&quot; so animation can be controlled in a programmatic way, reacting to game events instead of just going through an animation loop. We are using these primarily in the Lifters as shown above.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;motion_trans.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;motion_trans.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Motion Transitions&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;In addition to more interesting programmatic animation we are using Bevy&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;examples&#x2F;animation&#x2F;animation-graph&#x2F;&quot;&gt;animation graph system&lt;&#x2F;a&gt;. This lets us change from one animation cycle to another smoothly without jitter or visual artifacts. Above you can see the exoframe go from walking to idle in a smooth continuous way.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;resources&quot;&gt;Resources&lt;&#x2F;h1&gt;
&lt;p&gt;We now have resources! We are starting with iron and copper. Soon we should see some machines start to get to work!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-08-07&#x2F;copper.webp&quot; alt=&quot;Copper Resource&quot; &#x2F;&gt;
Above we see copper ore and bars. This should be pretty common in game and will be used to make many things including low power wires.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-08-07&#x2F;iron.webp&quot; alt=&quot;Iron Resource&quot; &#x2F;&gt;
Above we see iron. I quite like the details on the top of the bars. Given we play as an AI, I could see the AI liking the design too.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;terrain-v3&quot;&gt;Terrain v3&lt;&#x2F;h1&gt;
&lt;p&gt;The Bevy space is full of halfborn, unmaintained, and poorly documented terrain &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Level_of_detail_(computer_graphics)&quot;&gt;level of detail (LoD)&lt;&#x2F;a&gt; systems. You will see a ton of terrain LoD systems everywhere but I found none that were maintained, had the features I needed, and were documented in a clear way. Resultingly Exofactory now has its own LoD implementation. It&#x27;s relatively naive, but meets the base requirements I need. These being:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Spawning and despawning terrain based on the location of &lt;em&gt;multiple&lt;&#x2F;em&gt; cameras.&lt;&#x2F;li&gt;
&lt;li&gt;Swapping in higher and lower resolution meshes and textures based on the location of said multiple cameras.&lt;&#x2F;li&gt;
&lt;li&gt;Handling LoD for terrain details like foliage or stones.&lt;&#x2F;li&gt;
&lt;li&gt;Doing all of this in a performant Bevy native ECS way.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;level_of_detail.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;level_of_detail.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Level of Detail System Testing&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Above you can see the test terrain I was using to test this LoD system. Green being the tile under the active camera, yellow being the higher resolution mesh tiles, red being the low resolution mesh tiles, and the red being despawned as it goes further away.&lt;&#x2F;p&gt;
&lt;p&gt;This is a MUCH stronger foundation for terrain, but sadly a lot of my past terrain work needed&#x2F;needs to be re-written. Good news is that the terrain v3 system is very tunable for aesthetics or performance. Even on my old 11th gen intel laptop iGPU I was able to tune things to run at 60fps with the full view distance. This being said this will probably change as more gets added.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;terrain_v3_with_color.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-08-07&#x2F;terrain_v3_with_color.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Terrain v3 with only base colors&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;Here we can see a more developed (although still very bare, texture-less, and empty) version of the reworked Terrain v3 system with full LoD functionality. The textures and other detail will be added on GPU via shader and that is not included here, but we have the base colors and that gives an idea of what textures we can expect. Once we add terrain details I think the terrain will look amazing.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;Given the time frame I wish I could have gotten more done. This being said what I did do was impactful and makes the game more playable, and more importantly at this stage, more test-playable. No longer are we seeing stutters when crossing terrain tiles. It&#x27;s smooth and pleasant. The animation is cute too and adds a lot of life to a formally still world.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Terrain, Animation, and Major Work Done</title>
          <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-07-06/</link>
          <guid>https://exofactory.net/blog/2025-07-06/</guid>
          <description xml:base="https://exofactory.net/blog/2025-07-06/">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;&#x2F;strong&gt; We were approved and Exofactory is now &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;3615720&#x2F;Exofactory&#x2F;&quot;&gt;available on Steam&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h1&gt;
&lt;p&gt;The past month has been full of a ton of progress. The terrain has been completely reworked (more on that later), we now have a ton of animated 3D assets thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;julef.myportfolio.com&#x2F;&quot;&gt;Julef&lt;&#x2F;a&gt;, and we have everything in line to get our steam presence up.&lt;&#x2F;p&gt;
&lt;p&gt;Also over the month I had the pleasure of attending &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;entropia.de&#x2F;GPN23&#x2F;en&quot;&gt;GPN23&lt;&#x2F;a&gt; an amazing hacker&#x2F;maker conference of the chillest (in vibe not temperature) order. I was tricked into giving a lightning talk on creating games in Rust with Bevy. If you are inclined you can watch it &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;media.ccc.de&#x2F;v&#x2F;gpn23-50-lightning-talks-ii#t=72&quot;&gt;here&lt;&#x2F;a&gt;. The cool thing is that this talk was received well enough that I could justify giving a longer extended presentation at an upcoming event.&lt;&#x2F;p&gt;
&lt;p&gt;As a bonus &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;julef.myportfolio.com&#x2F;&quot;&gt;Julef&lt;&#x2F;a&gt; shares a peek behind the scenes at her work on Exofactory in her first blog contribution.&lt;&#x2F;p&gt;
&lt;p&gt;More to come.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;animation&quot;&gt;Animation&lt;&#x2F;h1&gt;
&lt;p&gt;Where a ton of work shows is the animation and 3d work by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;julef.myportfolio.com&#x2F;&quot;&gt;Julef&lt;&#x2F;a&gt;. I am super excited to add these to the game.&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;wave.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;wave.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Wave Animation&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;walk.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;walk.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Walk Animation&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;idle.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;idle.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Idle Animation&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;scene.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;scene.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
  &lt;figcaption&gt;Scene with Belts and Machines&lt;&#x2F;figcaption&gt;
  
&lt;&#x2F;figure&gt;
&lt;h1 id=&quot;behind-the-scenes-with-julef&quot;&gt;Behind the Scenes with Julef&lt;&#x2F;h1&gt;
&lt;p&gt;Hello, Julija here – Art Director and head of the full Art Development team for Exofactory.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;d like to share a quick art update on the game.&lt;&#x2F;p&gt;
&lt;p&gt;Over the past month, we&#x27;ve been focused on refining assets and enhancing the terrain.&lt;&#x2F;p&gt;
&lt;p&gt;One of the key highlights: the Fabricator has received a complete visual overhaul with a brand-new look.&lt;&#x2F;p&gt;
&lt;div style=&quot;display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin: 1rem 0; align-items: center;&quot;&gt;
  &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;julef_image1.webp&quot; alt=&quot;Fabricator 1&quot;&gt;
  &lt;img src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;julef_image2.webp&quot; alt=&quot;Fabricator 2&quot;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;We added more belts with Level 1 and 2 and gave them a life. Things are starting to move!&lt;&#x2F;p&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
  &lt;video class=&quot;looping-video&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;scene.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
    &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;scene.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
  &lt;&#x2F;video&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;The Exoframe also came to life with a working rig and animations – big thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vimeo.com&#x2F;1066535461&quot;&gt;Juan&lt;&#x2F;a&gt;, who supported the rig setup and created the animation work!&lt;&#x2F;p&gt;
&lt;div style=&quot;display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 1rem 0; align-items: center;&quot;&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;walk.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;walk.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;&#x2F;video&gt;
    
    &lt;p style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Walk Animation&lt;&#x2F;p&gt;
    
  &lt;&#x2F;div&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;wave.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;wave.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;&#x2F;video&gt;
    
    &lt;p style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Wave Animation&lt;&#x2F;p&gt;
    
  &lt;&#x2F;div&gt;
  &lt;div style=&quot;display: flex; flex-direction: column; align-items: center;&quot;&gt;
    &lt;video class=&quot;looping-video&quot; style=&quot;width: 100%;&quot; autoplay muted loop playsinline preload=&quot;auto&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;idle.av1.mp4&quot; type=&quot;video&#x2F;mp4; codecs=av01.0.05M.08&quot;&gt;
      &lt;source src=&quot;https:&#x2F;&#x2F;exofactory.net&#x2F;media&#x2F;2025-07-06&#x2F;idle.h264.mp4&quot; type=&quot;video&#x2F;mp4; codecs=avc1.4D401E&quot;&gt;
    &lt;&#x2F;video&gt;
    
    &lt;p style=&quot;margin-top: 0.5rem; text-align: center;&quot;&gt;Idle Animation&lt;&#x2F;p&gt;
    
  &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;We successfully completed and submitted First Visuals for Steam.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;julef_image7.webp&quot; alt=&quot;Steam visuals&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And here you can see what is happening behind the scenes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;julef_image8.webp&quot; alt=&quot;Behind the scenes work&quot; &#x2F;&gt;
&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;julef_image9.webp&quot; alt=&quot;Behind the scenes work&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;terrain&quot;&gt;Terrain&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;terrain_basic.webp&quot; alt=&quot;Terrain Basic&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Cait here agan! If the imaga above is terrain v2 below you will see v2.5.&lt;&#x2F;p&gt;
&lt;p&gt;The terrain system was overhauled. In the new system we have non-trash-tier terrain. But, I am still not happy with it. If this is terrain v2 I imagine we will need to get to at least v4 or v5 before things start to look okay. This being said, as I am reminded of constantly, terrain is one of the hardest parts of the factory game genre. If I am ever happy with it that would be a major win. So we won&#x27;t stop working on this till it&#x27;s at a good place.&lt;&#x2F;p&gt;
&lt;p&gt;More subtly, a new terrain loading system was added. It dynamically streams in assets and textures as the player navigates the world. This allows for a ton of potential like adding a &quot;level of detail&quot; system later on.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;steam-screenshots&quot;&gt;Steam Screenshots&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;1.webp&quot; alt=&quot;Screenshot 1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The screenshots were the killer for me. I had initially planned to set up our Steam presence &lt;em&gt;much&lt;&#x2F;em&gt; sooner, but I just couldn&#x27;t get the screenshots to a point where they actually represented the game.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevy.org&#x2F;&quot;&gt;Bevy&lt;&#x2F;a&gt;, the engine behind Exofactory has no scene viewer, nor preview nor paint tool, or any GUI at all. Resultingly I had to build the factories in the screenshot by &lt;strong&gt;actually playing the game&lt;&#x2F;strong&gt; exactly like a player would.  Given that thing like deleting building haven&#x27;t been added yet, you can imagine how this went.&lt;&#x2F;p&gt;
&lt;p&gt;The good news here that this did help me find things I now want to change just for player quality of life. So that is a win.&lt;&#x2F;p&gt;
&lt;p&gt;So without further ado here are the in game images that will be submitted to Steam. We expect the game to be approved soon.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;2.webp&quot; alt=&quot;Screenshot 2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;3.webp&quot; alt=&quot;Screenshot 3&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;4.webp&quot; alt=&quot;Screenshot 4&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-07-06&#x2F;5.webp&quot; alt=&quot;Screenshot 5&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;conclusions&quot;&gt;Conclusions&lt;&#x2F;h1&gt;
&lt;p&gt;All in all a productive month. Great work was done all around, particularly by Julef.&lt;&#x2F;p&gt;
&lt;p&gt;The only downside that was by doing so much so fast a little brittleness was introduced to the code base. I am looking forward to doing some &quot;pure&quot; programming work to bring the code base to where I want it to be in terms of quality. After all, what&#x27;s the point of writing a game in Rust at all if you let code brittleness work its way in.&lt;&#x2F;p&gt;
&lt;p&gt;This month was great and soon that greatness will be rock solid.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Our Art Lead, ESC, and the 3D Rework</title>
          <pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-24/</link>
          <guid>https://exofactory.net/blog/2025-05-24/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-24/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;The last two weeks were full of a ton of work, most of it not programming related. The good news is that this work resulted in major changes (improvements to the game overall).&lt;&#x2F;p&gt;
&lt;p&gt;The largest of these changes is that Exofactory now has an art lead. So we should start to see some visual improvements soon.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;art-lead&quot;&gt;Art Lead&lt;&#x2F;h2&gt;
&lt;p&gt;The big news, as mentioned above, is that Exofactory now has an art lead. While the artist search was originally focused on finding an artist to create some assets for the game, after speaking with Julija, I was convinced that hiring an art lead who can help drive game art direction made sense.&lt;&#x2F;p&gt;
&lt;p&gt;I simply lack the skills and don&#x27;t think the game would be best served by me driving the art direction.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve been working together for a bit now and the game now has an aesthetic that we are aiming for.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m excited to work together and lots is to be done.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to learn more about Julija, you can take a look at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;julef.myportfolio.com&quot;&gt;her portfolio here.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;esc&quot;&gt;ESC&lt;&#x2F;h2&gt;
&lt;p&gt;If the single reader of this dev blog is wondering why there wasn&#x27;t an update last week, the reason was me being distracted by the Eurovision Song Contest!&lt;&#x2F;p&gt;
&lt;p&gt;The resulting party and extra long get-together may have also impacted the progress this week, but I&#x27;ll just say it was worth it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;we-re-now-3d&quot;&gt;We&#x27;re now 3D!&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-24&#x2F;terrain.webp&quot; alt=&quot;3D Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The major work over the past two weeks was porting the game to be 3D. Not terribly hard, but it was a lot of work. (Just FYI: these are not final art assets. So don&#x27;t worry.)&lt;&#x2F;p&gt;
&lt;p&gt;Part of this work was writing a programmatic terrain generator. Regardless of whether the game will have an infinite map or a more limited hand tuned one, having the terrain be autogenerated lightens the load substantially.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-24&#x2F;terrain_zoom.webp&quot; alt=&quot;3D Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Funnily enough, generating the terrain takes just enough time to justify adding a game loading screen. So we now have one of those.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-24&#x2F;load_screen.webp&quot; alt=&quot;Loading Screen Screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Pretty happy this week. Lots of important work was started and the game now has an artistic direction.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Art and Artists</title>
          <pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-10/</link>
          <guid>https://exofactory.net/blog/2025-05-10/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-10/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;This week was focused on primarily non-code work. I ended up focusing on an area where I am quite inexperienced, namely the area of finding, filtering out, and selecting an artist. It was a tedious and quite unfun task, but it needs to be done.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;art-and-artists&quot;&gt;Art and Artists&lt;&#x2F;h2&gt;
&lt;p&gt;I am a programmer, not an artist so I made a few mistakes. Namely focusing on 2d artists.&lt;&#x2F;p&gt;
&lt;p&gt;This was a mistake because as one of the artists I reached out to kindly told me, I would need to commission an entire new animation for each building for each orientation. That&#x27;s a lot of work.&lt;&#x2F;p&gt;
&lt;p&gt;I was told that hiring a 3D artist and doing a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;UV_mapping&quot;&gt;UV map&lt;&#x2F;a&gt; to a sprite sheet might be wiser. After a bit of research I agreed. This advice was appreciated and helped set me in the right direction.&lt;&#x2F;p&gt;
&lt;p&gt;Before I was told this though I did get some concept art that&#x27;s pretty cool.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-10&#x2F;design_1.webp&quot; alt=&quot;Concept 2D drawing of a building.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A bit too round compared to what I was looking for but cool for sure.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-10&#x2F;design_2.webp&quot; alt=&quot;Concept 2D drawing of a building.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Quite like this one.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly this 2D concept art can&#x27;t really be taken further, but it helps define the game energy which is a good thing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The week was full of new things for me, but I learned a lot. Now I am in the process of hiring a proper 3D focused artist and should have more to show you there soon.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Offsets, Menus, Accessibility, and 0.16</title>
          <pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-05-03/</link>
          <guid>https://exofactory.net/blog/2025-05-03/</guid>
          <description xml:base="https://exofactory.net/blog/2025-05-03/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;Last week I had big plans to do a hard micro-crunch, and to put out a technical preview. Sadly due to personal issues, I couldn&#x27;t put in the needed time this week. Resultingly I was not able to get the game to where I wanted it to be. I will probably submit the game for future consideration, but for the sake of sustainability I had to drop it for this week.i&lt;&#x2F;p&gt;
&lt;p&gt;This being said, major work was done this week, both behind the scenes, and user facing stuff. All of which is exciting.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bevy-0-16&quot;&gt;Bevy 0.16&lt;&#x2F;h2&gt;
&lt;p&gt;The first big task was porting the game from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyengine.org&#x2F;learn&#x2F;migration-guides&#x2F;0-15-to-0-16&#x2F;&quot;&gt;Bevy 0.15 to 0.16&lt;&#x2F;a&gt;. I had 3 reasons for this.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;I plan on starting work on belts soon. I plan on heavily using the new &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyengine.org&#x2F;news&#x2F;bevy-0-16&#x2F;#ecs-relationships&quot;&gt;ECS Relationships feature&lt;&#x2F;a&gt; to manage belt sources and sinks. Without this I would just have ended up writing &quot;ECS Relationships at home&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;I wanted to use the stabilized &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyengine.org&#x2F;news&#x2F;bevy-0-16&#x2F;#input-focus-improvements&quot;&gt;Input Focus feature&lt;&#x2F;a&gt;. This is important for accessibility and gamepad support. (More details below.)&lt;&#x2F;li&gt;
&lt;li&gt;Bevy is a rapidly evolving game engine. To fall behind is death for Exofactory&#x27;s future at this point. Once bevy becomes stable that may change, but for now upgrades are mandatory.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This wasn&#x27;t too big of a struggle, mostly moving away from newly depreciated functions, and an small amount of refactoring. I took this as an opportunity to clean up some earlier code I wrote while I was newly learning Bevy, namely swapping out &lt;code&gt;Queries&lt;&#x2F;code&gt; for &lt;code&gt;Single&lt;&#x2F;code&gt; where I could. This let me delete a lot of &lt;code&gt;if let Some(x) =&lt;&#x2F;code&gt; style code removing a lot of nesting which is nice.&lt;&#x2F;p&gt;
&lt;p&gt;I had a few dependencies that hadn&#x27;t updated yet, so I used either their 0.16 PR branches directly or release candidates where available.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;menus-accessibility&quot;&gt;Menus &amp;amp; Accessibility&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-05-03&#x2F;build_menu.webp&quot; alt=&quot;Animated Image Showing the build menu&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The other big project this week was the new complete-ish build menu.&lt;&#x2F;p&gt;
&lt;p&gt;I waited till after 0.16 because I wanted to use the accessibility&#x2F;focus feature. This menu is the first in the game to use it. I strongly believe that accessibility is best practice. Building in accessibility helps everyone no matter what. This includes developers. By doing this I make it trivial to add gamepad support. After all from the perspective of code, a gamepad, and specialized accessibility hardware&#x2F;software are basically the same thing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;This week, I didn&#x27;t do as much as I wanted to in terms of quality, but I am happy with what I did do. That and sustainability is important to me. Burnout is something to be avoided.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Building Menus, Gamepads, and Change</title>
          <pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-04-26/</link>
          <guid>https://exofactory.net/blog/2025-04-26/</guid>
          <description xml:base="https://exofactory.net/blog/2025-04-26/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;This week started with a nearly completely different set of goals than the week ended with. Things changed when &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.twitch.tv&#x2F;pokinsson&quot;&gt;Pokinsson
&lt;&#x2F;a&gt; made a call for indie game submissions, in any state, finished or not. After thinking about it, I thought I would give it a shot. In essence, that basically means that I have until April 7th to polish what I have and produce a playable technical preview.&lt;&#x2F;p&gt;
&lt;p&gt;As a result, I paused work on the half-baked gamepad support and started working toward that goal. This leaves a bunch of half-functioning gamepad code, but that&#x27;s a problem for future me.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, progress was made.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;half-baked-gamepad-support&quot;&gt;Half-Baked Gamepad Support&lt;&#x2F;h2&gt;
&lt;p&gt;During the first half of the week, before I knew about the call for games, this was the primary area of focus. I am using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thoseawesomeguys.com&#x2F;prompts&#x2F;&quot;&gt;Xelu&#x27;s excellent button-prompt images&lt;&#x2F;a&gt;; I strongly recommend them.&lt;&#x2F;p&gt;
&lt;p&gt;I added a lot of mappings and controller-management code, so now, going forward, I can do something like:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;rust&quot;&gt;let focus_on_exoframe: Handle&amp;lt;Image&amp;gt; = smart_prompt_collection.focus_on_exoframe.clone();
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The result will always be the correct prompt image regardless of whether you are using the Steam Deck, an Xbox One controller, or a keyboard and mouse.&lt;&#x2F;p&gt;
&lt;p&gt;I didn&#x27;t get any further than this, but I do have a list of supported devices&#x2F;control schemes. I plan on supporting:&lt;&#x2F;p&gt;
&lt;p&gt;The Steam Deck with built-in controllers, a keyboard and mouse, or an Xbox One controller.&lt;&#x2F;p&gt;
&lt;p&gt;Modern (Debian 11 or newer) Linux with a keyboard and mouse or an Xbox One controller.&lt;&#x2F;p&gt;
&lt;p&gt;Windows 10&#x2F;11 with a keyboard and mouse or an Xbox One controller.&lt;&#x2F;p&gt;
&lt;p&gt;Other systems or controllers should work but won&#x27;t be tested. For more information on what may or may not work, see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gilrs-project&#x2F;gilrs&quot;&gt;gilrs&lt;&#x2F;a&gt;, the underlying library I am using via Bevy.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;control-guide&quot;&gt;Control Guide&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-04-26&#x2F;control_guide.webp&quot; alt=&quot;animation showing the control guide&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I also added a &quot;control guide&quot; panel. This panel shows you exactly what you can do at any given moment and self-updates as you play the game. Of course, you can always hide it if it gets in your way.&lt;&#x2F;p&gt;
&lt;p&gt;This is great for the technical preview and for the game in general.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-interface&quot;&gt;Building Interface&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-04-26&#x2F;building_interface.webp&quot; alt=&quot;animation showing the building interface&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Last but not least, I added a core new feature to the game: an in-game building can now produce a thing!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Overall, it was a stressful week, and I don&#x27;t want to normalize this work pace (especially with my other obligations), but a lot got done, and the preview build should come together.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>UI Foundations Laid</title>
          <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://exofactory.net/blog/2025-04-19/</link>
          <guid>https://exofactory.net/blog/2025-04-19/</guid>
          <description xml:base="https://exofactory.net/blog/2025-04-19/">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h2&gt;
&lt;p&gt;This week was primarily focused on adding basic UI elements, working on Exoframe movement, and adding initial game sounds.&lt;&#x2F;p&gt;
&lt;p&gt;For now I am using VERY basic art assets while I focus on core game mechanics, so be prepared for some crappy looking art that definitively proves that I am not an artist.&lt;&#x2F;p&gt;
&lt;p&gt;Overall this week was not too bad in terms of the timeline.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fleshing-out-the-ui&quot;&gt;Fleshing Out The UI&lt;&#x2F;h2&gt;
&lt;p&gt;Exofactory is being written in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bevyengine.org&quot;&gt;Bevy&lt;&#x2F;a&gt;, and while it has been quite enjoyable overall I must say that the UI developer experience is absolutely not fun. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bevyengine&#x2F;bevy&#x2F;discussions&#x2F;14437&quot;&gt;Future Bevy&lt;&#x2F;a&gt; is supposed to address this, and for the sake of Rust game devs everywhere I hope they do. While the UI for the main menu and settings are in a good spot the core game itself till this week has seen no work.&lt;&#x2F;p&gt;
&lt;p&gt;This week, that changed with the addition of the main top bar. This bar is intended to be the goto place that players use to get a sense of what “mode” they are in what is going on a global level.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-04-19&#x2F;ui_sample.webp&quot; alt=&quot;screenshot of the game showing the UI&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Secondly this week I laid down the framework for building detail&#x2F;setting windows. This enables me to quickly iterate and reduce the amount of UI work as new buildings are introduced. For now all clicking on a building does is bring up some basic info as shown above.&lt;&#x2F;p&gt;
&lt;p&gt;Overall happy with things here.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;experiment-with-sound&quot;&gt;Experiment With Sound&lt;&#x2F;h2&gt;
&lt;p&gt;As a break from all the UI work I added some basic sounds to the game. After a bit of recording and tinkering in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tenacityaudio.org&quot;&gt;Tenacity&lt;&#x2F;a&gt; I have a few sounds I am happy with. For example the menu mouse over I find quite nice.&lt;&#x2F;p&gt;
&lt;audio controls&gt;
  &lt;source src=&quot;&#x2F;media&#x2F;2025-04-19&#x2F;mouse_over.webm&quot; type=&quot;audio&#x2F;webm&quot;&gt;
  Your browser does not support the audio element.
&lt;&#x2F;audio&gt;
&lt;p&gt;I still need to add a sound section to the settings menu, but that can wait for now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exoframe-motion&quot;&gt;Exoframe Motion&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;media&#x2F;2025-04-19&#x2F;movement.webp&quot; alt=&quot;screenshot of the game showing the UI&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Lastly I added exofame motion. It’s very snappy and satisfying to say the least. The motion and physics system in general is handled by the excellent rapier library.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Bottom line, I am happy with this week. I aim to release weekly dev blogs and monthly video blogs, so keep an eye out.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
