Cloud Mill Games / Founder & Creator (2023-2024)

Cloud Mill Games / Founder & Creator (2023-2024)
CMG's Hack Tank

Hack Tank (preview title) is a hack-n-slash Tanks game inspired by Diablo 2 core mechanics.

Development on the game began after project Conflict was cancelled. I did all the coding and most of the art on the preview game. My brother modelled most of the enemy vehicles.

I used Godot 4.1 engine. The planned target platform was Windows, Mac, Linux (Steam).

Implementation Details

The game is written in GDScript with C++ GDExtension setup for critical bottlenecks. 3rd party extensions used: Gut (unit testing in-editor), ProtonScatter (terrain object painting), Terrain3D (terrain).

I used a custom-build of Godot 4.1 with modifications like adding depth-write function support to implement effects like highlighting blocked objects:

0:00
/0:04

For Hack Tanks development, I developed a frictionless method to use some principle elements from Entity-Component-System design rather than the standard Godot way. I called this system GECS.

For example, this is how one of the enemy tanks is setup:

The tank object itself has no custom code. Its behavior is the result of a collection interacting components. Components can be removed or added at runtime to change the behavior of any entity.

Highlight capabilities in GECS:

  • Components can communicate directly with sibling components
  • Supports tag components like player or enemy and ability to query entities by tag
  • Components can broadcast messages to other components in the entity
  • Support enforcing what type of entity a components can be attached to
  • Support enforcing that the owning entity of this component must also own specific other components to ensure correct dependencies

This is while maintaining full compatibility with the normal Godot way of implementation so using components is optional. For example, Godot UI is driven by an excellent signal-slot system so no need for GECS there.

I arrived at GECS as a perfect middle ground after testing the use of Godex and experimenting on my own and deciding against an intrusive implementation.