6.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Build Commands
This is a Unity project that cannot build standalone outside of Unity Editor. The .sln references UnityEngine and UnityGameFramework which are only available in the Unity Editor environment. Use Unity's build system instead.
Architecture
Three-Layer Structure (per docs/LayeredArchitectureDesign.md)
- L0 (Domain): Pure C# business logic. References
GameFramework.dll(pure C#, no Unity dependency). Contains enums, constants, data structures, CombatNode domain, PlayerInventory, InventoryGeneration, UI use cases. - L1 (Infrastructure): Glue layer bridging L0 and Unity. Implements GameFramework Unity adapters (Resource/Scene/Entity/UI/Sound), implements L0 interfaces, holds L0 service instances, manages Unity lifecycle.
- L2 (Presentation): Unity MonoBehaviour classes, UGuiForm implementations, Entity Logic (Player, Enemy, Tower).
GameFramework.dll Modules Usable in L0
GameFramework.dll is pure C# and provides infrastructure usable directly in L0:
| Module | L0 Usage |
|---|---|
| Event | GameFramework.Event.EventManager - custom args inherit GameEventArgs |
| ObjectPool | ObjectPoolManager - entities inherit ObjectBase |
| Fsm | FsmManager - states inherit FsmState<T> |
| ReferencePool | ReferencePool.Acquire<T>() / Release() |
| DataNode | Tree data structure, use directly |
| DataTable | DataRow classes implement IDataRow in L0 |
Modules requiring L1 Unity adapters: Resource, Scene, Entity, UI, Sound.
Key Domain Boundaries
| Domain | Key Files | Responsibility |
|---|---|---|
| CombatScheduler | CombatScheduler.cs, CombatStates/* |
State machine managing combat phases |
| EnemyManager | EnemyManager.cs, EnemySpawnDirector.cs, EnemyLifecycleTracker.cs |
Enemy spawning and lifecycle |
| PlayerInventory | PlayerInventoryComponent.cs, PlayerInventoryTowerAssemblyService.cs |
Backpack, trading, tower assembly |
| InventoryGeneration | InventoryGenerationComponent.cs, DropPoolRoller.cs, ShopGoodsBuilder.cs |
Drops, shop goods, rewards |
| MapEntity | MapEntity.cs, MapTopologyService.cs, TowerPlacementService.cs |
Map orchestration, grid/path, tower placement |
| TagSystem | TagGenerationRuleRegistry.cs, RarityTagBudgetRuleRegistry.cs, TagDefinitionRegistry.cs |
Tag generation rules and definitions |
Combat State Machine Flow
Loading → RunningPhase → WaitingForPhaseEnd → Settlement → RewardSelection(可选) → FinishForm → WaitingForReturn
Dual-Currency System
- Coin: Single-combat internal currency (
CombatRunResourceStore.CurrentCoin). Used for build/upgrade/destroy in combat. Reset per combat fromDRLevel.StartCoin. - Gold: Cross-combat persistent currency (
PlayerInventoryComponent.Gold). Used for shop buy/sell. Persists across nodes.
Tag System
Three-table configuration: Tag.txt, RarityTagBudget.txt, TagConfig.txt.
Active Tags (7): Fire, Ice, Crit, Execution, Shatter, Inferno, AbsoluteZero.
Deferred Tags (5): BurnSpread, IgniteBurst, FreezeMask, Pierce, Overpenetrate (metadata only, not combat-active).
Tag Runtime Structure:
- Component instances hold
TagType[] - Tower instances hold
TagRuntimeData[](grouped by TagType with Stack count) TagGenerationRuleRegistryandRarityTagBudgetRuleRegistryload fromTagRow/RarityTagBudgetRow(IDataRow implementations)
Tag Generation Uses InventoryGenerationRandomContext for reproducibility (RunSeed + SourceType + ItemInstanceId + ConfigId).
Service Naming Conventions
Scheduler: State machine boundary onlyManager: Facade/aggregate entry for subdomainCoordinator: Cross-state orchestrationCalculator: Pure computationSession: Single lifecycle objectBridge: Framework boundary adapterRuntime: Mutable state carrierResolver: Mapping/lookup/resolutionTracker: Tracks running entities or factual truth valuesPort: Restricted host interface for internal state/use cases
Key Invariants
- All combat state transitions go through
CombatScheduler.ChangeState(...) EnemyManageronly reports events, never directly calls state transitionsCombatRunResourceStoreis sole source of truth for in-combat Coin/Gold/BaseHpEnemyLifecycleTrackeris sole source forAliveEnemyCountandHasAliveBossMapEntityaccesses combat context viaMapData+ Events only- Tag generation uses
InventoryGenerationRandomContextfor reproducibility TowerPlacementServiceis sole write entry for tower mapping stateMapTopologyServiceis sole source for Path/Foundation data
Project Structure
src/
├── GeometryTD.Domain/ # L0 - Pure C#, references GameFramework.dll
│ ├── Definition/
│ │ ├── Enum/ # All enums (TagType, RarityType, etc.)
│ │ ├── Constant/ # Constants
│ │ ├── DataStruct/ # POCOs (AttackPayload, HitContext, TowerStatsData)
│ │ └── Tag/ # Tag definitions, generation rules, combat effects
│ ├── Event/ # GameEventArgs subclasses by domain
│ ├── UI/ # UI contexts and use case interfaces
│ ├── DataTable/ # IDataRow implementations (TagRow, RarityTagBudgetRow)
│ └── CustomComponent/ # L0 services (CombatScheduler, EnemyManager, etc.)
│
├── GeometryTD.Infrastructure/ # L1 - Unity adapter layer
│ ├── Entity/ # EntityLogic, EntityData DTOs
│ ├── Scene/Map/ # MapTopologyService, TowerPlacementService
│ ├── UI/ # UGuiForm base, controllers
│ ├── DataTable/ # L1 DataRowBase wrappers over L0 rows
│ └── CustomComponent/ # Unity Components holding L0 services
│
└── GeometryTD.Presentation/ # L2 - Unity MonoBehaviours, Views
├── Entity/Logic/ # Player, Enemy, Tower, Bullet entities
└── Components/ # MovementComponent, ShooterBullet, etc.
Documentation
docs/LayeredArchitectureDesign.md- Three-layer architecture, GameFramework integration, migration phasesdocs/CombatNodeArchitecture.md- Combat scheduler, state machine, EnemyManager, resource storedocs/MapEntityArchitecture.md- Map orchestration, tower placement, topology servicesdocs/TagSystemDesign.md- Tag system rules, generation, three-table config, combat effectsdocs/GameDesign.md- High-level game designdocs/MVP-Scope.md- Current MVP scope