Categories
Game Development Marketing/Business Personal Development Politics/Government

The Mixed Bag of 2025 & Planning 2026

Despite making a note to myself to do so, I didn’t spend as much time in December reviewing the past year and planning the next year, which is why my new year post is so late into the new year.

Last year, I set the following actionable goals for 2025:

  • Publish at least 1 free game by June 30th
  • Publish major Toytles:Leaf Raking quality improvement update (including demo) by December 31st

I also had the following aspirations (that is, goals I didn’t have control over so I don’t call them goals):

  • Earn 2 sales per month (+24 sales) by December 31st
  • Increase newsletter subscribers by 1 per month (+12) by December 31st

How did it go?

My Goals

Published Freshly Squeezed Entertainment Game – DONE

I did it! You can play my second Freshly Squeezed Entertainment project Clown Alley Creator, a family-friendly creativity tool for creating your own fun and zany clowns!

Well, technically it wasn’t done by June 30th. It was published on July 5th.

But I will count it as a win because the game was ready to be published, and I had to wait for reviewers at a couple of app stores. Next time, I should anticipate that kind of lead time.

What was intended to be a six month project took about nine months, from initial design to publication.

Why the difference? Well, I will create a post-mortem for the project soon, and I’ll share what lessons I’ve learned then.

But for now, I will say that I was fairly happy with how the project progressed, and it seemed well-received by players.

Published Toytles: Leaf Raking update and demo – NOT DONE

Toytles: Leaf Raking is my current flagship title, originally published in 2016.

Which means that 2026 is going to be its 10 year anniversary!

As I said multiple times last year, I wanted to celebrate by updating it with better visuals, audio, and game play. I started to call it a Major Update(tm).

After I finished Clown Alley Creator, I spent time trying to promote it, and I didn’t get started on Toytles: Leaf Raking right away.

In fact, I felt a bit unfocused, and it took me many weeks to get back into my game development routine.

When I finally had a new plan, it coincided with getting into the end of the year holidays, a notoriously unproductive time. I decided to set my sights a bit lower to at least have a significant internal update.

So before the end of the year, I wanted to release a new version of Toytles: Leaf Raking that should otherwise look and feel the same, but it will have an upgrade of libSDL from v2 to v3. I use libSDL as a cross-platform library that lets me make my games and have them play on many platforms. It is how all of my games currently support desktop and mobile across five operating systems without requiring a lot of effort to support it.

Most of the porting work was relatively easy thanks to the fairly well-written libSDL migration guide, and I had the game running with libSDL3 fairly quickly.

Well, without audio.

I used the audio management library libSDL_mixer for my audio, and the change to libSDL3 meant that libSDL_mixer was completely overhauled, which meant that my own code needed to be overhauled when it came to audio.

Between not putting in many hours of work into it and not having a clean design for the new audio code, I floundered, and the end of the year came and went without a new Toytles: Leaf Raking release.

My Aspirational Outcomes

Earn at least 2 sales per month by December 31st (Target: 24) – 9

I definitely fell short here, and it was mainly because I didn’t have much of a promotion strategy. I didn’t want to do a bunch of random social media posts or pay for ads without those tactics being grounded in something bigger.

In fact, early in the year I had planned to create a free booklet about games and online safety, but I switched focus and spent time trying to figure out what that bigger promotion strategy would be. I didn’t expect to find a universal perfect solution (or else everyone would already be doing it), but I did want to have something to inform the tactics I might employ.

For instance, if I wanted to establish GBGames as an expert for parents who care about privacy and ensuring that their kids are not bombarded with invasive advertising, perhaps that means I focus a lot on writing for that audience. Maybe I still create that free booklet, but now I have much better idea of what I am trying to accomplish with that booklet.

But as usual, I found myself focusing most of my available time on game development. Even when I did finish Clown Alley Creator, I spent most of my promotion time creating social media posts and sending out press releases for the next couple of months.

What’s kind of annoying is that most of those 9 sales of Toytles: Leaf Raking most likely can’t be attributed directly to my own efforts. It turned out a somewhat viral incremental game about raking leaves was released, and coinciding with its release was a spike in traffic and a few purchases of my game.

That’s right. I probably can’t even feel good about the low sales numbers I did get.

I mean, I’ll take the sales, and to be fair, I kept the game alive and working all these years to be available for those customers, but I don’t want to hope I get lucky that something like this will happen again and frequently enough to earn any significant amount of money.

GBGames Curiosities Newsletter subscribers net increase (Target: 12) — net 2

I gained 3 subscribers and lost one of them for a net gain of 2 new newsletter subscribers. Positive numbers are good, but it is still a very low number compared to where I wanted to be.

Once again, my lack of promotion is primarily the problem. However, there was a technical problem that I didn’t know about for months that could have also impacted things.

See, my Freshly Squeezed Entertainment line of games is part of my product development strategy.

The general idea is to quickly create relatively polished prototypes as complete playable experiences, release them for free to make it easier for them to find an audience, and hope that if enough people love them that they’ll be willing to sign up for the newsletter and give me feedback, and if enough people really love a particular game, I can then decide to make a “deluxe” version for sale with the expectation that I’ll have an audience already willing to pay for it.

And you know what? After Clown Alley Creator was released, I could see that people were visiting the newsletter sign-up form on my website from the game.

Now to be clear, I do NOT track anyone’s data in my games. I don’t want to do anything creepy like that, no matter how normalized it is in the industry as a whole.

But my website does track visitors the way almost any website does, and so the links in my games append a little information to the URL to let me know what game is sending the traffic, for instance.

And I can see that I got hundreds of visitors from Clown Alley Creator whereas I got way, way fewer visitors from my first Freshly Squeezed Entertainment, Toy Factory Fixer.

Unfortunately, it wasn’t translating into people actually signing up. I chalked it up to perhaps not offering a strong enough incentive to do so. Ah, well. Maybe the next game might do even better.

But then near the end of the year, I was checking some very, very old messages somewhere, most of which were spam (which is why I never check them), when I saw one person in August said that my newsletter signup form was broken.

And sure enough, it was!

I fixed it (it turned out that I had the same MailChimp signup form for many years and for some reason it stopped working relatively recently, but creating a new signup form seemed to do the trick), but it does mean I had months in which potential visitors interested in signing up for my newsletter couldn’t!

So I’m hoping that people continue to play the game and visit the site over the next few months, and with the working signup forms, I’m hoping that I get way more than 2 signups.

Speaking of, do YOU want to signup for the free GBGames Curiosities newsletter? You get free Player’s Guides to my existing and future games for free!

Analysis

I successfully worked my plan and got a third game published. I feel confident that I can do it again in a similar amount of time, and I think I learned some things about managing the project and prioritization that should help me deliver games faster.

I did not, however, get a major update for Toytles: Leaf Raking out. I didn’t even get a minor update out, unless you count the update I did to comply with ever-changing app store requirements, which I don’t. The libSDL3 update started out well, but it feels bad that I somehow spent a couple of months of calendar time and still didn’t get the audio part finished.

Despite tracking time for promotion, I am not sure how much good it did. Most of my early effort wasn’t actually DOING promotion so much as figuring out a strategy, and later when I was actively trying to promote Clown Alley Creator, I started to wonder just how impactful it was to spend time on my daily social media posting and sending out press releases.

But Clown Alley Creator seemed to be one of my more popular games, and it seems like people are playing it. Too bad I was oblivious to my mailing list signup form being broken for months to take advantage of the people potentially interested in signing up for it.

In the time between working on Clown Alley Creator and working on Toytles: Leaf Raking, I found myself updating all of my games for compliance with app stores before a deadline, which took some time away that I didn’t anticipate. I somehow need to find a way to be more productive AND allow for slack in my schedule to allow me to attend to things like this.

Also during that time, I found myself a bit knocked off course. I was steadily working on Clown Alley Creator, with a daily habit that often added up to 5-15 hour weeks, and then when I was done working on it, I felt like I didn’t know what to do without my regular development work there to keep me focused. Even when I had a list, and I knew what I could be working on, whether related to promotion or planning the next project, I just didn’t seem to be able to do so.

It was somewhat of an unplanned hiatus, one in which I felt like I should be doing something but wasn’t. I think the lesson is that I need to plan some deliberate downtime for the end of a project. I once had a very intense month-long project that took me months to recover enough to work on the next project, so maybe this isn’t a new insight. But I need the break, I need to recharge, and I need to make sure I am purposeful about it.

I have found that I can do the work indefinitely after I set myself on a particular trajectory. That is, after doing the hard work of planning, I can work the plan. I can even adapt the plan, sometimes significantly, and still continue on.

But momentum changes seem to be challenging for me, even if ostensibly the day to day should be the same. Switching from one project to another, I went from being slow and steady and consistent to just being slow and inconsistent.

It would be one thing if I can claim that the reason I was struggling was that I was bored of the older project or didn’t find it compelling, but I don’t think either of those statements are true. I’m pretty excited about the new Toytles: Leaf Raking updates, in fact.

What might impact things is that the country I live in has had a very, very rapid slide towards authoritarianism in the last year, so maybe my struggle comes more from struggling to justify my time working on games when I could be doing something to connect with my neighbors and friends more often.

Some numbers

I spent 252 hours on game development, at least 100 fewer hours than each of the last couple of years.

For comparison, a full-time developer working 40-hour weeks would have accomplished the same thing in 1.5 months.

I’ll try not to think about those numbers too hard.

I did 34.75 hours of writing and published 51 blog posts and 11 newsletters.

I did 1.75 hours of video development and published 0 videos, unless you count the trailers I created for Clown Alley Creator. I just didn’t focus on video creation at all.

I spent 67.50 hours on promotion efforts. I sent out a press release to 95 outlets and content creators over the course of four months. Most of them never replied or reported anything that I am aware of. I didn’t track how many published social media posts I created.

I earned less than $25, most of which I won’t see until this year due to how the app stores don’t pay out until a month or two after the sale.

I spent almost $4,000, about twice as much as last year, but most of the cost is due to getting myself a new computer to replace my main machine that I’ve had for over 10 years, plus getting a new LED printer to replace the one that used to complain about the ink not being legitimate even if it was.

These numbers are obviously not very sustainable.

As for personal goals, I think I am doing a good job maintaining a healthy-ish body.

I kept up my walking routine from the previous year, and I walked a total of 62 hours. Aside from a couple of instances when my lower back was bothering me slightly, I found my morning stretching routine seemed to keep me in fit enough shape to handle day to day life.

In fact, a few times I found that I was able to shovel snow or even carry heavy logs to help my wife’s family when they were cutting down trees, and I felt great afterwards.

While the last half of 2024 ended with me not doing any push-ups due to my wrist hurting, I started the year at 5 push-ups a day and then a couple of weeks later I was doing 10 push-ups a day. I think I intended to eventually go to 20 or more push-ups per day, but I decided not to push it, and I ended up doing them almost every day. I ended the year with 3,500 push-ups total.

Similarly, I had started doing squats again after not doing them for a long time, and I ended the year with 3,500 squats as well.

I had a goal to lose some significant weight, and while I lost a couple of pounds, my weight was fairly stable throughout the year. I suppose that’s better than losing a bunch and gaining everything back?

I read a total of 62 books, of which 31 were audiobooks. Some favorites include:

  • Feeding the Machine by James Muldoon, Mark Graham, and Callum Cant
  • Let This Radicalize You by Kelly Hayes and Mariame Kaba
  • Poisoning the Well: How Forever Chemicals Contaminated America by Sharon Udasin and Rachel Frazen
  • The Splendid and the Vile by Erik Larson
  • Her Fearful Symmetry by Audrey Niffenegger
  • The Field Guide to Citizen Science by Catherine Hoffman and Caren Cooper
  • The Last Archer by S. D. Smith
  • Don’t Talk About Politics by Sarah Stein Lubrano
  • The Age of Surveillance Capitalism by Shoshana Zuboff
  • The Extended Mind by Annie Murphy Paul
  • Subtract by Leidy Klotz
  • How Big Things Get Done by Bent Flyvbjerg and Dan Gardner
  • Recursion by Blake Crouch
  • Tears in Rain by Rosa Montero

As for games, please realize that I almost never find myself playing new games. I don’t tend to let myself play games that often, especially when I am barely making the games I want to make, so if I do play games, it is usually a game in my existing collection.

I played quite a bit of eFootball early on. I enjoyed it, especially if I ignore all of the weird card collecting things and just focused on playing games against the CPU to get my soccer fix. Unfortunately, at some point I found the somewhat consistent crash bug on the main menu to be too annoying for me to bother fighting past, and I uninstalled it from my Steam Deck. I am still looking for a good soccer game, and I’m a bit turned off from free-to-play monetization. I have my eye on getting Pixel Cup Soccer one day, but I am going to miss the high fidelity of eFootball.

I also played games on the PlayDate, such as Pick Pack Pup, Shadowgate PD, Tiny Turnip, and Battleship Godios. I really enjoyed both Saturday Edition and The Whiteout. Blippo+ was an obsession for a hot minute.

Since I built a new, more powerful desktop computer, I played Kerbal Space Program and found myself periodically checking on the status of Kitten Space Agency, the spiritual successor that is currently in pre-alpha.

I finally got around to playing Monaco: What’s Yours Is Mine, and I love the atmosphere and heist tropes.

After reading Recursion by Blake Crouch, I read another one of his books, Run. It is gruesome and harrowing…and it made me want to play Overland. I remember not doing so great the last time I played it years ago, but this time I managed to get pretty far before accidentally losing my dog and another member of my party to a weird teleporting thingie and suddenly finding my party surrounded by monsters.

I was listening to the audiobook The Stardust Grail by Yume Kitasei at the end of the year (it was the 2nd book I finished in 2026, and it will be a highlight then), and someone had just gifted me the game Outer Wilds, and I couldn’t have asked for a better pairing. My very first attempt as space travel in Outer Wilds didn’t go so well. I was so used to Kerbal Space Program’s relatively realistic rocketry that the more arcade-y space travel in Outer Wilds meant that I didn’t realize how close everything was. While I was trying to get my bearings and figure out how to fly towards one of the other planets, I noticed some reentry burn around the edges of the screen, and I turned around just in time to discover and flown directly into the sun. Whoops.

But the game I have been telling everyone about since I got it? Dice the Demiurge, the single-player incremental dice game. I love this game. It’s compelling, it does neat things with a wide variety of dice, it’s funny, and it has a lot of variety. It even has some demands on the real world that I really like.

I found myself playing one session of Dice the Demiurge each day, which allowed me to take just a few minutes to get some game play in with a game that was rich and engaging. I fell behind during the holidays, so I’ve been playing multiple sessions each day to try to catch up.

Goals for 2026

My goals for 2026 are very similar to the goals I had for 2025:

  • Publish major Toytles:Leaf Raking quality improvement update (including demo) by December June 30th
  • Publish at least 1 free game by December 31st

Both of these goals boil down to development/production goals with a definite output.

What I want to do is figure out at least one more goal that is focused on promotion that would similarly have an output I can control.

Unfortunately, I’m now weeks into the new year, and while I feel like I’ve got a better handle on what a promotion strategy might involve, I’m frustrated that I don’t something more solid in place despite spending a lot of time last year on trying to figure this out.

Most of the advice out there is probably fine if you are trying to make a big splash upon launch of a new game on Steam or if you are monetizing people’s attention on mobile with ads or in-app purchases. Based on the sheer amount of discussion related to this kind of hit-driven business, you’d think that it was the only way people know how to run a game development business.

I’m fine with slowly growing an audience who appreciates entertainment that doesn’t come with strings attached, that likes their privacy and doesn’t like feeling worried about whether they can trust their games. I want to make games for families who can feel peace of mind that my games are not spying on them, selling their data, or trying to convince their kids that maybe fascism and white supremacy is fine actually. I want to make games that encourage the player to be curious and to support their creativity.

So it sounds easy: I just need to talk more about the kinds of things that this kind of audience would care for.

I look forward to figuring out the how.

Happy New Year!

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Real World Influence?

Last time, I reported that I was making very slow progress on migrating my code to SDL3, specifically SDL3_mixer, for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

It has been another slow couple of weeks since then.

Sprints 2025-MJ_8 and 2025-MJ_9: Preproduction
In progress:

  • Update SDL2 to SDL3

I didn’t give an update last week because I didn’t have much to say. I don’t have terribly much to say this time either, as I once again hadn’t put in many hours, but I am sketching out ideas for how the game could be improved and enhanced.

One thing I might try to do is borrow some ideas from a game I’ve been obsessed with recently. Dice the Demiurge is an incremental dice game for one player by Sophie Houlden, the creator of Sophie’s Dice.

One thing that I love about Dice the Demiurge is that it sometimes encourages you to do things in the real world. For instance, if you choose to play as a Mage, you can gain a bonus level by spending time each day for a week learning a new language. I’m currently on my third world and have chosen to play as a Rogue, and I’m currently looking for opportunities to gain a bonus level doing…rogue-ish things.

Some of the real world things you can do are more intimidating than others. Early on, I also gained a permanent Notion 1d18 by singing in the shower after finding the Wandering Emporium, but I could also gain a dice pool by giving up on something unfulfilling, which is a surprisingly big thing to try to fulfill.

Anyway, this game has a lot of such mechanics based on you doing something in the real world, and as it is a single-player game, it’s obviously enforced by your own honor system.

But I wondered if there was something that Toytles: Leaf Raking could encourage the player to do in the real world that would fit the theme of the game, such as offering to help a neighbor with a chore, or saving money for a big purchase, or making plans for the week based on checking the weather forecast.

Would a single-player leaf-raking business simulation have enough players with an honor system to only give themselves a bonus in the game when they do the actual real-world action? It might be worth a try.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: The Counterintuitive Holiday Slowdown

In my last report, I was still migrating my code to SDL3, specifically SDL3_mixer, for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

Despite having time off from the day job, I got less done this week than normal.

Sprint 2025-MJ_7: Preproduction

In progress:

  • Update SDL2 to SDL3

The holidays are always strange in terms of predicting how productive I will be.

Having time off from the day job doesn’t always translate into having more time to work on my business. Family activities and preparations for big visits naturally dominate.

Even when I do find myself with “idle” time, I might be exhausted. I think I napped more in the last week than I have in most months!

Some forward progress is better than none, of course, and I always manage to do something. I was updating code to use my new MixTrackManager that I mentioned last week, and a few more hours should be enough for me to finally finish this migration work.

And of course, last Friday kicked off the itch.io Black Friday sale which I am participating in, although I wish I had been more deliberate and prepared for it.

While I work on updating Toytles: Leaf Raking, you can get it now and ensure that you’ll get those updates for free in the future, when I will likely raise my prices!

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Games Marketing/Business

Announcing the Black Friday Creator Day 2025 and Reverse Sale

From now until December 4th, you can get my leaf-raking business simulation game, Toytles: Leaf Raking for Windows, Mac, and Linux and pay 50% more than usual. And you can pay-what-you-want for my toy factory worker management game Toy Factory Fixer.

In either case, if you are going to do so, please do so today!

Toytles: Leaf Raking

The indie-friendly platform itch.io is having another Creator Day, so for the next 24 hours, they won’t take a cut of any sales that occur. That means the creators get to keep more of the proceeds.

While many developers are having a sale to celebrate, and you should definitely check them out, I’m holding a reverse sale instead.

I think the game’s original price is more than generous, and a temporary increase still puts it under the cost for a movie ticket or a monthly subscription to a streaming service.

Also, you can get my first Freshly Squeezed Game, the turn-based toy factory management game Toy Factory Fixer, at itch.io. Pay what you want for it (even $0!), and Creator Day, I will be able to keep the full amount of anything you contribute.

And you can also get my second Freshly Squeezed Game, a creativity tool to create your own fun and zany clowns, Clown Alley Creator. As before, pay what you want for it (even $0!), and for today only, I will be able to keep the full amount of anything you contribute.

If you do end up paying for access to Toytles: Leaf Raking or Toy Factory Fixer or Clown Alley Creator, know that I appreciate it, and I appreciate all of the itch.io creators who make itch.io amazing!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Managing Mixer Tracks

Last time, I reported that I was still migrating my code to SDL3, specifically SDL3_mixer, for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

Alas, I am still, STILL working on it.

Sprint 2025-MJ_6: Preproduction

In progress:

  • Update SDL2 to SDL3

Again, the main migration work that I have left is audio-related. To make things easier, I decided to create a MixTrackManager to manage my MIX_Track objects.

Basically, when I initialize my game, I will also configure a set of tracks, grouped by name.

For example, I might have one track for all user interface sound effects. Every button click and swooshing transition will likely play on its own. That is, if you clicked a button, you couldn’t have clicked a second button simultaneously, so won’t need a second track to play both sounds. One track will work just fine for “UI” sounds.

However, maybe there will be lightning crashes, the sound of rain hitting a roof, and the sound of wind. All of these might be “ambient” sounds that could play together, so I should have at least as many tracks available.

SDL_mixer lets you tag tracks, but the main use is to treat a bunch of tracks that are so-tagged as a collective group of tracks to play at once, for instance.

What I want is to be able to say “Play this sound effect on the first available track in the ‘ambient’ tracks”, and hence the MixTrackManager.

The old SDL_mixer just let me specify -1 as the channel to play on, and it would play on the first available channel rather than require me to specify a specific channel. I wanted to have something similar while also retaining the ability to have separate sets of tracks for different purposes.

So MixTrackManager allows me to create a set of tracks for a given tag, but I use my tags differently from how SDL_mixer is using them.

But maybe calling them “tags” even though the purpose is to just name a set of tracks (and even as I use that name to use SDL_mixer’s tagging functionality, too) is confusing things.

I might consider renaming things, but the functionality it will allow is the key: I will be able to play audio more or less the way I did before.

It’s taking me a long time to get to this point, and frankly I am not sure why exactly it has taken me so long, but I’m almost there.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Fixing Tests and Designing SDL_mixer Usage

In my last report, I continued migrating my code to SDL3 for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

And once again, I continued the work.

Sprint 2025-MJ_5: Preproduction

In progress:

  • Update SDL2 to SDL3

I realized at one point that my unit tests were not running after a build for GBLib, which is my non-game-specific infrastructure code that all of my games make use of. Framework might be too heavy and formal a word to describe it. Anyway, I must have disabled it in the past while attempting to change something unrelated.

I have tests for my game and for GBLib. Normally, after my code builds, the build system will run the tests automatically.

I probably should have thought this migration work was too easy when I noticed that I didn’t have to make changes to my unit tests to keep things passing.

Once I turned the tests back on, I saw a bunch of errors, so I spent time updating my unit tests to more closely match my updated SDL3-based code.

By the end of the week, I was starting to test-drive changes to my audio-related GBLib code. Like the previous week, a good chunk of this effort was spent figuring out what I wanted my code to do to manage audio. Again, SDL_mixer is completely different than it was. It’s not a matter of merely updating some function names or parameters.

I’m disappointed that I ended the week without finishing this migration work yet again, but the main work left in this effort is audio-related, and I did prove that I can now play audio with part of an update to GBLib when I did a one-off test on the main menu in which I played a piece of audio when I clicked on the screen.

Managing tracks isn’t something I had to worry about before, and I’m making sure my games have the tools available to manage them in a way that is flexible and easy.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Almost Done Upgrading to SDL3

Last time, I reported that I was still working on migrating my code to SDL3 for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

I continued the work this past week.

Sprint 2025-MJ_4: Preproduction

In progress:

  • Update SDL2 to SDL3

At some point, I finally fixed the last compile error, and I was able to run the game, and I was surprised at how well it Just Worked(tm).

Well, I found an issue with the mouse cursor not being where I expect it to be if I change the size of the window. I’ll figure this issue out later, but I suspect it has to do with the game being at a “logical” set of dimensions but scaling the rendering without scaling the mouse cursor’s position.

And I also don’t have text and audio.

Toytles: Leaf Raking - running but without text

Toytles: Leaf Raking - running but without text

I am using the library NFont, and it hasn’t been updated in years, which means it doesn’t have an SDL3 update yet.

So I commented the use of the library out of my code, which explains why there is no text rendering to the screen.

And the audio is missing because SDL_mixer is so different from before that I have to figure out how to change my code to use it.

Within a day, though, I got text back. Originally I thought I would just remove NFont and try to use SDL_ttf directly, but instead I did the work to migrate NFont to SDL3 myself.

Toytles: Leaf Raking with text again

I even submitted a pull request for my changes to NFont in case the library does get updated one day.

Which just leaves SDL_mixer updates. So far I am initializing it with MIX_Init() and creating a Mixer object, but I am also no longer initializing it the way I did before with a frequency, number of channels, and chunk size.

I know I need to load sound effects and music into SDL_Audio objects, and I know that to play them that they should be set to Tracks.

What was nice about SDL_mixer v2 was that if I wanted to play on an open channel and not care about the particular channel I played a sound on, I could just use a channel ID of -1. It is possible to play and SDL_Audio file once, and it will be assigned to an internal track, but it doesn’t let me set the audio to loop or do any other effects I might want, so the fire-and-forget option isn’t ideal.

So I’m trying to figure out if there is a mechanism to do something similar with SDL_mixer v3, or if there is a better approach to playing sounds on tracks.

But I expect I’ll have sound effects implemented soon, and then I just have to fix a few issues like that mouse cursor issue I mentioned above, and then I’ll have Toytles: Leaf Raking running with SDL3.

And then the real update work can start.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: (Still) Upgrading to SDL3

In my last update, I said I was working on migrating my code from libSDL2 to libSDL3 for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

I continued the work this past week.

Sprint 2025-MJ_3: Preproduction

In progress:

  • Update SDL2 to SDL3

Toytles: Leaf Raking

I’ve modified almost 2,000 lines of build scripts and code so far. Most of them are renames of existing functions that didn’t change much, but some of them involved a bit more work.

For example, SDL_mixer is completely different, which means that my code now needs to be changed to create a mixer, then create tracks. Before I just had channels to worry about.

It looks like instead of getting one music track and a bunch of sound effects the way SDL_mixer provided before, I can mix and match multiple music and sound effects in a more unified way. So it will be nice when it all comes together.

Porting can be tedious, but it has been helpful to go through it step by step and see how this migration will directly impact things.

And there is a light at the end of the tunnel as the list of compiler errors is now fitting on a single screen.

So I’m almost done, but I’m not done yet, and these are the days when I wish I was able to dedicate full-time effort to the work.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Upgrading to SDL3

Last time, I reported that I had started working on my first sprint for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

This past week I started the work of migrating my code from libSDL2 to libSDL3.

Sprint 2025-MJ_2: Preproduction

In progress:

  • Update SDL2 to SDL3

Toytles: Leaf Raking

Technically, this work started in the previous sprint, but it was a very short sprint that started near the end of the week.

Also, this is a somewhat technical update.

Years ago, I wrote an abstraction over my usage of SDL2. SDL3 is a major change from SDL2, but I anticipated that the impact should be isolated to a few files that directly reference SDL2.

Even so, I’m finding that while many variables, constants, and functions are merely renamed, there are some areas in which SDL3 changed how it does things, or at least there is enough change that it requires me to spend time digging into it to determine if the changes are relevant to what I am trying to do.

For instance, the SDL2 to SDL3 Migration Guide mentions that “SDL_WINDOW_FULLSCREEN_DESKTOP has been removed” and that “Windows now have an explicit fullscreen mode that is set, using SDL_SetWindowFullscreenMode()” which makes it sound like I can’t do what I did in SDL2, which is use SDL_CreateWindow() for either fullscreen or resizable windows.

But when I looked into it, SDL_CreateWindow() still lets me pass in a SDL_WINDOW_FULLSCREEN flag. Creating a fullscreen window is still fine, but the way to set an existing window as fullscreen is different…something I never do in my code, so I don’t have to worry about handling this change in my own code.

It’s a little tedious, but the migration guide is very helpful, and the error codes are incredibly helpful:

include/SDL3/SDL_oldnames.h:1168:26: error: ‘SDL_RendererFlip_renamed_SDL_FlipMode’ does not name a type
 1168 | #define SDL_RendererFlip SDL_RendererFlip_renamed_SDL_FlipMode

That’s very thoughtful of the SDL3 developers!

And it also gives me an opportunity to look through some of my oldest parts of my code to see if there is anything I can also cleanup.

My hope is that I can get this migration work accomplished quickly early this week, and then I can make sure that the game still runs the same as before. Then I can start the work of updating the game itself.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Logos and Infrastructure

In my last report, I was concerned about how much work I identified for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

Last week, I put together an initial roadmap and started work on the first sprint.

Sprint 2025-MJ_1: Preproduction

In progress:

  • Update SDL2 to SDL3

Early in the week, I started looking into fun fonts to use for a new logo for the game.

The current logo, if you can call it that, is pretty simple and uninteresting:

Toytles: Leaf Raking old simplistic logo

So early in the week I started looking into fun fonts to use for a new log for the game.

I found quite a few, fell in love with one, then had to abandon it when it turned out that the font in question required me to pay a license fee for use in a logo for a limited number of uses.

So I found a few others and found that I can love a different font. Here’s an initial stylized logo that I really like:

Toytles: Leaf Raking new logo prototype

I toyed a bit with the kerning and outline, and a colleague added some iconography that showed some potential. Basically, don’t expect it to be the finished logo.

At the same time, though, I got really excited about the project upon seeing it. I think in the future I will spend time making a nice logo early in development of any new projects.

Later in the week, I set to work to finally update libSDL2 to libSDL3. I anticipate it might be tedious work, but I hope it isn’t going to require major surgery on my game’s code.

Thanks for reading, and stay curious!

Want to learn about future Freshly Squeezed games I am creating? Sign up for the GBGames Curiosities newsletter, and download the full color Player’s Guides to my existing and future games for free!