# Design: Player AI and Steering System

## Goal
Implement autonomous players that move organically on the ice, reacting to the puck and each other, with randomized individual characteristics.

## Architecture
The system is based on "Steering Behaviors", where players calculate a desired velocity based on multiple forces, which are then summed and applied to the player's physics.

### 1. Player Attributes
Each player is assigned a set of attributes that define their physical and mental capabilities.
- **Budget**: 10 points total.
- **Distribution**: Each attribute gets a minimum of 1 point; the remaining 6 points are distributed randomly.
- **Attributes**:
    - **Speed**: Affects `MaxSpeed`. Higher speed allows faster movement.
    - **Agility**: Affects `MaxForce`. Higher agility allows sharper turns and faster acceleration.
    - **Strength**: Affects collision impulse. Stronger players push the puck and opponents further.
    - **Tactics**: Affects the weight of steering behaviors (e.g., how effectively they seek the puck).

### 2. Steering Behaviors
The `internal/game/steering.go` module will provide the following forces:
- **Seek(target)**: Direct force towards the target (puck).
- **Arrive(target)**: Similar to Seek, but slows down as the player reaches the target to prevent orbiting.
- **Avoidance(others)**: A strong repulsive force to prevent players from overlapping.
- **ZoneConstraint(homeZone)**: A soft force pulling the player back to their half of the ice if they stray too far.

### 3. File Structure
- `internal/entities/player.go`: Defines `Player` and `Attributes` structs and the `NewPlayer` constructor with random attribute logic.
- `internal/game/steering.go`: Pure functions for calculating steering vectors.
- `internal/game/world.go`: 
    - Manages the list of players.
    - Updates player positions using steering forces.
    - Handles collisions (Player-Puck, Player-Player) using the `Strength` attribute.
- `internal/render/renderer.go`: Renders players as colored circles (Red/Blue), with size slightly scaled by `Strength`.

## Data Flow
1. **Per-Tick Update**:
    - Calculate Steering Forces: `TotalForce = (Seek * Tactics) + Avoidance + ZoneConstraint`.
    - Apply Physics: `Acceleration = TotalForce / Mass` (capped by `Agility`).
    - Update Velocity: `Velocity += Acceleration` (capped by `Speed`).
    - Update Position: `Position += Velocity`.
2. **Collision Resolution**:
    - If Player touches Puck: Transfer momentum based on `Strength` and `Velocity`.
    - If Player touches Player: Repel based on relative `Strength`.
3. **Rendering**: Draw players at their current positions.

## Edge Cases
- **Overlapping**: High-priority `Avoidance` force prevents players from stacking.
- **Boundary Control**: Players are clamped to the ice rink boundaries.
- **Damping**: A small friction coefficient is applied to velocity to prevent infinite sliding.
