Like many devs, I started a few projects. And like many devs, I never really finished them. My self made website CMS? There’s no admin panel. Once the front was done, I just started editing the tables using phpMyAdmin.
My shitty idle game? It was stuck on version 0.11 with 7 half-finished, or not even started, features. Or the insanely terrible 3D weekend game challenge.
But that 3D project gave me an idea.
The basic capsule shape with the weird texture looked like a cactus to me — with enough fantasy at least. How about honouring that cactus, and make it into an actual game?
The 3D version didn’t work well, so how about a 2D platformer?
Climbing up and up, evading deadly enemies, swinging on ropes!
I instantly started with some character sketches.
It had to be a cactus. I already wondered how many people would question the jump abilities of a cactus though. Quickly I set up a unity project and started working.
The initial cactus design looked terrible in unity, quite a disappointment. So I created a smaller one, but tried to keep at least the “facial expression”.
But I really wanted to keep the big design for something.
When I came across the 2D Animation Humble Bundle, I knew what I had to do. It was so obvious: A game needs videos! So without thinking, I bought it. It wasn’t as useful as I hoped, and probably a waste of money, as there are open source, or at least free, animation solutions out there. But it resulted in a nice, according to my standards, intro video.
When I finished the video after hours and hours of work, I felt like I was missing something. The game for the video! After setting up the unity project and creating a smaller character, I had done nothing.
No gameplay, no menu — just emptiness.
I decided to scrap some features I had imagined.
Just getting the base gameplay down.
Jumping and platforms.
I started with the jumping.
The GDC talk on jumps made me create my own jumping physics.
I even redid all the math, because I needed it in my own notation.
By now I believe, I should have stuck with unity mechanics, but I thought I had to do it manually.
Implementing the jump and movement created a lot of problems later on, without much of a payoff: I couldn’t use many unity provided helpers, but had to solve most of the problems (e.g., getting stuck in platforms, not correctly using normals and more).
But in the end, it worked somewhat as I expected: I could set jump height and length, or duration, and have a jump with those properties, which came in useful much later on platform generation.
Creating platforms took quite a lot of trial and error until I found some that didn’t look completely terrible.
Originally I wanted to scale the platforms during the level.
This turned out to be much harder than I expected.
Getting the tiles correctly was the easy part, but the level generation was tricky.
At first, I just created 4 platforms on each plane with random distances from each other.
They mostly clipped into each other.
I created an array of distance ratios of the game width, which summed up to 1 when including the width of the platforms. While that fixed the clipping, the level was extremely boring. Each layer was at roughly the maximum jump strength from the last and everything looked very uniform.
I needed a better level generator.
So I wrote down all the constraints I had.
Most of them based on the jump properties, but also the width and height of the platform.
I made many many miscalculations, forgot as many details as I remembered, but in the end it… kinda worked.
Let’s say it was better than the previous one and actually playable. I looked upon the game, and felt a little proud, but also that it was terrible.
I had two friends play the game (shoutout to Lazitus and Gariot, your suffering won’t be forgotten).
The worst bug was: Getting stuck in clouds, helplessly moving around.
Unless you let go of the controls, then it would magically move you upwards! At least it wasn’t game-breaking. I tried a lot of things. I came across Platform Effector 2D and noticed: unity had what i needed. Platform effectors modify the behaviour of collisions with platforms, e.g., allows a character to jump through from one side!
Remember when I said it was a mistake to implement the movement myself?
Those don’t work if you do this. I tried implementing them myself, and it mostly worked. And by that, I mean: I could do as much as before, but still had the bug if the angle of collision was too low. So I scrapped all the complicated code, and used my simple version again, but put in more margin of safety and it mostly worked as well.
Finally a finished game!
Unless you count having a UI instead of just an endless level. Then it was unpolished and unusable! As I wanted to do everything myself, I created some UI sketches, which I then made into UI elements.
I had to build my own ring indicator and combined upgrade elements, but I didn’t have upgrades yet anyways, so I didn’t put too much thought into it. Maybe I should have.
One of my design goals was being able to use it without any language, so everyone that would like to play it, could do so.
Mostly because I didn’t think there were more than 1 interested players if I restricted it to any language — I did call it ‘Shitty Cactus’ after all.
I made up some rough ranges for upgrade ideas and tested them.
Jumping too high, would be detrimental, making it much harder.
The same for many others.
After some hours of playtesting, I came up with some values, split them and made up some costs. I linked everything in the UI and felt I was done.
But the game felt open ended and unsatisfactory.
I decided that the game needed an outro video.
It was easily created, if you disregard 10 hours of getting back into the animator software and failing to create anything in the way I imagined it.
But how and when to play the video?
I tested some more, and felt 1200 was a good height to unlock it. But unlocking it, and switching to the play scene, would kill the progress.
There’s a good and an easy solution to that! The good one, storing the state and being able to reload it. That would be useful in many other cases, too. Obviously I went with the easy one: Unlocking it, and you have to watch it in the main menu (or simply in the folder if you have the offline version).
Finally, I felt, I had a full game.
But now I wanted to feel like a real game dev, so I decided to publish the game on steam for fun. It was quite the interesting experience.
The requirements are easy: Pay 100$, fill out some tax forms, create lots of game art, have the shop page in “coming soon” mode for at least two weeks, and you get to release the game!
What steam doesn’t tell you: Once the shop page is online, you will get indie-game-marketing spam. It would have been nice, if they felt less than fully automated emails with a small placeholder for the game name. But that’s a lot to ask for such a small and terrible game.
Though, I didn’t take this too seriously, so I didn’t respond.
Instead, I gave my friends each a free key and one told me: “It would be cool to have leaderboards.” That was the day I realised: There are leaderboards on steam.
There is a nice implementation of the Steamworks steam SDK for C#, and therefore unity. It was especially easy to get into. Adding some statistics and leaderboards was covered by the example, so they could be added with little code.
It was already time for my first patch!
As they say: Never play on patch day — and I enforced that! I never set up the steam pipeline, instead I uploadzip archives of the game folder. Those get preprocessed by Steam and are then published to players.
This time, I zipped the folder. Not the contents. This made the game unplayable, as steam was configured to search “shitty cactus.exe” only in the root folder. Quickly I created a new patch and uploaded it, hoping none of my 3 players would notice — so I could tell them instead personally.
I worked so well, I started to look into steam achievements, the culmination of steam! It’s quite easy, if you base them on existing statistics.
When you do that, they get awarded automatically, once a statistic above the threshold is submitted.
Otherwise, you manually have to set the achievement from code.
I opted to include only easy achievements for now, and created seven of them: Reach some height or reach a set amount of coins. One achievement for height was masked as a “play at least once” achievement, by setting the required game to height. I included a “don’t forget to jump!” in the description.
Each achievement needs two pieces of art: Unlocked and not unlocked.
Turns out, greyed out achievements are only a recommendation for not yet unlocked achievements.
After setting them up and publishing the changes, they were live instantly.
It turned out, I only manged to get 3 out of 7, while a friend of mine and a reviewer from japan created highscores that felt insane to me.
Lastly, I wanted to try a feature of steam I didn’t know existed: Curator connect. You can send up to 5 keys to up to 100 curators and reviewers.
To be honest, I just randomly selected reviewers at first and wrote “don’t play it, I just wanted to try the feature”.
In the end, 10 people bought the game, and one actually played it. The best thing about all of this, was the feeling when that one guy, a person I don’t know personally, reviewed the game without even being asked to: “It’s aight”.
I was lowkey proud of it and created a short imgur post, which received the good amount of 12 upvotes.
I even linked to a temporary free download of the game (without steam features), because I felt like I am writing an advert, which I didn’t like.
I retracted the keys from the curators and wroter a nicer message this time, something like “Seems like the game is not as bad as I thought, it would be nice to get a review, thanks.” I guess in the end, if you want someone to play your game, you have to tell people. And people don’t like bad self degrading humor in advertisements and even less in call outs to reviewers. Maybe I should stop prefixing my game names with ‘Shitty’.
I continue to work on the game sometimes, currently I plan to add a leaderboard for shortest time to 1200, I want to try the steam sale feature, too. But I won’t do anything big with it.
Once I lose interest, I will put the whole project on github (probably august ’20 or later), but for now the repo is locked.
It’s not a great game, but it’s not terrible either.
Don’t make the mistakes I made, believe in your game if you want it to be a success — whatever that means to you.
But at least I can say: I shipped a game (and lost some money while doing it), which is a success in itself.
Good luck everyone!
(This is a replica of a Medium article I wrote earlier this year.)