Having a Hoot at the Lisp Game Jam: A Tale of Two Daves
tessa —This October, several teams and individuals gathered online to create sixteen games over the course of ten days for the biannual Lisp Game Jam. The earliest recorded instance of the jam took place in 2010, then intermittently in the years that followed, before landing on a more semi-annual basis starting in 2016.
This year, two of the entries, Cybersol by David Wilson and Strigoform by Spritely's own Dave Thompson, leveraged Hoot, our open-source Wasm toolkit to enable Scheme in the browser. What follows is an interview with the two devs on how it felt to participate in the jam this year, as well as their experiences with Hoot.
Note: Interviews have been lightly formatted
How did you come to learn about the jam?
David Wilson
I've known about the Lisp Game Jam for years now and have tried participating a couple of other times but never submitted an entry. Since Hoot released 0.1.0 practically a week before the jam, it seemed like an excellent opportunity to participate and experiment with the toolchain.
Dave Thompson
I had become friends with one of the former jam hosts, David O'Toole (dto), via the #lispgames IRC channel. It turned out that dto and I live very close to each other and even went to the same college (though not concurrently), and through that connection I got more involved in hobby game development with Lisp, using Guile Scheme as my Lisp of choice. I submitted my first game to the jam that happened soon after: Spring 2016 Lisp Game Jam.
I try to participate in every jam, but most of the time I don't submit anything. Finishing stuff is hard!
How long have you been participating in this or other jams?
David Wilson
I've been participating in game jams like Ludum Dare, GitHub Game Off, and the Lisp Game Jam for around 10 years. They're a great way to try out new languages, libraries, and programming techniques! I usually live stream the work on my jam entries on the YouTube channel Flux Harmonic.
Dave Thompson
I started participating in 2016, when the jams started being hosted on itch.io, a hosting platform and digital store for independent games.
How did you start running the jam?
Note: Dave Thompson is a co-organizer of the game jam
Dave Thompson
In 2022, Michael Fiano (mfiano), who had been hosting the jam since late 2016, decided it was time for someone else to take over. Phil Hagelberg (technomancy), who maintains Fennel, among other things, volunteered. Phil felt it would be best to have some redundancy with a second person available to moderate, so I volunteered to co-host. You'll see my name in the "Hosted by" line starting with Lisp Game Jam 2022, but really Phil does all the work organizing the dates and setting up the jam page. The jams do not have strict rules, and there is no money involved, so there isn't much to moderate. Phil does kindly check in with me to see if his proposed dates for the next jam sound good to me. I always say "yes." :)
Can you tell us a bit about this year's entry?
David Wilson
I have a recurring idea to make keyboard-friendly versions of classic games like Solitaire, so this time I decided to do just that and worked on a cyberpunk-themed Solitaire game. Instead of clicking on the cards to move them around, you use keyboard keys that are mapped to the various card stacks so that you can be a lot more efficient with your movements.
Dave Thompson
I made a vertical scrolling space shooter with a retro arcade style called Strigoform. I wrote all of the code, Christine Lemmer-Webber came up with the name, the owl theme, and did all of the pixel art, and my wife Andrea Parthemore wrote the music.
What inspired your game?
David Wilson
The world needs more keyboard-driven games because using the mouse is boring :)
Dave Thompson
Fear! Hoot 0.1.0 had just been released, and since it was the very first release there were a lot of limitations and some bugs waiting to be discovered. I knew I'd be pushing my technical skills to get the game done in time, so I decided to play it safe otherwise and make something that was familiar to me. I have made several similar games for past jams, so a space shooter became the obvious safe choice. Also, Christine thought it would be cool if I made a space shooter and offered to make pixel art.
What tools did you use to make your game and why?
David Wilson
I used Emacs for development because it is the ultimate work environment, Inkscape for creating vector graphics, HTML5 canvas APIs for rendering the game, and Google Chrome Unstable for testing the game because it had all the bleeding-edge WebAssembly features needed by Hoot.
Dave Thompson
The game was made completely with FOSS. The code was written in Emacs because it's the best editor for Lisp out there. The art was made in LibreSprite because it is built for pixel artists. The level was made in Tiled because it's a flexible 2D map editor and I already had a parser for its TMX format written in Scheme. The music was made in MilkyTracker because it's good for retro chiptune music.
Most importantly, the source code was compiled with Guile Hoot because it builds Wasm binaries that can run in web browsers. I've done game jams long enough to know that browser games will be tried and rated by more people than games with only native builds because it is much less work for the user. Browser games are also more likely to work on other people's computers. Providing native builds for all major operating systems that work reliably is difficult as an independent developer.
What challenges did you encounter in development?
David Wilson
Because Hoot did not have a foreign function interface as of the 0.1.0 release, I had to write a decent portion of the game in JavaScript because Hoot could not call the JS functions needed for rendering the screen handling input, etc.
The biggest challenge there was designing the Scheme code to be purely focused on the game logic and to create a simple protocol for communicating the game state between the JavaScript and Scheme code so that the JS code can render the game and Scheme can process the user's actions. It was a lot of extra work to get around a temporary limitation of Hoot!
This problem has now disappeared as of Hoot 0.2.0. I've already started rewriting the game to make use of the new FFI capabilities.
Dave Thompson
Hoot's in an early stage of development, so challenges caused by bugs and missing features were to be expected. I ran into bugs with some floating point operations and hacked around them with some inline Wasm. There was a particularly gnarly compiler bug that caused the Scheme stack to get into an invalid state sometimes and throw a Wasm runtime exception. User defined record types, which Schemers know as define-record-type
, wasn't implemented yet so I resorted to tagged vectors to describe all my data types for the player, enemies, etc. All of these issues and more have since been fixed!
It was also challenging to not be able to use Chickadee, the game programming library for Guile that I maintain. Chickadee uses the C FFI to interact with native libraries like libGL, libpng and libfreetype, so it needs extensive work to add a new backend that uses web APIs instead via the Hoot FFI.
Note: Check out Dave's Chickadee template here
What about successes or wins?
David Wilson
The main success was that I was able to implement basic working game logic and rendering in the time of the jam! The biggest win, though, was that, thanks to Hoot, I was able to write working Scheme code to run in a browser.
Dave Thompson
The biggest win is that the prototype FFI for Hoot that I was hacking on before the jam started worked well enough to access the HTML5 Canvas API. I wasn't sure if performance would be good enough without using WebGL, which I definitely did not have time to use, but it worked out great!
Another small success story happened a few days into the jam. When the jam started, I was writing the level data by hand, tile by tile, in the Scheme source. I thought that since it was just a jam game I could deal with how annoying it was to edit the level, but it quickly became a productivity destroyer. I decided I should use a proper map editor like Tiled. However, writing the code to fetch, parse, and transform a Tiled map in the browser was going to be too difficult to implement in the time I had. I thought I was stuck, but then I remembered: this is Scheme! Code is data! I could compile the map file to Scheme code at build time. That auto-generated Scheme code could then be composed with the Scheme code that I wrote for the rest of the game and then the level would be baked into the final binary. So, that's what I did and it worked great! No need to use an XML parser at runtime!
What do you hope to see from Hoot going forward?
David Wilson
Since Hoot is quickly reaching compatibility with R7RS-small, it will be a fully functional Scheme for basic application and game development. What I'm more excited about is new libraries written for Hoot which add APIs for graphics programming, UI development, and networking support via HTTP requests or WebSockets. I imagine that is an area where the Hoot community could help out significantly!
Dave Thompson
I'd like to see a lot of useful browser APIs get wrapped into ready-to-use Guile libraries. Hoot still lacks a module system, but that's on the way and it will enable the community that's growing around Hoot to start making cool and reusable things. Besides the DOM, the most important APIs for games are HTML5 Canvas, WebGL, WebGPU, and Web Audio. Porting Chickadee to the web will make it much easier to build games with Hoot.
Do you have any advice or favorite resources you'd like to share with future participants?
David Wilson
My advice for anyone participating in a game jam is to limit the scope of your ideas as much as possible so that you can actually complete the game! You'll have a lot more fun if you make a "simpler" game that you can finish and then spend the rest of the time polishing it to make it more fun.
Dave Thompson
This is common jam advice but it's so true that it's worth repeating: Scope your ambitions down. Way down. Whatever your brain is telling you is a reasonable goal, try to reduce it even further. This takes practice, and I've failed at it more times than I've succeeded. The Lisp Game Jam is great because of its relaxed rules and how it always takes place across 2 full weekends for a total of 10 days, which makes it accessible to busy people.
Come into the jam with your tools ready and don't wait until the last day to figure out how you're going to distribute your game. Toolchain issues are no fun, and jams are supposed to be fun!
To learn more about what the options are for making games with Lisp, check out the source code for the entries in past Lisp Game Jams. Every game is required to publish source code so there's a lot of good code to learn from! The Strigoform source code is available on my personal website. I think Hoot is great for building web games and I'm going to try using it for the next jam, too.
Are there any other questions you wish you'd been asked about the jam?
David Wilson
Maybe "What was your favorite game from the jam?" My answer would be Dave Thompson's Strigoform because it's much better than mine and a real example of what you can do with a fully-Scheme browser game using Hoot :)
Dave Thompson
I think you covered all the important stuff. Thanks! :)
Further reading
All good things come to an end and so too must this interview. If you'd like to participate in the next Lisp Game Jam, here are some resources you might find useful:
-
- 📣 (Keep an eye out for the Spring Game Jam 2024 announcement on the Community tab)
- 📒 Game Jam Tools & Resources, kobitoko (GitHub)
- 📖 Game jam, Wikipedia
- 📖 Lisp Game Wiki
- 📰 7 Tips to 7-Day Game Jams, John Cooney (Game Developer)
- 📺 Live Coding a 2D Platformer with Lisp, David Wilson (YouTube)
- 📺 Live Coding a Solitaire Game with Scheme, David Wilson (YouTube)
- 📓 Spring Lisp Game Jam 2023 Summary, David Thompson (blog)
- 📓 Retrospective: Lisp Game Jam (Spring 2023), Jared Krinke (Schemescape)
- 🎮 Cybersol
- 🎮 Strigoform
And if you'd like to learn more about and contribute to Hoot, be sure to check out our webpage and the GitLab repo!
Thanks for reading! 🌟