back to main page

Harald Hopping Hare

Beating the highscore by climbing an endless growing plant

About the Game

Harald Hoping Hare was originally developed for a one-week game jam organized by the Zfx forum around Easter. I wanted to make a game with a stereotypical Easter look, with fresh spring colors and painted eggs. Since I did not have enough time to build many levels or add a proper story, I decided to make a highscore chase with procedurally generated stages. In my youth I really liked Icy Tower and I thought a very similar concept should work here as well: I cute little bunny (or a hare, to preserve the alliteration in the title ;) ) one day finds a magical plant the never stops growing. The goal of the game is now, to climb it as high as possible and to collect all the eggs on the way on order to gain extra points.

With increasing height, the jumps of course get harder: Leaves (that act as platforms in this game) are smaller, farther apart, and grow in odd angles. The plant will never stop growing, but at some point, the difficulty stops increasing, to ensure that it is always possible to get just a little bit higher. In practice however, a single play-through never takes more than a few minutes, since eventually everyone will commit some fatal mistake.

To make the game more engaging, there are two additional gameplay elements:

The player can collect carrots to charge the super jump. The super jump is either an extra high jump from the ground, or a double jump in the middle of the air, which is especially useful for recovering from a failed jump. In this way, the super jump acts a bit like an extra live, allowing the player to continue after an otherwise fatal mistake.

Some leaves (especially the ones higher up) also grow in an angle. If Harald runs up the slope, his jumps will be slightly higher, allowing him to reach leaves further away. This way, the way you jump from a leave matters and increases gameplay complexity without requirind extra keyes or moves.

The Plant

The most complex object in the game is the ever-growing magical plant. For an endless jumper like this, the level of course must be procedurally generated, so that it can be different for each run. Compared to the platforms in Icy-Tower, our leaves however cannog be simply placed completely randomly, because the plant should look organically grown. So on the one hand, leaves must be at a reasonable distance to the stem and on the other hand they need to be spread far enough apart to pose a proper challenge while still always being close enough to always remain reachable. Fulfilling all of these requirements at the same time was then one of the most challenging aspects of creating this game. The results can be seen here:

The growing Plant

Next to its final shape, the growth animation of the plant also should look at least somewhat convincing. Here we face another gameplay related challenge: The player should see the plant growing (meaning it cannot be fully grown from the beginning) while also always having another platform that is already there to plan the next jump. Thus, if the player approaches the top of the plant, it has to continue growing rapidly while it can grow much slower while the player is further down. This dynamic adjustment to the players action makes the growth somewhat less staedy and natural, because good playability was given the priority.

Leaves also bounce a bit whne Harald lands on them. Initially I considered a full dynamic simulation of the whole plant, where whole branches bend down under the players weight. But this would not only have increased the physics complexity but would have also made the level generation far more challenging, since platforms can have entirely different positions depending on what the player does. In the end, I was happy with a simple bouncing animation which already adds a decent feeling of dynamic feedback without actually affecting gameplay at all.

For the final distribution of the leafes I had to make up a new algorithm that guarantees that each leaf can be reached. For example, if the next leaf is directly above the previous one, it can be higher up than if the player has to also cross some horizontal distance. Someday I hope to write a longer article, which explains all the mathematical details of this.

Graphics

I also wanted to try out something new with respect to the games graphics, so I tried out drawing everything by hand. I started with some simple sketches in Krita of a reference picture of a tulip that I took:

Reference picture and first sketch

I like the result well enough to be encourage to do a whole game in this style.

Next to some simple, static objects like eggs, carrots und background images, I had to draw and animate Harald. The individual body parts were drawn in Krita in a neutral pose and exported to different sprite files. Then, I imported everything into Blender and created a rough triangle mesh around the sprites. This could then be animated via bones like a traditional 3D model.

In contrast to the traditional 2d flip-book animation (where there is an individual sprite for every animation frame), bone animations can be dynamically mixed and played back at arbitrary frame rates, which makes them appear more fluent.

Haralds body parts
The model in Blender
The in-game hopping animation

To collect references for the hopping animation, I spend an evening watching cute bunny videos from a petting zoo :)

Online-Highscore

So far, the game play is not too complex, and every run is more or less similar. So a major motivation to play another round is reaching a new highscore. To allow competing with players world wide, I added an online highscore.

On the server side, the highscore is just a collection of some rather straightforward php scripts and receive new entries, store them in a database and offer them for download. Nothing too fancy really, it honestly probably also does not scale very well for a massive amount of players, but I don't exactly except thousands of entries every second, so for now all seems fine.

One might think, that submitting the player name and score is enough. But to do it properly, quite a few additional fields are required:

The in-game highscore has 12 entries, but only 6 of those are loaded from the server. This means, that local players always have at least a few spots to compete in. Otherwise the highscore would be completely dominated by the globally best players and there would be no room for personal improvement.

The highscore list is also saved locally, so it continues to work without internet (in fact, all online features are entirely optional!). It will then be synchronized once internet access is back.

All server connections are encrypted via OpenSSL. This is somewhat overkill, since by definition all transmitted data are public, but unencrypted traffic is nowadays frowned upon. The webserver itself is even configured to not allow any unencrypted traffic, so I just went along and encrypted everything.

Tutorial

The foundations of game play are explained in the in-game tutorial. Signs will tell the player what to do next, and every platform can only be reached if the player learns the next mechanic. Some more polishing would have been nice here, but I did not want to invest too much time into a short level that almost everybody will only play a single time. Afeterall, the whole tutorial can be finished in about 20 seconds, if you know what you are doing.

...
The interactive tutorial
...
Game instructions in the main menu

Download

The game is currently only available for windows. If someone wants to help compiling it for Mac or Linux, please let me know :)

Version 0.2.4

Harald Hoppelhase Installer (german, english; ca. 58 MB)

Harald Hoppelhase ZIP (german, english; ca. 56 MB)

The installer is the more comfortable variant. It extracts the game and creates a desktop shortcut, but does not perform any other changes to the system and does not require administrator rights. To uninstall, simply delete the game folder. Both variants are portable.

Contact

For question, suggestions, or general feedback, you can drop me an E-Mail (and I will be happy to answer each):

JonathanK@posteo.de