The game
Astronaut is a 2d platformer with “grappling hook” mechanics and exploration / adventure elements. At first I was aiming mobile platforms (Android and iOS) only, but then some efforts to organize the gameplay and game control keeping other platforms in mind were done.
You’re playing as a guy in a space suit which allows you to make interplanetary jumps and cling to the planets and other objects with an electromagnetic hook. The problem is that the oxygen you carry in the suit’s tank is limited, thus you can die by asphyxiation in the open space.. or drown in water planet.. or burn in plasma.. or meet an unfriendly life form.. or.. well, I guess you’ve got the idea.
Although if you are lucky and skilful enough you can survive and move on through the planetary system.
Behind the scenes
Everything started in early 2014. Initially the project was written in C++ and used Cocos2d-x. I spent plenty of time implementing my own “prototype” system which allowed me to relatively easy create the templates for almost any type of the objects in the game and then instantiate them in the editor. Consider this “prototype system” as a very lightweight version of prefabs in Unity.
I used an early version of Dear ImGui (I guess it was called just “IMGUI” at that time) for the UI of the editor (or “EDITAAARH!” as it’s said in the title of its window) and NanoVG for rendering the schematic visualisation of game objects. I get enormous amount of experience while implementing the editor: camera panning / zooming, transformation of the objects (movement / scaling / rotation with their own gizmos), object selection (single and multiple), UI, serialization / deserialization, websockets (I used them for a remote console which allowed interacting with a game on the device from the browser on PC). Ah, that incomparable feeling of setting and achieving the goals you never did before…
Besides that I implemented a hot level reloading (press “Upload map” in the editor and instantly test that map on Android device), neat and flexible contact dispatcher for Box2d-based physics system, event/messaging system for low coupled code. I also optimized some internals of Cocos2d-x related to redundant transformation matrix calculation, which drastically improved the performance on the maps with lots of objects.
I planned to create a vast majority of space objects starting from the planets of different sizes with various environmental conditions and ending with huge supernova which is about to explode and absorb everything in its wave of plasma (this was planned as a mid-game boss level).
The first type of planet was a “Cold” one (at least this name was used for its assets). Despite the unattractive name this planet was the safest place in my virtual universe: it had a solid surface which could be landed on and, which is more important, taken off from; it had an atmosphere suitable to recharge the oxygen tanks; it had a temperature good enough to stay there for as long as it takes.
Obviously that was not enough. I had to add danger. But not that type of danger that smashes you in a second, just a usual danger. Like a planet filled only with water. As you may have guessed, this planet instead of refilling our oxygen tanks, sucked them out. But there was a positive side of course: if you get caught on fire this planet is one of the easiest ways to get extinguished.
How to get caught on fire in space? Oh please, for this case I prepared a red-hot plasma planet. Its atmosphere was so hot that staying in it for a short time led to a combustion, the closer you reach to the surface the lesser time was needed to start burning, while touching the surface instantly turned you into ashes quietly floating in the space.
Icing on the cake was a dark chocolate planet. Well, it was not a cake. Everyone knows that the cake is a lie. And it was not a chocolate, I lied too. It was tar. So thick and dense that anything touches the surface of this planet stays in there forever slowly turning into the tar by itself.
The next step was adding more dynamic hazards. How about a hive-planet which is inhabited with inhospitable space-wasps? Or a mechanical planet full of pressable triggers with unknown purpose?
After demobilisation I returned to development of the game with an old engine and codebase but quickly realized that I don’t want to despite all the blood, sweat and tears put into the previous work.
I was almost happy with Cocos2d-x, except some crucial points (some of them partially changed later):
- poor particle system, UI and audio support;
- no real component system;
- no (or relatively poor) animation editor (it was quite hard or nearly impossible to make scripted scenes or cut scenes);
- prototyping is not as fast as it could be;
- development of the engine went in wrong direction: js, 3d, vr;
- almost no applications for contract work.
A lot of basic things had to be done manually before you could start coding the gameplay itself.
And that’s it. I joined another full-time project and due to the lack of time the development of Astronaut completely stopped. It was way too hard to come back to it even if I had some free time: some ideas escaped from my memory, some parts of gameplay stopped linking up to each other and the whole direction of development slowly faded away. What’s the future of the project? Who knows…