Archived footage of star system view before the global refactoring.

How global singletons were killed, async race conditions resolved, and the door for custom player modifications opened

❌ The Problem

  • Development stagnation: Monolithic generation and logic controller bottlenecked project progress.
  • High risks: Minor changes threatened to break completely unrelated systems.
  • Cascading failures: Removing the legacy global singleton caused endless compilation errors.
  • Pointer errors: Instantiating subsystems before scene tree attachment broke configuration loading ($NullPointer$).

🔄 The Struggle

  • Dead-end refactoring: Trimming the singleton without changing architecture immediately broke builds.
  • Rigid hardcoding: Directory paths only functioned within one strictly defined file structure.
  • Modding unviability: Static paths completely prevented players from installing custom user mods.

The Solution

  • Separation of concerns: Monolith split into independent submodules via Single Responsibility Principle.
  • Dependency injection: Global singletons replaced with explicit, controlled dependency passing.
  • Asynchronous readiness: Added scene tree checks before generation, eliminating race conditions.
  • Dynamic discovery: Engine now automatically locates resources regardless of folder structure.
  • Language migration: Rewrote code from GDScript to C# for efficient modular development.