Skip to content

Archived on 2026-10-24. The Godot rewrite is cancelled. Migration decisions and work checklists below are withdrawn. Original claims, code examples, file paths, and completion statements have not all been revalidated. Use the current documentation and issue register for maintenance decisions.

Project Overview

Purpose

This document summarizes the current Unity project so it can be rebuilt cleanly in Godot 4 using pure GDScript. It documents behavior and architecture; it does not translate C# into GDScript.

Current Unity Project Shape

The main source root is Assets/Script, not Assets/Scripts.

Major code areas:

Area Main Paths Role
App boot/menu Assets/Script/App, Assets/Script/TinyChaos Boot flow, save loading, settings, main menu, shop, achievements, input, localization, Steam identity
Shared data Assets/Script/Shared ScriptableObject definitions, interfaces, runtime session data, counters
Gameplay Assets/Script/Game Run loop, player, enemies, spawning, rewards, upgrades, items, pooling, HUD, stage helpers
External/tutorial/platform Assets/Script/External Steamworks glue, leaderboard network client, Discord presence, tutorial scene logic, editor helpers
Data assets Assets/Resources, Assets/Scriptable Object Characters, abilities, upgrades, stages, spawner data, achievements, keybinds, UI/audio resource references

Important scenes found:

Scene Notes
Assets/Scenes/Bootloader.unity Likely startup scene.
Assets/Scenes/MainMenu.unity Main menu and app UI.
Assets/Scenes/Arena Stage 1.unity Gameplay stage.
Assets/Scenes/Arena Stage 2.unity Gameplay stage.
Assets/Scenes/Arena Stage 3.unity Gameplay stage.
Assets/Scenes/Tutorial.unity Separate tutorial implementation under Assets/Script/External/Tutorial.
Assets/Scenes/Experimental.unity Experimental content.

Current Architecture Summary

The game is a 2D arena survival game with one or two players. A run begins from boot/menu state, loads selected Character and LevelData into GameSession, initializes gameplay data, spawns players, starts timers, spawns enemies from stage data, grants experience/soul/chaos rewards, offers upgrade cards, and ends either on player death or stage timer/boss conditions.

The current code mixes old global singleton style with newer service-oriented pieces:

Style Examples Migration Meaning
Old singleton / scene-global state GameManager.instance, PoolManager.Instance, AudioResources.Instance, AbilityFunction.Instance Do not copy directly. Replace with explicit autoloads or injected node references.
Newer services GameStateService, PlayerManager, RewardRoller, GameDataLoader, AudioService, SaveService These show useful intended boundaries, but still depend on Unity objects and global state.
Asset-driven data Character, Ability, Upgrade, LevelData, SpawnerData, Achievement; ShopUpgrade for reference/save conversion only Strong candidate for Godot .tres resources, except the old shop system should not be rebuilt as-is.
Hardcoded behavior tables AbilityHolder, UpgradeFunction, PlayerWeapon, Player.TakeDamage Redesign as smaller behavior/effect scripts.

Important Data Asset Counts

Approximate asset groups found under Assets/Resources and Assets/Scriptable Object:

Asset Group Count Notes
Ability 105 Mostly identity/cooldown/stamina assets. Behavior is not in the asset.
SpecialUpgrade 82 Many active upgrade choices; some testing/in-development/need-revamp variants exist.
Upgrade 50 Basic/stat upgrades under Assets/Resources/Upgrade.
Achievement 84 Used by save/progression and Steam sync.
Character 23 Includes production and draft character assets.
Stage 6 Stage data references maps/spawners/boss/music.
Spawner 31+ Stage/difficulty spawn schedules.
Shop 16 Permanent progression upgrade data.

Core Systems

The main runtime systems are:

System Main Unity Scripts
Boot and app services AppInitiator, ServicesRoot, SaveManager, GameDataLoader
Run state and game loop GameManager, GameStateService, PlayerManager, GameInitialization, Timer
Ability system AbilityHolder, AbilityFunction, Ability, AbilityResources, PlayerWeapon, PlayerAttack, UpgradeFunction
Upgrade/reward system RewardRoller, UpgradeSelection, UpgradeButton, UpgradeFunction, UpgradeEvoFunction, WeaponEvoData
Player system Player, PlayerModifier, PlayerWeapon, PlayerCollectItem, StatusPanel, companions/orbs/swords/drone
Enemy/spawn system SpawnerEventManager, SpawnerData, Enemy, EnemyBaseState, EnemyAttackState, enemy state scripts, boss scripts
Items Items, ItemsBreakable, ItemsMerger, ItemsIndicator
UI flow MenuController, app views/controllers, GameMenuManager, GameEndManager, UpgradeSelection, StatusPanel
Save/progression SaveManager, SaveService, Save, PlayerData, GameConfig, GameDataCount, AchievementManager, ShopManager
Audio/feedback AudioService, AudioResources, DamagePopUp, Announcer, DOTween usage

High-Level Dependency Direction

Current gameplay dependencies are mostly inward toward singletons:

Player / Enemy / Items / UI
  -> GameManager.instance
  -> GameSession.Instance
  -> Save static wrapper
  -> PoolManager.Instance
  -> Game.Audio
  -> AbilityFunction.Instance
  -> AudioResources.Instance
  -> UIResourceProvider

For Godot, these should become explicit boundaries:

Run scene
  GameSession / RunState
  StageController
  SpawnDirector
  RewardDirector
  PlayerManager
  AbilityRegistry + AbilityRunner
  SaveService
  AudioBus/AudioService

Immediate Migration Principles

Preserve:

  • Run rules: timers, enemy waves, boss transition, level-up reward cadence, item collection, upgrade effects, player damage rules.
  • Data ids: character ids, upgrade ids, achievement ids, stage map ids, save dictionary keys.
  • Player-facing behavior: cooldowns, stamina costs, shields, projectiles, reward card flow, unlock/progression conditions.

Redesign:

  • AbilityHolder as separate ability behavior scripts.
  • UpgradeFunction as data-driven upgrade effects.
  • GameManager as several smaller controllers.
  • Pooling and target tracking as first-class scene services.
  • Save/progression so runtime resource state is not the source of truth.

Do not copy directly:

  • Large Update() polling that calls many unrelated ability activators.
  • Shared mutable Ability ScriptableObjects carrying cooldown runtime state.
  • Hardcoded upgrade switch statements.
  • GameObject.FindGameObjectsWithTag-based target searches in runtime hot paths.
  • Any Unity C# implementation detail that only exists because of Unity.

Open Questions

  • Which scenes and assets are production versus prototype/recovery content?
  • Which abilities/upgrades are released, in development, or deprecated?
  • Which character set is final for the Godot rebuild?
  • Whether the 1-minute stuck report refers to no enemies spawning, frozen UI/reward selection, paused time, heavy frame stalls, or network waiting.
  • Unknown / needs manual confirmation.