29 Making progress

In the past two weeks I was busy wrapping up my last freelance job. Currently I am enjoying 2 weeks off, and then on to a new job!

While all this is happening, I am still working on Find the Gnome. It is coming a long very nicely, if I may say so. A few interesting things are happening, so that is what I will talk about in this post.

Find the Gnome – Update

The video fragment of this blog is about that latest update on Find the Gnome.

Here you can see the improved camera, animations, level design and gameplay. Still working out the details on the final gameplay, and the UI is fully placeholders only, but its quite a fun game to play already!

Sound design

How a game feels is graphics on one hand, and sounds on the other hand. A good ambience can amplify the experience and really add to it.

On the previous installment of Find the Gnome I did all of this myself. And this wasn’t easy for me to do. For instance a month just before release I did not have the music in yet. That is because I had a hard time understanding what kind of ambiance I wanted to get with my music. And on top of that, finding the music on itself was very hard. Same with the sounds: the gnomes screaming are fun, but there could be so much more that makes a sound that adds to the experience.

So that is why I am working together with Theo from Daydream Sound to get professional sounds and musics on Find the Gnome. I just got his first set of samples so I am very curious of what he has come up with. A game like this, a hidden object game, really needs good sound design. That is a trademark for this genre. So I am probably going to need his services a few times during the development of Find the Gnome.

User interface

The user interface is another part of the game I really underestimated in the previous installment of Find the Gnome.

I didn’t think that I lacked experience creating user interfaces back then. However since then I did encounter a few very good ‘front end’ designers that really knew how to create compelling and clean/clear user interfaces. I am just not that good at this haha.

So with that knowledge I now look at other games to borrow concepts from them instead. For instance, I really liked the way the latest Hitman and Hitman 2 (basically the same game) told the player about possible objectives. You wouldn’t say that on first sight, but this game is a sandbox game with a lot of hidden objectives and possibilities. The way their user interface did give away some kind of hints on what to do while not spoiling the experience of discovering it yourself too much… yeah that is what I was looking for!

But another inspiration was to look at the competitors. They are more simplistic in things to do in the game, but their user interface layout is very similar across the genre. Hidden Folks, Hidden Paws, Out of Sight: all minimalist interfaces with a few components along the edges or, if applicable, an objective list in the bottom middle.

With this knowledge I designed the interface you see in the video at the start of the blog. But this is just the start of this interface: it still needs the touch of a professional. So as with the sound design, I am going to look for a prof to help me on the user interface to draw/design.

Next

So I am looking at my competitors on where I should aim for. What kind of gameplay is expected, what are characteristics (sound, UI, drawing style), how do tutorials in this genre, how much content per level, how many levels in general.

My goal is to get 3 levels fully working and the gameplay flushed out and release this on Steam. From there on I will start adding content incrementally. Releasing early will give me the necessary input needed to make the game even better, and above all keep motivated.

This is is where I am at on my own progress chart. Read the chart like this: “Phase name. At the end of this phase, I have the things mentioned in the bullet points.”

I am trying to get the most out of my free time currently while I don’t have another consultancy job. So expect some more progress in the coming two weeks, but after that its probably going to slow down a bit. So that is why I really want to have at least my alpha ready by then so I can start working on the first Release version.

28 Test flow

Hi folks! Today a more technical blog with a peek into my game production and test flow, with DevOps yml code included!

But first, a gameplay fragment of Gearful. This is somehow connected to ‘Roan’, my new helper!

Gearful

Level 7 of Gearful, played on itch.io. Play it yourself.

This level is created by Roan in March of 2020. He really liked to fantasize about Gearful while I was working on it. So he made a drawing for me, and I recreated it.

Testing by Roan

Last week Roan joined in on the game development team at GameFeelings. With his 9 years old he has a unique look at games. His job will mainly be to test the latest versions and hold me accountable for delivering on my promises.

He is a passionate player of games. He really likes to play games, and when he is not playing games he likes to draw scenes of his favorite games and do some modifications to the gameplay. And then play these out on paper.

Previous week he held a presentation in front of his class about the different types of games available. At the end his classmates could try out a game he created one level for. That is ‘Gearful’, level 7. That is why this bi-weekly shows off level 7 of Gearful in the introduction.

He already does play my games, out of his own curiosity and interest in games. That was really funny for me to discover. Over the past year he played my games a couple of times already, each time getting back to me and talking about how he enjoyed it. On Gearful a few levels are difficult to complete due to Unity Physics not working properly, but he manages to complete them anyway by exploiting the mechanics. And he really likes to tell me this. He does play (the old version of) Find the Gnome too, but less often. Because this game is a bit less appealing to him due to a few quirks in the gameplay. But he can already point those problems out to me, that’s quite remarkable for a 9 years old I think.

So yeah, I think he is a really valuable addition and will increase the quality of the games I deliver.

Testing setup

For those interested in how I do the test part of the production in my game development and the tooling I use, here a peek. If you are interested in more, look me up on my Discord and ask details there.

For me as a solo dev, I build the workflow around my preferred way of working. The testing workflow I am going to describe here is intended more as a signalling function then as an approvement flow. ‘Proper’ testing is still something I need to do myself before checking in my code. That is because in the flow show here there is no coupling between the builds and the stories/bugfixes that are solved in them.

Having said that, lets move on to some actual workflow. So when I check in my code on Azure DevOps the build starts.

I run Unity 2019.4 LTS and have my code on Azure DevOps. There i have a build agent connected to my local dev machine so the builds run locally. This is an evolution of the setup I did in this blog and on Youtube.

I run full yml now, so this is how that looks:

name: 2.0$(rev:.r)

# no PR triggers
pr: none

pool:
  name: Default
  demands: Unity_2019.4

variables:
  gameProjectDir: 'Find the Gnome Revisited'
  subscriptionConnector: 'redacted'


stages:
- stage: WindowsBuild
  displayName: 'Windows build'
  jobs:
  - job: Prepare
    displayName: 'Build FtG for windows'
    steps:
    #cleanup for unity build
    - task: DeleteFiles@1
      displayName: 'Cleanup staging dir leftovers from last build'
      inputs:
        SourceFolder: '$(Build.ArtifactStagingDirectory)'
        Contents: '**/*'
        
    #cleanup for published artifact
    - task: DeleteFiles@1
      displayName: 'Cleanup published artifact target dir'
      inputs:
        SourceFolder: '$(Pipeline.Workspace)\GameBuildPcWin\'
        Contents: '**/*'

    #get the previously secured library (if any) for performance reasons
    - task: DeleteFiles@1
      displayName: 'Delete old libary content'
      inputs:
        SourceFolder: '$(Build.Repository.LocalPath)\$(gameProjectDir)\Library'
        Contents: '**/*'
        
    - task: CmdLine@2
      displayName: 'Restore Unity library from last build for performance reasons'
      inputs:
        script: 'if EXIST "$(Build.BinariesDirectory)\Library\" move "$(Build.BinariesDirectory)\Library" "$(Build.Repository.LocalPath)\$(gameProjectDir)\Library"'
  
    
    # Build -------------------------
    
    #unity PC build
    - task: UnityBuildTask@3
      displayName: 'Unity build'
      inputs:
        buildTarget: 'Win64'
        unityProjectPath: '$(Build.Repository.LocalPath)\$(gameProjectDir)'
        buildScriptType: 'existing'
        scriptExecuteMethod: 'ImprovedBuild.PerformBuild'
        additionalCmdArgs: '-outputPath "$(Build.ArtifactStagingDirectory)\WindowsBuild" -outputFileName "FindTheGnomeRevisited" -buildVersion "$(Build.BuildNumber)" -versionJsonFileName "Assets\Resources\ProjectVersion.json"'
    
    #upload normal game build artifact
    - task: PublishBuildArtifacts@1
      displayName: 'Upload clean build'
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)\WindowsBuild'
        ArtifactName: 'GameBuildPcWin'
    
    # Cleanup -------------------------
    
    #secure the library for performance reasons
    - task: DeleteFiles@1
      displayName: 'Clean the temp store library'
      inputs:
        SourceFolder: '$(Build.BinariesDirectory)\Library'
        Contents: '**/*'
        
    - task: CmdLine@2
      displayName: 'Move the files over to be saved for the next build'
      inputs:
        script: 'move "$(Build.Repository.LocalPath)\$(gameProjectDir)\Library" "$(Build.BinariesDirectory)\Library"'

    # upload the setup creator so we don't have to download the whole code base next time we want to build the game installer
    # can be uploaded in a separate concurrent job
  - job: UploadSetup
    displayName: 'Upload windows setup creator'
    steps:
    - task: PublishBuildArtifacts@1
      displayName: 'Upload setup creator'
      inputs:
        pathtoPublish: '"$(Build.Repository.LocalPath)\Installer'
        artifactName: 'SetupCreator'


- stage: CreateQAInstaller
  displayName: 'Create installer for QA'
  jobs:
  - job: BuildInstaller
    displayName: 'Build installer for windows'
    steps:
    - checkout: none

    - download: current
      artifact: 'GameBuildPcWin'
      displayName: 'Download GameBuildPcWin Artifact'

    - download: current
      artifact: 'SetupCreator'
      displayName: 'Download SetupCreator Artifact'

    #create the installer
    - task: BatchScript@1
      displayName: 'Create installer'
      inputs:
        filename: '$(Pipeline.Workspace)/SetupCreator/createsetup.bat'
        arguments: '"$(Pipeline.Workspace)\GameBuildPcWin\*" "$(Build.ArtifactStagingDirectory)\Installer" "$(Build.BuildNumber)"'
        workingFolder: '$(Pipeline.Workspace)\SetupCreator'

    #upload game installer artifact
    - task: PublishBuildArtifacts@1
      displayName: 'Upload installer'
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)\Installer'
        ArtifactName: 'GameInstallerPcWin'


- stage: Upload
  displayName: 'Upload to stores'
  jobs:
  - job: QAInstaller
    displayName: 'Installers for QA (early builds)'
    steps:
    - checkout: none

    - download: current
      artifact: 'GameInstallerPcWin'
      displayName: 'Download GameInstallerPcWin Artifact'

    - task: AzureFileCopy@4
      displayName: 'Upload PcWin early build installer for QA to blob store https://redacted.exe'
      inputs:
        SourcePath: '$(Pipeline.Workspace)\GameInstallerPcWin\SetupPc.exe'
        azureSubscription: '$(subscriptionConnector)'
        Destination: 'AzureBlob'
        storage: 'redacted'
        ContainerName: 'earlybuild'

It still needs evolving. 1) I want to get it to build for and release to Steam too in the same script. 2) And I want to introduce 2 different game build types: one for early testing with all kinds of bells and whizzles and one for user release without test tools and shortcuts, probably by using different scriptExecuteMethod depending on my expected build output. 3) And the generated installer isn’t signed, so the browser is very picky on it currently and you have to jump a few big warning hoops to get the game installed this way.

Roan as a tester then has the following workflow:
He has a document on his desktop with a few links in them. First he uses the installer link to download & update the game to the latest version. Then he opens a google form with questions on the game, and answers those.

I then use the form excel document to create new tasks in DevOps. To do this efficiently I track the response and the reports I have processed.

One thing noteworthy is the tracking of the version number. To get a proper connection between reports and fixes, I had to somehow get an automatic build number to display in-game. This was not as easy as it sounds, because Unity hasn’t that great of a support for a build in versioning. TLDR: insert it at build time through a custom unity build script into a json file as a native Unity resource asset and read that asset when running the game.

The custom build script for the versioning part:

using System;
using System.IO;
using UnityEditor;
using UnityEngine;

#if UNITY_2018_1_OR_NEWER
using UnityEditor.Build.Reporting;
#endif

/// <summary>
/// Improved build script over GenericBuild.
/// -Use build version
/// </summary>
public class ImprovedBuild
{
    // Build inputs
    private static string outputFileNameArgName = "outputFileName";
    private static string locationPathNameArgName = "outputPath";

    // Version inputs
    private static string buildVersionArgName = "buildVersion";
    private static string versionJsonFileNameArgName = "versionJsonFileName";

    public static void PerformBuild()
    {
        try
        {
            // Preset versions
            SetVersions();

            // Prepare build
            EditorBuildSettingsScene[] editorConfiguredBuildScenes = EditorBuildSettings.scenes;
            string[] includedScenes = new string[editorConfiguredBuildScenes.Length];

            for (int i = 0; i < editorConfiguredBuildScenes.Length; i++)
            {
                includedScenes[i] = editorConfiguredBuildScenes[i].path;
            }

#if UNITY_2018_1_OR_NEWER
            BuildReport buildReport = default(BuildReport);
#else
                    string buildReport = "ERROR";
#endif

            var useLocationPathName = Path.Combine(FindArg(locationPathNameArgName), GetBuildTargetOutputFileNameAndExtension());
            Debug.Log("Using locationPathName: "+ useLocationPathName);  // Backward compatible with earlier unity editor C# versions


            // Build
            buildReport = BuildPipeline.BuildPlayer(new BuildPlayerOptions
            {
                scenes = includedScenes,
                target = EditorUserBuildSettings.activeBuildTarget,
                locationPathName = useLocationPathName,
                targetGroup = EditorUserBuildSettings.selectedBuildTargetGroup,
                options = BuildOptions.None
            });

            // Log build results

#if UNITY_2018_1_OR_NEWER
            switch (buildReport.summary.result)
            {
                case BuildResult.Succeeded:
                    EditorApplication.Exit(0);
                    break;
                case BuildResult.Unknown:
                case BuildResult.Failed:
                case BuildResult.Cancelled:
                default:
                    EditorApplication.Exit(1);
                    break;
            }
#else
                    if (buildReport.StartsWith("Error"))
                    {
                        EditorApplication.Exit(1);
                    }
                    else
                    {
                        EditorApplication.Exit(0);
                    }
#endif
        }
        catch (Exception ex)
        {
            Debug.Log("BUILD FAILED: " + ex.Message);
            EditorApplication.Exit(1);
        }
    }

    private static string GetBuildTargetOutputFileNameAndExtension()
    {
        var outputFileName = FindArg(outputFileNameArgName);
        switch (EditorUserBuildSettings.activeBuildTarget)
        {
            case BuildTarget.Android:
                return (outputFileName + ".apk");
            case BuildTarget.StandaloneWindows64:
            case BuildTarget.StandaloneWindows:
                return (outputFileName + ".exe");
#if UNITY_2018_1_OR_NEWER
            case BuildTarget.StandaloneOSX:
#endif
#if !UNITY_2017_3_OR_NEWER
                    case BuildTarget.StandaloneOSXIntel:
                    case BuildTarget.StandaloneOSXIntel64:
#endif
                return (outputFileName + ".app");
            case BuildTarget.iOS:
            case BuildTarget.tvOS:
#if !UNITY_2019_2_OR_NEWER
            case BuildTarget.StandaloneLinux:
#endif
            case BuildTarget.WebGL:
            case BuildTarget.WSAPlayer:
            case BuildTarget.StandaloneLinux64:
#if !UNITY_2019_2_OR_NEWER
            case BuildTarget.StandaloneLinuxUniversal:
#endif
#if !UNITY_2018_3_OR_NEWER
                    case BuildTarget.PSP2:    
#endif
            case BuildTarget.PS4:
            case BuildTarget.XboxOne:
#if !UNITY_2017_3_OR_NEWER
                    case BuildTarget.SamsungTV:
#endif
#if !UNITY_2018_1_OR_NEWER
                    case BuildTarget.N3DS:
                    case BuildTarget.WiiU:
#endif
            case BuildTarget.Switch:
            case BuildTarget.NoTarget:
            default:
                return outputFileName;
        }
    }


    private static string FindArg(string argName)
    {
        argName = ("-" + argName).ToLower();  // Backward compatible with earlier unity editor C# versions
        string[] args = Environment.GetCommandLineArgs();
        for (int i = 0; i < args.Length; i++)
        {
            var arg = (args[i] ?? string.Empty);
            
            if (arg.ToLower() != argName || i == args.Length - 1 || (args[i + 1] ?? string.Empty).StartsWith("-"))
                continue;

            return args[i + 1];
        }

        return string.Empty;
    }

    /// <summary>
    /// Set all version numbers alike
    /// </summary>
    private static void SetVersions()
    {
        var buildVersion = FindArg(buildVersionArgName);
        
        PlayerSettings.bundleVersion = buildVersion;
        UpdateVersionAssetFile(FindArg(versionJsonFileNameArgName), buildVersion);
    }

    private static void UpdateVersionAssetFile(string versionJsonFileName, string newVersionNumber)
    {
        if (string.IsNullOrEmpty(versionJsonFileName))
        {
            Debug.LogFormat("Skipping updating version asset file, paramater -{0} is empty", versionJsonFileNameArgName);
            return;
        }

        try
        {
            var fileContent = JsonUtility.ToJson(new BuildVersion { Version = newVersionNumber });
            File.WriteAllText(versionJsonFileName, fileContent);
        }
        catch (Exception exc)
        {
            Debug.LogWarning("Could not update version json file due to error: " + exc.Message);
        }
    }

    private class BuildVersion
    {
        public string Version;
    }
}

This is by the way an improved version of the script the Unity DevOps build task generates itself. One major difference is the original build script works in-line in the DevOps build so they can directly insert parameters into code, while I had to supply the DevOps build parameters into the Unity build startup parameters.

In conclusion: so this is how I do testing in my code. I work on DevOps tasks. When work is finished I test stuff myself, then let the build automatically create an installer for additional testing. Roan, or someone else that I instructed, then installs the updated version and runs a test on all the game that is in there. The test results are send back to me and I create new DevOps tasks if needed.

I like to share more of my ways of working if I improve my dev flow even more. Jump on my Discord if you want some help earlier, or wait for my video’s to come in the coming months.

27 First gameplay

Yes! YES!

I am back in business. My game dev is flowing freely again, from my fingers through the keyboard into the bits that make up the re-envision of Find the Gnome.

Please, enjoy this new writing of mine.

First gameplay on Find the Gnome

Here you see my boy Roan in action (9 years old) experimenting with the new game mechanics. He really likes watching the helicopter taking the gnome away on a successful catch.

So much improvement!

The past 2 weeks I have been inspired by my improved working practices keeping me motivated. The payoff was massive: I was able to get together a working piece of Find the Gnome with quite a few of the new mechanics already in it.

One of my major changes in working is to keep it very very simple. Unity 3D is build to facilitate precisely that, so my workflow has improved a lot. And I don’t make the things nice and tidy if I don’t know if I want to keep it around. Thus it seems like a lot of the animations look like they are ‘missing’ or ‘clunky’, but I don’t see it that way: they are exactly what I want for this stage of development.

This is such an improvement over my old way of working. I always build these massive systems in code without having something to show. And these systems are of course polished and prepared for every outlier that I could think of… but not this time anymore.

Upcoming

Where to take it from here?

My current goal is to get the mechanics down. I already did a short playtest with my kids Roan and Mirthe, and the results look very promising for the tested mechanics. But I have a lot more interaction mechanics envisioned, so there is still a lot to add and fine-tune. Also the user interface and user input needs some serious thought.

I came to discover is that I don’t have to worry about content in my games. I like modelling a lot, so much actually I have myself creating 1 object each day. This will me help to ‘automagically’ add more variation in objects and interactions to the game (and my other upcoming games) over time.

Since we are talking about upcoming stuff anyway, another thing I like to share is what I want to get out of the publication of this game. I want to achieve these: 1) replace the old game but still keep it around for people to play, 2) release late Alpha builds on Steam for my testers for each added level, 3) release the finished and polished game levels incrementally for everyone.

I still don’t know when the first Alpha will be available or when the first finished level can be played by everyone. It is done when it is done, hehe.

26 Gnomes everywhere!

Gnomes everywhere! Like… everywhere! But only a few of them are corrupted… That is how the ‘old’ Find the Gnome works. In the new one you just have to catch all gnomes. But for now, enjoy the little piece of gameplay I recorded for you on the old version!

I have an update on how catching gnomes will be different in the new version. A chopper!

And I have made a few changes. From now on: gnomes everywhere! More on this in ‘upgrading my habits’.

Have a nice read!

Gnomes casually walking around…

Here a piece of gameplay of me enjoying the view in the fourth level. In the soon-to-be revised / overhauled version of Find the Gnome.

#findthegnome a hidden object game with a twist! Find it on Steam.

Drone to catch your gnomes

One of the upcoming changes to Find the Gnome is having a drone pick-up the gnomes, instead of them disappearing when you click them.

Find the Gnome – drone

The idea behind this drone is to have a more natural system of limitations to catch gnomes, so clicking all over the scene isn’t that much of a problem anymore.

The drone will come to the mouse, catch the gnome, and take it off-screen. The drone amount is limited, its speed is just a bit slower than running gnomes. So once you find your gnome, you have to work out how to catch it by scaring it with your mouse or to ensnare it with other object interactions.

This will inspire a much more interactive experience of finding and catching gnomes. I like it already!

Upgrading my habits

Another thing I am working on is to improve my efficiency by doing more in less time, and make sure I work on things that contribute to my long term goals.

I attended to an online training ‘Online and social media marketing’, hosted by Qcredits. This was the second training I attended, and it emphasized on what I already knew. It is all about being clear on what you sell, and then make sure you sell it well and sell it everywhere. That ‘being clear on what you sell’ for me was always a bit vague, but I came to the conclusion I make games so that is what I sell: my games. So from now on, each blog, each email, is at least going to contain something about a game of mine.

Another thing I am working on currently is my procrastination. For this I am following a Dutch online course ‘Kies eieren voor je tijd’ from sochicken. It has 18 sessions of 15 minutes that spans multiple days. To me it already helps a lot in showing me how I procrastinate and what tricks others use to get over it. And it is very activating, it forces me to immediately apply the learning to the coming day. So fingers crossed: hope this helps me out being more productive!

25 Animating

When I started ‘Find the Gnome’ in December 2017, my goal was to do it all myself so I could experience what I was good at and what I was bad at. Creating a model for the gnome, texturing, animating: it was all part of that.

Now in 2021 modelling is much more easy for me to do and actually fun. Animating however is not something I enjoy doing.

If you take a look at the gnomes in my 2018 game, you will notice them being not that smooth on the animation. Further more, some are even broken. I ended up abandoning on fixing it back then. Even worse, I used a not-so-common way to record the animations in Blender, so all animations are broken by now.

That is the premise of this blog post: how to fix the gnomes?

Remodel

First I did a remodel of the gnomes. I think it is an O.K. low poly model, but some dimensions are a bit off. And the texturing is not matching with a low poly look.

Gnome models in ‘Find the Gnome’

As you can see, the old models use a ‘smooth’ look but in reality they are low poly models. Further more I textured them without knowing how to do it properly, hence the white-ish lines you see on the models. For insiders: I didn’t know how to properly use UV seams.

Reworked gnome model, low poly

This is the same model as before, only with slight changes to the face. But now with smoothing off so it matches with the low poly look of the environment. And the texturing is now done using some sort of a color map technique, common for low poly models, so there is a very limited set of colors used in the scene.

The color map I currently use in Find the Gnome is the same as on Manage the Universe. The ‘ImphenziaPalette01’:

ImphenziaPalette01

Mixamo

For animating the models, things have changed massively over the years. Currently, you can get at 90% without even lifting a finger. Ok, a few mouseclicks maybe.

Previously you had to give the model a ‘skeleton’, then attach the outside (the model) to the inside (the skeleton) properly, then make a few animations using keyframes.

Now you go to Mixamo, upload your model (without skeleton), point out a few key points in your model, and there you go. Then select a few interesting animations you want your model to have, see how it looks on your model and tune a few parameters (if any), then download it, import it into Unity, and: done.

Mixamo animation samples

It already looks sooo good, compared to what I had. Yes it can be even better than this, but that is when you want to do it yourself or to pay someone to do it for you.

Animation blend tree on Gnome

The fun part is: immediately I have a gnome that has a much more interesting idle/walk/run cycle.

So that is when I need to get to work. This previous image is a ‘blend tree’: it blends between different animations. That is another piece of Unity I didn’t use before but really helps with animating. It is part of a state machine that makes switching and blending between animations really easy to develop and debug.

I am still not finished. Yes the animations look way better already. But I can now also see that a few animations aren’t that well suited for my gnome and the type of walking he is going to have in-game. But that is the benefit of Mixamo: I now know what works and what not without too much effort, and can spend my time (or money) on animations that are certain to be useful. Or just switch them out with something else from Mixamo and see where that takes me.

24 Questionnaire results!

The results of the questionnaire are in! All of you want more game dev, so I am going to get my 1-hour-gamedev-a-day back in. Thanks for the answers!

The past 2 weeks I was still working hard on making money so I could support a few months off in the future to work on my games full time again. I have read a few interesting articles that I want to share with you in this blog. And on the end, the results of the questionnaire!

High quality budget marketing

Sometimes you come across someone that just seems to be good at his trade. This marketeer ‘Chris’ from https://howtomarketagame.com is such a person in my opinion. But there is a strangeness to his quality… he shares his insights for free!

His articles are all about applying his experience to real world samples, backed by a lot of data and the data analysis itself. See for instance this article on how to be smart in copying the marketing strategy of your competitors: https://howtomarketagame.com/2021/01/25/how-to-spy-on-your-competition/.

His down-to-earth approach is really inspiring to me. And his unconditional sharing of his insights is refreshing. I find myself temped by contacting him to do marketing on one of my games.

There is still place for new games

Sometimes I think by myself: wouldn’t be there a point in time that every possible game is invented? Every melody composed? Every painting painted?

I ran into 2 interesting stories on Reddit. They do show that there are still unexplored territories in gamedev. But at the same time, for these guys succeeding, a lot of others are failing.

So… pet simulators is going to be the next thing? Maybe I should create a garden simulator where you can place gnomes and watch it come to life in the evening? O my, others thought of that already

On the other hand, I came across a Sims clone lately. EA dropped the ball on ‘proper’ keeping up with this game, and now new games that do the same are enjoying a rich audience. Even reinventing games can be good business!

Questionnaire results

For those who where not able to do so, I have this form up where you can answer 3 questions to help me out. Very easy and quick to do.

Already 25% of my audience has answered. Friends, family, colleagues: thanks! You are by far my major supports. Over 50 people enjoy my content monthly already, but you are by far the most engaged, and thanks for giving something back to me!

With having said that, all(!!!) of you enjoy seeing me sharing my progress on game development. And half of you are interested in me sharing my experiences with running a business. Funny enough, non of you admit being a game developer yourself, but half of you like seeing tutorials about game dev. Interesting hehe.

So yeah, I have to get back on my game dev. I am still making money so I can fund a few dedicated months of game dev again. But your support for me means a lot to me, your answers gave me new energy! So I will put my daily game dev hour back in use so I work at least 1 hour a day on game dev.

23 – Redefinition of GameFeelings

Hello and welcome to this blog! The past few weeks I have been working on a couple of new concepts. One of which is Crowdkans.nl, a concept of a friend of mine. And I got a few personal and very insightful lessons from a great Dutch marketeer called TopPresentatie.

I will be exploring these and some other things in this blog post. I will be as clear as always, writing out my considerations on the subjects at matter, and give an insight in how I run my business. There is a big change you too can take something away from it!

Crowdkans.nl

Get a better interest rates while at the same time supporting the creation of a greener world, and do this by helping tangible companies with specific (local) projects.

That is what ‘Bart Kers’, a friend of mine, is trying to achieve with Crowdkans.nl. An interesting proposition in times where savings at the bank are next to nothing and you can’t spend your money.

You can find his own motivation over at his bio. As this bio is in Dutch, a summary of mine: he is an engineer with an entrepreneurial spirit and a knack for economics, and now he wants to contribute to the world by helping crowdfunded (local) green projects find the right people that want to invest.

This project of him is one of the counselings I was giving. He wanted my advise on how to start an online business and had a few technical questions. I was able to help him get to the core and make it small enough to start with. So that is what he then did: create a blog over at Crowdkans.nl. If you like his idea’s, message him or leave a comment at his blogs. We have a few nice technological tools in the pipeline to help you with finding and managing these crowd projects for yourself, but we need to know how much people are interested in this.

And then on to a disclaimer here. I need to add a few words from my own here because his website is about financial advise, or can be viewed as such.

I personally think there is a severe lack of education on finances in our current economy. The downside is that you are likely to not understand the risks of the information offered on this platform. On the other hand, Bart wants to educate people more so they understand how they can make a difference in the world with wisely choosing how to spend their money. And he want to give them the tools to make their own decisions.

I know from my personal experience while being an engineer for advieskeuze.nl that the area of financial advice is a heavily regulated one. The products are way too complex most of the time, the motives of people offering products and services are questionable, and when there is money involved suddenly even the mightiest of mind seems to bow to the wishes of the Mammon.

But I am also a fervent advocate of education. Finances is one of those area’s, where I think that regulating it by introducing advisors attributes to an even bigger downfall in education.

That is why I support his idea. And yes, he is an integer person, I can vote for that. He is a ‘real’ engineer from his childhood, just wanting to explore the options and give an objective overview of what is possible.

TopPresentaties

I haven’t blogging over my personal game projects for a while. Those who follow me over at twitter can see the long pauses between posts. And if you read about the business opportunities I am exploring, you might to come to think that creating games isn’t my passion anymore. But at the same time gamefeelings.com starts like this:

gamefeelings.com first lines

It is this discrepancy, among others, that the Dutch marketeer ‘Patrick van Gils’ (from TopPresentaties.nl) pointed out and tried to help me make more sense of it.

I learned this during an online training ‘Pitching and Presenting’ that was hosted by Qcredits. A quick insight into Qredits: I have a loan at this company. They provide government backed (EU) funding for starters, and their goal is to help you get a stable company running. To achieve this, they providing free trainings (currently online) and also provide a coaching service.

Back to the subject at hand. I was in this training together with 7 other attendees, and this Patrick held this amazing presentation. Without slides of course. And with a lot of questions involving us, the attendees, but always in control of where to go next. This guy was a living and breathing example of his profession.

His 2.5 hour presentation was already too short to get all his messages across. So me trying to sum this up in a few statements will fall short miles of his (even already limited) attempt. To help you better understand what to do if you want to do this yourself, I will show you the steps that I took myself.

  • It is all about introducing yourself efficiently. To do this, he gives you 6 points to work at to get a better introduction. Write it down each step.
  1. Who am I. (hint: present yourself as an A brand)
  2. What is it that I do. (hint: get it to 1 or 2 words)
  3. Who are my buyers. (hint: who do you aim at, 3 activities you do, the thing you solve for them)
  4. What are my questions. (hint: always ask something)
  5. What is their response to my service. (hint: pain, medicine, gain)
  6. How to get the message across. (hint: passionate)
  • A thing about introductions. If you are going to take 1 hour of time, give a proportional introduction of 5 minutes. If you are meeting someone for a few minutes, give a proportional introduction of 3 sentences. But ALWAYS reserve some time to introduce yourself. It is needed to establish a trust relationship between humans. It will massively enhance the effect of your talk if people know where you are coming from.
  • A thing about presenting online in services like Zoom, Teams and Meets: while speaking look at the CAMERA (not at the screen), position yourself well so that you are near to the camera and your eyes are at 1/3 from the top (2/3 from the bottom), make sure everyone sees the one talking by having them pin the main guy/girl talking, don’t use slides because they will hide yourself and a lot of the message is in the words (if you are doing this right) not in the presentation, ask everyone to have their camera and mic on all the time (so they have to pay attention).

This is what I got:

  1. Who am I
    I am Erik de Roos from Erik de Roos Software. I build good software and give good advice. (His comment on this was: elaborate on ‘good’, choose 2 other words that better describes why it is good. And get ‘game’ in, you need to add this. Even if you are still switching to it, you still need to get jobs in it to get proficient at it.)
  2. What is it that I do
    The trick here is to get more compact. 1 word that makes it clear: programmer. 1 word that makes it attractive: passionate. (His comment on this was: get back to ‘software engineer’ that is a more common word for the services you provide.) So I replied with: I am an expert and passionate software engineer. (His comment was: don’t call yourself expert. But my reply was: I build software professionally for 10 years now. And he was like: ah yeah that is something you should emphasize then. And everyone has the notion of an expert having at least 10 years under their belt.)
  3. Who are my buyers
    I help companies with custom software solutions, I aim at companies that need custom software solutions.
    I solve scalability, performance and complexity issues.
    (His comment was: that ‘custom’ one is a really really good addition there. It helps in defining your area of expertise, your value, and it will be immediately clear to the customer if you are a fit.)
  4. What are my questions
    This point is more about education me, the business owner, that I need to listen carefully to how people react to my questions. If I ask the right question, the answer of the client will tell more than just the plain answer. It will tell about their frame of thoughts. And this can then be a hook, where you use their frame to ask about how you could be of help. This will massively increase success because you are into their familiarity by using their frame.
    A think I could ask to start: how satisfied are you about …? (your software development process, the game ‘age of empires’, etc)
    A few things that I could ask at the end of a (sales oriented) conversation: how did this conversation go (we just had)? What appealed to you the most? What do you think of it?
    And even if I can’t sell my product to them, I could ask if they know someone that would benefit from my services. And then continue: keep that person in mind, how would he/she benefit from my services?
    It is all about the information that is in the reply to a question.
  5. What is their response to my service
    Part 1, the pain: At the companies I work for I see that their software gets more complex without it solving that much more of their problems, and with that adding more functionality becomes even harder.
    Part 2, the medicine: That is why I offer to give insights, make the (hard) decisions needed, and actively solve the problem.
    Part 3, the gain: Work faster, work smarter, and have happier colleague’s. (His comment: Use -er words here like happier.)
  6. How to get the message across
    In this part Patrick challenged us to get up to the mic and sell ourselves. So this is what I came up with:
    Hi I am Erik de Roos from GameFeelings.
    Faster, smarter, happier.
    Let me explain: I have 10 years of experience as a software engineer. And I see at my clients the recurring issue of their software getting more complex without really solving that more issues. So that is why I offer to give insights, make the decisions needed, and actively work myself at solving the real issues at hand.
    Because of this you can work — faster — again, is maintenance — easier –, and are the other employees — happier — with their working environment.
    Is there someone in the room here that needs custom software?
    (His comment was: that was a really good introduction. It had everything in it. You looked at the camera, talked enthusiastic. One thing you could add to it, is to append to the question: ‘or knows someone’)

My wish for you, my reader, is to be inspired by this and evaluate your own introductions. Even if you aren’t an entrepreneur, you could benefit from this in a normal company environment where you are introduced to someone new. Be honest, be personal, get the needed information over across to get a good impression about you and your services.

So back to the question I proposed earlier: where does this all fit into GameFeelings? Gamedev? Blogs? Am I going full software dev?

I have to change some introduction on gamefeelings.com. That is for sure. It is too much focused on the games itself, rather than the process of building them. The main thing I provide on this website is insights in building (game) software and running a business. This website has become less of a place to promote my own games or talk about them.

But I was, I am and I remain a software engineer. And my main service is to build software. I am switching this to be more into the game development domain, like the games, their back-end network services, their tools, the game development process itself. But both business software dev and game software dev go together if I keep emphasizing my own take at this:

a passionate expert custom (game) software engineer, out to help others get faster, smarter, happier.

More projects

With me spending more time on helping others and (re)defining my own strengths and weaknesses, I get idea’s about how to further improve my portfolio of services.

I do need to think about it some more. But I have had thoughts of setting up a fully automated mentoring website or app to get people to build software more easily.

Mentoring is currently available on a personal level and I think that is of so much value that everyone should have access to it. But there aren’t that much mentors to go around, there services aren’t cheap, and there is a high barrier of entry.

The emphasis is on mentoring, because I think the hard part in (software/game) product development isn’t so much about how to learn to code but more about the struggles you face once you need to make decisions. Or when you feel you are getting stuck, demotivated, time plans don’t work out, people seems to ignore you, things like that.

But first I want to finish my other game projects. After I have gathered some more money to pay for them. Hehehe.

22 – Business as usual

A new project, kids @ home due to COVID: business as usual.

Enjoy the read!

Rework on Find the Gnome

First I will share with you some juicy screenshots of my work. Here I am reworking a level on Find the Gnome.

Rework in progress on Find the Gnome

In the past months I did a lot of remodeling to create new low-poly model replacements for the original models. Here you can see the old and new vegetation side by side. As you can see I need to adjust a few of them to increase their size, but other than that I am pleased with the results so far.

Gun model improvements for Manage the Universe

I am not working on Manage the Universe currently, and I use this to look at it from a distance. One specific thing I want to decide on before continuing is the art style.

So when my daughter asked to join her with drawing, I happily accepted it and took it as an opportunity to experiment.

Experimenting on Manage the Universe

There are a few things to notice here:

  • Unit types: I am thinking about how to create more units without having to create models from scratch. Giving factions 1 base type and then create a few variations, is a thing common in other franchises. The hover boat would be one base type, that walker with the external control pod on top would be another base type. Same goes for giving factions ‘preferred’ gun types, like rocket based vs laser based.
  • Adding details to units: I created a hover boat but I am not satisfied. The current model feels lifeless and rough. So I added the green stripes, those would be ‘radiating’ light. And I added a few ventilation panels on the side. And I worked the wings open, like wings present in the old Lego sets. Same goes for the turret’s hull, there I added a few nuts and bolts to give it an interesting shape.
  • Gun types: with the idea of having base units came the idea of having base gun types for factions. If they have rockets on their units, they should have rockets on their ships. And these models should look and operate alike. I am not totally sure yet because this will probably make the factions a-symmetric, but I could counter that by having faction specifics while also providing some generic guns and unit models.
  • Adding details to guns: inspired by the Star Wars franchise and the game Forts, I tried to create a few interesting gun barrels that had more to them than just being sticks that point to the sky. Moving parts, visible internals, interesting shapes, outside wiring/tubing, heavy muzzle flash effects and of course totally different types (laser, rocket, gun/mass, fluid).

New projects

Creating new projects is a healthy entrepreneurial practice. So when people come to me with a project they like themselves, I always listen. If their project resonates with my own capabilities and my own vision of my future, I will gladly join their efforts.

I can’t talk much about the specifics yet (because these idea’s aren’t mine to share) but I can share a few details on how I handle requests like this.

  1. I like talking about random stuff, and I like to solve problems. So I have always time to talk about an idea.
  2. When I talk with someone about their idea’s, I understand that us talking is already valuable for both of us. I get inspired, they can sort out their thoughts and reflect on it. Because of this I feel no pressure to actually do something with their requests, I already helped them by listening.
  3. While talking I use my work-structuring skills to help them get to the core of their issue. This is always a healthy balance of empathetic listening and technical checks. You could argue that there needs to be listening only, but there is a reason people get to me the engineer: they understand that their vision on the subject is limited and just want to know if it has a chance of succeeding or not. The sooner I point out issues the better.
  4. When pointing out issues, I always offer alternatives. I have very diverse interests and a very diverse knowledge base, and I use this to our both’s advantage. I just as much want their idea to succeed as they do: I know how hard it is to bang your head against the wall trying to make something work. Our combined experiences can make from 1 + 1 = 3.
  5. And then, when it is clear what the root issue is that needs solving, I have to find out if giving it my time makes a difference.
  6. If that is the case, I have to decide if I like this type of work (short time benefits) and where this gets me in life (the long run benefits).

The funny thing is that my available time and the costs of this all is not in this equation. That is because this early on it is much more about being smart and to try out some key concepts, and those require much and much less time than the creation of the ‘actual’ product. Later, when things are validated, it is clear what the actual benefits are so the justification of time and effort can be made.

2020, A very fruitful year

2020 was for me a very rewarding year. I started freelancing on the 1st of January, and tried to pursue both a career in Game Dev and Software Dev at the same time.

This blog is a look-back at what 2020 has brought me and has taught me.

Where to start

I had this idea in my head that the game development scene needed someone like me because there were some apparent issues with working conditions, and I could be of help with my knowledge from software development. So I did some initial market research in November and December of 2019, and continued in January 2020. I tried to position myself as an independent researcher and journalist.

This continued through January and a bit of February. I attended a game jam, got to a game dev conference and attended 2 game dev meetups. I wrote a few articles on my blog. And I met a lot of people during this time and talked with them about game dev.

However I learned quickly that I was completely wrong. First of all, I want to be a business and needed to make money. That is very hard with research and journalism, it is a difficult product to sell. On top of that, to be good at it I needed to have experience and I very much lacked actual experience with the industry working condition issues and writing about it. Making it worse, it turned out the issue wasn’t that common especially in the Netherlands with our work culture here.

So: there was no real issue (here in the Netherlands at least), I didn’t know what I was talking about or what I needed to look for (lacking experience and connections), and it turned out to be the most difficult way to possibly make money of game dev.

On to: Plan B

When I started with GameFeelings, I already had planned to work 24 to 32 hours a week on software dev. At least for 3 years, until I had enough customers in freelance game dev to provide services to.

I landed a job with Strukton (through an intermediary) and enjoyed my work there as a backend software development specialist. It made good money, my first actual hard earned money as ‘a company’ of my own.

This ended abruptly by a let-go due to COVID hitting the streets. They had planned to utilize me for at least 2 months longer, but since they did not know what was coming at them they closed all flex contracts.

Renewed: Plan A

While working for Strukton I concluded that while the research wasn’t a good plan I really did want to do actual game dev work. Strukton was ‘just sofware dev’ and I have been doing this for the last 10 years already. This was not my idea of how I wanted to fill my time while freelancing.

So this brought me to Escaperoom 071. They needed someone cheap but with game dev experience and knows about how to make a multiplayer game.

I was really exited: within 5 months of my freelancing I landed my first actual game dev job, that I personally acquired by looking at the right places and talking to the right people.

My first ‘own’ freelance job turned out to be a massive learning however. It was organized very amateurishly, but nonetheless I really enjoyed working on ‘an actual game’. I had organized the contracts very badly so there was no real money to be made, but I was able to contain the damage and get away.

While working on this game dev I concluded that I had made substantially easier money with software dev. So much actually that I was able to live the whole year together with my wife and kids while my wife worked part time. We had to carefully look at our expenses, but that was totally worth it. We both enjoyed my newly owned freedom and that I had the ability to do whatever I wanted.

Back to: Plan A

With COVID really hitting hard, even the software dev turned out to be having a difficult time. In all kinds of business the freelancers where the ones that had to search for new opportunities, so the market became very crowded very quickly. With that, hourly prices fell at least 15% and the working conditions became much more requiring.

I did not want to work 40 hours a week again (for a contractor). I wanted to do this 24 to 32 hours max per week. And do short, max 3 months, contracts. But the market said ‘nope’.

So I concluded that I would be better off working on my own games. It was sure to make me more happy: better working hours, working on games, and being my own boss.

Happy times

While working on my own games I lived the best times of 2020. While everyone was experiencing a rough year due to COVID including me, I at least had something to look forward to every day.

I started the year working on a small project with Bart. That quickly turned out to be too difficult to continue due to the whole COVID thing and personal energy levels. So i put this project on the shelf again.

I started working on a new game idea of my own. However it turned out to be very difficult to start a game project. Especially since I wanted to do it professionally and make money out of it, I had to take it serious. I think I overdid the seriousness part there, because it caused a lot of stress. Thankfully, I ended up accepting that I only could give so much and that my efforts where sufficient.

During the work on the various game related things I was a bit stressed but I thoroughly enjoyed the experience. I could do whatever I wanted, whenever I wanted. And I could spend time with my family whenever I deemed necessary.

With my wife working as a nurse at the hospitals lung ward, there was much more pressure on her to deliver due to COVID. So I was happy that I could ease the burden and could actually ‘assist with something’ during this whole COVID thing.

All in all I think I am made for building software and are extra motivated by the software being games… at the only requirement of being in control of my own life and spending time with my family.

Aaaaand, back to: Plan B

But with the end of the year approaching, the COVID thing became a dark cloud on the horizon again. This time however the money had dried up and I needed to get a new job before February 2021.

I really did not want to work for a boss again if things didn’t work out in February 2021, so I was extra motivated to look for alternatives. The hourly rate I received while working for Strukton was a very good pay, but I learned during the months living off my savings that I needed a lot less. Another thing I had learned, was that I have very valuable experience in software dev that is worth a lot more money per hour than my game dev experience.

So I turned to the worldwide market to land a software dev contract myself, on my own turns. And that turned out to be waaaay more easy than I thought it would be. I got a contract at Tevent for a reasonable hourly pay, fully remote work, flexible hours, and only a minimum of 25 hours/week.

And that was the end of 2020! Happy new year everybody!

2020 In numbers

I like numbers, here are a few numbers of GameFeelings in 2020.

I did log 304 days of work:

  • 6% writing articles
  • 6% traveling and commuting
  • 8% of administrative tasks like logging hours, planning, and setting up and changing my work place
  • 11% talking to recruiters and doing all kinds of marketing for game dev
  • 33% worked on my own projects
  • 36% worked for clients

I started 12 of my own projects. Cancelled 8 of them. Completed 1. And 3 are still ongoing.

I attended 1 game development conference. I joined 1 game jam.

I release 1 game to 2 platforms. This game is ‘Gearful’. It was played 54 times on Itch.io and installed 5 times on Android.

‘Find the Gnome’ still sold some units, around 25. And I got 50 wishlist’s for it.

My Gamefeelings.com website: 863 visitors, 1615 views. I made 33 posts with 19,689 words in total.

My best content: The Jenkins Unity 3D CI/CD article with 207 views (released in January) with attached video, seconded by the same content but then applied to Azure DevOps with 147 views (released in August). Their YouTube statistics: Jenkins had 948 views with 3998 previews and 66 hours of content watched with a click-through of 13,3%, DevOps had 338 views with 1225 previews and 30,4 hours of content watched and a click-through of 8,2%.

Summary of my learnings

There are a few things I learned I want to share with you. I tell them from my perspective, but maybe it resonates with you. Think of your own learnings and accomplishments of 2020: even with the COVID disaster, 2020 was not a lost year.

  • Family: to have a place to call home, to be able to reside in it/with them for days even when in lock-down, that is something to cherish. I started to like my kids and wife even more for who they are.
  • Having my own business: I really like the business side, being my own boss.
  • Working on my own: I need other people around me, to stay mentally healthy and to let them do the work I am not good at. For instance, hiring a bookkeeper was one of my best decisions and worth every penny.
  • Constant change of plans: It caused a lot of headache, but it lead me down the way of the least resistance. It learned me to let go of control, trust my own skills, and make more of the here-and-now.
  • Inventing games: I don’t have to overdo it, I just need to make sure I can feed my family while I enjoy creating games. I will eventually get better at my craft, just have to give it time.
  • Software dev: I am good at my craft, enjoy it, and can make good money with it. So I should continue doing this kind of work.
  • Research and journalism: I don’t think this is my calling…
  • Writing blogs: fun thing to do, really resonates with my way of thinking and structuring my thoughts. And it makes sure I stay on track with game dev and deliver something interesting every 2 weeks.
  • Making YouTube video’s about development: very time consuming, but a good way to show off my skills and get people to know me.
  • Escaperoom 071 failure: It was no failure. I learned so much about communication and expectations. And how I could better trust my own gut feelings.
  • Part time work: there are very few companies that liked me working part time. Especially in software dev and game dev. If I want to work 24-32 hours a week on software dev, that is very hard to accomplish. More accepted is to work a few months full time on software dev, and than switch to full time game dev for a few months.
  • Remote work: There were few to none Dutch companies that allowed remote work, but that (luckily) changed a lot during COVID. Still, they insist on physical contact being the norm. However, I discovered that globally oriented companies are much more freely structured when it comes to working times and thus the feasibility of remote work.
  • Hours of work: I am a person that is easily exhausted by my work. 5 hours of work a day seems to be the max. While I can be available 8 hours on-site I always tend to work max 5 hours efficiently. While writing my own hours I am very strict in only writing what I actually work. But you could argue that this is equal to 8 hours of work for other people.

So, I am still searching for my place in all of game dev. But after one hell of a year, I am still in business with a healthy projection for the future. That alone is something I can be proud of.

21 – Other business

I have spend the past week working for the company ‘Tevent‘. They are a startup company based in the UK, currently in their first funding round and making an MVP. They are a platform for organizing events / conferences, but provide this completely online:

tevent.com

A new contract

With me working for them as a Freelance (business) software developer, I am able to fund my game development efforts.

I am very happy with this contract. They allow me to work on my advances software development skills because they use the beautiful Microsoft Service Fabric platform. They are a tech savvy company. So there is much emphasis on the use of the latest code practices, for instance next level C# 9 features.

My local development Service Fabric cluster

I love Gigs

In the weeks preceding this contract I had to work tirelessly to get a new contract. I tried a lot of my known contacts with software developers in the Netherlands but that did not work out. Eventually I got my ‘gig’ accounts up n running again on platforms like Upwork and Fiverr, and there I had more success.

These international gigs nets me less revenue than the usual ‘local’ contracts, but they are much more flexible and way more suited for remote work. I like these international contracts, they suit my needs much better.

Back to game development

So when will I get back to development on my games? Well, it depends on two factors: 1) I have to replenish my financial buffers, and 2) Tevent has yet to launch their platform, so there is pressure to deliver.

I think I will be able to squeeze a few hours per week in when I am fully up to speed, probably end December. It always takes me a few weeks to acclimate and get my schedule aligned. And there are a lot of holidays in December with a lot of (exhausting) social stuff happening.

So, stay tuned! See you next week.