Files
jimmyabvandClaude Sonnet 4.6 ab31bba21e Adopt Claude Code Game Studios template, configure Unity engine, document Combat Mode
- Install CCGS agent/skill/hook framework (.claude/, docs templates, GitHub issue/PR templates)
- Configure CLAUDE.md and technical-preferences.md for Unity 6000.3.3f1 (C#, URP, collider-based mouse picking)
- Point engine reference import at docs/engine-reference/unity/ and remove unused Godot/Unreal reference docs
- Add Version Awareness section to unity-specialist agent
- Set production/review-mode.txt to lean
- Add design/gdd/combat-mode.md: reverse-documented GDD for the vs-AI Combat mode, confirming it as the foundation for the guion.md narrative campaign (separate from Classic mode)
- Add docs/architecture/ADR-0001: documents the existing board-state/singleton/per-mode architecture and the decision to keep Classic and Combat modes permanently separate
- Add docs/architecture/control-manifest.md: programmer rules sheet sourced from ADR-0001 and Unity 6 engine reference docs
- Continue in-progress Mono/Classic and Mono/Combat refactor (ScoreManager, scene/prefab updates)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 10:08:10 -03:00

1.3 KiB

paths
paths
src/core/**

Engine Code Rules

  • ZERO allocations in hot paths (update loops, rendering, physics) — pre-allocate, pool, reuse
  • All engine APIs must be thread-safe OR explicitly documented as single-thread-only
  • Profile before AND after every optimization — document the measured numbers
  • Engine code must NEVER depend on gameplay code (strict dependency direction: engine <- gameplay)
  • Every public API must have usage examples in its doc comment
  • Changes to public interfaces require a deprecation period and migration guide
  • Use RAII / deterministic cleanup for all resources
  • All engine systems must support graceful degradation
  • Before writing engine API code, consult docs/engine-reference/ for the current engine version and verify APIs against the reference docs

Examples

Correct (zero-alloc hot path):

# Pre-allocated array reused each frame
var _nearby_cache: Array[Node3D] = []

func _physics_process(delta: float) -> void:
    _nearby_cache.clear()  # Reuse, don't reallocate
    _spatial_grid.query_radius(position, radius, _nearby_cache)

Incorrect (allocating in hot path):

func _physics_process(delta: float) -> void:
    var nearby: Array[Node3D] = []  # VIOLATION: allocates every frame
    nearby = get_tree().get_nodes_in_group("enemies")  # VIOLATION: tree query every frame