All work

Ironworks

The studio’s own game in the factory-building genre: from a drill on an ore field to production lines. Written in Swift with no third-party libraries, buildings drawn through Blender.

Type
Our own game, in development
Platform
iPhone and iPad, iOS 17
Our part
Game design, code, art
Year
2026
Ironworks

The brief

Factory games on phones usually either simplify the mechanics or start to stutter as the factory grows. The goal is a full simulation that holds 120 frames per second on ProMotion displays.

Architecture

The simulation is plain Swift with no SpriteKit. It advances in fixed steps, 60 times a second, and computes the same result on any device. Rendering is separate: SpriteKit draws up to 120 frames and smooths motion between steps.

The world is generated from a seed with GameplayKit noise and stored in chunks. Each chunk has its own tile map, so only what is visible is on screen. The camera zooms from 0.25 to 2× with inertia.

What already works

Placing and rotating buildings, inventory and hand crafting, fuel-burning drills, two-lane belts, underground belts and splitters, arms and crates. 112 automated tests and zero compiler warnings, which is a project rule. Smelters and assemblers come next.

Art

Buildings are modelled in Blender, rendered from above and turned into pixel art in the game’s palette: ochre, graphite and turquoise.

A simulation step and a rendered frame

The whole line, from drill to crate, is driven by one escapement wheel with 60 teeth: that is the simulation step. The flywheel beside it spins smoothly, like rendering at 120 frames.

IRONWORKS
The arm's hand carrying ore: the part to watchEscape wheel, 60 teeth: one tooth per simulation tickFlywheel and belt surface: the picture, smooth between ticksA tabletop model of a line from Ironworks, a factory-building strategy game for iOS in Swift 6 and SpriteKit. The simulation is pure Swift with no SpriteKit, stepped by a fixed clock at 60 updates per second: the escape wheel turns one tooth per tick and its shaft moves the line in steps. Rendering runs separately at up to 120 FPS on ProMotion and interpolates between ticks, so the flywheel spins and the belt and ore glide. The world is generated from a seed in chunks. On the bench, drills drop ore onto a two-lane belt, an arm carries it to a smelter and ingots fall into a crate; of these, drills with fuel, belts, arms and crates are already in the game (stages M0–M6).

Under the hood

  • A fixed step 60 times a second, rendering up to 120 frames on ProMotion.
  • A drill yields a piece of ore every 150 steps, a belt lane carries up to 7 items a second, an arm cycle takes 54 steps.
  • A world from a seed: GameplayKit noise, chunks with tile maps, a 0.25–2× camera with inertia and pinch.
  • Game data lives in JSON: items, recipes, buildings and the starting kit.
  • Swift 6 and SpriteKit with no third-party dependencies, 112 tests in Swift Testing.

Swift 6 · SpriteKit · SwiftUI · GameplayKit · Blender

Shall we talk about your project?

Discuss your project