Harvy Tile, a creation of Ludum Dare



My first blog post ever, or... no, that is not 100 percent true. I had to follow up some small blogs, mainly related to sport clubs I volunteered in. Maybe that is the reason why I put writing about my experience off for so long? Or is it because everyones work seems so great? Or the scaring fact that those words may be forever part of the internet?  Isn't it very cringe and what if someone I know sees it? Whatever it is, I am gonna try it for this new project Harvy Tile. So let's talk about January and ludum dare. 

Ludum dare

Harvy Tile (which is still a name in progress) started with the unforgivable truth that I did not finish any game project last year. It does not mean I have not worked on any project, but the two or three main projects were scrapped or "postponed". Postponed because I had absolutely no idea where I was heading with the game. But I still like the fantasy of the game and my best friend is still waiting for a full version of the game. So at some point, that game will return. 

I explained to a colleague that I really wanted to finish a game in 2022 otherwise I would feel less of a game developer. Sadly enough, the game became part of my unfinished projects pile. So to start 2023 the right way, I decided to do a game jam as soon as possible! A "finished" product is delivered at the end of it and it was my luck that ludum dare decided to do a jam in January.  It was the first time I participated in a game jam with a ranking.  I just had this heavy debate with myself if I would go compo or jam, since I only had two or three hours on Monday to work on the game. 

The main menu

The main menu used the same system as freeform to create the world on the right.

In the end, I decided to go for the jam and I am glad I did. In the weekend, I was having a randomly generated world where you could match the tiles. And although it was fun, it was unfair as well. In addition, it did not give the player any challenge. So on Monday, I started to create three little levels. It became a puzzle game with premade levels where you should match all tiles with at least one tile of the same kind. A little bit like a match-3 game, but the tiles are kept in the game. They just become unmovable. I believe this little change made the game actually interesting and give me the spot on the rank that I was aiming for. Is it wrong to aim for the middle of the pack? I do not think so... It was a learning experience.

In the end, I worked too much on optimizing the game. In the version that is online now, it was still not perfect. In my first version of the game, the "freeform" version, all tiles are spawned at the same time. 625 tiles to be exact. All those tiles had to undergo several loops when spawning in to check if the tiles next to them were the tiles were the same type. Almost every tile has 6 other neighbors, meaning there were 3750 operations done just by the tiles in addition to the creation of the world. Lastly, they all had an animation done by coding where they went upward to the position where they have to be. In other words, a lot was happening and the game froze. 

A level in freeform mode

A level in freeform mode

I fixed it by spreading the creation of the tiles over multiple frames. The game would only create twenty tiles each frame and thus the game did not freeze. But ofcourse, you saw the creation of the tiles. To prevent this, I made a quick loadscreen. In the end... this was all for nothing for the jam. The levels loaded much more quickly and the problem was gone. The main menu had the same problem, because I used the same script. I could have prevented this by just not using it and making the main menu more plain. In the end, I should have experimented quicker with making levels. I would have had more content and could have explored more ideas like specialized tiles and a proper win screen. This might have given me an even better score. 

But again, I am quite happy with where I landed in the ranking. All my scores were above three stars and I ended 458th place overall. There are just two very noticeable things on my scores. I ended 295th on audio (3.3/5), which is like suprising. I am even suprised I had a score higher than three on it. The second suprising rank is innovation (place 271, score 3.5). But in the end, I can only be happy about the 3.7 for graphics since I am almost never happy with the graphics I make on my own. Over the past years, I just learned I should stick with simple graphics. If I want to model a human, I still have a long way to go (so let's stick by two cubes on each other). 


Post Ludum Dare

So I decided to keep on going with this game. There are two reasons why I want to actually finish this game:

  • Firstly, it is doable. In the end, the game is playable and all extra content is just extra. 
  • Secondly, I really want to have a game on a mobile device and this seems like a game that is possible on a telephone. 

Do I expect to make millions with this game? No of course not. I am not even expecting to make a hundred. I am going for one euro. I just want to have the experience to really go for a project from start to finish, everything included. Developing, making art decisions, having respectable music and sound, but also marketing, a development plan, coordinated testing. A true learning experience. In the end, I am already convinced I can create a game. Doing multiple things might even help to keep going, since I am not only coding or feeling bad about my art. 

But since ludum dare, three respectable weeks have passed. I try to work on game related stuff for ten hours a week (Not counting the time I am writing this blog). I believe that is actually doable without getting burned out. But that also means, there is already thirty hours of work after the game jam that have passed. What do I have to show for it? 

I try to plan my work in weeks. Mostly there is one big topic each week and some smaller ones.

The first week: make millions

Let's start with week 1, the week where I believed this game would make me millions and I wanted to create a leveldesigner. Oh, I was ambitious because it would make it possible to have an infinite amount of levels and making my own levels would become easier. Luckily, I came quickly to my senses that this might be a bit... overkill. To create this leveldesigner I had to start by knowing how I would save each level. This way the leveldesigner could save the level and the game could load this levels. In the end, it was the only part I did for the level designer. If I wanted to introduce a level designer, I could create it based on this principles. For now, it is easy enough to create the levels using gdscript. 

I decided to create a scene where I can test a current level in development.  I gave every tile a specific number based on an enum. The gdscript just stores a 11x11 array of tilenumbers. I just run the editor and load up the testlevel to see the result I made. If I am not happy I change the array and restart the game and can test the level again. As long as I do not complete the level, the game won't crash, haha. So to celebrate the fact that I created a solvable puzzle, the game crashes. Luckily, the player will never see this screen. 

When the level is created I just put it in the leveldesigner scene and change some variables like levelname, difficulty, possible scores and run the leveldesigner scene. This scene just shows the level in terrible lighning, but saves all those variables in a JSON. This JSON is then loaded by the scene where levels are loaded and bam, working levels. This might not be the most perfect solution, but he, it works. It just feels very basic and is done exactly as in the documentation.

The second week: making levels finishable

The second week was all about finishing a level. Saving your progress, being able to start a specific level, saving the music settings (so you do not have to turn it off each time you start up the game) and some changes to how points are calculated. It was all just about "being able to finish the game over multiple runs". 


The third week: the Gradle problem

In the third and last week, it was all about testing. I wanted to be able to let my friends and family easily test the game. In other words, I had to find out how I could distribute to both IOS and Android. Ofcourse I reached some bumps along the way, but nothing that was unsolvable. The main problem I had was for android.  Although exporting to android from Godot seems better documented than Iphone, I might be bad at just reading documentation. I just try. Those were my problems exporting to android.

Firstly, it seemed I needed an .aab file instead of an .apk file and I could not find how I went from .apk to .aab in android studio. So I found out you can export .aab files from Godot, but you need something called Gradle for this. Godot installs this little tool of wonders in your project when installing the android template. Great! Everything will be great! Ofcourse not... 

The gradle gave bugs and mainly the following: "Unsupported class file major version 63". We know what to do... Google is your best friend in this case and I learned I could not use java 8 with gradle. I am not a developer by nature, so I do not understand why they just give me java 8 when I want to download java. There is even a version 19... But ofcourse java version 19 is also not supported for Gradle. It seems you need version 11 for Gradle in Godot. Take the version that is set in the Gradle file "config.gradle" in the Android directory of your project. And just to let me remember it for the next time I want to build the .aab file... You can change the active java version, but this might have reset itself after a reboot. Great... 


But in the end... ofcourse... this was not the only problem with the Gradle. I kept having this error and I had no clue how to fix it. I might have looked badly, but it was quite hard to find the answer for Godot. If you still have the errormessage, try opening the gradle files in android studio. I think it is the settings.gradle that you have to open. For some reason, this fixes it... Someone might know why, but I am just, "thingie works now so that is good". Hopefully this might be interesting for someone out there, but then they have to easily find those paragraphs in this whole blogpost. 

For this week (Week 5 ending on 5/FEB/23) I am hoping to be able to add some analytics to my game. I would love to see how players are behaving in game. How many times do they have to retry a level? How many points do they get? It is very interesting to see this, just as it is to see people play levels. It is just weird how some people can complete a level in one shot and others keep getting themselves stuck.

I think that mostly sums it up for Januari. We will see how long I can keep those blogpost running. Maybe we will find a rhythm to write them. I have the feeling this development log is more about spilling my feelings than actually telling how I accomplished something. At least you might learn something and if it would be helpful to anyone trying to export the .aab file, I am quite happy. But I am quite sure that I will cringe when I would read this. I never saw me as a blogpost writer. 

Get Harvy Tile

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.