<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged devlog</title>
<link>https://coderlegion.com/tag/devlog</link>
<description>Powered by Question2Answer</description>
<item>
<title>Evening the Terrain &amp; the construction of Road Infrastructure | UE5 Devlog</title>
<link>https://coderlegion.com/31123/evening-the-terrain-the-construction-of-road-infrastructure-ue5-devlog</link>
<description>&lt;p&gt;In this devlog, I continue shaping Kazuhara Resort by evening out the terrain and building its road infrastructure in Unreal Engine 5. The focus is on preparing the ground and creating routes that connect the resort’s different areas.&lt;/p&gt;
&lt;p&gt;I showcase the Flatten and Smooth tools to level uneven surfaces and soften transitions, the Ramp tool to connect different elevations, and the Landscape Paint tool to define the road surfaces. These changes help establish the resort’s layout and make the terrain more practical for further construction.&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/31123/evening-the-terrain-the-construction-of-road-infrastructure-ue5-devlog</guid>
<pubDate>Wed, 14 Oct 2026 23:23:34 +0000</pubDate>
</item>
<item>
<title>DevLog 20261007: A Detective Story - First Satisfying Full Playable Build</title>
<link>https://coderlegion.com/30161/devlog-20261007-a-detective-story-first-satisfying-full-playable-build</link>
<description>&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;I've always wanted to develop a video game — in fact, many of them. &lt;em&gt;A Detective Story&lt;/em&gt; is far from the first attempt at Methodox; several earlier projects stalled along the way (you can still catch a glimpse of one in &lt;a rel=&quot;nofollow&quot; href=&quot;https://methodox.itch.io/wayhome&quot;&gt;Codename Wayhome&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;As we set out to build Divooka — a general-purpose visual programming system — the ability to create even a simple 2D game became an essential touchstone. So &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/app/4484570/A_Detective_Story/&quot;&gt;the game&lt;/a&gt; was never &lt;em&gt;just&lt;/em&gt; a game.&lt;/p&gt;
&lt;h3 id=&quot;motivation&quot;&gt;Motivation&lt;/h3&gt;
&lt;p&gt;The idea for &lt;em&gt;A Detective Story&lt;/em&gt; grew out of our work on Methodox ChatGateway, a RAG-based knowledge engine we were running as an online service. Behind the scenes we were also spending a lot of time with locally hosted LLMs and general knowledge-base applications. The underlying technology isn't new, but none of the existing solutions quite met my requirements. Most are poorly organized and extremely heavy in (Python) dependencies. I could talk about my complicated relationship with Python for hours — the love and, mostly, the hate — but one principle I value above almost everything else is portability and compactness in local software.&lt;/p&gt;
&lt;p&gt;A complete RAG knowledge-base solution shouldn't be much larger than the knowledge source itself. That's the bottom line.&lt;/p&gt;
&lt;p&gt;As with so many other things we build for Divooka, the best way to prove what the platform can deliver is to find a real application for ourselves and push it as far as we can. That led us to the idea of &lt;strong&gt;Crime Engine&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;on-a-reusable-configuration-based-detective-story-game-engine&quot;&gt;On a Reusable, Configuration-Based Detective Story Game Engine&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Crime Engine&lt;/strong&gt; is a 2D detective-story game engine with fully configurable maps and characters. Players interrogate suspects using natural language, powered by locally hosted models through &lt;code&gt;llama.cpp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The setup is deliberately lightweight. It supports the major flavours of GGUF-based SLMs and includes built-in RAG. On the gameplay side we have map navigation, fully functional menus, story backgrounds, interrogation rooms, and a verdict screen for concluding a case. There are also interactions with NPCs on the streets in map view, item discovery, and item exchange.&lt;/p&gt;
&lt;p&gt;The item-exchange system turned out to be the trickiest piece. It may simply be a limitation of current local models, but I still don't find locally hosted LLMs reliable enough for consistent tool use.&lt;/p&gt;
&lt;h3 id=&quot;the-development-of-a-detective-story&quot;&gt;The Development of &lt;em&gt;A Detective Story&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;We announced the Steam “Coming Soon” page with a trailer back on &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/ZFBeZj6LN30?si=O0WVmJapNg_wIGXN&quot;&gt;6 March&lt;/a&gt;, yet we never felt confident enough to release. Three main challenges kept holding us back:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Graphics quality&lt;/strong&gt; — Much of the art was AI-generated with manual adjustments, but the overall integration still fell short of the standard we wanted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NPC behaviour and tool use&lt;/strong&gt; — The item-exchange mechanic is genuinely interesting, but relying on an LLM for reliable outcomes proved difficult. We eventually solved this by scouting a stronger SLM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plot completeness&lt;/strong&gt; — Closely related to the point above: because LLM responses are hard to control tightly, it was tricky to guarantee that players could smoothly finish the game with all the necessary clues. Of course, Divooka remained our primary focus, so we couldn't pour unlimited effort into fine-tuning the plots.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;plot-work&quot;&gt;Plot Work&lt;/h3&gt;
&lt;p&gt;This is still an experimental game and a tech demo for the engine, yet we wanted it to feel like a coherent little story we could build on later — expansions, a series, that sort of thing. As we kept working, the characters became more polished: Ronan, Jack, Lady Garba, Helen, and the rest. It turns out it's simply fun to dwell in fiction once in a while.&lt;/p&gt;
&lt;p&gt;Even though it's a small 2D title, we ended up planning a surprisingly large set of graphics assets and subplots worth exploring. We originally sketched a gigantic cast of almost 500 NPCs, then deliberately shifted toward fewer, more personalized characters instead of a generic population.&lt;/p&gt;
&lt;h3 id=&quot;release&quot;&gt;Release&lt;/h3&gt;
&lt;p&gt;Major improvements since the earlier builds include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Significant engine work — better NPC stability, improved tool use, and far more thorough internal (automated) testing.&lt;/li&gt;
&lt;li&gt;Noticeable graphics upgrades.&lt;/li&gt;
&lt;li&gt;A full GUI overhaul using our proprietary framework &lt;code&gt;ShadowGUI&lt;/code&gt;. All Divooka users will benefit from this soon enough.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I did a final playtest today and, for the first time, the game felt genuinely enjoyable, smooth, and fun. It's almost ready to go.&lt;/p&gt;
&lt;p&gt;We plan to release &lt;em&gt;A Detective Story&lt;/em&gt; first while we continue polishing Crime Engine itself. It will be a while before CE is generally available.&lt;/p&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/news/app/4484570/view/693147294304832085&quot;&gt;2026-10-03 Graphics Update Announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30161/devlog-20261007-a-detective-story-first-satisfying-full-playable-build</guid>
<pubDate>Wed, 07 Oct 2026 17:56:21 +0000</pubDate>
</item>
<item>
<title>Ragdoll Physics Issues | UE5 Devlog</title>
<link>https://coderlegion.com/30015/ragdoll-physics-issues-ue5-devlog</link>
<description>&lt;p&gt;While implementing player death and ragdoll physics, I ran into a persistent Chaos physics issue. The death system and ragdoll activation work correctly, but once the body hits the ground, it begins violently twitching, bouncing, and rotating, sometimes appearing to push through the Landscape.&lt;br&gt;
I tested several potential causes, including terrain collision, CCD, impact velocity, physics simulation nodes, modular mesh collision, damping, collision presets, and constraints, but the instability remained.&lt;br&gt;
During debugging, I also discovered that I had initially been troubleshooting the wrong Physics Asset. After switching to the correct one, the issue still persisted.&lt;br&gt;
The current investigation is focused on the Physics Asset's collision bodies and whether overlapping or conflicting bodies are causing Chaos to continuously apply forces to the ragdoll.&lt;br&gt;
Death system: working&lt;br&gt;
Ragdoll activation: working&lt;br&gt;
Possessed inflatable tube-man physics: still under investigation&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/30015/ragdoll-physics-issues-ue5-devlog</guid>
<pubDate>Tue, 06 Oct 2026 14:02:45 +0000</pubDate>
</item>
<item>
<title>Player Illumination Systems | UE5 Devlog</title>
<link>https://coderlegion.com/29136/player-illumination-systems-ue5-devlog</link>
<description>&lt;p&gt;In this devlog, I’m showcasing the Flashlight, Lantern, and Battery Systems I’ve built for my game in Unreal Engine 5 using Blueprints.&lt;br&gt;
Both light sources are fully integrated with the inventory system and can be equipped, used, dropped, and swapped. The flashlight and lantern each maintain their own battery level, while the UI displays the remaining charge of the currently equipped light.&lt;br&gt;
The system also handles switching between the flashlight and lantern, including correctly shutting down the previous light, stopping its battery drain, and transferring control to the newly equipped device.&lt;br&gt;
Systems showcased:&lt;br&gt;
Flashlight system&lt;br&gt;
Lantern system&lt;br&gt;
Battery consumption&lt;br&gt;
Independent battery levels&lt;br&gt;
Battery UI and status display&lt;br&gt;
Inventory integration&lt;br&gt;
Flashlight to Lantern swapping&lt;br&gt;
Equip and unequip logic&lt;br&gt;
Light activation and deactivation&lt;br&gt;
Battery drain timers&lt;br&gt;
This is part of the ongoing development of my game, where I’m building the gameplay systems step by step in Unreal Engine.&lt;br&gt;
More development updates and system showcases are coming soon!&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/29136/player-illumination-systems-ue5-devlog</guid>
<pubDate>Tue, 29 Sep 2026 18:01:15 +0000</pubDate>
</item>
<item>
<title>Interaction Awareness System – Custom Depth &amp; Icon Widgets | UE5 Devlog</title>
<link>https://coderlegion.com/29135/interaction-awareness-system-custom-depth-icon-widgets-ue5-devlog</link>
<description>&lt;p&gt;In this development log for Life of Alex, I’m showcasing the interaction awareness system I’ve built to help players identify objects they can interact with naturally while exploring the world.&lt;br&gt;
The system combines icon widgets with custom depth shaders, allowing interactable objects to provide clear visual feedback without overwhelming the screen or breaking immersion. Icons help communicate available interactions, while the custom depth effect highlights relevant objects and makes them easier to distinguish from the surrounding environment.&lt;br&gt;
This system is part of my ongoing work on making exploration and interaction in Life of Alex feel intuitive, responsive, and visually consistent.&lt;br&gt;
Life of Alex is currently in early development, so everything shown is still subject to change as the project continues to grow.&lt;br&gt;
Follow the development journey for more systems, environments, gameplay mechanics, and behind-the-scenes progress.&lt;/p&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/29135/interaction-awareness-system-custom-depth-icon-widgets-ue5-devlog</guid>
<pubDate>Tue, 29 Sep 2026 18:01:01 +0000</pubDate>
</item>
<item>
<title>DevLog 20260919: Upcoming Fantasy Planet Painter 2.0 and the Making of It</title>
<link>https://coderlegion.com/27752/devlog-20260919-upcoming-fantasy-planet-painter-2-0-and-the-making-of-it</link>
<description>&lt;h2 id=&quot;fantasy-planet-painter&quot;&gt;Fantasy Planet Painter&lt;/h2&gt;
&lt;p&gt;Whole-planet-scale fictional world-building: continents, mountain ranges, rivers, valleys, and features as small as individual hills. Maybe eventually trees, buildings, houses, roads, and cities too?&lt;/p&gt;
&lt;p&gt;That has always been roughly the idea behind Fantasy Planet Painter (FPP).&lt;/p&gt;
&lt;p&gt;Making a good-looking fantasy map is one part of the goal, but the longer-term idea is more ambitious: making an entire fictional planet something you can actually author, organize, inspect, render, and use.&lt;/p&gt;
&lt;p&gt;With the upcoming Fantasy Planet Painter 2.0, we are finally starting to build more seriously toward that idea.&lt;/p&gt;
&lt;h3 id=&quot;the-beginning&quot;&gt;The Beginning&lt;/h3&gt;
&lt;p&gt;FPP had a rather humble origin: I needed to create a world map.&lt;/p&gt;
&lt;p&gt;Naturally, I started with GIS software. First ArcGIS, then QGIS, and along the way I learned my way through map projections, layers, coordinate systems, GeoServers, and all the other fun stuff that comes with GIS.&lt;/p&gt;
&lt;p&gt;GIS is incredibly powerful, but for making a fictional planet from scratch, the workflow was not particularly efficient. I wasn't really trying to analyze an existing world; I wanted to sit down and &lt;em&gt;make one&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Eventually I came across Torben Mogensen's &lt;code&gt;planet&lt;/code&gt; program (&lt;code&gt;planet.exe&lt;/code&gt; on Windows). It was rather eye-opening because the program works on an entire spherical planet at once instead of treating the world as just another flat image.&lt;/p&gt;
&lt;p&gt;The underlying terrain generator uses recursive tetrahedral subdivision to produce planetary terrain, and it can render the generated planet using many different cartographic projections. That became the technical foundation from which FPP originally grew. We later ported the original code to C# and gradually modernized and extended it.&lt;/p&gt;
&lt;h3 id=&quot;the-start&quot;&gt;The Start&lt;/h3&gt;
&lt;p&gt;The first practical problem was obvious: &lt;code&gt;planet.exe&lt;/code&gt; is essentially a command-line program, and custom maps are represented through text-based input.&lt;/p&gt;
&lt;p&gt;That is powerful if you already know exactly what you want to type, but not particularly convenient if you are trying to &lt;em&gt;draw&lt;/em&gt; a world.&lt;/p&gt;
&lt;p&gt;Before FPP, I even made several small command-line utilities for operations such as moving and scaling cells around. It technically worked, but authoring by repeatedly modifying parameters, rendering an image, looking at the result, and trying again was painfully inefficient.&lt;/p&gt;
&lt;p&gt;So the first major goal became exposing all of this through a much more usable graphical interface.&lt;/p&gt;
&lt;p&gt;That took much longer than expected.&lt;/p&gt;
&lt;p&gt;The original code is quite old and was never designed with this kind of interactive editing workflow in mind. Adding a GUI was therefore not simply a matter of putting some buttons around it. Rendering, state management, editing, visualization, save files, projections, cross-platform support, and eventually performance all had to be integrated around the original generator.&lt;/p&gt;
&lt;p&gt;Version 1.0 was really the beginning of that process rather than its end.&lt;/p&gt;
&lt;p&gt;Over time we added higher-resolution authoring, more output options, brushes, polygon editing, region selection, map themes, improved rendering controls, and substantial performance work. By v1.4, techniques we had been developing for Divooka - erosion, terrain processing, procedural coloring, texturing, and rendering - also started finding their way back into FPP.&lt;/p&gt;
&lt;h3 id=&quot;the-road-map&quot;&gt;The Road Map&lt;/h3&gt;
&lt;p&gt;Once you start thinking seriously about authoring an &lt;em&gt;entire planet&lt;/em&gt;, a lot of other problems immediately appear.&lt;/p&gt;
&lt;p&gt;Some of the major ones are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Location and region management&lt;/li&gt;
&lt;li&gt;Local and regional maps&lt;/li&gt;
&lt;li&gt;Countries, cultures, biomes, settlements, etc.&lt;/li&gt;
&lt;li&gt;Different levels of detail&lt;/li&gt;
&lt;li&gt;Map rendering and map serving&lt;/li&gt;
&lt;li&gt;Exporting the same world into other tools and applications&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is why I don't really think of FPP as only a procedural map generator.&lt;/p&gt;
&lt;p&gt;A nice-looking map is important, of course. But a fictional world can easily contain thousands of named places and many completely different scales of information. A mountain range visible on a world map may contain hundreds of valleys, rivers, lakes, roads, towns, and individual terrain features that should not even exist at the resolution of the original world map.&lt;/p&gt;
&lt;p&gt;That creates an interesting authoring problem.&lt;/p&gt;
&lt;p&gt;A single giant bitmap is clearly not the answer. At the same time, splitting everything into unrelated maps loses the fact that they all belong to the same world.&lt;/p&gt;
&lt;p&gt;Our original public roadmap already described Version 2 as &lt;strong&gt;Advanced World Editing&lt;/strong&gt;, beginning with location management, followed eventually by better brushes, color control, biome editing, 3D worlds, roads, and cities. The exact implementation has changed quite a lot since that roadmap was written, but the overall direction has not.&lt;/p&gt;
&lt;p&gt;The important part is that FPP needs to gradually move from &quot;a program that generates a picture of a planet&quot; toward &quot;a program that understands the things making up that planet.&quot;&lt;/p&gt;
&lt;h3 id=&quot;feedback-and-improvements&quot;&gt;Feedback and Improvements&lt;/h3&gt;
&lt;p&gt;There haven't been many direct comments on the Steam community page so far. FPP is still a small and fairly niche product.&lt;/p&gt;
&lt;p&gt;Refund information, however, gives us another source of feedback, and the pattern is fairly understandable: people want more power, more detailed editing, and more features.&lt;/p&gt;
&lt;p&gt;None of those are particularly surprising.&lt;/p&gt;
&lt;p&gt;They correspond closely to limitations we were already aware of in Version 1.x. FPP became quite good at quickly establishing the large-scale shape of a planet, but there is a substantial gap between sketching continents and actually authoring the world &lt;em&gt;inside&lt;/em&gt; those continents.&lt;/p&gt;
&lt;p&gt;That feedback has helped us decide which parts of the longer-term roadmap should move closer to the front.&lt;/p&gt;
&lt;h3 id=&quot;version-2-0&quot;&gt;Version 2.0&lt;/h3&gt;
&lt;p&gt;There are three big areas we want to address at the beginning of Version 2.0:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;World regions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A new custom spherical tetrahedral-subdivision system with real-world physical units&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Major mapping, editing, theming, and rendering improvements&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first one is perhaps the most important structurally.&lt;/p&gt;
&lt;p&gt;Regions give us a way to start treating parts of the world as actual objects rather than just pixels or height values. Once regions exist properly, a lot of other ideas become much easier to build around them: locations, countries, biome areas, local maps, selections, metadata, exports, and eventually much more detailed world-building information.&lt;/p&gt;
&lt;p&gt;The second area goes much deeper into FPP's original foundation.&lt;/p&gt;
&lt;p&gt;The new subdivision system is also closely tied to another important change in 2.0: &lt;strong&gt;the metric system&lt;/strong&gt;. FPP now operates using real physical units, with distances and elevations represented in meters rather than abstract map values. A planet can have an Earth-scale radius, mountains can genuinely be several kilometres high, and distances between locations can be measured and discussed precisely.&lt;/p&gt;
&lt;p&gt;This sounds like a relatively small change, but it makes world-building much more practical. Terrain, regions, local maps, roads, settlements, and eventually buildings can all exist within the same physical frame of reference instead of relying on arbitrary scales that change depending on context.&lt;/p&gt;
&lt;p&gt;The tetrahedral subdivision approach has served FPP very well, but we are now experimenting with our own spherical subdivision implementation and data structures. Having control over this level of the system lets us build that real-world scale directly into the geometry while also making it easier to integrate editing, generation, resolution changes, region handling, and future algorithms without constantly working around assumptions inherited from the original renderer.&lt;/p&gt;
&lt;p&gt;And finally there is everything users actually interact with every day: mapping, editing, theming, and rendering.&lt;/p&gt;
&lt;p&gt;Version 1.x accumulated many useful features, sometimes rather experimentally. Version 2 gives us a chance to reorganize some of those ideas around a more coherent model instead of continuously extending what was originally a relatively simple world-map painter.&lt;/p&gt;
&lt;p&gt;These three areas should provide a much better foundation for extending FPP going forward.&lt;/p&gt;
&lt;h3 id=&quot;the-w2b-project&quot;&gt;The W2B Project&lt;/h3&gt;
&lt;p&gt;A surprisingly useful side project in all of this has been &lt;strong&gt;World to Beyond&lt;/strong&gt;, or W2B.&lt;/p&gt;
&lt;p&gt;It was originally proposed mostly out of curiosity.&lt;/p&gt;
&lt;p&gt;I sometimes play &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.beyondallreason.info/&quot;&gt;Beyond All Reason&lt;/a&gt; with my friend. Well, nowadays he is so good - even though I was the one who first got him into the game - that he no longer plays with me 😟.&lt;/p&gt;
&lt;p&gt;At some point he looked at FPP and said that its maps kind of looked like BAR maps, so: couldn't FPP make one?&lt;/p&gt;
&lt;p&gt;Visually, the answer seemed like it should be &quot;yes.&quot;&lt;/p&gt;
&lt;p&gt;Technically, of course, it was considerably more complicated.&lt;/p&gt;
&lt;p&gt;BAR uses the Spring RTS engine, and producing an actual playable map means much more than exporting a nice-looking heightmap. Terrain needs to work from a gameplay perspective. You have textures, metal distribution, grass, water, features, map metadata, engine-specific formats, reachability, and all kinds of details that don't really matter when the final output is only an image.&lt;/p&gt;
&lt;p&gt;So we made a &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/JDSvBHWeLQg?si=LWabE7djm2_9qVHb&quot;&gt;first attempt&lt;/a&gt;, but never really published much around it.&lt;/p&gt;
&lt;p&gt;People on Discord also quickly pointed out some obvious weaknesses, particularly the lack of convincing erosion and proper texturing.&lt;/p&gt;
&lt;p&gt;Conveniently, those were exactly the kinds of problems we had independently started working on in &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/app/4770820/Divooka_Explore_Demo/&quot;&gt;Divooka&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Over the past year, our terrain work in Divooka has expanded from basic noise generation into erosion, hydrology analysis, masks, terrain coloration, texturing, and eventually PBR terrain rendering. FPP has already started benefiting from some of that work.&lt;/p&gt;
&lt;p&gt;So when we returned to W2B, we were in a rather different position.&lt;/p&gt;
&lt;p&gt;The new W2B has now been rewritten from scratch. Earlier prototypes required users to provide a template extracted from an existing map, which was awkward both technically and from a redistribution/licensing perspective. The current implementation writes the core Spring map files - &lt;code&gt;.smf&lt;/code&gt;, &lt;code&gt;.smt&lt;/code&gt;, and &lt;code&gt;mapinfo.lua&lt;/code&gt; - itself.&lt;/p&gt;
&lt;p&gt;The authoring process has also grown into several distinct stages: source terrain, terrain setup, metal, grass, water, features, and final output. In other words, it is slowly becoming an actual map-making pipeline rather than an FPP export button.&lt;/p&gt;
&lt;p&gt;And this experiment is useful for FPP itself.&lt;/p&gt;
&lt;p&gt;It forces us to deal with questions that don't appear when creating a world map purely for viewing: Is this terrain navigable? What happens when we look much closer? Where does vegetation belong? How do large-scale shapes survive when converted into local terrain? How should a procedural world turn into something another application can actually &lt;em&gt;use&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Those questions are very relevant to where we want Fantasy Planet Painter to go.&lt;/p&gt;
&lt;p&gt;With all the work that has gone into FPP, Divooka, procedural terrain generation, and the first W2B experiment, we are much better equipped this time around.&lt;/p&gt;
&lt;p&gt;And the new W2B is already much more powerful - and, importantly, much prettier - than the original attempt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/6gaw513wu8z7xx7gb4gm.png&quot; alt=&quot;Methodox Fantasy Planet Painter World to Beyond Plugin for BAR Map Making - Procedural&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/5sj5wabqxdwty6s73ulu.png&quot; alt=&quot;Methodox Fantasy Planet Painter World to Beyond Plugin for BAR Map Making - Reachability&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/macgoin0zp6gps646qk6.png&quot; alt=&quot;Methodox Fantasy Planet Painter World to Beyond Plugin for BAR Map Making - Grass Map&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;going-forward&quot;&gt;Going Forward&lt;/h3&gt;
&lt;p&gt;Fantasy Planet Painter started from a relatively simple problem: I wanted a convenient way to draw a fictional world map.&lt;/p&gt;
&lt;p&gt;That problem turned out to contain a surprisingly large number of smaller problems.&lt;/p&gt;
&lt;p&gt;Some are mathematical. Some are GIS problems. Some are rendering problems. Some are UI problems. And increasingly, some are really data-modeling problems: how do you represent an entire fictional world in a way that remains editable from the scale of a planet down to individual regions - and where those scales correspond to actual physical measurements?&lt;/p&gt;
&lt;p&gt;With 2.0, an Earth-sized world is actually Earth-sized, mountains can be described in kilometres, and distances between places have a concrete meaning. That gives the rest of the world-building system a much more practical foundation.&lt;/p&gt;
&lt;p&gt;Version 1.x gave us a functional planet painter.&lt;/p&gt;
&lt;p&gt;Version 2.0 is where we start taking the &quot;world-building&quot; part much more seriously.&lt;/p&gt;
&lt;p&gt;There is still a lot to figure out, and some of the ideas described here will certainly change as we implement them. But the pieces developed over the past year - especially the work on terrain generation in Divooka and experiments such as World to Beyond - are starting to connect together rather nicely.&lt;/p&gt;
&lt;p&gt;We will share more as 2.0 takes shape.&lt;/p&gt;
&lt;h3 id=&quot;references-1&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://fantasyplanetpainter.com/&quot;&gt;Fantasy Planet Painter Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://fantasyplanetpainter.com/road-map/index.html&quot;&gt;Original FPP Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/app/3336490/Fantasy_Planet_Painter/&quot;&gt;Fantasy Planet Painter on Steam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/watch?v=_-83stjP5D0&quot;&gt;Fantasy Planet Painter YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://wiki.methodox.io/Utilities/FantasyPlanetPainter/index.html&quot;&gt;Methodox Wiki – Fantasy Planet Painter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://wiki.methodox.io/Utilities/FantasyPlanetPainter/WorldToBeyond/&quot;&gt;Methodox Wiki – World to Beyond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20260731-fpp-v140-and-divooka-explore-demo-updates-45fc&quot;&gt;DevLog 20260731: FPP v1.4.0 and Divooka Explore Demo Updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/news/app/3336490/view/704405656884478635&quot;&gt;Steam Announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27752/devlog-20260919-upcoming-fantasy-planet-painter-2-0-and-the-making-of-it</guid>
<pubDate>Sat, 19 Sep 2026 15:03:37 +0000</pubDate>
</item>
<item>
<title>DevLog 20260731: FPP v1.4.0 and Divooka Explore Demo Updates</title>
<link>https://coderlegion.com/23943/devlog-20260731-fpp-v1-4-0-and-divooka-explore-demo-updates</link>
<description>&lt;h3 id=&quot;overview-1&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;The past few months have seen several &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/app/4770820/Divooka_Explore_Demo/&quot;&gt;Divooka Explore Demo&lt;/a&gt; releases, with our efforts focused on rolling out procedural terrain generation features. These include random noise-based terrain generation, procedural and simulation-based terrain processing, natural effects such as erosion and hydrology analysis, procedural coloration and texturing, and, more recently, improved 3D previews of generated terrains directly within the Divooka visual programming environment.&lt;/p&gt;
&lt;p&gt;One small lesson from this cumulative effort is that there always seems to be more academic material, papers, tutorials, online examples, and even source code snippets to discover and use to improve existing systems. That is a shiny silver lining, since we are still fairly new to this domain and desperately need broad exposure to existing techniques.&lt;/p&gt;
&lt;p&gt;Another useful lesson is that, although many papers approach these subjects from a real-time rendering perspective - such as the old GPU Gems articles - the same techniques are often equally applicable in a pure-CPU regime.&lt;/p&gt;
&lt;h3 id=&quot;procedural-terrain-generation-in-divooka&quot;&gt;Procedural Terrain Generation in Divooka&lt;/h3&gt;
&lt;p&gt;As mentioned, we have made quite a large number of functions available in this area, and the subject definitely warrants much more detailed treatment. Documentation and comprehensive video guides are dearly needed.&lt;/p&gt;
&lt;p&gt;To recap, we have moved from very basic noise-based terrain generation to custom heterogeneous multifractal terrains, functional erosion - although there is still plenty of room for improvement - various masking techniques, practical procedural coloring using either masks or SQL queries, and preliminary texturing support.&lt;/p&gt;
&lt;p&gt;The terrain generation is only the first step, and there is still plenty of room for improvement despite we have achieved useful basic implementation for now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/tjh15wb15uew55mjoroo.png&quot; alt=&quot;Early Days of Divooka Procedural Terrain Generation&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/5yejmj3d6u1ltjp3tuvn.png&quot; alt=&quot;Early Days of Heightmap Erosion in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once we became comfortable with generating functional procedural terrains, we could move on to coloring, texturing, and eventually shading.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/pgfyqwl0v6t7s50ckxya.png&quot; alt=&quot;Procedural Terrain Coloring Nodes in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/mtpjb24wj0jmpqwikmme.png&quot; alt=&quot;Procedural Terrain Coloring in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, I realized a fundamental limitation of heightmaps and image textures. They may be able to represent distant views of terrains spanning 8–64 km when viewed from above, but for ground-level rendering, procedural shading techniques are a must.&lt;/p&gt;
&lt;p&gt;The 3D rendering work is still new, and there is a long way to go. We started with basic baked shadows, moved on to experimental texture mixing, and eventually reached full PBR rendering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/vd23at51fda31xhie5rc.png&quot; alt=&quot;Baked Shadow Mapping for Terrains in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/eyzib5rfsvljdhkmqslh.png&quot; alt=&quot;Early days of Procedural Texturing of Terrains with Photo and Generated Textures&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/89jvthtqlgj6nzcm6x0x.png&quot; alt=&quot;Voxel Space Viewer of Textured Terrains in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;PBR rendering is the holy grail. Once we figure out how to dynamically populate terrains with trees, grass, and rocks - and generate ripples across reflective water - we will be able to share all of it through Divooka as reproducible workflows!&lt;/p&gt;
&lt;p&gt;Below is an intermediate result so far. It uses simple slope-based texturing, which we plan to replace with mask-layer-based materials in the next attempt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/6xv7t457d8ij3tvqozva.png&quot; alt=&quot;Procedural Slope-Based Textures for Procedural Terrains in Divooka, PBR Rendering&quot;&gt;&lt;/p&gt;
&lt;p&gt;We have learned so much and cannot wait to share more about the specific techniques once we have more spare time!&lt;/p&gt;
&lt;h3 id=&quot;the-fantasy-planet-painter-v1-4-0-update&quot;&gt;The Fantasy Planet Painter v1.4.0 Update&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/oqdj4ehduk7s3pcqyc3w.png&quot; alt=&quot;2D Flat World in FPP - Basic Altitude Coloring to Relief Render&quot;&gt;&lt;/p&gt;
&lt;p&gt;While the eventual goal is to support whole-planet procedural generation and content management, we began with basic Earth-like world map generation. At the moment, our work is mostly focused on improving the existing editing experience. The previous update significantly improved the multithreaded generation performance of the tetrahedral subdivision method.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/s8zbkyenxvetcp0aln6r.png&quot; alt=&quot;Fantasy Planet Painter by Methodox&quot;&gt;&lt;/p&gt;
&lt;p&gt;The 2D cell-based height-value canvas is an interesting medium. It allows us to sketch the desired elevation levels quickly at a high level while the program procedurally populates the remaining details.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/3d6pw0r6vwttkunvlyjz.png&quot; alt=&quot;Painting on a 2D Cell Map with Abstract Height Values While FPP Generate Procedural Details&quot;&gt;&lt;/p&gt;
&lt;p&gt;There has also been some experimental exploration into using this medium for direct 2D terrain editing, as seen in our previous video, &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/JDSvBHWeLQg?si=MEAZdVL4sYn674m-&quot;&gt;World to Beyond (BAR map export from FPP)&lt;/a&gt;. Although BAR export is still in its early stages, the potential of this kind of authoring technique is indeed interesting.&lt;/p&gt;
&lt;p&gt;Following the advances in procedural terrain generation within Divooka, we have gathered quite a collection of useful tools and made them available at a high level in the latest &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/news/app/3336490/view/697645818486718921&quot;&gt;FPP update&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/hb74s7fqo75qsemf5tuu.png&quot; alt=&quot;Hydrology (Erosion) Outputs from Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;The results are very interesting, and I am glad that we are moving beyond practical utility toward generating worlds that - at least in my eyes - are also visually appealing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/eybl1vnbexwd2hrv99s5.png&quot; alt=&quot;2D Flat World in FPP - 1K Wetness + Slope-Based Relief Render&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;That is a brief recap for today. I have been busy diving headfirst into all the nitty-gritty work, which has left less time for DevLog updates and for sharing the techniques and progress behind them.&lt;/p&gt;
&lt;p&gt;Still, let us look forward to the day when new results are ready to shine, when we are comfortable placing an early-access version of Divooka into the hands of users, and when we can talk in much greater detail about the road that led us there!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23943/devlog-20260731-fpp-v1-4-0-and-divooka-explore-demo-updates</guid>
<pubDate>Sat, 01 Aug 2026 18:44:44 +0000</pubDate>
</item>
<item>
<title>DevLog 20260319: Towards OOP - Document-Level Default Module and Module-Level Members and Behaviors</title>
<link>https://coderlegion.com/13227/devlog-20260319-towards-oop-document-level-default-module-module-level-members-behaviors</link>
<description>&lt;h3 id=&quot;revisiting-flappy-bird-the-pain-point&quot;&gt;Revisiting Flappy Bird – The Pain Point&lt;/h3&gt;
&lt;p&gt;Remember our Flappy Bird example from mid-2025?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/509yykxr054pazr7crm6.png&quot; alt=&quot;The Initialization Sequence for Flappy Bird Game in Divooka Interactive Demo&quot;&gt;&lt;/p&gt;
&lt;p&gt;The long chain of variable initializations was needed for two main reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No way to declare variables before using them  &lt;/li&gt;
&lt;li&gt;More critically - &lt;strong&gt;no way to define custom data structures&lt;/strong&gt; that could group related values together and be instantiated with a single node.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In retrospective it seems obvious: we just need proper structured data containers. But building the scaffolding to support this properly in a visual, node-based system is a bit more involved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c044pu9pmmgtppisnts7.png&quot; alt=&quot;Initialize State with A Single Node with Structured Data&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;searching-for-a-solution&quot;&gt;Searching for a Solution&lt;/h3&gt;
&lt;p&gt;I spent a long time trying to bring OOP concepts into Divooka. A huge amount of effort went into DiOS (Divooka Open Standards), with the hope that a complete standard would naturally solve these kinds of problems. But standardization work is slow and deep - just like making Divooka itself feature-complete.&lt;/p&gt;
&lt;p&gt;Then, while working on something completely unrelated and taking a short break from this topic, it suddenly clicked.&lt;/p&gt;
&lt;p&gt;The key insight: &lt;strong&gt;start simple and approach it from a functional/declarative angle first&lt;/strong&gt;, before jumping into inheritance, encapsulation, polymorphism, and all those good stuff.&lt;/p&gt;
&lt;p&gt;I'm really excited - we finally have meaningful progress.&lt;/p&gt;
&lt;h3 id=&quot;the-divooka-way&quot;&gt;The Divooka Way&lt;/h3&gt;
&lt;p&gt;To claim our goal as &quot;everything is a node&quot; is a bit too strong, but I strongly prefer keeping almost everything on the graph.&lt;/p&gt;
&lt;p&gt;This aligns with how we already handle &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20260225-divooka-visual-programming-direct-value-setting-of-compound-inputs-4dej&quot;&gt;structured primitives&lt;/a&gt; - direct value setting of compound inputs. That way, there's still hope that users can drop down to raw node programming when they need full control (and thus keep everything programmable).&lt;/p&gt;
&lt;p&gt;Traditional property panels (like Unreal Blueprints' object definition GUIs) are out - they break the pure graph paradigm.&lt;/p&gt;
&lt;p&gt;Instead, the solution is declarative, similar to how TerraGen works: &lt;strong&gt;the mere presence and connection of certain nodes defines meaning&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dt0uo32f876mkby6xfce.png&quot; alt=&quot;Custom Module Data Member Definition in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5rcgs9pioy63whstj6r.png&quot; alt=&quot;Declarative Programming in Divooka in the Context of Module Member Definitions&quot;&gt;&lt;/p&gt;
&lt;p&gt;This feels &lt;strong&gt;awesome&lt;/strong&gt; for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can make full use of the 2D graph layout - place things exactly where we want them visually  &lt;/li&gt;
&lt;li&gt;It stays completely coherent with Divooka's graphical paradigm  &lt;/li&gt;
&lt;li&gt;No need for separate &quot;class editor&quot; UIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-s-been-implemented-so-far&quot;&gt;What's Been Implemented So Far&lt;/h3&gt;
&lt;p&gt;Current working pieces:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Graphs can now act as &lt;strong&gt;modules&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Support for &lt;strong&gt;module-level data members&lt;/strong&gt; and &lt;strong&gt;behavior members&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;main module&lt;/strong&gt; tied to the document, with existing graphs serving as associated behaviors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Module-scoped instance node – in Events context&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fuz1d4xkpggewvio85i.png&quot; alt=&quot;Module Scoped Instance Node in Divooka - Events Context&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Module-scoped instance node – in Dataflow context&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3it8f0cg1weluxbjb9uq.png&quot; alt=&quot;Module Scoped Instance Node in Divooka - Dataflow Context&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Top-level module behavior graphs&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54bhw9ol26pp6265hjri.png&quot; alt=&quot;Top Level Module Behavior Member Graphs in Divooka&quot;&gt;&lt;/p&gt;
&lt;p&gt;This immediately unlocks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clean access to (top-level) module instances  &lt;/li&gt;
&lt;li&gt;Shared event and dataflow instance data  &lt;/li&gt;
&lt;li&gt;A unified programming and document model for subgraphs (still a work-in-progress) &lt;/li&gt;
&lt;li&gt;In procedural contexts (&lt;strong&gt;Glaze!&lt;/strong&gt; especially): we now have proper data containers - no more awkward giant variable lists or forced tuples! (Compare to the old Flappy Bird screenshot)  &lt;/li&gt;
&lt;li&gt;Much simpler and more natural state storage/access in &lt;strong&gt;Glaze!&lt;/strong&gt; and procedural graphs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a big deal - for a system that's gearing up for real production use, it feels like crossing a major milestone in usefulness and core abstractions.&lt;/p&gt;
&lt;h3 id=&quot;current-limitations-amp-remaining-work&quot;&gt;Current Limitations &amp;amp; Remaining Work&lt;/h3&gt;
&lt;p&gt;Still plenty to fix/polish:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A bunch of bugs and edge cases  &lt;/li&gt;
&lt;li&gt;Proper serialization support  &lt;/li&gt;
&lt;li&gt;Smooth context switching between graphs  &lt;/li&gt;
&lt;li&gt;Subgraph consolidation / better nesting UX  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;looking-ahead&quot;&gt;Looking Ahead&lt;/h3&gt;
&lt;p&gt;This is a solid foundation, but there's still a long road:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full modularization support  &lt;/li&gt;
&lt;li&gt;Modules inside modules (nesting)  &lt;/li&gt;
&lt;li&gt;Module inheritance / composition patterns / polymorphism&lt;/li&gt;
&lt;li&gt;Base DOM exposed as the &quot;main module&quot; for metaprogramming API  &lt;/li&gt;
&lt;li&gt;Detailed documentation: how it all fits together, recommended usage patterns, expected behaviors, pitfalls  &lt;/li&gt;
&lt;li&gt;Module-level scoped instances (deeper/finer control)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall - I am very happy with the direction. It feels like Divooka is finally getting the abstraction power it deserves while staying true to its visual, graph-first philosophy.&lt;/p&gt;
&lt;p&gt;I am hyped for what we will achieve.&lt;/p&gt;
&lt;h3 id=&quot;references-2&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://wiki.methodox.io/en/Frameworks/Glaze/Tutorials/FlappyBird&quot;&gt;The original flappy bird example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20250711-flappy-bird-in-divooka-sneak-peak-40j8&quot;&gt;DevLog on flappy bird example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/13227/devlog-20260319-towards-oop-document-level-default-module-module-level-members-behaviors</guid>
<pubDate>Thu, 19 Mar 2026 20:31:07 +0000</pubDate>
</item>
<item>
<title>DevLog 20260224 Divooka - Node-Level Automatic Dispatch (Runtime Execution Behavior)</title>
<link>https://coderlegion.com/12155/devlog-20260224-divooka-node-level-automatic-dispatch-runtime-execution-behavior</link>
<description>&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0nmv1dzv1kuerx8vvr5.png&quot; alt=&quot;Scalar Operation&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;overview-2&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;Anything useful done with a program eventually involves file I/O and some form of repetition.&lt;/p&gt;
&lt;p&gt;In Divooka, the dataflow context already makes it very easy to &quot;just get a single thing done.&quot; That part feels good. But handling loops? That's where things start to get awkward.&lt;/p&gt;
&lt;p&gt;One challenge lies on the GUI side — especially around lambdas and subgraphs. We do have foundational support (as shown &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20250510-dealing-with-lambda-3ff9&quot;&gt;here&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/progress-share-graph-local-lambda-calculus-4dj2&quot;&gt;here&lt;/a&gt;), but let's be honest: it's not &lt;em&gt;smooth&lt;/em&gt; yet.&lt;/p&gt;
&lt;p&gt;So the question becomes: how do we make repetition feel natural without introducing heavy conceptual overhead?&lt;/p&gt;
&lt;h3 id=&quot;the-plan&quot;&gt;The Plan&lt;/h3&gt;
&lt;p&gt;There are several well-established ways to achieve looping behavior in a functional or visual programming context:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Subgraph context&lt;/strong&gt; - Used in tools like Blender, vvvv, and Houdini. A specialized node group or frame defines loop entry and exit boundaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda callbacks&lt;/strong&gt; - Evaluation is handled via callback-style execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expressive recursion&lt;/strong&gt; - As seen in text-based functional languages, requiring explicit termination conditions to avoid stack overflow.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of these approaches are powerful and necessary in certain contexts. But they also introduce additional constructs into the language model. For advanced workflows, that's fine. For simple operations, it can feel unnecessarily complex.&lt;/p&gt;
&lt;p&gt;I wanted something lighter.&lt;/p&gt;
&lt;h3 id=&quot;array-coercion&quot;&gt;Array Coercion&lt;/h3&gt;
&lt;p&gt;Divooka already supports &lt;strong&gt;Array Coercion&lt;/strong&gt; — a scalar value can be passed into an input expecting a collection.&lt;/p&gt;
&lt;p&gt;This avoids the need to manually &quot;wrap&quot; a scalar into an array just to satisfy a function signature - I still remember the pain of handling arrays in Unreal Blueprint.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2m2p8hs7ellxbfzgj5m.png&quot; alt=&quot;Treat Scalar as Array&quot;&gt;&lt;/p&gt;
&lt;p&gt;Scalar-to-array coercion keeps graphs clean and avoids clustering.&lt;/p&gt;
&lt;p&gt;To take this to the next level, I've been giving it much thought on how the reverse might work: if we can coerce scalars into arrays — what if we also let nodes automatically dispatch when arrays are passed in?&lt;/p&gt;
&lt;h3 id=&quot;automatic-dispatch-node-level-&quot;&gt;Automatic Dispatch (Node-Level)&lt;/h3&gt;
&lt;p&gt;The core design question was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Should an array input implicitly turn the &lt;em&gt;entire downstream chain&lt;/em&gt; into a loop?&lt;/li&gt;
&lt;li&gt;Or should the dispatch behavior stay localized to the node itself?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eventually it seemed localizing things to the node made far more sense. &lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;string String.Replace(string, string, string)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If any input is provided as an array instead of a scalar, the node automatically promotes itself to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;string[] String.Replace(string[], string[], string[])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The node executes element-wise.&lt;/p&gt;
&lt;p&gt;Now, I can rename a folder of files with roughly three nodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enumerate files&lt;/li&gt;
&lt;li&gt;Regex replace&lt;/li&gt;
&lt;li&gt;Rename file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No explicit loop node. No subgraph. No lambdas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bvz2dbw56ctqp2kju5n.png&quot; alt=&quot;Dispatch Setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this example, &lt;code&gt;Duplicate as Array&lt;/code&gt; returns a strongly typed &lt;code&gt;string[]&lt;/code&gt;, enabled by &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20250710-generics-in-divooka-49e6&quot;&gt;generics support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One important rule: All array inputs must align in size with the source array. The dispatch is index-based and deterministic.&lt;/p&gt;
&lt;h3 id=&quot;full-example&quot;&gt;Full Example&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tsypgdt3xrj6g4phkvij.png&quot; alt=&quot;Full Example&quot;&gt;&lt;/p&gt;
&lt;p&gt;What used to require explicit iteration logic now becomes implicit behavior at the node boundary. The graph remains readable. The mental model stays simple.&lt;/p&gt;
&lt;h3 id=&quot;conclusion-1&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;This is still early work. Integration with the rest of Divooka's features is ongoing, and edge cases are being worked through.&lt;/p&gt;
&lt;p&gt;So far so good.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12155/devlog-20260224-divooka-node-level-automatic-dispatch-runtime-execution-behavior</guid>
<pubDate>Tue, 24 Feb 2026 22:22:17 +0000</pubDate>
</item>
<item>
<title>DevLog 20250728: Multi-graph Navigation GUI</title>
<link>https://coderlegion.com/4322/devlog-20250728-multi-graph-navigation-gui</link>
<description>&lt;h3 id=&quot;overview-3&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;From the beginning, we've expected Divooka documents to support multiple graphs for efficient daily use. I consider this essential for scripting purposes, as dealing with file system entry references should be the last thing on our minds when trying to get something done quickly.&lt;/p&gt;
&lt;p&gt;However, implementing this isn't straightforward. Several interesting and foundational features are required first: serialization, file format support, editor refactoring - and graph referencing, which we may discuss in a future entry.&lt;/p&gt;
&lt;p&gt;In traditional programming languages, especially object-oriented ones, similar functionality is often achieved by allowing multiple classes per file. In C#, for example, it's even possible to define partial classes across separate files, which can become confusing if not managed carefully.&lt;/p&gt;
&lt;h3 id=&quot;objective&quot;&gt;Objective&lt;/h3&gt;
&lt;p&gt;When working with multiple graphs in a single document, the experience should feel similar to working with separate documents that each contain a single graph. At the most basic level, the editor should allow quick and seamless switching between graphs. More advanced features will come later. For example, storing multiple graphs within a single document should eventually enable referencing those graphs or documents from other documents.&lt;/p&gt;
&lt;h3 id=&quot;implementation-progress&quot;&gt;Implementation Progress&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3gcza59pu9l1lpes82s.png&quot; alt=&quot;Graphs Selection&quot;&gt;&lt;/p&gt;
&lt;p&gt;Today's goal was to support navigation and switching between different graphs in Neo.&lt;/p&gt;
&lt;p&gt;Preliminary work on refactoring the graph editor into a reusable component was already completed earlier. This refactor is also crucial for enabling the subgraph editing window.&lt;/p&gt;
&lt;p&gt;To maintain context when switching graphs, the current viewport remains unchanged. We've also implemented a mini-map to help users quickly identify their location within the graph.&lt;/p&gt;
&lt;h3 id=&quot;minimap-behavior&quot;&gt;Minimap Behavior&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/unxovuu86yg2srk4tjd0.png&quot; alt=&quot;Minimap&quot;&gt;&lt;/p&gt;
&lt;p&gt;The math behind the minimap is a bit tricky, so it's worth documenting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When switching between graphs, the editor should either preserve the current viewport (location and zoom) or reset the view to the center of the new graph.&lt;/li&gt;
&lt;li&gt;A &quot;world boundary&quot; must be calculated that encompasses all nodes in the graph.&lt;/li&gt;
&lt;li&gt;A &quot;viewport boundary&quot; should also be calculated to represent the currently visible area of the canvas.&lt;/li&gt;
&lt;li&gt;The minimap scale (typically less than 1 to represent downscaling) should be the minimum of:  &lt;ul&gt;
&lt;li&gt;&lt;code&gt;minimap size / world size&lt;/code&gt;, or  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;minimap size / viewport size&lt;/code&gt;, if the viewport is larger than the world (e.g., when zoomed out).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;other-matters&quot;&gt;Other Matters&lt;/h3&gt;
&lt;p&gt;The Neo graph editor is taking noticeably longer to load lately. We may need to investigate and address performance issues soon.&lt;/p&gt;
</description>
<category>Divooka</category>
<guid isPermaLink="true">https://coderlegion.com/4322/devlog-20250728-multi-graph-navigation-gui</guid>
<pubDate>Tue, 29 Jul 2025 17:19:46 +0000</pubDate>
</item>
</channel>
</rss>