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:
AbilityHolderas separate ability behavior scripts.UpgradeFunctionas data-driven upgrade effects.GameManageras 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
AbilityScriptableObjects 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.