Yep, I made an entire game in Reaper! A side scroller with enemies, difficulties and procedually generated levels. Without a single line of code! I insisted of only using macros and custom actions.

In this post I want to give you an in depth explanation of what's going on under the hood, which custom actions I made, which scripts I used an how its all setup inside of Reaper. I actually have no idea how to script, so there's no scriptininvolved during making of this game. Only a combination of various actions and scripts that other have made which can all be found in ReaPack or at the Stash.

Gameplay You control a midi item with the arrows. Up and down on the tracks and left and right by grid points. Keep going right to avoid the 'evil playback cursor' aka the Creaper. Let's imagine theplayback cursor is ahuge Spider-like monster hunting you down!

Collecting purple blocks increases the BPM but theoretically gives you more points or maybe hurts the Creaper more.

Collecting brown midi items slows the BPM down hence making it easier but giving you less points.

Avoid the black midi items, if you collide into those you are game over!

You win the game by making it all the way to the right, doing so a picture pops up showing "Win" and stopping the playback. Getting caught by the playback cursor or colliding into a Avoider-item stops the playback and shows a message with "Game Over"

Underneath there's a cheesy midi soundtrack going on, that adapts according to how you play the game. (Playing it faster or slower). As a challenge for myself I decided to only use ReaSynth.

Main Mechanics

First of all, I use a lot of midi commands to run actions. Normally it only works with controller surface, but the awesome plugin MidiReaControlPathlet's Repaer redirect midi to itself, which makes it possible to activate actions by midi items. No, seriously, I don't know what I should have done without this plugin! It saved the whole game

The controls are pretty straight forward. Up is "Item edit: Move item/envelope points up one track/a bit" and Right is "Item edit: Move items/envelope points right by grid size" + 2 Custom Actions that I call "Move block to playback cursor and play" and "Find Player" which I will get back to later.

GameZoom sets the horizontal zoom to an empty midi item on track 1 and sets the vertical zoom to "Level tracks" which is then later defined in the custom Action "Selected Level tracks". They are split up, so that is easily possible to expand or reduce the track view in the game. The track GameZoom pumps a steady pulse on every beat, activating the action GameZoom via MidiReaControlPath. The action moves the timeline-midi item one beat as well. In all my actions, but especially this one I was very careful not using any scripts or actions moving the playback cursor, which turned out to be difficult!



Select level tracks

This one basically select the children tracks of Track 1 folder and unselects the upper and the buttom one. Conveniently I found an action called Xenakios/SWS: Unselect tracks with 'BUSS' in name which is a bit hacky, but works well. Optimally it would work with any track name