BagelTech
During 2020 and 2021, Laura and I made some games together, including:
Here’s Laura’s thoughts on it, and here I’ll be writing about the tech behind our Tall Bagel games.
Engine
We jokingly referred to our tech as BagelTech, but we ended up saying the the term BagelTech so often that it became the de facto name.
BagelTech is primarily powered by two libraries/frameworks:
FNA
FNA is a framework that handles graphics, input, audio, and more. For those familiar with XNA, FNA is a modern implementation of XNA.
I’ve been using XNA/FNA since over 10+ years ago (including my first commercial game Flotilla!) and I highly enjoy working with it. It’s free, lightweight, open-source, cross-platform, and flexible.
BagelTech is built on an accumulation of code I started way back in Flotilla. Here’s what it mostly looks like now:
camera.cs
handles the player first-person camera movement.helpers.cs
is my junk-drawer of helpful functions.inputmanager.cs
handles game input.program.cs
is where the program starts.screen.cs
a ‘screen’ is: options menu, game world, inventory screen, etc.screenmanager.cs
handles the stack of screens (removing, adding, updating).settingsmanager.cs
handles save/load of options (volume, resolution, etc).soundmanager.cs
is where we handle audio.
If you’re ever interested in checking out FNA, I made an open-source FNA Starter Kit to help get you going. It includes most of what I describe above.
YarnSpinner
Laura did all of Tall Bagel’s writing and scripting. We wanted find a way to allow her to rapidly implement and test her work. I think you can create an amazing amount of momentum when working with a good pipeline, and we wanted that kind of environment here.
We had a series of goals. We wanted to be able to:
- Implement content quickly/easily.
- Have content be data-driven (i.e. in human-readable text files, not in code).
- Test content quickly/easily.
YarnSpinner ended up being fantastic for this. YarnSpinner is a tool for game dialogue and game scripting. It’s lightweight, straight-forward, and is as extensible or minimal as you like.
Here’s a sample from Tall Bagel:
[time 3]Kim: I'm saving my dessert budget for egg nog.
[time 2]Jacob: But this is egg nog.
<<lookpitch kim 10>>
<<jostle kim 2.5>>
[time 3]Kim: No, it's egg nog ice cream!
The scripts live in a text file, and control what the characters say and do.
- The
[time 3]
command determines how long their speech bubble stays on-screen. - We added various commands to control the characters, including
<<lookpitch>>
to make the characters look up/down, and<<jostle>>
to make the characters shake in indignation.
If you’d like to see all of the various scripting commands we added to the game, we listed them all here.
Note: our Tall Bagel games (1, 2) are designed to be moddable. If you want to make a dinner party mod, please do!
Rapid Iteration
We wanted to be able to easily test things, to be able to fast-forward or skip to specific parts of the game. We added debug tools to facilitate this.
R
= reloads all script files, without having to exit the game.DOWN ARROW
= skip current dialogue bubble.RIGHT ARROW
= skip to next chapter.[ ]
= select chapter from dropdown box.ENTER
= confirm chapter dropdown box selection.
Here’s how our debug view looks like in-game:
For any future Tall Bagels, I’d love to re-visit how we handle how we test – perhaps something more intuitive and GUI-driven that uses less cryptic keystrokes.
Thanks
Working on these games was a joy. It’s wonderful to work with Laura, it was wonderful to see these characters come to life, and it was wonderful to create tech built around our specific workflow and processes.
A big special thanks to Choroplethora for making fantastic music for our games, and to Ethan Lee for helping us make our games work on Mac/Linux (and for making FNA!).