Status
SteamPeaks
ChartsSalesUpcomingPatchesEventsCalculator
New on SteamEvery app, DLC and depot the minute Steam creates itAppsEvery app on Steam, newest change firstPackagesSubs and bundles, and what each containsDepotsDepots, manifests and install sizesTagsSteam's user tags and the games under themDevelopers & publishersCompanies and their cataloguesTechnologiesEngines, SDKs and anti-cheat found in the filesChange historyEvery PICS changelist as it lands
SignalsNineteen readings of the whole catalogueCompareAny games side by sideRecordsAll-time peaks and the days they were setReportsWeekly and monthly write-upsAlerts & newsroomWatch a game, get told when it movesSteam statusIs Steam up, right nowWeb API explorerTry the endpoints in the browser
EventsSteam's own events and the sales calendarCalculatorWhat a Steam account is worth, and its pile of shame
/
Sign in
/
SteamPeaks
The ultimate resource for Steam data.
ExploreChartsSalesSales and festsUpcomingPatchesEventsRecordsTrendingSignals
DatabaseAppsPackagesDepotsTagsDevelopersTechnologiesChange history
ToolsCalculatorCompareSearchAlertsSteam statusAPI
SiteMethodologyFAQDiscordSupportSign in via Steam
Not affiliated with Valve or Steam. Game names and artwork belong to their owners. All times UTC.
PrivacyCookiesFair useStatus
Iron VillageEventsDiary #54 – Workers and Resources: Iron Village
Community

Diary #54 – Workers and Resources: Iron Village

Iron Village · published 30 Jul 2025, 18:39 UTC

All eventsPlayers around this dateRead on Steam

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.

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.

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.

(Discussion of coding practices follows, feel free to skip down to the pretty pictures later on.)

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.

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.

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).

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.

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.

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.

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):

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. 😊

More from Iron Village

Other announcements

All events
Community9 Jul 2026Diary #73 – Don’t Worry, I’m Still AroundHi all, so it's been awhile since the last dev diary... I've still been working on Project OY, but there's been a bunch of personal & family things going on over here so there hasn't been time to communicate much about the project. (That'll likely be the case for the next month too, FYI.) (An in-engine shot of something being worked on.) I did make a start on one dev diary, which was going to b…In-game event24 Mar 2026Diary #72 – 1.3.02 Release NotesTo celebrate a whole year of Iron Village being available to the public, the 1.3 update is releasing today! (March 24th, 2026) The biggest feature is tree planting: once you get the Full Agricultural Permit, you can start planting your own trees. I haven’t personally run into a situation where I’ve completely run out of trees, but if you want to replant some of your deforested regions, you now…Community20 Mar 2026Diary #71 - Yet More Games I've Played (Part 3)In this dev diary I’ll be wrapping up my 2025 games played review. But first, a quick announcement – Iron Village 1.3 will be releasing on March 24th, the one year anniversary of 1.0’s release! It’s not a huge update, just some bug fixes and a small tree feature I’ll go into detail about next time, but it’s still something! Iron Village is currently on sale for 35% off, so if you don’t have it…