I'm not prepared to administer a public server right now, but there is an active thread for the game on the thinky-puzzle-games Discord server: https://discord.com/invite/eybtCDR
themsalltook
Creator of
Recent community posts
Nice, I've heard good things about Raylib. Leaf's Odyssey actually had a pretty short development time, starting in October 2023. I had initially set out with the goal of writing and releasing an entire game by the end of that month, and tried to keep the scope down to match, but one thing led to another, and it turned into a much larger project than anticipated.
In almost every way though, this project went just about perfectly - after I understood the true scope of the game, I had a clear and achievable deadline in May that helped me focus my efforts in the right direction. A wonderful group of playtesters helped me sort out the majority of issues before release, and a couple of them even used the editor to make fantastic custom puzzle campaigns, one of which I'm still in the middle of solving. The post-release updates I've been doing have been a labor of love, and an interesting case of getting to experience my own game as if I'm a new player - by playing puzzles made by other people, I'm seeing firsthand which quality of life improvements would make the most impact, and I'm motivated to implement them to improve my own experience so that everyone else's experience can get better at the same time.
Hope you enjoy the game, and I'm looking forward to playing your puzzles!
Yup! It's written in C with a homebuilt framework, which allowed me to do a lot of interesting things with data efficiency.
Some relevant history: Long ago, I used to write games for the Macintosh by using system APIs directly. In 2009, after copying code from project to project a few times for stuff like window creation and event handling, and desiring to be able to support other platforms, I decided it would make more sense to package up the code I had been copying around into a set of libraries, each of which would encapsulate a specific set of functionality, and I could pull in the relevant ones for each project I was working on without making a mess. I named this collection of libraries "Stem", and everything I wrote from then on used it as the foundation to build upon, gradually expanding the Stem framework as needs arose.
Sometime around 2021, I started working on a suite of productivity applications that acted as a companion to Stem (while also being built with it), which consisted of a bitmap graphic editor, an audio synthesizer, and a 3D modeler. When I wrote Throw Rock in 2022, I used these tools for asset creation, and then a more mature iteration of them was used for Leaf's Odyssey. The main reason Leaf's Odyssey is so small on disk is because there's no sampled audio in it at all - everything you hear is synthesized at runtime from very compact configuration files. All of the graphics are packed into one PNG file, which is used as a texture atlas with a supplemental index of rectangles for every sprite in the game. The title screen graphic was made with my 3D modeler, though instead of including the entire scene, it's actually just a 480x270 render packed into the main texture atlas.
All of these libraries and tools are open source, though I haven't yet put in the effort to make them easily buildable without specialized knowledge; however, if you just want to browse some code, you can find the relevant sections of my WebSVN repository here: https://ludobloom.com/svn/StemLibProjects/ https://ludobloom.com/svn/Tools/
I'm pretty happy with how all of this turned out. Having full control over every part of the process means I don't have to compromise on anything; if there's a bug at any level of the program, I can fix it myself instead of having to convince a third-party vendor to do it for me, and if I want to do something unconventional, I have the freedom to insert it into whatever part of the pipeline is most appropriate, or build something entirely new to do what I want. Since the tools I've written use the same framework as the game, I can continue to run them on every platform and setup relevant to what I use them for.
I would estimate that the amount of system APIs and paradigms I've had to learn to get this all to work is roughly comparable to what it would take to master a typical pre-built game engine, and the benefits I get from it are quite substantial. C happens to be my favorite programming language, and it's perfectly suited to this task. I wouldn't necessarily recommend this approach to other game developers since it takes a specific kind of dedication, but if this fits your style, you're probably not shopping around for that type of recommendation in the first place. That said, I would love to see more software written in this way, and would encourage everyone to at least give it a try and see if it works for you!
Update: Hotfix version 1.0.10r2 changes:
- Fixed a crash caused by opening waypoint menu after the room containing an active waypoint has been deleted
- Fixed graphical issues that could occur in rooms with more than 100 monsters
- Fixed ladders not showing their one-way warning correctly in rare circumstances
- "Play this room again" now uses the most recently recorded replay to determine room state and starting position, instead of the least recently recorded one
- Undoing a change in the editor now restores the room's internal revision number to what it was before the change was made. The revision number determines whether the room gets automatically reset when loading a save in the middle of the room, so this means that making and undoing changes will no longer cause mid-room saves to get reset when no changes were ultimately made.
Aha, I see it now - I didn't notice in the minimap screenshot, but there's actually a column of pit tiles in the room at (-1, 0, -1) between the two rooms. Subtle enough not to notice, but it's separating the two by a tile. Just gotta shift everything over to the right a bit and the two rooms should connect properly!
Whoa, weird! I've replicated the relevant parts of the layout based on that minimap screenshot, and the rooms connect as expected for me. There shouldn't be anything extra required, so I wonder if something subtle is causing a logic bug somewhere. Could you send me the world file? If you don't have an easy place to host it, feel free to upload it using this world submission form (if you put your username here as the e-mail address, I'll know it's in reference to this thread; the process isn't automated, so the world won't actually get published right away): https://ludobloom.com/leafsodyssey_worldupload.html
I've created a webpage for hosting user-made worlds. You can find more puzzles to play here: https://ludobloom.com/leafsodyssey_worlds.html
If you've made a world of your own and want to submit it for listing, there's an upload form linked from that page. I'm hoping to eventually integrate this directly into the game so that you won't have to do the extra import/export step and can simply see the listing and choose one to play, but for now this at least collects all of the existing custom worlds in one place.
Have fun!
- Fixed incorrect audio playback when reenabling music after changing zones while music was disabled
- Fixed inverted joystick vertical directions on Steam Deck
- Fixed incorrect game resume state (potentially resulting in a crash) after deleting a player profile
- Fixed incorrect fullscreen state at startup on some Linux distributions
- Fixed journal control getting unbound under some circumstances
- Fixed stale information being shown when advancing turns with a mouseover active, and mouse cursor set not to hide on input
- Fixed being able to input moves while showing room initial state
- Fixed minor sprite layering errors with the north edges of walls
- Fixed incorrect traversibility behavior on some elevated surfaces
- Fixed edge cases where statues would not correctly leave rubble when killed
- Fixed edge cases where music would not correctly resume playing
- "Player Start Position" is no longer shown when inspecting the start tile in a world
- Monster sightlines are now drawn in a different color if the monster is at a different elevation than the player
- Added a small marker to the corner of the journal showing where to click to go back to the top-level monster list
- Added a journal entry for statue becoming a stepping stone in water
- Tower of Destiny room changes:
- Watering Hole: Exchanged position of toggle door and trapdoor to enforce solution
- Remains: Added an extra obstacle to prevent a dead-end solution path
Hey, this was fun! I really like how small the possibility space is while still having interesting things to think about. A couple of my solves happened by accident, but that's fine. Exploring the graph of "this and this are valid moves, which then leads to a state where this and this are valid moves" was quite enjoyable.
Minor control setting stuff and a few very small level tweaks based on feedback. There's an option now to disable the behavior of starting a throw at the same time as picking up a rock, and a scroll in the intro level to let players know how to get to the settings menu. A lot of people didn't discover right away that there was a menu at all!
Whoa, this is a trip. I had a lot of trouble understanding how to accomplish anything at first, but things made more sense once I finished blundering my way past level 3.
One persistent issue I was having was that every time I'd click a hook to change my rotation, it would instantly jump to a different orientation, and I didn't have much success building up a mental model to know where that would be - in pretty much all cases, I wanted to make a relative adjustment from where the hook was currently rotated, so I think a different control scheme (for example, click and drag vertically to adjust relative to the current rotation) could have given me a smoother experience. Still, I got through the first 10 levels and had a pretty good time.