1. Iron Village
  2. News

Iron Village News

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]

Diary #51 - But what about second [bugfix]?

[p]Alternative Title: "Oops, I did it again!"[/p][p]So uh, I have yet another bugfix update that just dropped (except on Google Play, 1.1.04 didn't even get approved there yet, so we'll be going straight to 1.1.05 once I get a payments "issue" sorted). There's two bugs fixed, so I figure I'll explain a little about how they happened, and what the fixes entail.[/p][h2]Bright White Hair & Train Cars[/h2][p]So this one seems simple enough to explain: in some situations, loading a save will cause some of the villagers to have bright white hair, and some of the train cars to be bright white. However, the cause has to do with commas, periods, and (parts of) Europe*. The main thing that concerns me is that none of this was new in 1.1, so this problem may have been in the game all along? And the people affected never said anything - I only found out from an unrelated bug report![/p][p][/p][p]*As you'll see later, this applies outside of Europe as well, but that's where the bug was originally reported.[/p][p][/p][p]So a couple things need to be laid out to fully understand the issue. First of all, decimal separators. In the English speaking world, we use "." to separate everything above 1 and everything below, e.g. 2.7. However, many other parts of the world (not all of them) use a "," for this, e.g. 2,7. Things get a bit more complicated with the optional separators used for big numbers: two thousand seven hundred and 54 hundredths could be 2,700.54 in English, but 2.700,54 in other parts of the world.[/p][p]Hold on to that, now it's time for the second part: storing colo(u)r in computers. If you're not printing (where CMYK is more useful), you want to store the red, green, and blue values (RGB) so that you know how much to light up each part of each pixel on the computer screen. There's a few different ways of doing this, sometimes you'll see a hex code (for instance, #ffffff is ff for red, ff for green, and ff for blue; combining these makes bright white), sometimes it'll be a value between 0 and 255 for red, green, and blue, and in our case Godot uses a number between 0.0 and 1.0. (It also stores an alpha value 0.0 to 1.0, where 0.0 is fully transparent and 1.0 is fully opaque.)[/p][p]In Iron Village, train cars and villagers' hair and clothing have different colors applied to them. Rather than making separate images for each color, the game just stores the color as a separate variable. That way it can use the same texture to make different variations. In order to maintain this data when you save the game and load it later, we have to store this color in the save file. In Iron Village, that save is a "string", basically a bunch of words written out in a text file. It's not the most compressed, but it makes it much more easily readable by humans (or at least, me), which means it's way easier to find bugs.[/p][p]So at this point, we need to take a number between 0.0 and 1.0 and store it in this text file. Or, we need to read some text and convert it to a number between 0.0 and 1.0. That's easy enough though, just about every common programming language has functionality built in to get this done, or at least some sort of standard library. Since I'm using C#, I just use the built in ToString() and Parse(). It seems to work pretty well, and I don't encounter any issues while developing the game or testing it.[/p][p]At some point a few months ago, too late to avoid this problem but early enough that it saved me a lot of debugging time, I learned something kind of horrifying: the way C# handles converting numbers to strings and back can depend on the user's locale. That's right, the code behaves differently based on who is running it. My reaction when I discovered this boiled down to "WTF?!", but I hadn't yet realized my code was vulnerable. I had even wrote down a note to audit my code for this sort of thing, I just never got around to it.[/p][p]With all of that prior knowledge, I open up the save that the bug reporter sent in, and see this:[/p]
"Shirt":{"color":"(0.0, 463000.0, 435000.0, 10000.0)"}
[p]The UI of the screenshot was in German, so my first thought was, "uh oh, there's a gonna problem isn't there?" Somehow the save and load were acting differently, so it was reading 0.463000 as 463000 or something like that. The fix I put in was to force the usage of "CultureInfo.InvariantCulture" (i.e. US English, but pretending it's international), and fix existing issues by moving the decimal point for values above 1.[/p][h2]Loud Sounds[/h2][p]In comparison, this was such an easy bug to fix. At some point during development, I split up all of the sounds into two different channels, or "buses": Sounds and Music. Sounds also got split into regular and UI sounds, but the difference isn't user configurable. It turns out that a couple of sounds were missed, and were still on the Master bus, meaning they could be super loud even if you turned the sounds down. This was an easy fix - find the remaining sounds, and put them on a bus.[/p][p][/p][p]...and, now I've written a bunch of paragraphs about two bugs, lol. Hopefully that was at least somewhat interesting![/p]

Diary #50 - Not That Bad of a Screw-Up

[p]As tends to happen with major releases, a couple of new bugs managed to crawl in. Nothing game-breaking, but they're prominent enough that I figured I should deploy a new update. Since I was also working on new features/tweaks, there's a couple new things here as well! The full release notes:[/p]
  • [p]Allowed non-demolishable buildings to be moved, as long as they are marked as moveable. Among other things, this allows you to move the storage buildings you start with.[/p]
  • [p]Fixed an issue where one of the two squares reserved for the logistics office was allowed for building, but an adjacent open square was blocked.[/p]
  • [p]Adjusted the camera bounds to make it easier to build & view the REDACTED.[/p]
  • [p]Fixed some visual glitches with farm field signs and z layers.[/p]
  • [p]Fixed an issue on the Steam version where completing the Royal Ceremony would not unlock its corresponding achievement. (The game was trying to unlock "ACHIEVEMENT_ROYAL_CEREMONY", which does not exist on Steam, instead of "ACHIEVEMENT_CITY_CEREMONY", which does.)[/p]
  • [p]Fixed an issue where every fueling event in the Railway Status window was using the Fortress icon.[/p]
  • [p]Adjusted the villager positions for tree chopping so that you can actually see the new animations.[/p]
[p]That should be all! As always, replying here, posting in the Discord, or emailing me to send in bugs, suggestions, and comments is much appreciated - that's how this bugfix patch got out as quickly as it did![/p]

Diary #49 – 1.1 Released!

[p]It’s out! About 2.5 months of part time work has led to the 1.1 release, with a bunch of new features, “content”, and bugfixes. To celebrate, Iron Village will be available for 20% off on Steam and Itch![/p][p][/p][p][/p][p]An image summary of the new features in Iron Village 1.1.[/p][p][/p][p]A full set of release notes will follow, but in summary:[/p]
  • [p]Русский & 한국어 Translations: Iron Village now has options to play in Russian and Korean.[/p]
  • [p]Android Release: The full game of Iron Village will be available for purchase on Google Play and Itch.io for Android devices![/p]
  • [p]Construct a Fortress: Later in the game, you can construct an imposing fortress at the exit of your town. This will improve the satisfaction of your railway, and supply much needed housing.[/p]
  • [p]More Flexible Construction Options: You can now move buildings after they have been built, and build rotated versions of most buildings.[/p]
  • [p]Host a Royal Ceremony: Once you obtain City Status, the mysterious Monarch Faearn will show up to make it official. Your town will be expected to host a ceremony and feast as part of this process.[/p]
  • [p]Upgraded Camera: Now you can zoom the camera in to take a closer look at the details of your town, or zoom out to view the whole town at once. A new “Screenshot Mode” allows you to hide the UI and take in unobstructed views of your creations.[/p]
  • [p]Many More Improvements, including pausable resource production, new villager animations, and fixing villagers who sometimes get a bit stuck.[/p]
[p]A zoomed out screenshot of a large town. Look closely enough and you can see many of the new features.[/p][p][/p][p]Thanks to a frustrating day job (details of which could easily fill another post), the amount of time to work on Iron Village has been somewhat reduced, so a couple of known bugs/gaps are present:[/p]
  • [p]Despite implementing Google Play Games Services, the Android version does not yet support cloud saves. I was running into some issues where one save kind of worked, and then other ones just didn’t save, and never provided error messages either. This may involve modifying the plugin I used, so it was bumped for time. (Achievements
  • are* in place though.)[/p]
  • [p]Some roofs will overlap each other if the buildings are next to each other. This is especially common with rotated buildings and some of the “fancy” roofs.[/p]
  • [p]The new chopping animations are hard to see because the villagers go behind the trees. This will be adjusted later.[/p]
[p]Anyway, I hope you enjoy the new updates! Also a huge shout out to Fort Malthus for his playthrough of the new update of Iron Village – I sent out some copies/news updates very last minute (like, Monday evening), but somehow he pulled together a video and released it before I managed to get 1.1 out! Go watch it if you want to take a closer look (w/o playing yourself)![/p][h2]Full Release Notes for 1.1.00[/h2]
  • [p]Allow the player to move buildings around, apart from a few with specific set positions.[/p]
  • [p]Created a Royal Train that Monarch Faearn arrives on once the City Status Ceremony is ready (see below).[/p]
  • [p]Added a Monarch Faearn villager, who arrives on said train. They also hang around your city afterwards.[/p]
  • [p]Allow the player to click on the current level in the Railway Status screen to reread the current permit.[/p]
  • [p]Added a button to the info panel for resource producing buildings allowing you to pause production.[/p]
  • [p]Added an autopurchase feature, available at level 3 (Full Agricultural Permit), allowing you to automate the purchasing of goods from trains. Also allows for a minimum gold setting so you don’t go broke executing these orders.[/p]
  • [p]Added zoom in and out buttons. This allows you to alter what fits in the camera without also changing the UI size. (Changing the scale of
  • everything* on screen is already handled via the settings menu.)[/p]
  • [p]Added a “Screenshot Mode” which hides all of the UI (apart from the screenshot mode button), including progress bars. This allows you to take screenshots of your beautiful town without revealing that they are starving and homeless.[/p]
  • [p]Implemented a City Status Ceremony as a sort of “construction project” on the Royal Palace. This allows players to drop of resources as if they’re building a building.[/p]
  • [p]Added the Google Play Games Plugin by Jacob Ibanez Sanchez (Android and/or Google Play only)[/p]
  • [p]Specifically designated trees as immobile – unfortunately there are no ents here.[/p]
  • [p]Used the Kobold font by SomePx for many instances of small text that didn’t have to be super tiny (Latin & Cyrillic characters only).[/p]
  • [p]Added some missing resource tooltips.[/p]
  • [p]Added 1×2 farm fields, as opposed to the standard 2×1 already in game.[/p]
  • [p]Added 2×1 orchards, as opposed to the standard 1×2 already in game.[/p]
  • [p]Adjusted the progress bar for construction projects so that a 1000 gold requirement wouldn’t take up the whole bar, even if the 20 manastones are way harder to collect.[/p]
  • [p]Added 1×2 versions of the 2×1 houses.[/p]
  • [p]Added stone houses with black roofs.[/p]
  • [p]Allow resource producers to discard output if they are able to store some of their output. (For example, if your stone storage is full, but you need gems, the deep mine can produce and store the gems and discard the excess stone.)[/p]
  • [p]Added Russian & Korean translations.[/p]
  • [p]Added a separate Taiwan Traditional Chinese translation, using the existing Traditional Chinese translation as a Hong Kong one.[/p]
  • [p]Added tunnels at the far ends of the train tracks. (You won’t see these in most cases except when fully zoomed out.)[/p]
  • [p]Added a “victory screen” once the City Status Ceremony is complete, allowing the player to stop at a natural ending point. (They can of course continue playing.)[/p]
  • [p]Villagers getting off of the train now spawn closer to the car they came off of.[/p]
  • [p]Remember the previous screen resolution so it will start at that resolution the next time you open the game.[/p]
  • [p]Autosaves are now named for the town, allowing you to maintain multiple autosaves.[/p]
  • [p]Added new villager animations for mining, chopping trees, and planting crops.[/p]
  • [p]Adjusted the camera starting position to better frame the starting area.[/p]
  • [p]Fixed an issue with non-Latin characters in Steam Cloud saves. For some reason an encoding issue meant extra empty bytes were getting inserted into file names. This wasn’t an issue for Latin characters, as they are supposed to have empty bytes anyway (a result of English having first dibs on the character list), but if there were any non-Latin characters it would cause the game to attempt to load a save that didn’t really exist. This hasn’t really been fixed, it’s still an issue that occurs in the C++ -> GDScript -> C# conversion, but Iron Village now manually goes through and removes the extra bytes.[/p]
  • [p]Some buildings put up fancy banners to celebrate the arrival of the Monarch.[/p]
  • [p]Added relevant villager animations to the villagers in the main menu.[/p]
  • [p]Fixed an issue where villagers could become stuck just before reaching their destination.[/p]
  • [p]Added clouds to cover up the grey void past the edge of the map.[/p]
  • [p]Fixed custom logo design so that changes would only take effect after saving them.[/p]
  • [p]Added new tutorial bubbles.[/p]
  • [p]Added a fortress, available in level 4 (Heavy Industrial Permit), which bumps up approval by 10 and houses 4 villagers.[/p]
  • [p]Throttled scroll speed when using a controller joystick, it was waaaaay too fast earlier.[/p]
  • [p]The train station sign now shrinks or grows depending on the town name’s length. (You can thank the Russian translation for necessitating this.)[/p]
  • [p]Implemented achievements on Android.[/p]
  • [p]Added on screen keyboard logic so that the new game and save/load game screens shrink into the available space to avoid being covered up.[/p]
  • [p]Expanded the size of several buttons on Android to make them more easily pressable. (Due to the nature of this game and phone screens, the buttons are still small, but this should hopefully reduce wrong button accidents.)[/p]
  • [p]Added new art for the clothes boxcar.[/p]
  • [p]Fixed an issue where the cost display next to the cursor didn’t reset after dragging out an invalid road.[/p]
  • [p]Made the Royal Train slightly less binary.[/p]
[p]Anyway, if you’re still reading this, thanks so much for taking the time to look through it – now go and play![/p]

Diary #48 – What About Revenue & Profit?

This is the counterpart to Diary #45 – How Much Does an Iron Village Cost to Make?, let’s talk about how much money Iron Village has brought in, and then do the obvious comparison with how much has been spent. Don’t worry, more Iron Village 1.1 content is coming soon – because most of the content is done! Since the day job has been getting a bit crazy recently (in more ways than one), progress has been sporadic, and I’ve avoided giving any release dates. That trend will continue (I’m still avoiding release dates), but my bug and feature tracking list is quite a bit shorter than when I started – the end of this update is in sight!


A preview of the Fortress (work in progress), the last major piece of “content” going into 1.1.

So, revenue – how does Iron Village make money? Overwhelmingly, it’s on Steam. Iron Village is also for sale on Itch.io, but that has accounted for $48.95 USD of gross revenue – low enough that I’m ignoring it for these calculations. If you’re curious about that breakdown though, I have Itch’s share set to 10%, and the available balance to withdraw is $30.19, so there’s an additional 28.3% that has been taken out. I don’t have all the numbers in available to me at the moment, but I suspect most of that is VAT, along with payment processing charges.

The way the payments work is Lunar Chippy Games LLC’s portion of the sales is paid on a monthly basis, so at the end of the month the previous month’s share is paid. I’ll be going through each month’s data so far, to give a picture of how things went over time.

March 2025


Iron Village was released on Steam on March 24th, 2025, at 9am EDT (13:00 UTC), so this “month” was actually just under 8 days. (I don’t know exactly what time zone Valve uses to make the month cutoff.) For the first 7 days, it was in the City Builder & Colony Sim Fest, and on sale for 15% off.

To start, the price of games varies significantly around the world, so combined with the 15% off, the gross average price was $5.68 USD, compared to a full price of $7.99 in the US and a $6.79 US sale price. There were 583 units sold (i.e. purchases of Iron Village), of which 45 (7.7%) were returned, leading to 538 net sales.

In USD, this was a gross sales of $3648.35, which you might recognize as being about the same as the expenses. Except, now we get to start taking parts away. The returns subtract $271.09, then remove $338.43 of sales tax and VAT, and the net sales are $3038.83. The cherry on top is the $100 “Steam Direct Fee”: remember how we had to pay $100 to get on Steam? Well, Iron Village sold enough to get that back, for a total of $3138.83. Great!

Except, the payment arrives at the end of April, and it’s… $2227.17. Up until then, I was wondering when Valve’s 30% cut was going to show up. I checked the math, it’s basically as close as you can get to 30% without slicing up pennies. The expenses at the time were $4046.39 (some more PR purchasing post-launch), leading to a company profit of… -$1819.22. (Note that I’m comparing to expenses at the end of April, and not when the payment was actually made to the bank account.)

April 2025


Moving onto April, Lunar Chippy Games LLC hasn’t been paid yet, but the monthly report for April has been generated, so let’s look at the numbers. An average price of $7.27 this time, with 368 units sold, but 37 returns (10.1%), so a net 331 sales. Yes, that is less in one month than the 538 in less than 8 days in March. That’s the power of festival & launch visibility combined with sales.

Subtract out returns, VAT, other taxes, and that’s $2401.56. Based on the math from March, I’m expecting a $1681.09 payment to Lunar Chippy Games LLC. Expenses at the end of April were up to $4387.57, so that’s an expected profit of… -$479.31. Still negative, but a lot closer to breaking even!

May 2025 (Through the 24th)


This data is a bit rougher, since the month isn’t over yet: there will probably be more purchases in the remaining week, as well as returns. However, so far there have been 63 net units sold, and $449.17 net sales. That would make Lunar Chippy’s expected share $314.42. Except there were a bunch more fun expenses, the largest of which were translations for version 1.1 and the LLC renewal cost. (Technically it’s called an “annual report”, but it’s the same $500 + $20 expedited filing fee.).

Adding all of that up, the current profit is… -$1615.50. Lol.

Anyway, I’ll be putting Iron Village on sale again once version 1.1 releases, as well as making more of an effort at marketing, and that LLC fee is only once a year. I still think we’re on the road to profitability, which was my baseline goal at the start (fully knowing that that’s a surprisingly difficult target). Obviously every game is different, and I’m only one data point, but I hope this was an interesting view into the Lunar Chippy budget.