Mirror-Mirror

Mirror-Mirror is a first person puzzle game where players must bend light to solve puzzles and illuminate the mystery of a crashed spacecraft. Each of the game’s 10 chambers involves finding a way to direct the source of a powerful laser to the next chamber using a series of mirrors, lenses and other devices. To solve the game’s puzzles, players are given an energy gun than can store and release energy to manipulate the layout of levels, along with a tablet that is used to precisely redirect the source of the laser.

This game was made by a team of 3 artists and 3 programmers.

Puzzle mechanics

I worked on all the puzzle elements that interact with the energy gun. The gun itself can store up to three charges which are indicated via the gun’s emissives by updating parameters on it’s material instance. The only objects in a level that directly interact with the gun are crystals that, when fired on, either absorb energy from the gun or give back to the gun depending on if that crystal already had charge. These crystals can be configured to have shielding on any of their four sides, allowing level designers to fine tune when the player has a line of sight to them.

All crystals have a relationship with a puzzle device that listens to the state of that crystal to check if it needs to update it’s state. These devices often physically change the layout of the level such as opening and closing doors or moving pillars. Some devices support being affected by multiple crystals simultaneously, so it’s possible have a crystal that rotates a pillar, and a different one that translates it.

Additionally, crystals can have more than one output allowing it to affect multiple devices at once.

Pillars can be chained together to achieve more complicated motions. Here this single crystal is toggling translations and rotations of multiple chained pillars.

I also added teleporters that work a bit differently from the other devices. Rather than consuming and storing charges, these just require the energy gun to have a single charge to be activated. As the name would suggest, the teleporters are capable of moving a device on one teleport pad to another pad that is linked to it. They’re also able to teleport the player character if they’re standing on the pad when it’s charged. This functionality is reused to transport the player between levels. In the current version, teleport pads use a visually distinct crystal to indicate that they don’t consume charges. The below video is an early version of of the system without those newer crystals.

Puzzle Design

We had two main types of puzzle chambers in the game: static rooms with devices and optics that could be manipulated, and chambers where the the puzzle was to rearrange the rooms themselves like a sliding pluzzle. All of my levels were of the former variety and were made to be more difficult, end-game challenges that tied together multiple interconnected types of devices.

I was particularly happy with the chamber that we used as the final level. Not only was I able to incorporate every type of device and optic in the game, but the chamber has a bit of a twist that is unique to the level. I took one of the existing pillars and enlarged it, using it as a large rotating central platform within the level. To solve the chamber, players must find a way to navigate around the perimeter of the level by interacting with devices and finding new vantage points that let them access previously blocked energy crystals.

Level Building Tools

To facilitate faster level prototyping and iteration, I created a few level building tools. The first of these was a floor generator that filled in a volume with a grid of floor tiles. I expanded this to be able to set any arbitrary tiled mesh, allowing it be be used to make the game’s ceilings as well. Since we need to add gaps to the floor and to the ceilings, I added another volume that worked with the floor tool to punch holes into the generated plane of tiles.

Similarly, I worked on a spline-based tool to flexibly place walls. This along with the floor generator was particularly useful in a few cases when we decided to change a room’s dimensions such as the corridor the player enters at the start of the game. I later extended this tool to also add multiple rows of wall tiles since we created some chambers with higher ceilings.


Working on Mirror-Mirror was a great experience and it’s definitely a project I would consider revisiting down the line. We’ve likely only touched upon some of the many combinations of puzzles we could make with the existing devices and it would be interesting to see how adding a few new devices or mechanics would mix up the existing gameplay.