WASD to move. Arrow keys for the camera. R to reset the player.
Made completely from scratch except for help with fixing fisheye from this article. http://www.playfuljs.com/a-first-person-engine-in-265-lines/ See inside for comments that explain how it works. Due to the map's design, some areas yield much lower performance than others. If the map was more maze-like (without any large open areas), then the fps would be higher.