Thief: Milkmaid Heist

Shaw
Hard Mode
Published in
4 min readOct 2, 2017

A couple weeks ago, I built a CLI game in Ruby with a friend and peer at Flatiron School, Cole Shapiro, called Thief: Milkmaid Heist. TMH is a text-based adventure game where you play as the international art thief, Vince Peruggi, breaking into the Rijskmuseum in Amsterdam to steal valuable works of art. We built the game in three days; it turned out to be an interesting project.

opening screen

The Story

The game takes place in Amsterdam in 2005 during a large renovation of the Rijksmuseum. The renovation provides the perfect opportunity to break in and steal priceless works of art. The player gets to choose gadgets to take with them on the heist to help them overcome obstacles in the museum such as laser sensors, noise alarms, and security guards. Familiar text-based adventure game elements like open ended user input are present, as well as some pretty cool colorized ascii art representing the works on display at the museum. The player breaks into the museum, navigates the corridors to discover art that they may steal, and encounters obstacles along the way that they must overcome using their gadgets.

Gameplay

The goal of the game is to steal as much art as possible from the Rijksmuseum, and to ultimately steal the famous Vermeer painting, The Milkmaid. The game begins at the thief’s hideout. The player must select 5 gadgets to bring with them on the heist. As the heist begins, the player finds themself outside of the Rijksmuseum, where they must choose their entry point into the museum. Once inside, the player encounters obstacles that are randomly generated by the game engine. For example, the player may notice laser emitters on the walls suggesting that the corridor is rigged with a labyrinth of laser sensors. If the player has selected their gadgets wisely, then they will be able to use a gadget to overcome the obstacle. It is also possible for the player to attempt to rely on their base skills as a thief to overcome an obstacle. However, this will drain the player’s stats, lowering the probability of being able to overcome an obstacle in the same manner in the future.

After every obstacle that the player successfully overcomes, they reach a new corridor of the museum with art available for them to steal. Every time they attempt to steal a work of art, there is a random chance that they will trip an alarm. If the player can disable the alarm, then they can steal the artwork and continue the heist. If the player avoids all obstacles and is able to reach the grand hall containing “The Milkmaid,” then they can steal it and escape the museum.

Connecting to the Rijskmuseum API

We pulled all of the data pertaining to the artworks in the game, including images of the art, from the Rijksmuseum API. We parsed the JSON data into artwork attributes which we stored in a database. Then, we used Active Record to instantiate Ruby objects with corresponding attributes from the database. As a player explores new corridors in the Rijksmuseum, we randomly generate artworks from the database (and render an image in ascii art form) that the player can encounter and attempt to steal.

Incorporating Randomness

One of our goals was to incorporate randomness and attempt to encourage emergent behavior in the game. We wanted to avoid a completely linear and obviously scripted experience. We implemented a number of design choices in order to achieve an interesting and unique game experience for each playthrough.

  • The obstacles that a player encounters are randomly chosen.
  • The player gets to choose which gadgets to take with them on the heist at the beginning of each playthrough.
  • Each gadget and obstacle has unique stats including: technical complexity, physical demand, and willpower required.
  • Gadgets can be used in a variety of unique ways to overcome obstacles.
  • The artworks that are generated in each playthrough are randomly chosen.
  • When a player attempts to steal an artwork, there is a random chance that they will trip an alarm and have to disarm it.

Ascii Art

The images of the works of art on display at the Rijskmuseum were converted into ascii art using the Ruby gem ‘asciiart’ and a program called Image Magick. Another Ruby gem ‘rainbow’ enabled the images to be converted into colored ascii art.

Portraits of Giuliano and Francesco Giamberti da Sangallo, Piero di Cosimo, 1482

I had a lot of fun building Thief: Milkmaid Heist with Cole and I am happy with what we created in such a short period of time. If you are interested, feel free to check out the github repository: https://github.com/bitwitch/THIEF-cli

--

--

Shaw
Hard Mode

programming sorcery and black magic bit witchery