Implementation
Love
- https://codeberg.org/alexjgriffith/min-love2d-fennel "Minimal Fennel Love2D Setup"
- https://love2d.org/wiki/Config_Files
Can disable modules you don't need.function love.conf(t) t.modules.window = false t.modules.graphics = false t.modules.joystick = false t.modules.physics = false end
HTML / Love?
- https://itch.io/jam/autumn-lisp-game-jam-2025/topic/5480272/making-games-with-fennel-and-love2d
If you’re brave you can also try targeting the web. The “minimal” love2d fennel template has a “web” target that may be used in the makefile.
If you’d like to do web first development to avoid fixing these gatchas at the last minute check out the fennel lovejs template.
HTML / Fengari
Help text
"I will be your eyes, hands, and ears."
VOLUME 1, VOLUME 10, MUTE, UNMUTE commands. [c15e045577daea74]
CREDITS to show developer names, credits for sound clips we use.
Credits also show when you win the game.
Parser
Canonicalize various representations of commands in the process of parsing,
e.g. GET TAKE PICK UP could all get canonicalized to the string constant :TAKE.
Same with objects that may have multiple ways to refer to them.
Make a single representative form that can be pattern-matched with a Fennel
case expression.
(case parsed-input
[:TAKE obj] (... do something to pick up obj ...)
[:EXAMINE obj] (... do something to examine the object ...)
_ (print "Huh?"))
Audio visualization
Live scrolling stereo spectrogram of L and R stereo audio channels. Like Music from another room. Looks neat and is an experiment in accessibility.
May not be easy/possible with Love2d: Getting rendered audio (e.g. as SoundData) before it is sent to the speakers?.
With Web Audio, can use AnalyserNode.
Text interface
Think about IRC: you have your own text input at the bottom, and while you are typing other people's messages are arriving and scrolling upward above your input line. When you hit Return on your own message, it enters the history and scrolls upward with the others.
That's how I envision the text interface. There's a line at the bottom that waits for your input, but meanwhile real-time sounds are playing. The sound files are annotated with text captions (maybe using Praat), and when that part of the sound plays, the corresponding text enters the message stream, above the line of input the player is editing. Maybe with different colors for sounds versus room descriptions versus player commands.
Town Square You are in a town square with cobblestones below your feet. There are exits to the north and east. A wheelbarrow leans against a tree. * "—boards today! Bill builds 'em, you buy 'em." (radio) >look at wheelbarrow You see nothing special about the wheelbarrow. * Bong (the bell rings). * A dog barks. * "Cheep!" says a bird. * Bong. Bong. >play the magic flute
GNU Readline may or may not make this possible. The main readline binding for Lua seems to have a limited subset of the API, though.
linenoise (lightweight alternative to Readline and libedit) has an asynchronous API that is designed for exactly this purpose; the documentation even calls it the "IRC problem". But linenoise may(?) not work on Windows. Also, neither the lua-linenoise nor the ljlinenoise Lua bindings has the asynchronous API.
libedit and luael Lua binding?
Non-blocking stdin input in Fennel and Love
- https://dev.fennel-lang.org/wiki/CookbookRepl
- https://technomancy.us/188 REPL blocking on stdin in a separate thread
- https://technomancy.us/202 REPL with Lua coroutines
- https://www.love2d.org/wiki/love.event.wait
Bell tower
Real-time chimes.
Radio
Two joke stations, one real station that gives you information you need to progress (phone number, safe combination, ...?).
Bad reception on the necessary station, need to carry the radio up a gondola to the top of Snowy Mountain to get good reception. ("This station isn't getting good reception here." "As you approach the mountain, the station is coming in a little stronger.")
E.g. TUNE RADIO command. TUNE RADIO TO 103.5.
>TUNE RADIO
What station do you want to tune the radio to?
1. 90.1 Ear Whacks
2. 103.5 The SLAB
3. 106.7 ???
"You're listening to the Dusty Rock Room, on 103.5 The SLAB." "Coming up next, a little Dusty Springfield. But first, a message from our sponsor." And then never get to the music, it's only funny commercials. "Bill's Surfboards - Bill builds 'em, you buy 'em." "You won't find Bill's boards on a billboard - only on the radio." "From the Himalayas to the Serengeti, Bill's Surfboards have you ready." "Browse our exciting selection of board wax!"
"All wax cylinders, all the time." https://archive.org/details/cylindertransfer https://archive.org/search?query=subject%3A%22wax+cylinder%22 "This next one will knock your socks off." "This next one's gonna make your head explode." "The seventh caller will win tickets to EdFest." "Playing hits of the 1880's, 1890's, and today."
"Just a reminder that there are no hints or progression on this station. Federal regulations prohibit us from providing hints or progression on this station. If you are looking for progress, you'll have to tune to <special frequency>."
Bird chamber
Hallway/room with hundreds of noisy birds. Need to dispel/quiet them somehow.
- Scarecrow outfit?
- Time of day?
- Earplugs? it is their home after all
- Maybe the birds really hate the sound of wax cylinders. All but one, hipster, bird.
"A cheerful little bird is sitting here singing. In fact, there's hundreds of them! What a racket!"
The bird noises get echoed to the text transcript, and their noisiness is reflected in how fast the text is scrolling. You can hardly hear yourself type.
After you solve the bird chamber, the single bird that remains becomes an item. It sits on your shoulder and you can hear it whistling on the right side.
A cheerful little bird is sitting here singing.
>take bird
Understanding your meaning, the bird flits up and takes a place on your right shoulder.
>i
You are carrying:
little bird
>drop bird
The bird descends in a tidy arc and alights on the ground.
Sound effects when moving between rooms
Depending on the floor surface. *trudge trudge trudge*
Yodeling and engine noises while taking the gondola up and down the mountain. Whistling wind at the summit.
Hear sounds from adjacent rooms. Maybe special "sound-only" exits to hear things in rooms you can't actually walk to directly (like being able to hear the bell tower anywhere outside).
Cheat codes
Big head mode. (Stops you from passing through a narrow corridor.)
Directionality
Slightly different descriptions (and sounds!) depending on which way you're facing in a room.
Joke puzzle
A treasure chest with a seemingly intricate puzzle, "line up the gems" or something like that, but put on the +2 Boots of Puzzle Solving, kick the chest, and it pops open.
Audio / music
Keep sound files mono, 44.1 KHz.
https://archive.org/details/animalsounds1
- https://archive.org/details/animalsounds1/44loons.mp3
- https://archive.org/details/animalsounds1/20peepers.mp3
- https://archive.org/details/animalsounds1/21singers.mp3
Clock tower machinery.
Special reward music track when you win the game.
Plays until you Press any key to exit.
Win Conditions
Let's subvert the Collector trope!
- Identify all the mushrooms by talking to people, finding snippets of a guidebook, listening to a mushroom identification radio station
- See all the rooms, the puzzles unlock new rooms until you've seen them all
- Get to the top of the clocktower. Each puzzle involves going up another level. Clear sense of progression as you go up the tower. I can record a song using a metronome to line up with machinery sounds. Machinery sounds get louder as we go up the tower.
- Unlock all the radio stations, the last station is a number station that tells you the key to the top room of the clocktower.
You begin the game in the n−1 floor of the clock tower. At the beginning of the game, a trap door locks shut above your head. Drat! Wait, what did I come down here for again? On the way down the tower, you see a preview of the puzzles you'll need to solve to get into floor n, which is the goal of the game. Once you get the trap door open, you remember: oh yeah! I was supposed to feed the cat! (Your cat that lives with you in the belfry.)
You identified 3 types of mushrooms, out of a possible 7. This qualifies you as a Noob Class Adventurer.
Player motivations
- It's just cool to see things and solve puzzles!
- Something is broken and you need to fix it
- You're looking for something specific but you can't quite remember what it is or why
- You have to feed your cat, who lives with you in the belfry.
Tower levels (puzzle maps)
Maybe each level when you unlock it emits a noise that feeds into the final music that plays when you unlock the top of the tower again? It might be a bit too complex for this jam but if there are multiple possible outcomes for each level, the final music could be different depending on how you played through it.
Makes me think of the Sound Stone in EarthBound (video).
Zelda-like jingle to let you know when you've solved a puzzle.
Combination lock (code from numbers station)
right box "Get radio" arrow -> box "Go to Snowy" "Mountain" arrow -> box "Tune to" "numbers" "station" arrow -> box "Enter" "numbers" "in lock"→ /pikchrshow
Instead of the combination lock being for your own door, have it unlock something out in the world (so it makes a little more sense why the combination would be being broadcast). Could be that that's what unlocks the cat food. (Didn't see ae7bb48989 when I wrote this.)
Gravel Pile
There is a useless pile of gravel here, the remains of some past construction project.
In a shady spot there is a plywood box with an incongruous and imposing combination lock on it.
>x box
Stenciled letters read
STRATEGIC CAT FOOD RESERVE
FOR EMERGENCY USE ONLY
>enter code
OR >enter 01342
OR >01342
OR >enter code in/on box
OR >enter code in/on lock
The combination lock opens, revealing the contents of the box: a bag of cat food.
>look
There is a useless pile of gravel here, the remains of some past construction project.
In a shady spot there is a plywood box with an incongruous and imposing combination lock on it.
There is a bag of cat food here.
>get the bag
The lock should make a beep-beep-beep noise when you enter a code.
>feed cat
Feeding the virtual cat makes you feel good IRL.
Door with no handle
You see a door with no handle. Maybe it opens from the inside?
> knock
With your knuckles you wrap out a catchy rhythm. Hey you should remember that one! Unfortunately it doesn't prompt movement from the other side of the door. On second thought, you have been in a bit of a creative dry spell lately.
> knock
You're not feeling very inspired.
You've got to get inspired by the world to come up with a truly unique beat, causing the denizen on the other side of the door to open it
Rushing rapids
The path takes you to some rushing rapids. You are momentarily mesmerized by the complex swirling patterns that the water makes as it climbs over itself to traverse the rocker river bed. And those sounds!
> listen
You pause for a moment to take in the full range of melodies offered by the rushing river. From the gentle undulations of the water at the edge of the river bank, to the mad, swirling chaos in the centre, nature's complex symphony brings tears to your eyes and you feel truly inspired.
> (go back to tower level)
> knock
You really get into it, using both knuckles, your elbows, the soft rustling of clothes, you lose yourself in your performance. Just as you're about to get carried away and use your head to evoke the sound of a snapping tree branch, the door is flung wide open. "Inspired!" yells the voice from inside and you hear a set of drums start to play, picking up where you left off.
The door to this level is now open and drums like the sound of violently rushing water emit from inside.
Maybe we could have two different possible points of inspiration, which produce slightly different messages and responses but both open the door.
Mirror
On this level there is just a mirror. It turns out to be a one-way window and you've got to dance?
On this floor you see a mirror.
> look at self
Looking good! It's always nice to do a fit check on the way out.
> bust a move
Ouch! You should really warm up first before attempting something like that.
Warm up and unlock at least one of the other musical levels before you can dance well enough.
> dance
You get caught up in the music. Whew! That was pretty good. You hear the clanking of dishes through the wall and sheepishly realize the creaking floorboards must have woken someone up. The delicate domestic sounds mingle nicely with the [list other unlocked levels] though.
Padlock
Pet door
You need to get some good smelling food and a cat with a key around its neck comes out (this almost reminds you of why you need to get up to the top). You take the key and use it to unlock the door on this level.
Bird level
You see a sleeping songbird perched out of reach across the stairwell. You can't wake or interact with it yet.
You need to get a cheerful little bird (maybe the one that likes wax cylinders?) and bring it to this level. The cheerful little bird's song wakes and inspires the songbird to chirp out a wonderful melody.
Maybe there's some tricky interaction with the cat level that you need to sort out. A cat and a bird create the potential for an unfortunate interaction. But it's okay—the bird is a hipster bird and the cat is a hep cat, so they get along.
Hint mushroom
Eating the mushroom takes you on a brief spirit quest where a cosmic rutabaga gives you a hint about one of the things you've not done yet.
- Not turned the radio on? Try turning it on.
- Not tuned the radio yet? Only one of the radio stations is useful to you.
- Not found the numbers station code? Read the back of the radio.
- Not solved the knock puzzle? Look to the river for inspiration.
- Maybe you should try meditating by the river.
Once you eat the mushroom, it's gone. If you want to see the other hints you have to play again.
Title
?