**Motivations:** - Make docs/specs implementation-ready without empty sections or placeholders. **Root causes:** - Multiple specs still contained non-actionable placeholders (N/A, “see above”, "..."), and inconsistent “no cache” wording. **Correctifs:** - Replace placeholders with explicit tables, structures, and typed examples. - Align “no cache / no memorization” statements where relevant. **Evolutions:** - Add a features doc entry to track the documentation enrichment effort. **Pages affectées:** - docs/specs/* - docs/features/docs-specs-enrichment.md - docs/leo.md - docs/plan-enrich-docs-specs.md
198 lines
6.6 KiB
Markdown
198 lines
6.6 KiB
Markdown
# Spécifications : Attractivité dans le Zoo sur les Visiteurs
|
||
|
||
## Définition
|
||
Comportement des visiteurs une fois qu'ils sont entrés dans l'enceinte du zoo.
|
||
|
||
## Mécanique de Déplacement
|
||
Les visiteurs ne se déplacent pas au hasard. Ils ont des "cibles" d'intérêt.
|
||
- **Cibles Prioritaires** : Animaux Rares > Animaux Communs > Boutiques.
|
||
- **Algorithme** : À chaque intersection ou fin d'action, le visiteur évalue l'attrait des cases environnantes.
|
||
|
||
## Facteurs de Rétention
|
||
- **Diversité** : Voir des animaux différents prolonge la visite.
|
||
- **Confort** : La présence de bancs, poubelles et boutiques augmente le temps de séjour.
|
||
- **Départ** : Si l'attrait local tombe sous un seuil (ennui) ou si la journée finit, le visiteur se dirige vers la sortie (Billeterie).
|
||
|
||
# Annexes Techniques
|
||
|
||
## 1. Données et États
|
||
### Modèle de Données (JSON)
|
||
Propriétés de `Visiteur`.
|
||
```json
|
||
{
|
||
"visitor_id": "uuid",
|
||
"current_target": { "type": "enum('animal','shop','bench','toilet','exit')", "entity_id": "uuid" },
|
||
"target_score": "float",
|
||
"memory": {
|
||
"seen_species": "string[]",
|
||
"last_shop_at": "timestamp | null",
|
||
"fatigue": "float (0-100)",
|
||
"thirst": "float (0-100)"
|
||
},
|
||
"pathing": {
|
||
"preferred_tiles": "enum('path','bridge')",
|
||
"avoid_zones": "uuid[]",
|
||
"repath_cooldown_ms": "integer"
|
||
}
|
||
}
|
||
```
|
||
|
||
### Caractéristiques Initiales
|
||
| Caractéristique | Valeur Initiale | Type | Description |
|
||
|---|---|---|---|
|
||
| Fatigue | 0 | float | Monte avec la marche ; déclenche recherche de banc. |
|
||
| Soif | 0 | float | Monte avec le temps/température ; déclenche boutique. |
|
||
| Diversité vue | 0 | int | Compte d'espèces différentes vues. |
|
||
|
||
### Scores Initiaux
|
||
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|
||
|---|---:|---|---|
|
||
| Enthousiasme | 50 | 0-100 | Modifie durée de visite et dépenses. |
|
||
| Ennui | 0 | 0-100 | Si > 70, visiteur part vers sortie. |
|
||
|
||
## 2. Cycles de Vie et Apparition
|
||
### Conditions d'Apparition
|
||
| Condition | Seuil | Opérateur | Résultat |
|
||
|---|---:|---|---|
|
||
| Visiteur spawn | true | Est | IA interne démarre (choix cibles). |
|
||
|
||
### Conditions de Disparition
|
||
| Condition | Seuil | Opérateur | Résultat |
|
||
|---|---:|---|---|
|
||
| Ennui | 70 | >= | Cible sortie (billeterie). |
|
||
| Heure | fermeture | >= | Cible sortie. |
|
||
|
||
### Hérédité
|
||
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|
||
|---|---|---:|---|
|
||
| Groupe famille | Itinéraire (préférence boutique/enclos) | 100% | Non |
|
||
|
||
## 3. Impacts Environnementaux
|
||
### Impact Température
|
||
**Canicule/Grand Froid** : Réduit le temps de séjour (-30%).
|
||
|
||
### Impact Milieu (Biome)
|
||
| Biome | Compatibilité | Bonus/Malus |
|
||
|---|---:|---|
|
||
| Chemin pavés | 100% | fatigue -10%/min |
|
||
| Boue | 30% | fatigue +20%/min, satisfaction - |
|
||
|
||
### Impact Saisons
|
||
| Saison | Effet | Modificateur |
|
||
|---|---|---|
|
||
| Été | recherche d’ombre/boutiques | soif + |
|
||
| Hiver | recherche d’intérieur | fatigue + |
|
||
|
||
### Impact Heure / Jour-Nuit
|
||
| Période | Activité | Visibilité |
|
||
|---|---|---|
|
||
| 10h–16h | exploration max | haute |
|
||
| 17h–19h | achats sortie | moyenne |
|
||
|
||
## 4. Impacts Biologiques et Sociaux
|
||
### Impact Reproduction
|
||
| Facteur | Effet sur Taux | Condition |
|
||
|---|---|---|
|
||
| Bébés visibles | + | visiteurs restent plus |
|
||
|
||
### Impact Mort
|
||
Voir `visiteur.md` (Départ immédiat).
|
||
|
||
### Impact Nourriture
|
||
| Type Nourriture | Gain Santé | Coût | Préférence |
|
||
|---|---:|---:|---:|
|
||
| Boisson | soif -50 | 5 | 5 |
|
||
|
||
### Impact Attractivité (Visiteurs/Animaux)
|
||
**Poids des Cibles** :
|
||
| Type Cible | Poids |
|
||
| :--- | :--- |
|
||
| Animal Rareté 1 | 10 |
|
||
| Animal Rareté 5 | 100 |
|
||
| Boutique | 50 |
|
||
| Banc (si fatigué) | 200 |
|
||
|
||
### Impact Valeur
|
||
| Facteur | Variation Prix | Condition |
|
||
|---|---:|---|
|
||
| Visiteur VIP | dépense x2 | si satisfait |
|
||
|
||
## 5. Impacts Logistiques et Économiques
|
||
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
|
||
| Paramètre | Valeur | Unité | Détail |
|
||
|---|---:|---|---|
|
||
| Repath cooldown | 500 | ms | évite recalcul permanent |
|
||
| Poids chemin | 2.0 | facteur | préférence chemin vs herbe |
|
||
|
||
### Dépenses (Boutiques/Visiteurs)
|
||
| Action | Dépense | Condition |
|
||
|---|---:|---|
|
||
| Achat boisson | 5 | soif > 50 |
|
||
| Achat souvenir | 15-30 | proche sortie |
|
||
|
||
### Trajet Visiteurs
|
||
Algorithme de choix de cible pondéré.
|
||
|
||
## 6. Événements
|
||
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
|
||
| Event | Déclencheur | Effet | Durée |
|
||
|---|---|---|---|
|
||
| `TARGET_CHANGED` | nouvelle cible | path recalculé | instant |
|
||
| `VISITOR_BORED` | ennui seuil | départ | jusqu’à sortie |
|
||
|
||
## 7. Progression
|
||
### Tableau des Upgrades
|
||
| Niveau | Coût | Prérequis | Bonus Débloqué |
|
||
|---|---:|---|---|
|
||
| 1 | 0 | - | IA basique |
|
||
| 2 | 2000 | chemins niv 2 | préférence chemins + |
|
||
|
||
## 8. Logique et Interfaces
|
||
### Pseudo-code Impacts
|
||
```
|
||
function chooseNextTarget(visitor, zoo):
|
||
candidates = getAllPOIs(zoo)
|
||
scoredCandidates = candidates.map(c => {
|
||
score = c.attractiveness / distance(visitor, c)
|
||
return { target: c, score: score }
|
||
})
|
||
return weightedRandomSelect(scoredCandidates)
|
||
```
|
||
|
||
### Messages d'Infos / Alerte
|
||
| Type | Message | Condition | Priorité |
|
||
|---|---|---|---:|
|
||
| Info | "La foule se déplace vers une star." | animal rare visible | 2 |
|
||
| Warn | "Les visiteurs s'ennuient." | ennui moyen > seuil | 4 |
|
||
|
||
# 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)
|
||
### Foule (Passif)
|
||
**Description UX** : Les visiteurs s'agglutinent devant les animaux les plus intéressants.
|
||
**Description UI** : Densité de sprites visiteurs plus élevée autour des cases "Stars".
|
||
**Emplacement** : Grille Zoo.
|
||
**Intégration** : Comportement IA.
|
||
**Navigation** : Aucune (passif). Option debug : toggle “Heatmap foule” dans HUD pour visualiser les zones d’attroupement.
|
||
**Événements** : `CROWD_GATHER`.
|
||
|
||
#### Assets
|
||
- **Musiques** : `ambience_crowd_dynamic.mp3` (volume selon densité).
|
||
- **Sons** : Rumeur de foule (volume variable selon densité).
|
||
- **Graphiques** : Particules “flash photo”, bulles d’émotion.
|
||
- **Images** : `icon_camera.png`, `icon_star.png`.
|
||
- **Vidéos** : `crowd_flash.webm` (0.6s loop, optionnel).
|
||
- **Animations** : Applaudissements, Photos.
|
||
- **Couleurs** : Blanc/Jaune (flash), Or (star).
|
||
- **Textes** : `CROWD_GATHER` = "La foule se rassemble"
|
||
- **Formes** : Bulle BD (émotions).
|