Welcome-welcome, my dear friend-in-dev, come and join me by the fire, while I share with You my story of building Hermetica.
Hermetica is a Godot based game I have been developing for 1092 hours and I hope I can save You at least some of that time.
Let me promise to make it short or at least be sure, I will try.
A little disclaimer about me, I had zero knowledge of Godot when I started.
However, I already had medium game dev experience and overall high software dev experience, so Your millage may vary.
You can download Hermetica here:
Hermetica is a game about magic craftsmanship with a deep and complex mechanics.
I wanted to create a game where magic is not just a preset of 60 similar spells, but something a player can study, develop and master.
To handle such a requirement, a dynamic world is needed. That’s why Hermetica is implemented using voxels.
Do no use voxels, unless You absolutely have to.
There are almost always better alternatives for Your gameplay, such as heightmaps, for example.
Voxels are deceptively easy to implement, but surprisingly unwieldy during gameplay implementation.
It’s not without a reason, why there are so few popular games using voxels as part of their core gameplay.
Voxels as visual aesthetic is fine, though.
Some of Hermetica features You might be interested in:
- Spellcrafting based upon visual 2D state machine.
You can create a spell, which will auto-build a custom building of Your design.
- Semi-gridless voxels that can be rotated, scaled, etc.
Floating islands that can fly, be terraformed, connected, etc.
- Voxel based characters and items, including player.
Your character is Your health bar: damage to “leg” voxels will slow You down, etc.
Armor equipped is additional voxels, protecting Your “leg” voxels from damage.
Hermetica is built using Godot v3.4.4. Yeap, Godot 4 is much better, but porting is always a pain.
Nevertheless, Godot 3 is already a mature and stable engine. Not without its quirks, but any big enough project have those.
Documentation is also great and I love the community!
Working with engine is quite a joy and so my deep appreciations to creators and contributors.
Special thanks goes to Zylann, half of the issues I stumbled upon were already discussed and researched by Zylann in Godot repo issues.
Do not wait for the next tool, update, etc. Godot is perfectly good for all Your major needs as it is.
Hermetica is written primarily in GDNative C++ with some parts (UI) in GDScript.
Overall C++ experience is rough. Bindings are working, but are clunky and esoteric.
It’s often feels as if You are struggling against the engine and its design.
Lack of documentation or tutorials are also playing their part.
Guess it’s kind of a negative feedback loop. Hard to use - no one uses it - no improvements - hard to use.
Especially frustrating to see some useful code in engine sources, which is just not accessible from bindings API.
GDScript on the other hand is great! Easy and fun to work with. Not so slow as people tend to think.
It’s actually feels like language tailored specifically for Godot.
Write Your project in GDScript and optimize critical parts in GDNative if needed.
Most of the projects don’t need that kind of optimization and low level control C++ provides anyway.
Hermetica follows a popular pattern of strict separation between abstract game data and Godot implementation of it.
Voxels are stored using a custom data structure consisting of sparse octree at the top and arrays at the bottom.
This allows to strike a balance between low space usage and fast access.
Data is stored in SQLite database and serialized dynamically during runtime.
There are several additional tools used, such as MagicaVoxel importer, etc.
Development time: 1092 h.
Days of dev: 212 d.
Median of dev per day: 5.1 h.
Upper quartile of dev per day: 7.3 h.
Lower quartile of dev per day: 3.0 h.
Technical dev inc. research: 787 h.
Game modeling and design: 179 h.
Graphic design: 38 h.
Testing: 18 h.
Additional research: 14 h.
Misc: 56 h.
Here is an arbitrary, non-exhaustive list of tips, which came to my mind:
Focus on the quickest implementation of Your MPP, Minimal Playable Prototype.
If Your game is not fun to play in small, it won’t be magically fun in large.
You don’t need perfect code, perfect art, etc. You need a working project.
Prioritize what player can see and interact with over anything else.
It doesn’t matter if each snowflake in Your game is unique, if all a player can see is a bunch of snow to shovel.
Design first, implement last.
Implementing is almost always more time-consuming than designing.
And You really don’t want to reimplement all the stuff You have already made because of a single poor design choice.
Estimate development tasks and goals, preferably in hours.
Be honest and clear in Your estimates. Evaluate and adjust Your estimates after finishing a task or goal.
It’s too easy to fool yourself that something is quicker to do than its actually is.
Decompose tasks into smaller tasks, no longer than 3 days each.
It’s too easy to spend weeks trying to improve something Your project really doesn’t need.
Although I still haven’t finished Hermetica in a scale I was hoping for, it was quite an interesting journey.
Guess that’s what it’s all about, You have to love making games, just as a process, a craft.
Because doing game dev as a business endeavor is certainly not an efficient or reliable way to spend Your time.
If you’ve come this far, Thank You for Your time reading my short report!
Feel free to write me a comment or a question, I will gladly answer those.
Best wishes in Your own journey,