Salty Scientist Studios

Wizard School · November 2026

From flat to 3D, one screenshot at a time

The last post was about what changed when Wizard School went 3D. This one is about how it went, because it went fast and not in a straight line. The first 3D commit is dated 11 November. A day later the flat view was marked deprecated. Since then the game has looked wrong in about ten different ways, and I kept the screenshots.

Day one: a test

the first 3D picture: a kitchen and hall with round-headed figures
the first 3D picture: a kitchen and hall with round-headed figures

It started as a question. The game had turned into a Sims-like, so what would it look like drawn the way The Sims 1 was, with the engine left alone? The answer was one new file and a launch flag, --3d. Flat tile pictures for the ground, thin walls cut away in front, boxes and balls for furniture and people.

It ran, it looked like The Sims straight away, and that was that.

Rule one: don't touch the simulation

Everything after that followed one rule. The view may draw the world any way it likes and may not change it. Positions, pathfinding, needs and magic all stayed where they were. Clicking still goes through the same cursor, which now gets its tile from a ray to the ground.

That is why it could go quickly. It is also why the old flat view still runs underneath, unseen. Anything the 3D view can't draw yet, it borrows from the flat one as a sprite and stands it up in the world.

Rule two: say what's ugly

boxy animals and chibi people by a pond
boxy animals and chibi people by a pond

Most of the three days were spent looking at a screenshot and writing down the first thing wrong with it. Some of my notes, in order:

Each one got fixed on its own before I looked again. The animals went from balls to grown skins to boxes with a painted coat, which is where they stayed. People went the other way. Boxes made them worse, so they became smooth lathe-turned shapes with a picture wrapped round.

a crowd in pastel robes with painted faces
a crowd in pastel robes with painted faces

This is the "drawn by a 4 year old" stage. Every robe is one flat colour, the eyes never shut, and the colours are washed out because the engine's film curve was still on. None of the fixes added polygons. A second colour for trim, a hem, a blink, thinner eyebrows, a head tipped back a little so you see a face and not a scalp.

students in house uniforms with different hair
students in house uniforms with different hair

The same models after that pass.

Rule three: when stuck, look at 1996

Twice I went the wrong way by being modern about it. The first models were smooth and subdivided, which is a 2020s look. The first night used real lights, which shone through walls.

Both times the answer was to look at what an old game did. Mario's face is a picture. A Minecraft pig is six boxes. PlayStation games shaded from the corners and dithered the rest. The night went back to the flat view's light map, a light level per tile, darkened in eight dithered steps.

dusk falls over a yard, the lamps come on, and a teacher tries a few spells
dusk falls over a yard, the lamps come on, and a teacher tries a few spells

Rule four: film it twice

The flat view turned out to be the best test I had. I filmed every set piece in both views and looked at them side by side. That found the burning field that looked like traffic cones and the frozen pond with candy stripes round it.

Then I ran the same seed under both views and compared the dice. They should match exactly, since the view isn't allowed to change anything. In one scene they didn't, and it led to eight loops in the simulation that were quietly depending on the order things were drawn in. The 3D view found a bug in code it never touches.

Where it is now

three hundred students on a field
three hundred students on a field

Three hundred people on screen costs about 6 ms a frame. Items are still flat pictures and will stay that way. The flat view is still in there behind --2d until the last few things it draws have been moved over, and then it goes.