32 Farm level design

Today I give a peek at how I approach level designs.

Also, someone joined in to help me with the level designs! Stay tuned to see who is helping me out…

Video

No game-play fragments this time. Next blog will probably have one again.

Level design

I always start out with drawing stuff on my whiteboards. Level 1 (mansion) is from the ‘original’ Find the Gnome. As is level 4 (village). But I want some levels in between that fit the vibe. And to get more usage out of my models of course. So that is why I came up with a farm level and a log cabin level.

The farm level was the easiest to draw. My parents in law live in the Dutch country side and we visit them often, so I have a lot of memories of scenery during the travel to draw inspiration from.

Next is to get it into the scenes using a few raw shapes. The model of the farm house is a re-use of the one in level 4 (village), so that’s an easy start.

But for this level to really come to life, I do need a few models I don’t have yet. I need a wire fence and something to emphasize the dirt field.

Then I moved in a lot of the more detailed models to get a better feel of the level size and its potential:

I hoped to have this level finished by here. But this sadly far from ready.

  • I have to add a lot (more) of interactive elements like hiding places.
  • I want to model a new fitting fence door for the wire fence.
  • I want cows that walk around as mobile ‘obfuscation’ spots.
  • I want to add gnomes that work with ‘obfuscation’ spots instead of ‘real hiding’.
  • I have to split the level up in sections that unlock in an interesting pattern.
  • And of course the ‘default’ stuff as in: the objectives and the gnome placements.

So yeah, that is me being a perfectionist. I want the levels to be fun to do, to come back to trying out new strategies, or just to enjoy the scenery. And that requires multiple iterations (and always more time than anticipated).

Help

You probably guessed it right: Roan (my son) is helping me out.

He already likes to create custom levels for the games he plays. He is my main tester. And he wants to have more things to test (I basically have to up the pacing lol)

So 1 and 1 is 3 is this instance. Here he is working alongside me:

That was it folks. Thanks for the read and: See you again in 2 weeks!

31 At work

First a shout-out to Jonathan: Stay strong!

Last 2 weeks I have created this fancy pancy Unity build to Steam pipeline. Finally, the whole pipe is now ready! So easy to get new updates to Steam now.

And I did some small updates to Find the Gnome itself, like an improved UI.

Find the Gnome – Update

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

While the past 2 weeks didn’t add that much functionality, the last video was from 4 weeks ago. So now I can show a lot of improvements like: improved UI, sounds, and the tutorial puzzle level!

New pipeline

I am so happy with my new release pipe. It now builds a QA version (with debug interface), 1 ‘production’ version for 3 targets (PC, Mac, Linux), and uploads this all to Steam.

Find the Gnome improved build pipe

There are still a few things on my wishlist to add to this pipe. But for now this is sufficient. Its pushing the content to my ‘beta’ channel on Steam and that is what matters the most!

Upcoming Unity to Steam CI/CD pipe video

I am working on a video of this pipe. I know a lot of people get onto my website because of the Unity –> Jenkins or Unity –> Azure DevOps video’s I made. And I like tinkering with this CI/CD stuff, so helping you all out with making a video of it is something I really like to do.

Previously I created big video’s like this in 2 or 3 consecutive days with 8 to 10 hours of work going into it. I am not that good in writing a good script, video editing and voice overs. This always felt like moving a mountain.

This time I want to do it in little pieces at a time. Getting a game out and working on my consultancy job is prio 1 for me, producing a CI/CD video is secondary. With this new approach I hope to make it more for for me and at the same time make it so I can stay producing Find the Gnome content at the same time time.

The result is that the video will now take a few weeks to make, but that is only good because its production quality will be a lot better and more consistent without the time pressure.

30 Change of pace

I am switching from consultancy job because of an opportunity that opened up.

At the same time, I have prepared for this so Find the Gnome is in a good place now to work part time on it.

Blast from the past

This is me, doing a vlog in 2018 on my first Find the Gnome game (on my old channel). Always nice to see old stuff, think about the progress I have made since then and the learnings I have had.

A new contracted job

I have a new contracted job starting this week at Topicus in the Netherlands. I planned for this, to keep the money coming in so I can stay developing my games. I will keep working on Find the Gnome part time.

Because I new this new job was coming, I have emphasized certain tasks on the rework on Find the Gnome. This was what I was doing most of the time in the past 4 weeks.

Find the Gnome is now in a good place where the most difficult parts have been sorted out. Most of the mechanics are sorted out, working technically and balanced in the gameplay. I have practiced my asset pipe so I know can easily put out more content, while at the same time work on my other job.

Back to that job. I am looking forward to it. It is close by (a 30 min drive), so I will be partly working on site. I will be enjoying the live presence of colleague’s again. That on itself is a reason for me to enjoy this new opportunity!

Find the Gnome

So, where is Find the Gnome currently at?

It is currently OK-ish. You can find and catch gnomes, unlock stuff in the level, have required and optional objectives. Sound and music is still very early with being worked on, and same for the HUD/UI.

The gameplay is fun but short. It is in dire need of more levels and more variation. But that was exactly where I wanted the game to be: polished gameplay, ready to add more content.

To give you an idea what I currently have:

  • 2 levels: 1 tutorial level, 1 ‘normal’ level
  • These levels feature:
    • 3 different hiding place models
    • 2 additional interactive models
    • 6 non interactive environment prop models
    • 3 ground tile models (excluding the variations)
    • the ‘normal’ level has 10 gnomes to find, 3 Required and 1 optional objectives
    • 4 different interaction sounds (excluding the variations)
  • 1 type of gnome

In addition, I already have 8 additional environment prop models (excluding the variations). I have 2 additional ground tile models (excluding the variations). I have 1 additional level fully prototyped but not with final models. I am working on 1 additional distinct gnome type behavior.

If I look at competitors, it is important to have object variation. They don’t have that much interaction variation. I do have a lot of variation for my starting scenes objects already, but I personally do like it to be even more, to add replay-ability to earlier scenes. And I definitely want to have more interaction variation, to get more out of each level.

And I have a good functioning CI/CD pipe, but its delivering up to test currently. I am working on adding automatic deployment to Steam. I hoped to fix this also in the past weeks but that task was a bit more difficult than anticipated. When this is ready, I will probably be releasing another video on this subject (CI/CD with Unity and Azure DevOps).

I think Find the Gnome is in a good place currently. Still needs a minimum of 6 weeks of part time work to get it up to quality for a beta release on Steam. But that was expected.

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.