Categories
Game Design Game Development Geek / Technical

Freshly Squeezed Progress Report: iOS SDL3 Porting Struggles, Part 2

In my previous report, I said that I was working on the SDL3 iOS port of my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

I am sorta finished, but why am I still working on it?

Sprint 2026-MJ_14: Release SDL3 update version

In progress:

  • Ensure iOS version can still be built/deployed

Toytles: Leaf Raking

How am I “sorta finished” with the iOS port?

I mean that I was able to successfully build the app and run it in an iPhone simulator.

Normally, I would just move on to building the app and testing it on my actual iPhone and iPad test devices.

But my goal isn’t to just manually build this app and submit it to the App Store and move on.

I currently have three different games that I support across Windows, Mac, Linux, Android, and iOS. I’ve been trying to automate my builds as much as I can to make it easier for me to support these existing games and support the new ones I will be making for hopefully many years to come.

If I had to manually fight with Xcode each time that I wanted to create a new release of any one game, it would be error-prone and a waste of my time. Each release would be painful, and I would do it less often.

Now you could argue that I’ve spent too many days on this work as it is, that I’m already wasting time.

To that I would say that maybe I agree with you, that I do feel like this effort is taking too long. I am really behind on my plans due to all of this automation work I’ve been investing my time into.

So if anything, I’ll admit that I’m worried I am justifying all this effort and time when instead I should be moving more quickly.

My plans are basically on hold until I get these new releases finished, and the releases are on hold until I can automate their creation as much as I can. And maybe I’m wrong to do so?

But on the other hand, I’ve been living this manual build and release life for years, and I think I’m finally willing to put in the hard work to make my life easier.

If I have any concerns, I think it is that I so easily let myself keep working on a task long after the time I thought it was going to take, and I feel like I should be a bit more deliberate about actually deciding how to proceed.

Anyway, I fully expect that I’ll finally have this work actually automated soon. Basically, my build scripts need to be changed to do this one-off wacky thing involving supporting Apple xcframeworks for my iOS port, while pretty much all of my other ports do not have to worry about it.

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: iOS SDL3 Porting Struggles

Last time, I reported that I was working on the SDL3 mobile ports of my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

I continued to fight with the Apple ecosystem to create my iOS port.

Sprint 2026-MJ_13: Release SDL3 update version

In progress:

  • Ensure iOS version can still be built/deployed

Toytles: Leaf Raking

I am so close. Every SDL2 to SDL3 update for each platform I support is finished except for iOS.

I ended up looking at the script libSDL3 uses to build its Universal library, and it is TOO Universal! It combines everything: Mac, iOS, visionOS, tvOS, and watchOS.

I don’t need all that, so instead I adapted my own library build scripts to create my own Universal libraries to support just iOS, and I did the same for SDL3_image, SDL3_mixer, and SDL3_ttf.

Now I have a few .xcframeworks that I can use to build my app and have it run in the simulator or on an actual hardware device. That’s a lot nicer than having separate builds like I used to with SDL2.

But to get there involved a lot of false starts, such as installing needed things like the Metal toolchain and deciding not to include the debug symbols because I would get errors that they weren’t valid debug symbols.

Next was updating my own application’s build process. I used to have static libraries for SDL2, but now that I have dynamic SDL3 libraries, I need to be able to not only build my app with those libraries but also run the app by pointing to those libraries when they are embedded in the app.

I ran out of time last week, but once again I am making slow and steady progress.

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: Mobile Ports Are Mobilizing

In my previous report, I finished working on the Mac port of my strategic leaf-raking business simulation game, Toytles: Leaf Raking, and then I proceeded to work on the Android port.

I finished the Android work relatively quickly and started working on the iOS port by the end of the week.

Sprint 2026-MJ_12: Release SDL3 update version

Completed

  • Ensure Android version can still be built/deployed

In progress:

  • Ensure iOS version can still be built/deployed

Toytles: Leaf Raking

As I said last time, I had an Android port that was almost finished. I basically needed to test it out manually on my phone to make sure it worked correctly, then I created a bundle and submitted it to Google Play for review.

Then I spent the bulk of the week figuring out what I needed to change to get SDL3 libraries built for iOS. The documentation for SDL3 has suggestions for how to incorporate the library as a subdirectory or submodule of my project, but I would rather build the libraries separately, especially as I will be using these libraries in each of my apps. I should need to build the library for each one.

I had a script that basically built static SDL2 libraries that I incorporated into my app, but the downside was that I needed to build one set of libraries for an app for the iOS simulator to test in and a completely different set of libraries for an app for testing on an actual iPhone or iPad.

Apple allows you to create Universal libraries, but ever since the development of Silicon-based Macs, you couldn’t make assumptions that x86_64 was for the simulator and arm64 was for the iOS hardware.

However, apparently SDL3 allows you to create a very Universal .xcframework. That’s great, except I ran into trouble building it, both on my Intel-based Mac and the Mac in Cloud M2-based Mac, although for different reasons.

I was able to use my old Intel-based Mac Mini to work on the Mac port, but I ultimately ran into a problem in which SDL3 uses and expects newer iOS SDKs than my obsolete machine supports. And on the newer Mac, I ran into problems because it was depending on SDKs for platforms I don’t care about and don’t want to bother with, like visionOS or watchOS.

I will need to do most of my work with Mac in Cloud, unless I get myself a Silicon-based Mac. Either way, I’ll figure it out and hope that the SDL3 port for iOS doesn’t take too much longer.

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: A Mac Port, Finally

Last time, I reported that I was fighting with Apple’s development ecosystem to automate the creation of a Mac port of my strategic leaf-raking business simulation game, Toytles: Leaf Raking

In the end, I wasn’t able to completely automate the creation of the Mac application, but my scripts do a lot more than they used to so I can spend as little time in Xcode as I can.

Sprints 2026-MJ_8, 2026-MJ_9, 2026-MJ_10, and 2026-MJ_11: Release SDL3 update version

Completed

  • Ensure Mac version can still be built/deployed

In progress:

  • Ensure Android version can still be built/deployed

Toytles: Leaf Raking

My apologies if you aren’t interested in the technical, behind-the-scenes work, but this post is going to be a somewhat technical, behind-the-scenes post.

My goal was to automate the creation of a Mac version of the game and get it published on itch.io as quickly as I could.

I already have a deployment script that works for Windows and Linux, so adding the Mac port wasn’t difficult.

But I first needed the Mac port.

I was already using CMake to create an Xcode project. As much as possible, I tried to get my CMake configuration and scripts to create an Xcode project that had as much configured as possible. A long time ago I used to manually copy in my resources directory, which holds all of the images and audio files that I use in the game, but eventually I got the configuration to do that for me automatically. Similarly, I got my account/team information tied in so I didn’t have to manually specify that I wanted to use my account for code signing the project.

I still had issues with other things being a manual effort, though, such as creating a Universal binary, which can run on older Intel-based machines as well as the new Silicon-based ones. Last time, I had to create a set of SDL2 libraries on my Intel-based MacMini and another set using Mac in Cloud, then use something like lipo to combine them together into a “fat” binary, then build my project in Xcode using those fat libraries and making sure to configure the project to also be a Universal build.

But now my build scripts can create SDL3 libraries that are Universal binaries, and I can create a Universal app that I can test easily once the build is finished.

Unfortunately, I struggled to automate code-signing and notarizing. Between Apple’s documentation strongly encouraging using their GUI-based Xcode, rarely mentioning their xcodebuild CLI tools, and needing to dig deeply into the details of certificates and provisioning, something that Xcode’s manual effort handles automatically, I decided I had been working on this automation work for way too long and to cut my losses.

I made progress. I can create Universal libraries and a Universal app automatically, so I can quickly go from nothing to a program I can run and playtest. I can confirm that everything works, that it has the right permissions, and is packaged together properly. Archiving, notarizing, and exporting are relatively quick manual steps, and then I am finished and can upload my new Mac app to itch.io.

Next up was the Android build.

It was fairly straightforward to update my project’s build scripts. SDL3 provides an android-project directory, which I copy into my project, and then use CMake/configure to update files based on my project’s details.

I ran into problems running it, however. It seemed to keep crashing when launching the game.

Ultimately it came down to having an older version of SDL3. There was a mismatch between the android-project’s Java code and the C code related to SDLControllerManager, and it took me awhile to find it, but the discrepancy was already addressed in the latest SDL3 version. Once I grabbed the latest SDL3 and built it with my project, it finally ran successfully.

Then I had to update how touch presses were handled, which I think was potentially due to the high DPI of mobile devices. Basically, SDL3 touch events are scaled from 0.0 to 1.0, and I would multiply it by the screen width and height that I requested in order to identify where on the screen the touch event occurred.

But in high DPI mode, if you use SDL_ConvertEventToRenderCoordinates(), it scales to the screen width/height already. So I was basically taking an event’s coordinates and multiplying them by the dimensions of the screen a second time, which made it seem like the inputs were happening way, way offscreen. No wonder it seemed like input wasn’t working right!

So I ended the week pretty close to having a new Android version ready, but I wanted to test it some more to ensure that there weren’t any other quirks or surprises. Then I’ll work on the iOS version.

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: Can’t Seem to Archive a Mac Build?

In my last report, I was working on automating the Mac release builds for my strategic leaf-raking business simulation game, Toytles: Leaf Raking.

While I’ve made progress, it’s still not going well.

Sprint 2026-MJ_7: Release SDL3 update version

In progress:

  • Ensure Mac version can still be built/deployed

Toytles: Leaf Raking

Last time, I was trying to get SDL3_ttf to build properly, since it has a couple of dependencies and I was running into trouble getting it to build a Universal Binary properly.

It turned out that I had to do a few things.

First, I needed to have my build scripts call SDL3_ttf’s download.sh so that it would populate the Harfbuzz and Freetype dependencies.

Second, I needed to make sure I set SDLTTF_VENDORED to “ON” so it would use its internal projects that I just downloaded.

Finally, I needed to build out of source. Apparently this matters in this repo (and not in other SDl3_* projects) for some reason.

SET(SDL3_TTF_CONFIGURE_ARGS 
+	-DSDLTTF_VENDORED=ON
 	-DCMAKE_INSTALL_PREFIX=${TARGET_INSTALL_DIR})
 
+EXECUTE_PROCESS(COMMAND ./external/download.sh WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/${SDL3_ttf_EXTRACTED_DIR}")
+
+EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E make_directory build WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/${SDL3_ttf_EXTRACTED_DIR}")
 ADD_CUSTOM_TARGET(SDL3_TTF_SHARED_LIBRARY 
 	ALL
-	${CMAKE_COMMAND} "${MULTI_ARCH_ARG}" ${SDL3_TTF_CONFIGURE_ARGS} WORKING_DIRECTORY 
+	${CMAKE_COMMAND} .. "${MULTI_ARCH_ARG}" ${SDL3_TTF_CONFIGURE_ARGS} WORKING_DIRECTORY 
 	COMMAND make
 	COMMAND make install
-	WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${SDL3_ttf_EXTRACTED_DIR}
-	COMMENT "BUILDING libSDL3_ttf")
+	WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${SDL3_ttf_EXTRACTED_DIR}/build
+	COMMENT "BUILDING libSDL3_ttf" VERBATIM)

At this point, I could create Universal Binaries for the SDL3 libraries. Whew!

Moving on to the Mac application, I had some work to do. When I last worked on creating a Mac port, all I did was use CMake to generate an Xcode project, then I built it manually in Xcode. As much as possible, I used CMake and a well-crafted Info.plist file to configure the project automatically. What’s nice is that a lot of things are handled already. I can bundle resources, have my “team” show up automatically in the code signing screen, and more.

So what do I need to do to create a Mac release? I need to archive the project, then notarize it through Xcode.

Unfortunately, I can’t seem to get it to archive properly. It seems to build my project just fine, but the main errors seem to be related to the code-signing step, and specifically when it comes to the dependencies on the SDL3 libraries.

When I read the logs, I see:

Command CodeSign failed with a nonzero exit code

And I see it for each of the libraries it failed to sign. For some reason, libSDL3.dylib was fine, but libSDL3_mixer.dylib, libSDL3_image.dylib, and libSDL3_ttf.dylib show “No such file or directory”.

That’s weird. If they didn’t exist, it makes sense that signing would fail for them, but they should exist!

So which directory is it looking in? Because those files are in the directory I installed them to.

The logs tell me that it is looking in an ArchiveIntermediates directory under ~/Library/Developer/Xcode/DerivedData/ and again, the files seem to exist there just fine.

But digging into it some more, I see that libSDL3.dylib is an actual file, while the other three are links to non-existent files.

SDL3 Mac libs, most of which are broken symlinks

So what’s going on?

Back to the logs. I noticed before the code signing activity that the libraries were copied from the directory I put them in and placed in the ArchiveIntermediates directory.

BUT! Only libSDL3.dylib had some special treatment to have strip called on it, which resulted in that file no longer being a symlink.

So I once again wished I had more hours to dedicate to this work, because I have questions to answer that probably just require some dedicated effort.

Why is libSDL3.dylib treated differently from the other libraries? I don’t see anything in my CMake configuration or in the resulting Xcode project settings to say why it is doing something special for that library and not the others.

Under “Frameworks, Libraries, and Embedded Content”, I see all of the libSDL3* libraries listed twice. For example, libSDL3_image.dylib is listed with the “Embed & Sign” option, while libSDL3_image.0.2.4.dylib, which is what the libSDL3_image.dylib symlink points to) is listed as “Do Not Embed”.

Xcode settings for embedding Frameworks and libraries.

libSDL3.dylib pointed to libSDL3.0.dylib, yet somehow it seems to be doing the right thing when it comes to archiving and signing.

So what obscure Apple-specific thing changed that made something that used to work before suddenly not work, and what change do I need to make in order to make things behave the way they did before? I hope to figure it out this 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: 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!