1. Iron Village
  2. News

Iron Village News

Diary #56 – The Iron Village Cinematic Universe

[p]When I stopped working at my corpo tech job, I assumed that I would magically get the time to put out some sort of dev diary every week. Maybe that’ll still happen, especially if I do start a Patreon, but that has definitely not been the case recently. Instead, it’s been the two weeks between my two oldest kids going to summer camp, and them going to school. Some highlights include:[/p]
  • [p]Trying to get my oldest to not spend all of his time on the computer without being a hypocrite.[/p]
  • [p]A reintroduction to Hand, Foot, and Mouth Disease, this time in my youngest kid.[/p]
  • [p]Moderating interpersonal conflicts between the three of them. (Yes, it is frustrating dealing with a toddler in their terrible twos. No, you don’t get to scream whenever they touch you.)[/p]
[p]Somehow in the midst of all of this, I did get some work done on Iron Village: Steam Input API integration. It’s a best practice for Steam Deck integration, and will finally let you rebind keys in the game. It’s also been a bit of a pain to get working properly, there’s a decent amount that just hasn’t been documented – so fun! 🙃[/p][p][/p][p]A topographic map of a continent, placeholder name “Amé”, in a window of Inkscape. Just to show the insane scope of what I’m talking about.[/p][p][/p][p]Instead of talking about that though, I want to talk about something related to both Iron Village and the unannounced next game: world building. A couple of years ago, I had the luck/misfortune of stumbling across Artifexian’s worldbuilding channel (and subsequently, Worldbuilding Pasta’s blog and Madeline James’s Worldbuilding blog & channel). There’s something really neat about designing a world using ridiculously unnecessary levels of detail, so of course I started that as a little side project. (Editor’s note: it was not little.)[/p][p]In parallel though, I started doing a little bit of very basic background for Iron Village. Back around November/December 2024, some feedback I was getting pointed to my neglect of details for the setting – like, why are we building in terra null? Up until this point there was this vague idea of “urban fantasy” – there’s magic and fantastic themes, but they’re not the focus of everything. After this feedback came the first bit of setting: the mission to administer a new town in “the borderlands” (the excuse for why they’re empty) to facilitate trade with Nova Porthladd. This mission is assigned by a Monarch Faearn of the Kingdom you name at the start, otherwise known as the Iron Realm. There’s not a ton, but it’s enough to put across the feeling that you’re part of a larger world, even if you’re building everything in this part.[/p][p][/p][p]This is a Köppen Climate Map of the same area, to give you a sense of the info I’ve been tracking.[/p][p][/p][p]For the next game, I have the audacious plan of combining the two: using this much more developed world as the setting, and shoehorning the Iron Village “story” into it as well. Technically, this means I’m developing… the Iron Village Cinematic Universe! Don’t worry, it won’t actually be that insane, I am perfectly happy to retcon things as needed, but I thought it would be a neat way to tie the games together.[/p][p][/p][p][/p][p]Some very rough sketching I did to try to vaguely map where the Iron Realm (cyan), Iron Village (purple), and Nova Porthladd (Maroon) would be. Note that Nova Porthladd is probably going to be a tiny bit south of that circle, at the mouth of the slightly larger river.[/p][p][/p][p]I’ll be talking more about this in the future, but at least wanted to introduce the concept now. Next up should be some more 1.2 info, hopefully including a release date! (I was thinking of doing something silly and releasing on the same day as Hollow Knight: Silksong – but that timing is definitely too soon.) Thanks for reading![/p]

Diary #55 – Turning Points

[p][/p][p]Disclaimer: Not in game footage. No curved tracks are planned for Iron Village, sorry.\\[/p][p][/p][p]So things are changing over here, and I’m going to potentially overshare personal life things that are relevant to Iron Village & Lunar Chippy Games as a whole.[/p][p]First off, the job at the global megacorp, or whatever I called it back at the start of these dev diaries, is coming to an end. There was a “voluntary exit program” with severance pay offered, and I figured it was time to make the jump. I’m not going to go into all of the details (personal privacy reasons mainly; everything I’m talking about is discussing working conditions and is therefore protected activity in the US – at least as long as the NLRB exists 🙃), but the gist of it is:[/p]
  • [p]Growing disillusionment with the company, its direction, and especially its leadership[/p]
  • [p]Other parts of the company allegedly profiting off of genocide (according to the UN)[/p]
  • [p]Having vaguely defined “performance issues” or nitpicks raised by my manager every week, only for the goal posts to shift every time I successfully deal with them.[/p]
  • [p]All of the above completely destroying any semblance of mental health.[/p]
[p]Based on some of that, I probably should have left a couple of years ago, but now the opportunity has lined up to bail out of that job. With a decent amount of savings, I’ll be working full time on a combination of recovery & Lunar Chippy Games.[/p][p][/p][p][/p][p]The Immigration Office has been built across the tracks from the Headquarters, with an overpass connecting the two.[/p][p][/p][p]So where is Iron Village right now? The different analysis windows are now done, as are the HQ buildings. The fifth level technically isn’t a headquarters upgrade, instead there’s a separate building on the other side of the tracks: the Immigration Office. This is the answer to the question, “why can’t I have more than 12x villagers?” (usually 122 or 124) – there’s a population cap. With the Immigration Office, you can adjust the cap to your heart’s content. Want to set it to 0? Sure, it won’t kick anyone out, but you want get any new villagers. Want to modestly increase it to 2147483647 + 1? You’re limited to going up in 5s, so that may take awhile. But theoretically, sure! Otherwise though, this lets you keep growing your town/city as much as you want, until you run out of space.[/p][p]With that, the “star features” are done, although there’s a decent set of other features & bugfixes to go. The main thing I’m trying to do this time is get all of the text finalized now, so I only have to send over one batch of text to the translators. Every time I thought I got everything together, a week or two later I’d discover, “oh shit, I need to add text here too”. So instead, I’m trying to wait until I get way more done before sending it over, and hopefully this time I’ll actually pull it off. With this plan, I should be able to get 1.2 out some time in September 🤞.[/p][p]Now above I mentioned I would be working on “Lunar Chippy Games”, not just “Iron Village”. When I started work on Iron Village, the plan was to make a small game as a learning exercise, and see if getting into game dev is a feasible plan. The answer so far is… maybe? Last time I ran the numbers myself (a few days ago), the company has lost about $100 USD. Considering the profit margin the last time I went through expenses, that isn’t terrible? This whole thing is so close to actually making profit, not bad for a little game without enough marketing! But obviously that isn’t enough to live off of, so it’s time for game #2: this time with full time work and actual marketing! I’ll have a proper announcement at some point, but this is a heads up that Iron Village development will be slowing down.[/p][p]The thing I’m going back and forth on is Patreon: I think it could be a helpful way to make this a little more sustainable, but also it just doesn’t seem to be a common way to fund a lot of games. (The huge exception here is adult games – but I don’t know if that’s just because it’s a different market, or if that funding model is actually applicable here.) Is there a reason for that? Is it just gamers™ thinking it’s greedy, or is it actually too much? Do I have to start putting some dev diaries behind a paywall, or just figure out something else I can do that’s more easily monetizable? Maybe it’s a bad idea, maybe it’s a good one, I’m curious if anyone has thoughts?[/p][p]Anyway, TL;DR is the full time job is ending, so there’s going to be more dev time – but not on Iron Village. I still might put some more updates into it post-1.2, but I have to start deprioritizing it in favor of the next game.[/p]

Diary #54 – Workers and Resources: Iron Village

[p][/p][p]The theme of the 1.2 update. Original logo ©3Division. I hope you'll forgive my very dumb visual gag 😅. I had an idea and it stuck in my head.[/p][p][/p][p]I haven’t put one of these dev diaries together in a bit, life has been a bit hectic, but I wanted to talk about the infrastructure behind the new UI windows that let you get a closer look at your… workers and resources.[/p][p]I showed the maximum production rates in the last diary, but compared to implementing the current production rate charts, that was pretty easy: check the building counts (how many of each building we have), look up the inputs, outputs, and production times, and calculate the maximum output. All of that information was already there, I just chose to refactor things to make that data more easily and efficiently accessible.[/p][p](Discussion of coding practices follows, feel free to skip down to the pretty pictures later on.)[/p][p]Meanwhile for current production rates, I needed data on what resources were produced, and when. That was information that just wasn’t being saved. There was the recent approval events feature in the Railway Status window, which records changes in approval rating and their times, but that was specifically designed just for approval events. So, using knowledge of Godot best practices that I acquired after starting development of Iron Village, I started putting together an EventLogManager.[/p][p]A lot of the code in Iron Village uses singletons: basically, an object that’s designed to only have one instance at a time. Some of these are “autoloads”, and are always-on global instances. This isn’t necessarily the best practice in normal coding, but in the scope of a single player game there’s a few areas that this is perfect for, including the GlobalSettings object that manages client settings, and the SteamworksManager which handles connecting to and communicating with Steam. Some of the singletons are specific to the root scene, where the actual gameplay takes place (as opposed to the main menu scene) – the best example for this dev diary is the ApprovalManager, which handles tracking the railway’s approval of your work. It doesn’t make sense to have multiple managers for this, so it’s a singleton.[/p][p]Singletons by themselves aren’t bad, and are actually really useful in the context of single player games. What wasn’t so great was that the ResourceVehicle class (a train car carrying cargo) was directly calling this singleton to report approval changes. It’s not the end of the world, but making a bunch of these calls from various different nodes can turn things into a bit of a confusing web. Godot is designed to work as a “tree”: basically, there’s a root “node” (an object, e.g. an image, a sound player, a collision shape, or just an abstract invisible thing), and that node can have a bunch of children, and each child node can have its own children, etc. In this case, a great grandchild node of the root (the ResourceVehicle) was calling a separate child node (ApprovalManager).[/p][p]The saying goes (yes, Godot is big and old enough that it has its own sayings), “call down, signal up”. Basically, a parent node will tell its children what to do (this is a fantasy of course, because the children actually listen), but the child should emit a signal: it yells into the void, and the parent may or may not react to that signal (that part is super realistic). This makes the flow of the program much more predictable, and hopefully avoids confusing bugs where the game isn’t doing what you think it should have done.[/p][p]To start the EventLogManager, I rewrote the approval event code to use the upward signaling. This did involve a decent amount of boilerplate code unfortunately, since the call would have to go ResourceVehicle -> Train -> TrainManager -> GameManager -> ApprovalManager, instead of ResourceVehicle -> ApprovalManager. (In most cases, it is actually even worse, the water for a locomotive is represented by a ResourceVehicle child of a Locomotive.) However, the code flow is at least quite a bit easier to track.[/p][p]I also did the same thing for buildings producing and consuming resources (ResourceProducer -> Building -> BuildingsManager -> GameManager -> EventLogManager), and so now there’s a system for signaling and recording resource production, resource consumption, and approval changes. The current production rates and railway status windows can just refer to the EventLogManager for these events, and make any calculations from the logs.[/p][p]Since you made it this far (or just skipped ahead), here’s a side-by-side comparison of the level 2, 3, and 4 railway HQs (not including additional props rendered in game):[/p][p][/p][p][/p][p][/p][p]Iron Village 1.2 is definitely coming together now, there was just a lot of underlying infrastructure to put together to support it. Hope that was at least somewhat interesting. 😊[/p]

Dev Diary #53 – OK, What’s Next?

[p]Developer's note: apparently this has been sitting as an unpublished draft for two weeks - sorry about that![/p][p]OK, so the latest patch has been out for a bit, and is mostly stable. It feels like it's been awhile since my last dev diary, but apparently it's only been around 2 weeks? Blame that on mental health and work shenanigans I guess? (That'll probably be a separate dev diary, but I'm not ready to write that just yet.)[/p][p]So what's happening now? First of all, the 1.2 update. The star feature of 1.2 will be... data analysis! Sounds super exciting, right? But really, one feature that was requested by some players was a way to better see what's going on. Especially in the later game, it was hard to gauge if you had enough of a particular kind of building, for instance, do you have enough magick pepper fields to handle your electricity requirements? The big feature now is a window you can open that will tell you, "yes, you have enough", or "no, you probably don't have enough".[/p][p][/p][p]The top half of the Maximum Production window. As you can see, there is (theoretically) plenty of supply for making more advanced goods, although this does not include usage by trains or villagers.[/p][p]There's actually four new windows planned. The first one, shown above, is Maximum Production, which tells you the theoretical output of the buildings you have built. This does not take into account how long it takes for your villagers to get there, interruptions from eating, drinking, and sleeping, or if you even have the spare workforce to fill the job. It will, as an example, help you get the right number of farms and windmills to fully supply your bakery.[/p][p][/p][p]The version of the HQ built in level 2, a small structure on the hill with a giant clock. (Yes, that clock is functional!)[/p][p]These windows are unlocked by building the Railway HQ, a further-upgradeable building that represents the railway's presence in your town. Starting with the Light Industrial Permit (Level 2), each permit unlocks a new level of HQ, and each level of HQ unlocks a new analysis window to help support your administration.[/p][p]I'll have more details once I actually build them, but I'll at least mention the other three windows. After maximum production is Population Statistics. This will have information about how many job openings you have compared to your population, how you are doing with fulfilling their food, water, and shelter needs, etc. Third is Current Production, which shows the actual output of your buildings, allowing you to see the gap between theoretical and actual performance. Finally, there's Immigration Controls. As some of you have noticed, the game caps out around 120 villagers. It's a soft cap: you may end up with more thanks to a train with a lot of passengers, but more passengers will stop coming once you've reached this limit. Immigration Controls will allow you to change that limit (or remove it altogether).[/p][p][/p][p]The new coal, wood, stone, and steel storages are visible in this screenshot.[/p][p]The new storage graphics also appear in the main menu.[/p][p]To wrap this dev diary up, I wanted to add a bit of new eye candy. Somewhat recently (a couple of months ago, I think), Krishna Palacio put together a new Patreon-exclusive pack: Material Piles. I know, sounds fascinating and exciting, right? A big part of this update has to do with resources though, so it was a perfect time to update some of the resource storage graphics! I did modify them a decent amount to fit them into the context of Iron Village, but the core of it is Krishna's work, so definitely check it out![/p]

Diary #52 – 1.1.06 & 1.1.07 Release Notes

[p]So uh, sorry about that everyone! I managed to create a new bug in 1.1.05, so a fix went into 1.1.06, but then another bug was reported the next day which warranted the release of 1.1.07. Now that those are sorted, I’m back on feature work, but I wanted to talk a bit about what happened and why.[/p][h2]1.1.06[/h2][p]So you may remember my long explanation of the color bug fixed by 1.1.05, and maybe you thought, “wow, this guy went into a lot of detail about this bug, he seems to know what he’s doing”. It turns out, nope. While fixing the problem, I decided to go ahead and write some code to manually write out the color, rather than relying on the default serialization. I still think this was a good call, as relying on the default was the cause of the comma/period bug, but as I was writing it the autocomplete spat out what looked like the thing I was trying to type. So I went ahead and finished the line & moved on. (This was mistake #1.)[/p][p]Publishing software to actual people should involve a decent amount of testing to prevent bugs from reaching them. Ideally, it’s one part of the “swiss cheese” model we all got to learn about in 2020. For major releases, that is the case – not only do I run through a full playthrough or two, but Bea McCullagh also does some substantial testing – that’s why she’s on the credits. For this one though, because I was in such a hurry to get a glaring bug fixed, I didn’t do enough testing (and I was the only one testing it). I made sure that loading saves with the white hair and trains fixed the colors, and saving the game seemed to work without crashing, but I forgot to verify that these new saves could then be loaded again. (Mistake #2) That is kind of the definition of a working save: it’s kind of pointless if it can’t be loaded again. But this was a last minute “oh, I should fix this too” change, so it didn’t fall on my radar as something to test.[/p][p]So what was the problem? I forgot the alpha channel when storing colors. Or specifically, the autocomplete forgot it, and I didn’t notice. This autocomplete is IntelliCode, which I made the dumb mistake of just assuming was just rebranded IntelliSense or something, just some sort of fancy autocomplete. (To be fair, that does describe all LLMs, but still.) But even though it’s not Copilot, it calls itself some sort of AI feature, so I finally went diving through the mess of settings to disable all of it. Apparently I’m not enough of an anti-“AI” zealot.[/p][p]Anyway, without the alpha channel, the code that loads the colors throws an exception, which stops the loading, which prevents the “Loading…” panel from going away. I still generally think this is generally correct behavior, otherwise you could load a corrupt save and all sorts of unexpected shenanigans might happen, but a missing alpha channel stopping loading is too much. The loading code will now properly handle missing alpha channels for colors, and going forward all saves will include it again.[/p][h2]1.1.07[/h2][p]Another bug got reported afterwards, but thankfully this wasn’t caused by another fix. In one save, the “scheduledRoyalTrain” variable in the ProgressionManager (code I have that handles the game levels, a.k.a. permits) had somehow been set to “true”, but there was no Royal Train present in the save, either in town or listed as a “nextTrain”. Unfortunately I couldn’t reproduce the reason why this happened in the first place, which would’ve been ideal, but there’s now code when loading the save that checks if this variable should actually be true. If it shouldn’t be, it gets set back to false, which allows the TrainDispatcher to realize it should spawn the Royal Train. That code is now in 1.1.07.[/p][h2]How to Report Bugs[/h2][p]The most useful thing to help deal with bugs is providing your save file to me; second is your log file. The fix in 1.1.07 never would have been made without getting an affected save, so I’m taking this opportunity to make a PSA. If you run into an issue in the game, the most useful thing you can do is send an explanation of the problem and a save file. Where do you find those saves (or the related logs), you might ask? Every operating system seems to have an annoying location for them, but here’s the full listing:[/p][p]Save Files (Steam Cloud):[/p]
  • [p]Windows – C:\\Program Files (x86)\\Steam\\userdata\\ (Your Steam ID)\\3011060\\remote[/p]
  • [p]MacOS – ~/Library/Application Support/Steam/userdata/(Your Steam ID)/3011060/remote[/p]
  • [p]Linux – ~/.local/share/Steam/userdata/(Your Steam ID)/3011060/remote[/p]
[p]Logs & Save Files (Local):[/p]
  • [p]Windows – %appdata%\\Godot\\app_userdata\\Iron Village\\logs, saves[/p]
  • [p]MacOS – ~/Library/Application Support/Godot/app_userdata/Iron Village/logs, saves[/p]
  • [p]Linux – ~/.local/share/godot/app_userdata/Iron Village/logs, saves[/p]
[p]Then either send those via Discord, or send them via electronic mail to [email protected].[/p][p]Anyway, thanks for bearing with me and these fixes![/p]