forked from Shardstone/trail-into-darkness
2.7 KiB
2.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Nox is a Unity RPG game with party-based gameplay. It uses Addressables for asset management, Newtonsoft JSON for serialization, and URP for rendering.
Architecture
Dual-Layer State Management
The game uses two layers of state:
- Game States (
IGameState): Application-level flow — Splash → MainMenu → GameMode (PlayModeGameState) - Play Modes (
IPlayMode): Gameplay-level modes within GameMode — Adventure, Town, Rest, Combat, PauseMenu
PlayModeGameState bridges these layers, managing play mode transitions and scene loading via Addressables.
Key Subsystems
- Boot/Entry:
Boot.cs→EntryPoint.cs→GameStateRunner.cs(main update loop) - GameData: Global state container holding party, map, settings, and current play mode
- Platform Abstraction:
IPlatformwith Desktop and UnityEditor implementations, selecting input mode and settings per platform - Persistence:
GamePersistenceController+IPlayModeStateSerializerfor JSON save/load - Character System: Attributes (Might, Reflex, Knowledge) → derived Stats (Health, Stamina), with Perks and party Roles (Protagonist + Companions)
Namespace Convention
Namespaces mirror the folder structure: Nox.Core, Nox.Game, Nox.Input, Nox.Platform, Nox.Util.
Code Layout
Assets/Code/
├── Core/ # Game states, bootstrapping, GameData, GameStateRunner
├── Game/ # Gameplay: PlayModes/, Camera/, movement, persistence, factories
├── Platform/ # IPlatform, DesktopPlatform, UnityEditorPlatform
├── Input/ # IInput abstraction with Desktop/Editor implementations
├── UI/ # Menu views and MonoBehaviour references
└── Util/ # BootMode, editor utilities
C# Style (from .editorconfig)
- 4 spaces, LF line endings
- No
var— use explicit types (csharp_style_var_*: false) - No space after keywords in control flow (
if(,for(, notif () - Opening braces on same line (
csharp_new_line_before_open_brace = none) - Block-scoped namespaces (
namespace Foo { ... }) - Always use braces (
csharp_prefer_braces = true) - Naming: PascalCase for types/methods/properties, camelCase for all fields (public and private),
Iprefix for interfaces - Expression-bodied: yes for properties/accessors/indexers/lambdas, no for constructors/methods/operators
Patterns
- Constructor-based dependency injection (no DI container)
- ScriptableObject-based configuration loaded via Addressables
- Factory pattern for character/party creation
- Action delegates for UI event communication