Progress on TanksVsJellyfish!

Well, I’ve decided to conclude my journey with Diggem and mark my first game as completed. I started up my second project and I’ve already taken advantage of so many lessons learned and also implemented some unconventional strategies for game development vs what I’ve read in the industry, but worked pretty well in enterprise software.

Regardless, here’s a prototypey video of some of what’s in store!

18 Levels!

I know many of you have been at the edge of your seat awaiting more gem finding fun! Now there are 18 levels and a scrollable level map! Adding newer levels is going to be simple and I’m in a good place to add more meaningful progression into the game.

I’m going to spend a little time now figuring out what is going to be next and I imagine it’s going to involve getting some reward for beating levels and something to spend your reward on. I realize I should also make it a goal to keep adding levels at a specific interval. Maybe 18 new levels every month.

After that I’m going to think of additional twists in puzzle solving. I have a few ideas involving different kinds of bombs, but maybe mashing up other puzzle game elements will come into play.

As always, thanks for all the friendly support and feedback!

Unity TileMap Bug

I’ve run across a mildly infuriating issue that I finally resolved. If you look carefully at the roof of the windmill in my level selector, you’ll notice that it disappears when I scroll up and reappears when I scroll down.

I’ve done many a Google / StackOverflow / UnityForum searches to no avail and it wasn’t clear to me how to solve the problem. I originally though it was an issue with me using a ScrollRect with a TileMap, but I took the content out of the ScrollRect, manually moved the camera to still see the same artifact.

It seems the actual problem is the hidden bounding box/size of the TileMap. In the inspector view of the TileMap, you’ll see no properties allowing you to see or change the size.

However, I was finally able to identify the actual problem by sheer luck. I randomly inserted another object further from the original tile that I had drawn, delete that same new object and retested the scene. With that, the tile somehow correctly persisted and displayed.

Looking at the source diff in version control I then saw the hidden delta in the actual scene file. It turns out that the TileMaps have a size property, so when I added and deleted the test object, it changed the size to accommodate the tile that I added.

	... tile details ...
  ... more Tilemap properties ...
  // Here's the magic
  m_Size: {x: 1, y: 10, z: 1}
  // Above!
  ... even more Tilemap properties

Before I added and deleted the random object, the m_Size property was {x: 1, y: 1, z: 1}, notice now it’s {x: 1, y: 10, z:1}

My guess is that Unity has some definition of the TileMap size to be efficient about only rendering what’s on screen. I eventually report the issue, but I have a workaround for now. I hope this helps someone else chasing the same issue of disappearing tiles in TileMaps!

A tutorial feature!

I’ve finally wrapped up the tutorial feature to Diggem. It seems as though the best way to write a tutorial feature is to also write a “Minesweeper” solver. So due to all the complexity, plus my family duties during the holidays, the tutorial is about 10% of what it could be, but it’s a great start.

Now I’m going to address some lower hanging fruits like more levels and start the power ups soon! It’s time to build “Mo features!” I’m very appreciative for those of you who are still supporting me. Thanks for the patience!

Also, if you have any feedback or criticisms, I’m happy to take that input into account!

100 Active devices!

Another achievement! I’ve managed to make a game that at least 100 people are willing to keep on their phones!

So subtle humor aside, all of the amazing tools that are available, have really offered an instant gratification model to building games. I’ve recently implemented Unity analytics, which is super easy to implement and definitely helping me know if I’m making the right choices.

When I first released the game, I noticed that lots of people would play, lose, get an ad and then proceed to uninstall. That was likely due to the original logic that showed an ad in between each game. So I made a tweak of making ads show between games only if 60 seconds passed after the first win. This would give players enough time to warm up to the rules of the game and be rewarded before, presented with an opportunity for an ad.

I then saw the numbers of uninstalls drop and the number of games increased, but still about the same number of ads served. Now that I’ve reached 100 active installs, I ponder that this could just be a factor of laziness or forgetfulness for a user to uninstall. It took about 300 total installs to hit the 100 active install and while the slope of the graph is got better, I contemplated doing some A/B testing on optimizing when to show ads to further reduce uninstalls.

However, I decided that I would put time into new features that would make the game worth the player’s time and space on their phones. I’ve recently introduced an “Adventure” mode, where one could progress through levels with incrementing difficulties.

The next set of features are power ups, rewards and new “mines”. Some power ups that I’m thinking of would be random tile revealers/flaggers, more lives, fixed tile revealer and maybe a larger tile revealer. However, if you have suggestions I’m super open to hearing them!

Much appreciation to all of my friends and family supporting this adventure. The nights spent when the kids go down to 2am get pretty exhausting but I really do appreciate the feedback, the ears when I re-tell my stories, the cheering on, the high fives and hugs.

100 Installs!

I’m super excited to see that Diggem hit a milestone of reaching 100 installs.

Thanks to my family and friends that contributed to some of those installs. This is a truly awesome journey. I added a dedicated page to the game, which includes a change log for those curious on the engineering side what’s going on. There are also other really fun aspects of game development that I want to share.

First, while I’m very happy to reach my first 100 installs, I do recognize there are many other important metrics to track. Currently I’m watching data on retention and a few interactions. I believe that there are still a handful of features to implement to offer a better experience while playing and also more data to guide me.

Next, besides time, I’ve also put a small investment into visual assets and advertising. What shocked me is how effective the advertisement platforms are. I created a “easy button” campaign using Google Ads and from that I’m getting a steady flow of installs. Those installs are currently offering me the insight that “this game still not good enough”. While I know some could see this as  discouraging, I love that I have a tool that will give me visibility on whether I’m moving in the right direction.

Finally, I hit a snafu, I lost the password to my keystore due to a series of unfortunate circumstances. Google does have a process to get you back and running but I won’t be able to submit another update until the 14th. I’m super thankful that this process exists, because it seems as though prior to 2017, people had to orphan their old app and create a duplicate.

Thanks for reading this, I’m super excited about this adventure! Let me know if you have any words of wisdom or ideas to share!


Hello friends! I’ve created a game called Diggem, which is a spin of the classic game, Minesweeper. The goal is to provide an experience that offers the same challenging puzzle with more room for forgiveness and rewards!

I’m having a blast building this and really look forward to adding more features that players will enjoy! This is an initial iteration, if you enjoy classic Minesweeper, it would be awesome if you could download this game and give me your feedback!

You can find “Diggem” on the Google Play Store or follow the link to review it on your favorite web browser.

EntityFramework – Migrations Gotchas

Wanting to be a little more thrifty on a side project, I decided to roll with MySQL and EntityFramework. There were a few gotchas, outside of the normal tutorial and I’m just putting this out here to save time for anyone else who may have had to deal with the issues I ran across.

Data Model defined in a separate library

Most of the 101 examples have the data model included in the MVC, WebAPI or Console/UI project that is typically the startup project. However, if you have your data model defined in a separate project don’t forget to add the “-StartupProjectName” argument when invoking any of the migration commands.


enable-migrations -StartupProjectName [DataModelLibName] -ProjectName [DataModelLibName]
add-migration -StartupProjectName [DataModelLibName] -ProjectName [DataModelLibName]
update-database -StartupProjectName [DataModelLibName] -ProjectName [DataModelLibName]

This argument is actually telling the migration command where to look for the configuration of the providers and the target database to migrate. If you have everything configured in the shell startup project, then you’re probably fine and won’t have witnessed the issues I ran across. However, if you have multiple providers and/or are testing a new provider, it helps to keep that isolated in a configuration in the library before pushing it to the actual startup project configuration.

Code first classes with DateTimeOffset fields

As of the MySQL 6.9.10 connector, there is no support for the DateTimeOffset type and there are no plans for from what I’ve read. However, if you already have lots of models that use that type you can add the following code to your models to preserve most of your existing logic and still have it serialize into the database accordingly.

public class Foo
  public DateTimeOffset UpdatedAt { get; set; }
  public DateTime UpdatedAtUtc {
    get => this.UpdatedAt.UtcDateTime;
    set => this.UpdatedAt = value.ToLocalTime();

Keep on coding on!

XamarinForms – Overriding PageRenderer and NavigationService

After further implementation on my pet project, I realized that my previous solution on the page renderers would cause the NavigationService to fail from going back. So with more experimentation, I’ve discovered a way to preserve that functionality and still allow the page renderers to override the default view functionality.

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(FooPage), typeof(FooPageRenderer))]
namespace FooApp.Droid.Renderer
    public class FooPageRenderer : PageRenderer
        private Android.Views.ViewGroup parentView;
        private Android.Views.View origView;
        private Android.Views.View newView;

        protected override void OnElementChanged(ElementChangedEventArgs e)
            var activity = this.Context as MainActivity;
            var newView = activity.FindViewById(;
            parentView = activity.Window.DecorView as ViewGroup;
            origView = parentView.GetChildAt(0);

		private void Restore()
			if (origView != null)

XamarinForms – Overriding a ContentPage with a custom PageRenderer on Android

The short version:

If you want to have default behavior on all platforms except for Android. Do the following

  • Create your content page with all of it’s goodies
  • Create a custom PageRenderer
  • In the OnElementChanged function
    • Cast the Context property of the renderer to the Activity type associated
    • Take that value and execute the SetContentView method while passing in your new view!

The awesome story version:

I’m building a Xamarin Forms application which has a default implementation in most platforms and a special snowflake behavior on Android. While working through the Xamarin documentation I realized that custom renderers were the way to go.

The default behavior for all platforms is performed through a WebView, which has some custom logic when pages are navigated. While the functionality still works, it doesn’t feel seamless. However, in Android there is already native functionality that really improves the user experience, so I wanted to make sure that if I was on the Android platform, I would not display that web view and I would go straight to the native view.

While navigating through the sea of googlementation(, I saw various examples on how to do stuff with custom renderers and I walked through them one by one hoping to hit my use case. Most search results demonstrated how to replace the view when doing a custom renderer on a control element with the SetNativeControl method. However, this was a page renderer. So it was time for experiments!

The behavior that I got was that the default view was still rendering and my custom view was not. If commented out the content on the default ContentPage then it would successfully output the custom view. However that in turn meant no default behavior. There was no winning! It was like arguing with a cat!

Hours later, I was able to debug and discover that I had access to the Android Activity. Using the activity, I was able to replace the main content with the SetContentView method like so.

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(FooPage), typeof(FooPageRenderer))]
namespace FooApp.Droid.Renderer
    public class FooPageRenderer : PageRenderer
        protected override void OnElementChanged(ElementChangedEventArgs e)
            var activity = this.Context as MainActivity;
            var newView = activity.FindViewById(;


I hope this helps other people save a few hours in their quests of building awesome things.

Keep on coding on friends!