Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Universal Mac Builds and CMake

Last time, I reported that I was working on automating the release builds for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

Due to other priorities taking up my time, this effort is still ongoing, and for much longer than I would like.

Sprints 2026-MJ_5 and 2026-MJ_6: Release SDL3 update version

In progress:

  • Ensure Mac version can still be built/deployed

Toytles: Leaf Raking

To recap, back in October, I started the work of updating Toytles: Leaf Raking from libSDL2 to libSDL3. I had expected that it might take me a week or two at most, assuming I could put in the hours.

It was mostly straightforward and quick to do except for when it came to dealing with libSDL3_mixer, which was significantly different enough from libSDL2_mixer in design that it required some rearchitecting of my own code.

I spent weeks of calendar time on that effort, even though it only represented a handful of hours of game development in all of December, and I finally finished at the end of January.

Next was putting out a new release on every platform that I support. Linux was easy, as I do my development there, and the scripts I use to make a release are mostly the same.

The Windows port took a couple of weeks, although it represented again only a handful of hours of effort, and most of this effort was trying to make sure that the next time I want to cut a release will be automatic and fast.

And here I am, still working on the Mac port, and the story is similar. In the last couple of weeks, I put in only a little more than 5 hours of game development time in. Which is too bad, because I really needed to put some time in to solve this one.

Warning: the following gets a bit technical.

Basically, to release a Mac build, I want to make sure my game supports both Intel-based Macs and the Apple Silicon-based Macs. Apple provides a way to do so with the so-called “fat” binary, or Universal Binary. Basically, it’s one application that can run on either one of the hardware options without the player needing to worry about it.

Of course, to build it that way, you need to explicitly configure the build to support both architectures.

Last time, I did so by manually building libSDL2 and my game on my Intel-based Mac Mini, then copying the binaries to my Mac in Cloud instance of an M1-based Mac, building new libraries there, then using lipo to combine the libraries into a Universal Binary version, then building the game with those libraries.

This time, I don’t want to do it manually, and I don’t want to depend on two different Macs. I want to make this part automated as well.

Now, SDL3’s documentation mentions how to build a Universal Binary for the Mac:

cmake .. "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13

And if I extract the SDL3 source code and use cmake manually, it works just fine.

However, because I wanted to automate this build as part of my own project’s build scripts, I wanted to have my project’s cmake scripts configure and build SDL3 and all of the other SDL3-based libraries.

And it felt like no matter how I tried to make things work, CMake was doing the most surprising wrong things and never the right thing in terms of passing the CMAKE_OSX_ARCHITECTURES variable to SDL3’s cmake scripts.

Now, I think CMake and CSS have something in common: it’s relatively easy to put together something that seems to work but might have fundamental flaws based on misunderstanding or ignorance of how it is supposed to work.

For CSS, things felt a lot less random once I put in time to understand the Box Model. I was no longer randomly trying different values for margins or padding to get things to line up.

CMake, on the other hand, continues to be a challenge for me to learn. The docs are great…once you know how everything works, but until then, they seem quite abstract and confusing.

Anyway, I spent a few hours trying to figure out why the following cmake script would not result in the cmake command above:

SET(SDL3_CONFIGURE_ARGS
    "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"                                                                                           
    "-DCMAKE_OSX_DEPLOYMENT_TARGET=10.15" 
        -DCMAKE_INSTALL_PREFIX=${TARGET_INSTALL_DIR})                                                                                  
 
MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/${SDL3_EXTRACTED_DIR}/build)                                                                      
ADD_CUSTOM_TARGET(SDL3_SHARED_LIBRARY                                                                                                  
                  ALL                                                                                                                  
                  ${CMAKE_COMMAND} ${SDL3_CONFIGURE_ARGS} ..
                  COMMAND make
                  COMMAND make install
                  WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${SDL3_EXTRACTED_DIR}/build
                  COMMENT "BUILDING libSDL3")

As an explanation, I am creating the SDL3_SHARED_LIBRARY target as a custom command. It calls cmake with some arguments (SDL3_CONFIGURE_ARGS), then runs make and make install.

Now, you’ll notice that I have the arguments separate from the command. I have a few, including a target install directory that I want to specify. I don’t want to install to the Mac’s system. I want it to be in a known location for my own build.

And when I didn’t have the -DCMAKE_OSX_ARCHITECTURES argument specified, it would just build on the native architecture of the Mac I happened to be building on. It would specify the deployment target and the target install directory correctly.

That is, passing SDL3_CONFIGURE_ARGS to my custom target’s cmake command worked just fine.

But once I added the -DCMAKE_OSX_ARCHITECTURES argument with two values separated by a semicolon, it stopped interpreting things correctly.

In the above case (which wasn’t my first iteration, by the way), it would build the arm64 version. The semicolon seemed to get interpreted in a way that it was treating it as the end of the command, so x86_64 was seen as a new command.

That’s annoying. What about if we add VERBATIM to the invocation of ADD_CUSTOM_TARGET()?

Well, all that does is treat SDL3_CONFIGURE_ARGS as a single argument being passed to cmake. That is, instead of three separate arguments, it’s one big one…and completely wrong.

Also annoying.

I tried escaping quotes, quoting around escaped quotes, having no quotes, and using or not using VERBATIM for each case. I just kept getting the semicolon treated as the end of a command, leaving x86_64 as a completely separate command, or I got it to treat arm64;x86_64 as a list to expand (so it passed along “arm64 [space] x86_64”), or that one long argument.

I just couldn’t get it to do what I wanted, which was to pass along the arguments as I actually wrote them.

In the end, I found that the problem goes away when I don’t try to use a variable that represents multiple arguments, which makes CMake treat it as a list to sometimes expand or not based on some seemingly non-intuitive rules. I instead now use a separate argument:

SET(MULTI_ARCH_ARG
    "-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64")

SET(SDL3_CONFIGURE_ARGS
    -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15
    -DCMAKE_INSTALL_PREFIX=${TARGET_INSTALL_DIR})
    
ADD_CUSTOM_TARGET(SDL3_SHARED_LIBRARY
          ALL
          ${CMAKE_COMMAND} "${MULTI_ARCH_ARG}" ${SDL3_CONFIGURE_ARGS} WORKING_DIRECTORY
          COMMAND make
          COMMAND make install
          WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${SDL3_EXTRACTED_DIR}
          COMMENT "BUILDING libSDL3")

Note that I pass along MULTI_ARCH_ARG by quoting in the cmake command, but I don’t quote the SDL3_CONFIGURE_ARGS.

The above worked, and I could move on.

I could have moved on earlier by not trying to do the above, but I was determined to figure out how to get CMake to do what I wanted, and in the process, I am now more familiar with how CMake variables and lists work. Next time I run into something similar, I have this experience under my belt, and I think the struggle was worth it for what I gained.

And now I’m fighting with SDL3_ttf dependencies not building with multiple architectures. SDL3_ttf depends on Freetype and Harfbuzz, and those are apparently building with the current architecture (arm64) and so when the x86_64 version of SDL3_ttf is trying to build, it can’t find the x86_64 version of those dependencies. Hopefully solving this one won’t take another week.

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: Automating New Releases

In my last report, I was creating a new SDL3-based release for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

Since SDL3 is so different and I’ve been unable to dedicate substantial time to it, the work to create release builds for each platform I support is still ongoing.

Sprints 2026-MJ_3 and 2026-MJ_4: Release SDL3 update version

Completed

  • Ensure Windows version can still be built/deployed

In progress:

  • Ensure Mac version can still be built/deployed

Toytles: Leaf Raking

Since Toytles: Leaf Raking is in the No ICE in Minnesota Bundle on itch.io (which, by the way, at the time of this writing has raised over $500,000 for the Immigrant Law Center of Minnesota and is still going!), I’ve been focusing on updates for the desktop version of the game.

The Linux version was done right away, but when I last did the work to release a build for Windows, I apparently did a poor job documenting how I did so, so I had to reverse-engineer how I did it before with SDL2 in order to figure out how to do so for SDL3.

And this time, I’m writing scripts to do it for me so that next time I have executable documentation.

I run Ubuntu has my main development system, and one thing I love is that cross-compilers exist. Basically, I can build a Windows version of my game just by using the C++ compiler from MinGW, but I need to use the MinGW development libraries that SDL3 provides.

Next up is the Mac build, complicated by the fact that I don’t have a Silicon-based Mac. I do have access to Mac computers I can remote into thanks to a service I pay for.

Due to how they handle billing by the hour even if I only use one minute and my limited development time which sometimes finds me trying to squeeze in development minutes at a time, I feel pressured to make sure I have an entire hour at a time to dedicate to the effort.

I’m not sure how much I can iterate on trying to automate the Mac build, but I hope I’m most of the way there already and just need to adapt my scripts in minor ways.

Assuming I can knock out the Mac build soon, I’ll move on to the Android and iOS builds soon after.

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 Politics/Government

Get Toytles: Leaf Raking and Fight Authoritarianism at the Same Time

Toytles: Leaf Raking, my strategic leaf-raking business simulation game, is in the No ICE in Minnesota bundle on itch.io!

Get it and over 1,400 other games, tools, books, comics, and soundtracks today!

We created this bundle to raise funds for Immigrant Law Center of Minnesota in response to the Trump administration sending ICE agents to the Minneapolis area and the reckless murder of an innocent people by ICE agents. ILCM provides free immigration legal representation to low-income immigrants and refugees in Minnesota and North Dakota. They also work to educate the community about immigration matters and advocates for public policies which respect the universal human rights of immigrants. ILCM provides services based on capacity and has a generally high demand for services. The more we are able to fundraise, the more people they will be able to assist.

You are probably aware that the United States, which is supposed to be a beacon of freedom in the world, is dealing with homegrown authoritarianism, with masked secret police kidnapping and killing people.

As a kid, I grew up believing that this kind of stuff happened in other countries. After all, we had due process, right? Innocent until proven guilty, judged by a jury of your peers, and all that? Jackbooted thugs on a power trip executing people in the street is something I believed happened in less-free parts of the world run by cruel dictators with no regard for the humanity of their people.

Now frankly, I have since realized it was happening in the United States long before Minnesota got invaded by ICE. I see the people justifying ICE performing extrajudicial kidnapping and murders of immigrants and citizens, and they are the same people who justify it when police were performing extrajudicial murders of Black people, including the murders of children.

I am disappointed that we somehow grew up in the same country and somehow came to such drastically different conclusions about what it means to have rights.

Anyway, Minneapolis has been and continues to be occupied by a violent, authoritarian force, and this bundle is supporting those Minnesotans and sending a message that ICE isn’t wanted there or anywhere. I’m proud to be a small part of this effort.

Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: Trying to Make Release a Non-Event

Last time, I reported that I had finished the SDL3 migration for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

As soon as I get this release version built on all supported platforms and out the door, I can start focusing on the Major Update(tm).

Sprint 2026-MJ_2: Release SDL3 update version

Completed

  • Ensure Linux version can still be built/deployed

In progress:

  • Ensure Windows version can still be built/deployed

Toytles: Leaf Raking

I try to automate what I can, partly to make sure it is repeatable. I don’t need to remember how to do something if I can just look at the script I wrote.

But I also like automation because it takes something that tends to be stressful and time-consuming and turns it into something that is routine and easy.

So as much as possible, I like to have scripts that build and package my games for release, and over the years, more and more things have been automated.

I even got my iOS build mostly automated, which has the bonus benefit of reducing my need to touch Xcode.

Anyway, the SDL3 migration has naturally thrown a wrench in my existing scripts, so I need to update them. They should more or less work as-is, and I just need to make sure I have new libraries and maybe potentially point the scripts towards them.

But deploying those versions to the various app stores is still a manual effort, and I want to change it.

For the Linux version, I created a script to take a finished build and upload it to itch.io’s servers using butler, itch’s app used for such purposes. And it works pretty well! I can just give the script the name of the project, the version number to release, and the channel (in this case Linux), and it does the right thing.

Well, mostly. I uploaded the tarball, when instead I should have uploaded a directory, which means someone with an older version of the game will not be able to cleanly update to the newer version. I need to fix that.

I am also working on the Windows version. Again, I have scripts that do the work for me, but in this case it requires me getting the SDL3 libraries for Windows first and ensuring the scripts know where to find them.

The Android build should be similarly very quick as most of the effort to build the bundle for the Google Play store is done, but the iOS and Mac builds are trickier, mainly because I don’t have a modern Mac to do development on so I work remotely on a cloud service provider. It’s not ideal, but it is cheaper than buying a new machine each time Apple decided an older one is obsolete.

But my goal with creating new deployment scripts as well as improving the build scripts is to make sure that such release events aren’t a big deal in the future.

Wish me luck!

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: Finally Finished with SDL3 Upgrade

In my last report from mid-December I was still in the middle of migrating my code from SDL2 to SDL3 in preparation for a Major Update(tm) for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

I spent the beginning of January reviewing 2025 and planning 2026, but this past week I finally got back to game development and finished the migration work.

Sprint 2026-MJ_1: Preproduction

Completed

  • Update SDL2 to SDL3

Toytles: Leaf Raking

If you’ve been following along and are interested in the technical details, most of the upgrade was pretty straightforward and easy, especially since the SDL3 migration guide was fairly detailed and a lot of the changes were renames or small interface changes.

But I was struggling with migrating to libSDL3_mixer, which has completely changed, which meant my code also needed to change how it handled audio significantly.

Before, I just played sound effects at a certain volume on whatever free audio channel was available.

Now, SDL_mixer has tracks and mixers, and so now I needed to manage those as well as the sound effects.

Toytles: Leaf Raking doesn’t have music (yet!), which means I could worry about supporting audio looping later.

Once the SDL_mixer migration work was done, I then solved a problem involving mouse input and rendering scaling.

Basically, if you resize the window, such as maximizing it to be fullscreen, the game renders the screen to that new window as best it can. However, I found that the mouse cursor was still only getting recognized in the dimensions of the original window.

That is, if I was running the game at 1280×720, and I change the window to run on my 4k monitor at fullscreen, the mouse cursor and mouse button clicks were still acting like the game was still 1280×720. That is, only the top left of the window.

It turned out to be an easy fix. SDL3 has a function called SDL_ConvertEventToRenderCoordinates which takes an event, such as SDL_MouseMotionEvent, and converts the coordinates based on the current renderer. Well, actually, the docs show it takes in a lot of different things, but the point is that when I use this function, the input works as expected no matter what the window size and logical rendering settings are like.

Now I’m just checking to make sure the game works from beginning to end and on all platforms without any issues before producing a new release.

Oh, I also updated the copyright year, which reads “2016-2026” now. That’s right, this year marks the 10 year anniversary of Toytles: Leaf Raking‘s initial release! That’s why I am very interested in creating a Major Update(tm) to celebrate.

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 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!