# **Barracks Specification: The Squad Quarters**

This document defines the UI and Logic for the **Barracks Screen**. This is the persistent management interface where the player oversees their entire roster of Explorers.

## **1. System Overview**

**Role:** The Barracks serves as the "List View" for the RosterManager. It allows the player to browse, sort, heal, and dismiss units.

### **Integration Context**

- **Parent:** Rendered inside the HubScreen overlay container.
- **Data Source:** GameStateManager.rosterManager (The source of truth for units).
- **Dependencies:** \* CharacterSheet (For detailed editing).
  - Persistence (Saving changes).
  - Wallet (Paying for healing).

## **2. Visual Design & Layout**

**Setting:** Inside the large **Troop Tent**. Rows of cots and weapon racks.

- **Vibe:** Organized, slightly military, warm lantern light.

### **Layout (Split View)**

#### **A. Roster List (Left - 60%)**

- **Header:** \* **Count:** "Roster: 6/12".
  - **Filters:** [ALL] [READY] [INJURED] [CLASS].
  - **Sort:** [Level] [Name] [Status].
- **Scroll Area:** A vertical grid of **Unit Cards**.
  - _Card Visual:_ Portrait, Name, Class Icon, Level, HP Bar.
  - _Status Indicators:_ "Injured" (Red overlay), "Ready" (Green dot).

#### **B. Command Sidebar (Right - 40%)**

- **Selection Preview:** Shows the 3D model of the currently selected unit.
- **Quick Stats:** HP, Stress/Fatigue (if implemented), XP bar.
- **Actions:**
  - **"Inspect / Equip":** Opens the full CharacterSheet modal.
  - **"Heal":** (If injured) Shows cost in Aether Shards. Button: "Treat Wounds (50 💎)".
  - **"Dismiss":** Permanently removes unit from roster (Confirmation required).

## **3. TypeScript Interfaces (Data Model)**

```ts
// src/types/Barracks.ts

import { UnitStatus } from "./Inventory"; // Assuming shared status types

export type RosterFilter = "ALL" | "READY" | "INJURED" | "CLASS";
export type SortMethod = "LEVEL_DESC" | "NAME_ASC" | "HP_ASC";

export interface BarracksState {
  /** Full list of units from RosterManager */
  units: RosterUnitData[];
  /** ID of the currently selected unit */
  selectedUnitId: string | null;
  /** Current filter applied */
  filter: RosterFilter;
  /** Current sort method */
  sort: SortMethod;
  /** Cost multiplier for healing (e.g. 1 HP = 0.5 Shards) */
  healingCostPerHp: number;
}

/**
 * Lightweight data for the list view
 */
export interface RosterUnitData {
  id: string;
  name: string;
  classId: string;
  level: number;
  currentHp: number;
  maxHp: number;
  status: "READY" | "INJURED" | "DEAD" | "MISSION";
  portrait: string; // Asset path
}

export interface BarracksEvents {
  "open-character-sheet": { unitId: string };
  "request-heal": { unitId: string; cost: number };
  "request-dismiss": { unitId: string };
  "close-barracks": void;
}
```

## **4. Logic & Algorithms**

### **A. Healing Logic**

Healing is not free in the Hub; it acts as a resource sink.

1. **Calculate Cost:** `(MaxHP - CurrentHP) * CostPerHP`.
2. **Validate:** Check `Wallet >= Cost`.
3. **Execute:**
   - Deduct Currency.
   - Set `unit.currentHp = unit.maxHp`.
   - Set `unit.status = 'READY'`.
   - Save Roster & Wallet via `Persistence`.

### **B. Filtering**

The UI must filter the raw roster list locally.

- **READY:** `unit.status === 'READY'`
- **INJURED:** `unit.currentHp < unit.maxHp`

---

## **5. Conditions of Acceptance (CoA)**

**CoA 1: Roster Synchronization**

- The list must match the contents of `RosterManager`.
- If a unit is dismissed, it must immediately disappear from the list.

**CoA 2: Healing Transaction**

- Clicking "Heal" on an injured unit must update their HP to max immediately.
- The Global Wallet in the Hub Top Bar must update to reflect the spent shards.
- A unit with full HP cannot be healed (Button Disabled).

**CoA 3: Navigation**

- Clicking "Inspect" opens the `CharacterSheet`.
- Closing the `CharacterSheet` returns the user to the Barracks (not the Main Hub), maintaining their selection state.

**CoA 4: Selection Persistence**

- If the roster is re-sorted, the currently selected unit remains selected.
