# Spécifications : Case (Générique)

## Définition
Une case est l'unité élémentaire de la grille (Zoo ou Monde).

## Propriétés
- **Coordonnées** : Position (x, y) dans la grille.
- **Couleur (Milieu)** : Définit le biome et l'environnement visuel.
- **Température** : Liée à la couleur/biome.
- **Contenu** : Peut contenir un bâtiment, un animal, un visiteur, ou être vide.
- **État** : Peut avoir des indicateurs visuels (herbe jaunie, givre, fertilité).

# Annexes Techniques

## 1. Données et États
### Modèle de Données (JSON)
```json
{
  "x": "integer",
  "y": "integer",
  "grid_id": "string (stable key: `${x}:${y}`)",
  "owner_id": "uuid | null (null = carte neutre/monde)",
  "created_at": "timestamp",
  "updated_at": "timestamp",
  "biome_id": "integer",
  "biome_type": "enum('prairie','ocean','montagne','savane','toundra','desert','jungle','marais')",
  "temperature_offset": "float (°C, additive)",
  "content_ref": "uuid | null",
  "content_type": "enum('empty','animal','building','visitor','staff','decoration','path','bridge','water','fence')",
  "fertility_level": "float (0-100)",
  "cleanliness_level": "float (0-100)",
  "state_flags": [
    "enum('frozen','dry','dirty','fertilized','muddy','snowy','flooded','trampled')"
  ],
  "render": {
    "tile_variant": "string (auto-tiling key)",
    "occluder": "boolean",
    "hitbox": "enum('tile','base_sprite','custom_polygon')"
  },
  "iso_x": "integer",
  "iso_y": "integer",
  "z_index": "integer"
}
```

### Contraintes (Invariants)
*   **Unicité** : (`x`,`y`) est unique dans une grille.
*   **Cohérence contenu** : si `content_type === 'empty'` alors `content_ref === null`.
*   **Température** : `temperature_offset` s’applique additivement à la température “biome” et aux modificateurs (saison, jour/nuit).
*   **Z-index isométrique** : `z_index` est dérivé principalement de `y` (et secondairement de `x`) pour garantir le recouvrement correct.

## 8. Logique et Interfaces
### Pseudo-code Impacts
```python
def fertilize_case(case, player):
    cost = 50
    if player.money < cost: return error("NO_MONEY")
    
    player.money -= cost
    case.fertility_level = 100
    case.state_flags.append("fertilized")
    
    # Si plante dessus, boost croissance
    if case.content and case.content.type == "plant":
        case.content.growth_rate *= 1.5
        
    return success("CASE_FERTILIZED")
```

### Messages d'Infos / Alerte
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Sol fertilisé." | `state_flags` ajoute `fertilized` | 2 |
| Warn | "Fonds insuffisants." | `player.money < cost` | 4 |
| Warn | "Case occupée : action indisponible." | `content_type` non compatible | 3 |

# Annexes UX/UI

## 0. Direction Artistique & Vue
*   **Vue** : Isométrique (2.5D).
*   **Style** : Coloré, vivant, détails foisonnants (Réf: IMG_20260303_170253.jpg).
*   **Sprites** : 4 directions.
*   **Interactions** :
    *   **Sélection** : Cliquer sur la base de l'élément (ou son sprite principal) pour le sélectionner.
    *   **Feedback** : Surbrillance (outline blanc/jaune) au survol de la souris.


## 1. Expérience Utilisateur (UX)
### Fertilisation (Action)
**Description UX** : Le joueur améliore le sol pour que l'herbe repousse plus vite.
**Description UI** : Outil "Sac d'engrais". Clic sur la case.
**Emplacement** : Menu Outils -> Case.
**Intégration** : Curseur.
**Navigation** : Clic.
**Événements** : `FERTILIZE_SOIL`.

#### Assets
- **Musiques** : `ambience_garden_soft.mp3` (léger, discret).
- **Sons** : `scatter.mp3`.
- **Graphiques** : Particules vertes/brunes.
- **Images** : Texture terre riche (plus foncée).
- **Animations** : Poussière qui retombe.
- **Couleurs** : Marron foncé.
 - **Textes** : `TOOL_FERTILIZE` = "Engrais", `CASE_FERTILIZED` = "Sol fertilisé"
 - **Formes** : Curseur rond (outil), surbrillance tuile.
