Compare commits

..

7 Commits

Author SHA1 Message Date
dfecb09b7c ok 2026-03-05 03:39:33 +01:00
349f3b8ac3 docs(specs): complete VIP/pass/skin/theme template sections
**Motivations:**
- Make cosmetic/meta specs implementation-ready with the strict required template.

**Root causes:**
- Specs files were missing the mandatory exact headings/tables required by the new template.

**Correctifs:**
- Added the exact required headings and detailed tables without deleting existing sections.

**Evolutions:**
- Clarified VIP/pass/theme gating rules and UX/UI assets contracts.

**Pages affectées:**
- docs/specs/vip.md
- docs/specs/passe_saisonnier.md
- docs/specs/skin.md
- docs/specs/theme.md
2026-03-05 03:33:23 +01:00
5143a79890 docs: enrich docs/specs and remove placeholders
**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
2026-03-05 03:08:15 +01:00
e92c1355d0 Enrichissement exhaustif des specs : Vue Isométrique et Design
**Motivations:**
- Aligner toute la documentation technique avec la nouvelle direction artistique isométrique (Réf IMG_20260303_170253).
- Faciliter l'implémentation en ajoutant les contraintes techniques liées à la 2.5D (Z-index, Sprites 4 directions).

**Root causes:**
- Besoin de cohérence visuelle et technique sur l'ensemble du projet.

**Correctifs:**
- N/A

**Evolutions:**
- Ajout systématique de la section "Direction Artistique & Vue" dans `Annexes UX/UI` de tous les fichiers.
- Enrichissement des modèles JSON avec coordonnées isométriques (`iso_x`, `iso_y`, `z_index`).
- Précision des interactions (clic, survol) adaptées à la grille losange.
- Conservation stricte de la structure existante (aucun titre supprimé).

**Pages affectées:**
- docs/specs/*
2026-03-05 02:10:32 +01:00
1d3352455e Intégration des spécifications Leo : Isométrique, Staff, Cosmétiques
**Motivations:**
- Intégrer les nouvelles fonctionnalités demandées par Leo (vue isométrique, gestion du personnel, personnalisation avatar/zoo).
- Enrichir le gameplay avec des mécaniques de fusion d'enclos et de passes saisonniers.

**Root causes:**
- Demande d'évolution majeure du Game Design (fichier `docs/leo.md`).

**Correctifs:**
- N/A

**Evolutions:**
- Ajout de 19 nouveaux fichiers de spécifications (Staff, Skins, Enclos, Avatar, etc.).
- Mise à jour de 5 fichiers existants pour supporter la vue isométrique et les nouvelles interactions.
- Définition du système de passes temporaires et statut VIP.
- Spécification des employés achetables avec pièces.

**Pages affectées:**
- docs/specs/*
2026-03-05 01:53:05 +01:00
f0219559c5 Standardisation exhaustive des spécifications techniques
**Motivations:**
- Harmoniser la documentation technique pour faciliter le développement.
- Garantir l'exhaustivité des données de Game Design pour chaque entité.

**Root causes:**
- Documentation hétérogène et incomplète.

**Correctifs:**
- N/A

**Evolutions:**
- Réécriture complète de 53 fichiers de spécifications selon un modèle strict.
- Ajout de données de Game Design (prix, durées, impacts) pour combler les manques.
- Ajout systématique des annexes UX/UI.

**Pages affectées:**
- docs/specs/*
2026-03-04 18:07:31 +01:00
ncantu
c7d389ecbb Lint: fix errors and remove unused variables
**Motivations:**
- Ensure lint config is not degraded and fix all lint errors for pousse workflow.

**Root causes:**
- Unused variables kept with _ prefix instead of removed (_row, _questReward, _i).
- getAnimalBlockOrigin had 5 parameters (max 4).
- use of continue statement (no-continue rule).

**Correctifs:**
- ESLint config verified; no eslint-disable in codebase.
- Removed unused variable _row (biome-rules); removed dead function _questReward (quests); removed unused map param _i (state.js).
- getAnimalBlockOrigin refactored to 4 params (pos object instead of x, y).
- Replaced continue with if (cell) block in normalizeLoadedCells (state.js).
- JSDoc param names aligned with _height, _y (biome-rules).

**Evolutions:**
- (none)

**Pages affectées:**
- web/js/biome-rules.js
- web/js/quests.js
- web/js/state.js
- web/js/placement.js
2026-03-04 15:32:27 +01:00
137 changed files with 21902 additions and 4783 deletions

3
.gitignore vendored
View File

@@ -3,6 +3,9 @@ node_modules/
.DS_Store
dist/
build/
app.ini
gitea/
mysql/
.cursor/
terminals/
agent-transcripts/

103
app.ini.example Normal file
View File

@@ -0,0 +1,103 @@
APP_NAME = GIT 4NK
RUN_MODE = prod
RUN_USER = git
WORK_PATH = /data/gitea
[repository]
ROOT = /data/git/repositories
[repository.local]
LOCAL_COPY_PATH = /data/gitea/tmp/local-repo
[repository.upload]
TEMP_PATH = /data/gitea/uploads
[server]
APP_DATA_PATH = /data/gitea
DOMAIN = git1.4nkweb.com
SSH_DOMAIN = git1.4nkweb.com
HTTP_PORT = 3000
ROOT_URL = https://git1.4nkweb.com/
DISABLE_SSH = false
SSH_PORT = 2222
SSH_LISTEN_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET =
OFFLINE_MODE = true
[database]
PATH = /data/gitea/gitea.db
DB_TYPE = mysql
HOST = db:3306
NAME = gitea
USER = gitea
PASSWD =
LOG_SQL = false
SCHEMA =
SSL_MODE = disable
[indexer]
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve
[session]
PROVIDER_CONFIG = /data/gitea/sessions
PROVIDER = file
[picture]
AVATAR_UPLOAD_PATH = /data/gitea/avatars
REPOSITORY_AVATAR_UPLOAD_PATH = /data/gitea/repo-avatars
[attachment]
PATH = /data/gitea/attachments
[log]
MODE = console
LEVEL = info
ROOT_PATH = /data/gitea/log
[security]
INSTALL_LOCK = true
SECRET_KEY =
REVERSE_PROXY_LIMIT = 1
REVERSE_PROXY_TRUSTED_PROXIES = *
INTERNAL_TOKEN =
PASSWORD_HASH_ALGO = pbkdf2
[service]
DISABLE_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = false
REGISTER_EMAIL_CONFIRM = true
ENABLE_NOTIFY_MAIL = true
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS = noreply.localhost
[lfs]
PATH = /data/git/lfs
[mailer]
ENABLED = true
SMTP_ADDR = smtp.protonmail.ch
SMTP_PORT = 587
FROM = noreply@4nkweb.com
USER =
PASSWD =
[openid]
ENABLE_OPENID_SIGNIN = true
ENABLE_OPENID_SIGNUP = true
[cron.update_checker]
ENABLED = false
[repository.pull-request]
DEFAULT_MERGE_STYLE = merge
[repository.signing]
DEFAULT_TRUST_MODEL = committer
[oauth2]
JWT_SECRET =

43
docker-compose-gitea.yml Normal file
View File

@@ -0,0 +1,43 @@
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3016:3000"
- "2222:22"
depends_on:
- db
db:
image: mysql:8
restart: always
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql

View File

@@ -0,0 +1,25 @@
# Billeterie flux complet
**Objectif :** Flux dentrée/sortie conforme aux specs : heures douverture 08h20h, entrée limitée à 1 visiteur/s, départs après durée de séjour, affluence selon lheure.
**Référence :** docs/specs/billeterie.md, visiteur.md, inventaire_heures.md ; plan docs/plan-implementation-specs-animaux-billeterie.md.
## Impacts
- **Entrée :** uniquement quand `timeOfDay` dans [OpenHour, CloseHour). Nombre de nouveaux visiteurs par tick plafonné par `MaxEntryPerSecond * secondsPerTick`.
- **Départs :** déjà en place (`getStayDurationSeconds`, filtre `arrivedAt + stayDuration`).
- **Demande :** `getVisitorDemand` multiplié par un coefficient selon lheure (08h10h faible, 10h16h fort, 16h18h décroissant, 18h20h faible, nuit nul).
## Modifications
- **web/js/config.js** : `Billeterie.OpenHour`, `Billeterie.CloseHour`, `Billeterie.MaxEntryPerSecond`.
- **web/js/income.js** : dans `tickVisitorArrivals`, ne pas ajouter de visiteurs si hors créneau ; plafonner les ajouts par tick avec `MaxEntryPerSecond` et `IncomeTickMs` ; `getVisitorDemandHourMultiplier(timeOfDay)` appliqué dans `getVisitorDemand`.
## Modalités de déploiement
Client uniquement. Rechargement suffit.
## Modalités d'analyse
- Nuit (timeOfDay < 8 ou >= 20) : aucun nouveau visiteur nentre.
- Jour : nouveaux visiteurs jusquà cap et demande, avec au plus 1/s réels (selon tick interval).

View File

@@ -28,14 +28,15 @@
## Non implémenté
- **Seuls** : pas de règle « animal seul meurt ».
- **Seuls** : ~~pas de règle « animal seul meurt ».~~ **Implémenté** : `GameConfig.Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone` ; `checkNotAlone` dans `food.js` ; retrait et `deathCountRecent` si seul depuis trop longtemps.
- **Tué par un autre animal d'un autre zoo** : pas de mécanique inter-zoo.
- **Niveau de recherche trop inférieur** : pas de vérification niveau recherche vs niveau animal.
- **Animal (adulte) vente échouée** : à l'expiration d'une annonce adulte (`isBaby: false`), `deathCountRecent` n'est pas incrémenté (actuellement seul le bébé invendu est compté).
- **Niveau de recherche trop inférieur** : ~~pas de vérification niveau recherche vs niveau animal.~~ **Implémenté** : dans `maybeDeathBlock` (food.js), si `def.rarityLevel > getSkillLevel(state)` → retrait et `deathCountRecent`.
- **Animal (adulte) vente échouée** : ~~à l'expiration d'une annonce adulte (`isBaby: false`), deathCountRecent n'est pas incrémenté.~~ **Implémenté** : `tickSaleListings` (trade.js) incrémente `deathCountRecent` pour les listings expirés adulte comme bébé.
## Fichiers
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `filterPendingBabies`, `filterReceptionAnimals`.
- `web/js/trade.js` : `tickSaleListings` (expiration bébé).
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `checkNotAlone`, `filterPendingBabies`, `filterReceptionAnimals` ; cause recherche (getSkillLevel), cause seuls (Animal config).
- `web/js/trade.js` : `tickSaleListings` (expiration bébé et adulte → deathCountRecent).
- `web/js/animal-visits.js` : `lastVisitedAt` pour cause « pas visités ».
- `server/db.js` : `expireSaleListings` (bébé invendu).
- `web/js/config.js` : `Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone`.

View File

@@ -0,0 +1,24 @@
# Specs documentation enrichment (docs/specs)
**Auteur : Équipe 4NK**
## Objectif
- Rendre lensemble des fichiers de `docs/specs/` exploitables pour une implémentation, sans sections vides, sans placeholders (`N/A`, “voir …”, timestamps `"..."`, ellipses `"..."`), et sans suppression de rubriques existantes.
## Impacts
- Documentation uniquement (pas de modification de logique applicative).
- Convergence des conventions isométriques (2.5D) et des champs de rendu (`iso_x`, `iso_y`, `z_index`, hitbox) dans les specs concernées.
- Clarification des règles “pas de cache / pas de mémorisation” dans les specs où le sujet apparaît.
## Modifications
- Enrichissement des tables et contrats (données/états, cycles, impacts, événements, UX/UI) là où il restait des champs non spécifiés.
- Remplacement des références non actionnables (ex. “voir …”) par des tables explicites.
- Suppression des timestamps et champs dexemple `"..."` au profit de types (`timestamp`) ou structures explicites.
## Modalités danalyse
- Re-scan de `docs/specs/` pour labsence de `N/A`, “ci-dessus”, et `...`.
- Vérification de cohérence “pas de cache” sur les spécifications qui mentionnent des calculs dérivés.
## Modalités de déploiement
- Aucun déploiement (documentation). Les changements suivent le workflow Git standard du dépôt.

View File

@@ -0,0 +1,24 @@
# Feedbacks visuels animaux
**Objectif :** États visuels (froid, chaud, faim, malade, heureux) dérivés des données existantes, sans jauges. Specs : animal_generique.md, temperature.md.
## Impacts
- **Rendu :** classes CSS `animal-cold`, `animal-hot`, `animal-hungry`, `animal-sick`, `animal-happy` sur les cellules animal (origine et parties de bloc).
- **Logique :** `getAnimalVisualState(cell, state, grid, originKey)` dans animal-visual-state.js : température (avec saison), lastFedAt, lastVisitedAt, seuils config (Food.MaxSecondsWithoutFood, Visitor.MaxSecondsWithoutVisit) pour déduire cold/hot/hungry/sick/happy.
## Modifications
- **web/js/animal-visual-state.js** : `getAnimalVisualState` (froid = temp < idéal - tolérance, chaud = temp > idéal + tolérance, hungry = fedAgo > 60 % maxFood, sick = cold ou hot ou hungry ou visitAgo > 80 % maxVisit, happy = aucun problème et bien nourri/visité).
- **web/js/ui.js** : import `getAnimalVisualState`, pour chaque cellule animal (origine ou non) récupération de lorigine et application des classes.
- **web/css/main.css** : `.animal-cold` (teinte bleutée, givre), `.animal-hot` (rougeâtre), `.animal-hungry` (opacité, icône faim), `.animal-sick` (saturé/brillance réduits), `.animal-happy` (lueur, brillance).
## Modalités de déploiement
Client uniquement. Rechargement suffit.
## Modalités d'analyse
- Animal sur case froide (ou saison hiver) : classe cold visible.
- Animal non nourri depuis longtemps : hungry puis sick.
- Animal bien nourri et visité, temp ok : happy.

View File

@@ -16,7 +16,7 @@
- **state.js**
- `buildDefaultCells()` : appelle `buildDefaultRow1Cells()` du module partagé `default-grid-layout.js` (research, billeterie, nursery, reception, food, school en ligne 1).
- `addStarterAnimals(state)` : importée depuis `default-grid-layout.js` ; place 6 animaux (3 couples) sur la ligne 2.
- `defaultState()` : construit le state puis appelle `addDefaultStarterAnimals(state)` avant retour.
- `defaultState()` : construit le state puis appelle `addStarterAnimals(state)` avant retour.
- **prestige.js**
- Même layout de grille et mêmes 3 couples après reset, via `buildDefaultRow1Cells()` et `addStarterAnimals()` importés de `default-grid-layout.js`. Réinitialisation de `pendingBabies` et `receptionAnimals`.

View File

@@ -0,0 +1,36 @@
# Saisons cycle et impacts
**Objectif :** Cycle de 4 saisons (Printemps, Été, Automne, Hiver) dérivé du jour de jeu, avec impacts sur température, visiteurs, reproduction et billeterie.
**Référence :** docs/specs/inventaire_saisons.md, temperature.md, visiteur.md, reproduction.md, billeterie.md ; plan docs/plan-implementation-specs-animaux-billeterie.md.
## Impacts
- **State :** `gameDayTotal` (incrémenté à chaque jour de jeu dans `tickTime`), `lastSeason`, `seasonChangeMessage` (pour notification).
- **Température :** `getDisplayTemperature` + `getSeasonTemperatureModifier(getCurrentSeason(state))` dans food.js (mort) et reproduction.js (délai naissance).
- **Visiteurs :** `getVisitorDemand` multiplié par `getSeasonVisitorMultiplier(season)`.
- **Reproduction :** délai multiplié par `(1 + getSeasonReproductionBonus(season))` (Printemps +20 %, Hiver -50 %). En hiver, les espèces adaptées au froid (`biome === "Mountain"`) sont exemptées du malus (`getEffectiveReproductionSeasonBonus` dans reproduction.js).
- **Billeterie :** `getVisitorParams` applique `getSeasonTicketPriceMultiplier(season)` sur le paiement entrée (été +20 %, hiver -10 %).
- **UI :** toast « C'est le [Saison] ! » à chaque changement de saison (3 s).
## Modifications
- **web/js/config.js** : `Season.DaysPerSeason`, `TemperatureModifier`, `VisitorMultiplier`, `ReproductionBonus`, `TicketPriceMultiplier`.
- **web/js/time-weather.js** : incrément `gameDayTotal` quand `timeOfDay` dépasse 24.
- **web/js/state.js**, **web/js/types.js** : `gameDayTotal`, `lastSeason`, `seasonChangeMessage`.
- **web/js/seasons.js** : `getCurrentSeason`, `getSeasonDay`, `getSeasonTemperatureModifier`, `getSeasonVisitorMultiplier`, `getSeasonReproductionBonus`, `getSeasonTicketPriceMultiplier`.
- **web/js/game-loop.js** : détection changement de saison, pose `seasonChangeMessage`.
- **web/js/food.js** : température effective = base + seasonMod pour `maybeDeathBlock`.
- **web/js/reproduction.js** : temp avec seasonMod, facteur × (1 + seasonBonus) ; `getEffectiveReproductionSeasonBonus(season, def)` pour exonérer Mountain en hiver.
- **web/js/income.js** : demande × seasonVisitorMult, paiement × seasonTicketPriceMult.
- **web/js/ui.js** : toast saison (seasonToastEl), `seasonLabel`, `seasonChangeToast`.
- **web/css/main.css** : `.season-toast`.
## Modalités de déploiement
Client uniquement. Rechargement suffit.
## Modalités d'analyse
- Avancer le temps (DayLengthSeconds court) jusquà changement de jour ; vérifier `gameDayTotal` ; après 7 jours (DaysPerSeason), vérifier changement de saison et toast.
- Vérifier en été : demande visiteurs plus forte, prix ticket plus élevé ; en hiver : demande plus faible, prix ticket plus bas.

View File

@@ -0,0 +1,42 @@
# Extraction du rendu UI (render)
## Objectif
Réduire `web/js/ui.js` pour respecter les règles ESLint :
- max 250 lignes par fichier
- max 40 lignes par fonction
## Réalisé
- **no-shadow** : variables `phase` / `weather` dans `updateStatus` renommées en `timePhase` / `weatherVal` ; `mapLevel` dans `fullRender` renommé en `currentMapLevel`.
- **Imports inutilisés** : suppression des imports devenus inutiles après utilisation des modules world-map et grid (zoo, conveyor, economy, placement, texts-fr, api-client) ; suppression de la constante `EGG_EMOJI` non utilisée.
- **Réutilisation des modules** : `render()` utilise désormais `renderWorldMap(ctx)` de `ui-world-map.js` et `renderGrid(ctx)` de `ui-grid.js` au lieu des anciennes fonctions locales (environ 900 lignes supprimées).
- **Refs** : `selectedTokenId`, `emptyCellChoice`, `lastActionWasDrop`, `sellZoneJustDropped` sont passés en refs pour être partagés avec les handlers (grid, sell zone) et les modules.
# Extraction du rendu UI (render)
## Objectif
Réduire `web/js/ui.js` pour respecter les règles ESLint :
- max 250 lignes par fichier
- max 40 lignes par fonction
## Réalisé
- **no-shadow** : variables `phase` / `weather` dans `updateStatus` renommées en `timePhase` / `weatherVal` ; `mapLevel` dans `fullRender` renommé en `currentMapLevel`.
- **Imports inutilisés** : suppression des imports devenus inutiles après utilisation des modules world-map et grid (zoo, conveyor, economy, placement, texts-fr, api-client) ; suppression de la constante `EGG_EMOJI` non utilisée.
- **Réutilisation des modules** : `render()` utilise désormais `renderWorldMap(ctx)` de `ui-world-map.js` et `renderGrid(ctx)` de `ui-grid.js` au lieu des anciennes fonctions locales (environ 900 lignes supprimées).
- **Refs** : `selectedTokenId`, `emptyCellChoice`, `lastActionWasDrop`, `sellZoneJustDropped` sont passés en refs pour être partagés avec les handlers (grid, sell zone) et les modules.
- **Extraction en modules** :
- `ui-render-dom.js` : `buildUIDOM`, `createTabsStructure`, `updateStatusBody`, `createUpdateStatus`, `createFullRender`, `updateWorldMapUpgradeAndCounters`, `buildFinishContexts`, `finishBuildUIDOM` ; `formatQuestListHtml` pour garder `updateStatusBody` sous 40 lignes ; `finishBuildUIDOM` prend un objet `opts` (max-params) et délègue les contextes à `buildFinishContexts`.
- `ui-render-dom-panels.js` : `buildWorldMapWrap`, `buildWorldMapUpgradeZone`, `buildWorldMapTruckDropZone`, `buildWorldMapActions`, `buildWorldMapSection`, `buildPlotUpgradeZone`, `buildGridSection`, `attachSellZoneListeners`, `handleSellZoneClick` ; import de `handleWorldMapTruckDrop` et `handleSellZoneDrop` depuis `ui-render-dom-drops.js`.
- `ui-render-dom-drops.js` (nouveau) : handlers de drop pour la carte du monde (camion) et la sell zone ; `handleWorldMapTruckDrop`, `handleSellZoneDrop` exportés ; sous-handlers `handleTruckDropBaby`, `handleTruckDropAnimal`, `handleTruckDropEgg`, `applyNurseryDrop`, `applyReceptionDrop`, `applyGridCellSell` pour rester sous 40 lignes et réduire la complexité.
- `ui-render-gamebar.js` : `buildGameBar` et helpers (title, status bar, view switcher, music, auto mode, prestige/restart, quest dropdown) ; import de `buildAutoProfilePicker` depuis `ui-render-gamebar-picker.js`.
- `ui-render-gamebar-picker.js` (nouveau) : `buildAutoProfilePicker` avec `buildAutoProfilePickerFamilyStep` et `buildAutoProfilePickerSpecStep` pour respecter max-lines-per-function et max-lines du fichier gamebar.
- `ui.js` : `EMOJI_BY_COLOR`, `animalEmoji`, `buildRenderSetup(opts)`, `render(root, opts)` qui appelle `buildUIDOM(root, setup)` ; fichier et fonctions sous les limites.
- **Imports nettoyés** : `getPlotUpgradeCost` retiré de panels ; `t` retiré de ui-render-dom ; imports inutilisés retirés de ui-render-gamebar (getSkillLevel, getVisitorCount, getTimePhase, doPrestige, playSound, errorMessage, questDescription, timePhaseLabel, weatherLabel, GameConfig ; textes et auto-mode-profiles conservés dans le picker).
## État actuel
- **ESLint** : 0 erreur sur les fichiers modifiés. Les warnings (complexity, etc.) restants sont hors périmètre de cette extraction.
- **Fichiers** : `ui.js`, `ui-render-dom.js`, `ui-render-dom-panels.js`, `ui-render-dom-drops.js`, `ui-render-gamebar.js`, `ui-render-gamebar-picker.js` respectent max-lines (250) et max-lines-per-function (40).

35
docs/leo.md Normal file
View File

@@ -0,0 +1,35 @@
les cases en entouré d'un enclos qui est joint quand plusieurs animaux identiques sont cotes à cotes
les cartes prennet tout l'espace de l'écrant sous la barre du haut (et dézoom lorsqu'agrandi)
il y a desormais un avatar presonnalisable du joueur (avec un profil de jeu) avec le speudo
son personnage est dans un coin de l'écran et il peut avoir des skins
le zoo lui meme peut avoir des skins
graphiquement le zoo à une banderole d'acceuil avec son nom (à définir au début) tenu par des poteaux en bois
il est possible de changer des cases en chemins upgadables (payant) (terre, gravier, sols jolis...) avec un effet sur l'attractivité plus elevée et la rapidité des visiteurs (plus rapides), les visiteurs sont très attirés à rester sur les chemins
pour traverser l'eau il faut des ponds (techniquement comme les chemins mais pour l'eau)
chaque animal a aussi son objet spécial dans l'enclos (arbre à singe par exemple)
il y a desormais des employés que l'on peut acheter avec les pieces du zoo:
soigneur
nourisseur
agent de sécurité
artiste
checheur (jusqu'à 3 chercheur par centres de recheche)
ne pas confondre les laboratoires sur les cartes avec des bébés ou animaux rares et les centres de recherche de zoos qui produisent des unités de recherche
on peut acheter avec des pièces de la nourriture spéciales différente des cases nourriture pour booster durant un temps limité les caractéristique de la nourriture pour un animal en particulier (nouriture dédiée) ainsi les animaux ont 1 nourriture préférée
Faire un menu spécial pour les achats du zoo avec les pièces
Faire des personnages homme et femme
mettre en place un système de passes temporaires qui permettent d'avoir acces à des skins et thèmes durant 1 mois : jungle, tigre,ourse,lapin,lion,chat,dinosore,pentère,jaguar,crocodile 3d
sac tigre,ourse,lapin,lion,chat,dinosore,pentèrejaguar,crocodile
les VIP peuvent conserver leurs thèmes pour toujours tant qu'ils sont vip
un inventaire est ajouté pour gérer les pièces des skins unitairement
les animaux sont en petit dans leur enclos, une affiche de l'animal est sur une des portions horizontales de l'enclos
prévoir un passage en monde isométrique
sur la carte du monde à coté de la case du nom du zoo, une case avec l'avator du joueur (ou bot) du zoo.

View File

@@ -0,0 +1,192 @@
# Plan Cursor (Cas A) — Exécution “build-ready” : enrichir `docs/specs/` sans suppression
Référence direction artistique : `docs/specs/IMG_20260303_170253.jpg`.
## Objectif exécutable
Enrichir **tous** les fichiers `docs/specs/*.md` pour quils soient “prêts à coder” (règles, données, cas limites, UX/UI), en garantissant :
- **Aucune suppression** de rubriques existantes (même vides).
- **Aucune renommage / réordonnancement** de la structure.
## Règles immuables (garde-fous)
- Ne supprimer aucun titre / sous-titre / tableau / section, même si vide.
- Ne pas renommer les rubriques.
- Si une section existe déjà mais est faible : enrichir **dans la même section**.
- Si une section existe en doublon : conserver les deux, enrichir, ajouter une ligne de clarification (“complément / fait foi”).
- Intégrer partout où pertinent la contrainte **isométrique 2.5D** (grille losange, sprites 4 directions, occlusion, `z_index`, hitbox base sprite).
- Ne pas déclencher de build/checks sans validation explicite “OK build”.
- Ne pas committer sans validation explicite du message de commit.
## Definition of Done (DoD) — par fichier
Un fichier est “Done” si :
- **Structure intacte** (rubriques identiques à avant).
- Tous les placeholders évidents (`N/A`, `...`, “voir ci-dessus” non actionnable) ont été remplacés par des détails implémentables.
- Les tableaux ont unités, plages, règles de cumul, caps/planchers **si la rubrique existe**.
- Si un modèle de données existe : il contient `id`, `created_at`, `updated_at`, types/enums, et les champs isométriques si entité visuelle (`grid`, `iso_x`, `iso_y`, `z_index`, `hitbox`).
- Si UX/UI existe : interactions (clic base sprite), feedback hover/selection, assets, événements, messages i18n (clés FR/EN).
## Protocole exécutable (à dérouler mécaniquement)
### Étape 0 — Pré-scan global
- [ ] Rechercher `N/A` dans `docs/specs/` et obtenir la liste des fichiers impactés.
- [ ] Rechercher `...` / placeholders de structure (“`[ ... ]`”, “voir ci-dessus”) dans `docs/specs/`.
- [ ] Classer les fichiers en 5 lots (A→E) ci-dessous.
**Critère de sortie Étape 0 :** liste des fichiers à corriger par placeholder, et ordre de traitement.
### Étape 1 — Traitement par lots (ordre strict)
#### Lot A — Fondations carte / iso / rendu
Objectif : tout ce qui touche à grille, cases, enclos, chemins, ponts, profondeur.
- [ ] Traiter chaque fichier du lot A en suivant “Procédure par fichier”.
**Critère de sortie Lot A :** champs transverses iso (`grid`, `iso_x`, `iso_y`, `z_index`, `hitbox`) cohérents entre ces fichiers.
#### Lot B — Entités vivantes
Objectif : visiteurs, animaux, bébés, reproduction, mort, besoins.
- [ ] Traiter chaque fichier du lot B en suivant “Procédure par fichier”.
**Critère de sortie Lot B :** cycles de vie, seuils, impacts et événements cohérents entre fichiers (ex. reproduction ↔ saisons ↔ température).
#### Lot C — Bâtiments & services
Objectif : boutique, billeterie, nurserie, accueil, camion, centre recherche, labo.
- [ ] Traiter chaque fichier du lot C en suivant “Procédure par fichier”.
**Critère de sortie Lot C :** capacités, files dattente, dépenses/recettes, préconditions, erreurs, interactions UI codables.
#### Lot D — Économie & méta
Objectif : scores, attractivité, enchères, ventes, upgrades, skins/themes/passes/VIP, inventaires, menu achats.
- [ ] Traiter chaque fichier du lot D en suivant “Procédure par fichier”.
**Critère de sortie Lot D :** toutes les mécaniques ont unités, formules, règles de cumul, caps/planchers et messages UX.
#### Lot E — Inventaires & tables de référence
Objectif : saisons, météo, températures, milieux, quêtes, problèmes visiteurs, heures.
- [ ] Traiter chaque fichier du lot E en suivant “Procédure par fichier”.
**Critère de sortie Lot E :** tables de ref complètes (enums/ranges/priorités) et réutilisées par les autres specs.
### Procédure par fichier (checklist atomique)
Pour chaque fichier `.md` ciblé :
- [ ] Lire le fichier en entier.
- [ ] Vérifier la liste des rubriques existantes (ne rien supprimer).
- [ ] Remplacer chaque occurrence de `N/A` par un contenu implémentable (valeurs, conditions, règles, assets).
- [ ] Remplacer chaque placeholder de structure (`...`, `[ ... ]`) par un exemple complet cohérent.
- [ ] Compléter les tableaux : unités, plages, cumul, caps/planchers, préconditions, postconditions.
- [ ] Compléter les interactions : erreurs (fonds insuffisants, inventaire plein, placement invalide), cas limites (pathfinding bloqué, occlusion, click ambiguity).
- [ ] Si la rubrique JSON existe : ajouter/normaliser `id`, timestamps, enums, et champs iso si entité visuelle.
- [ ] Si UX/UI existe : préciser hitbox base sprite, feedback hover/selection, Z-order, assets, events, messages i18n FR/EN.
- [ ] Vérifier quaucun titre/sous-titre na disparu.
**Critère de sortie du fichier :** DoD “par fichier” satisfait.
### Étape 2 — Contrôle final global
- [ ] Vérifier cohérence des champs transverses (`id`, `created_at`, `updated_at`, `owner_id`, `grid`, `iso_x`, `iso_y`, `z_index`, `status_flags`).
- [ ] Vérifier cohérence des événements/messages (noms, niveaux, conditions).
- [ ] Vérifier conformité aux règles projet (ex. interdiction de cache dans les specs).
## Commit et checks (gated)
- [ ] Préparer le message de commit au format imposé (`**Motivations:**`, `**Root causes:**`, `**Correctifs:**`, `**Evolutions:**`, `**Pages affectées:**`) et demander validation.
- [ ] **Ne pas committer** sans validation explicite.
- [ ] **Ne pas exécuter de build/checks** sans “OK build”.
## Mapping des lots (ordre recommandé)
- **Lot A** : `carte_zoo.md`, `case_generique.md`, `case_zoo.md`, `enclos.md`, `chemin.md`, `pont.md`, `affiche_enclos.md`, `objet_enclos.md`, `tech_architecture.md`
- **Lot B** : `animal_generique.md`, `bebe_animal.md`, `visiteur.md`, `reproduction.md`, `mort_bebe.md`, `temperature.md`, `milieu.md`, `etat.md`
- **Lot C** : `boutique.md`, `billeterie.md`, `nurserie.md`, `accueil_animaux.md`, `camion.md`, `centre_recherche.md`, `laboratoire.md`
- **Lot D** : `score_reputation.md`, `score_survie.md`, `attractivite_interne_zoo.md`, `attractivite_zoo_sur_ville.md`, `enchere_generique.md`, `vente_animal.md`, `vente_enchere_animal.md`, `vente_enchere_bebe.md`, `achat_upgrade_*.md`, `inventaire_animaux.md`, `inventaire_bebe_animaux.md`, `menu_achats.md`, `skin.md`, `theme.md`, `passe_saisonnier.md`, `vip.md`, `inventaire_skins.md`, `joueur.md`, `personnage_generique.md`, `bot.md`, `zoo.md`
- **Lot E** : `inventaire_saisons.md`, `inventaire_meteos.md`, `inventaire_temperatures.md`, `inventaire_milieux.md`, `inventaire_quetes.md`, `inventaire_problemes_visiteurs.md`, `inventaire_heures.md`, `carte_monde.md`, `carte_generique.md`, `case_monde.md`, `site_generique.md`, `agrandissement_carte.md`
## Checklist exhaustive — fichiers `docs/specs/` à enrichir (sans suppression)
- [ ] `docs/specs/accueil_animaux.md`
- [ ] `docs/specs/achat_upgrade_boutique.md`
- [ ] `docs/specs/achat_upgrade_camion.md`
- [ ] `docs/specs/achat_upgrade_case.md`
- [ ] `docs/specs/achat_upgrade_case_zoo.md`
- [ ] `docs/specs/achat_upgrade_centre_recherche.md`
- [ ] `docs/specs/achat_upgrade_generique.md`
- [ ] `docs/specs/achat_upgrade_nurserie.md`
- [ ] `docs/specs/affiche_enclos.md`
- [ ] `docs/specs/agent_securite.md`
- [ ] `docs/specs/agrandissement_carte.md`
- [ ] `docs/specs/animal_generique.md`
- [ ] `docs/specs/artiste.md`
- [ ] `docs/specs/attractivite_interne_zoo.md`
- [ ] `docs/specs/attractivite_zoo_sur_ville.md`
- [ ] `docs/specs/avatar_joueur.md`
- [ ] `docs/specs/banderole_accueil.md`
- [ ] `docs/specs/bebe_animal.md`
- [ ] `docs/specs/billeterie.md`
- [ ] `docs/specs/bot.md`
- [ ] `docs/specs/boutique.md`
- [ ] `docs/specs/camion.md`
- [ ] `docs/specs/carte_generique.md`
- [ ] `docs/specs/carte_monde.md`
- [ ] `docs/specs/carte_zoo.md`
- [ ] `docs/specs/case_generique.md`
- [ ] `docs/specs/case_monde.md`
- [ ] `docs/specs/case_zoo.md`
- [ ] `docs/specs/centre_recherche.md`
- [ ] `docs/specs/chemin.md`
- [ ] `docs/specs/chercheur.md`
- [ ] `docs/specs/enchere_generique.md`
- [ ] `docs/specs/enclos.md`
- [ ] `docs/specs/etat.md`
- [ ] `docs/specs/impacts_generique.md`
- [ ] `docs/specs/inventaire_animaux.md`
- [ ] `docs/specs/inventaire_bebe_animaux.md`
- [ ] `docs/specs/inventaire_heures.md`
- [ ] `docs/specs/inventaire_meteos.md`
- [ ] `docs/specs/inventaire_milieux.md`
- [ ] `docs/specs/inventaire_problemes_visiteurs.md`
- [ ] `docs/specs/inventaire_quetes.md`
- [ ] `docs/specs/inventaire_saisons.md`
- [ ] `docs/specs/inventaire_skins.md`
- [ ] `docs/specs/inventaire_temperatures.md`
- [ ] `docs/specs/joueur.md`
- [ ] `docs/specs/laboratoire.md`
- [ ] `docs/specs/menu_achats.md`
- [ ] `docs/specs/milieu.md`
- [ ] `docs/specs/mort_bebe.md`
- [ ] `docs/specs/nourisseur.md`
- [ ] `docs/specs/nourriture_speciale.md`
- [ ] `docs/specs/nurserie.md`
- [ ] `docs/specs/objet_enclos.md`
- [ ] `docs/specs/passe_saisonnier.md`
- [ ] `docs/specs/personnage_generique.md`
- [ ] `docs/specs/pont.md`
- [ ] `docs/specs/reproduction.md`
- [ ] `docs/specs/score_reputation.md`
- [ ] `docs/specs/score_survie.md`
- [ ] `docs/specs/site_generique.md`
- [ ] `docs/specs/skin.md`
- [ ] `docs/specs/soigneur.md`
- [ ] `docs/specs/tech_architecture.md`
- [ ] `docs/specs/temperature.md`
- [ ] `docs/specs/theme.md`
- [ ] `docs/specs/vente_animal.md`
- [ ] `docs/specs/vente_enchere_animal.md`
- [ ] `docs/specs/vente_enchere_bebe.md`
- [ ] `docs/specs/ville.md`
- [ ] `docs/specs/vip.md`
- [ ] `docs/specs/visiteur.md`
- [ ] `docs/specs/zoo.md`

View File

@@ -1,321 +0,0 @@
# Plan d'implémentation Rappel des grandes règles (cahier des charges 174-324)
Plan pour implémenter lintégralité du bloc « Rappel des grandes règles » sans exception. Les phases sont ordonnées par dépendances ; chaque phase livre un ensemble cohérent et testable.
---
## 0. Modèle de données et configuration
**Objectif** : Fondations pour tout le reste (cases avec couleur + température, bâtiments, bébés vs animaux, ventes).
**Livrables** :
- **Cases** : chaque case a une **couleur** (milieu : eau douce, eau salée, montagne, prairie, forêt, etc.) et une **température** (nombre ou plage). Transitions douces = formules dinterpolation entre cases voisines (calcul côté moteur).
- **Animaux multi-cases** : définition des types danimaux qui occupent N×M cases (shape), et stockage dans `grid.cells` (référence à une entité « animal » multi-case ou marquage des cases).
- **Types de bâtiments** (remplacement / extension des kinds actuels) :
- `research` (Centre de recherche), 7 niveaux
- `billeterie`, 7 niveaux
- `boutique` (déjà présent en `souvenirShop` → renommer/aligner), 7 niveaux
- `nursery`, 7 niveaux (au lieu de 5)
- `food` (Nourriture), 7 niveaux
- `reception` (Accueil nouveaux animaux), 7 niveaux
- `truck` (camion : actuellement métadonnée détat, pas une case à trancher : case dédiée ou zone comme aujourdhui)
- `biomeChangeColor` (changement de milieu couleur), 7 niveaux
- `biomeChangeTemp` (changement de milieu température), 7 niveaux
- **Entités déplaçables** : `baby` (bébé, en nurserie ou en vente), `animal` (adulte, sur carte ou en accueil ou en vente). Plus dœufs comme objet principal : les zoos exposent des **bébés** et des **animaux** à lachat/vente.
- **Config** : GameConfig étendu (niveaux max à 7 pour les bâtiments listés, coûts, capacités : recherche 10 zoos/unité, billeterie 20 visiteurs/unité, boutique 5 visiteurs/unité, nurserie 1 bébé/unité, nourriture 5 animaux/unité, accueil 1 animal/unité, camion 1/unité).
**Fichiers impactés** : `web/js/types.js`, `web/js/config.js`, `web/js/state.js`, `server/schema.sql` (si extension game_state), `web/js/loot-tables.js` (animaux avec `cellsWide`, `cellsHigh`, température idéale, score reproduction/survie par milieu).
**Dépendances** : aucune.
---
## 1. Cartes : couleurs et températures des cases
**Objectif** : Les cases ont une couleur (milieu) et une température ; les transitions sont douces entre cases.
**Livrables** :
- **Couleurs** : élargir les biomes au-delà de prairie/océan/montagne (eau douce, eau salée, montagne, prairie, forêt, etc.) ; chaque case a un `biome` (couleur/milieu) et un `temperature` (valeur ou min/max).
- **Transitions douces** : calcul de la couleur et de la température affichées par interpolation avec les cases voisines (ou gradient par position). Export dune fonction du type `getDisplayColor(x, y, grid)`, `getDisplayTemperature(x, y, grid)`.
- **Rendu** : CSS/Canvas ou styles dynamiques pour fond de case selon couleur et température (dégradés entre cases).
- **Grille** : les cases forment le cadrillage des cartes (zoo et monde) ; pas de changement de structure, seulement sémantique couleur/température.
**Fichiers impactés** : `web/js/biome-rules.js` (ou nouveau `cell-environment.js`), `web/js/grid-utils.js`, `web/css/main.css`, `web/js/ui.js` (rendu grille).
**Dépendances** : Phase 0.
---
## 2. Animaux multi-cases
**Objectif** : Certains animaux prennent plusieurs cases.
**Livrables** :
- **Définition** : dans les données animaux (loot-tables ou équivalent), champs `cellsWide`, `cellsHigh` (ex. 1×1, 2×2). Placement valide si toutes les cases cibles sont vides et dans les limites.
- **Stockage** : soit une entité « animal » avec `originKey` (case coin) + `animalId` + `width`, `height`, soit marquage de chaque case avec référence à la même entité. Suppression/mouvement : toute la surface est libérée ou déplacée.
- **Règles** : cohérence animal/milieu et température (phase 1) appliquée sur la zone couverte (ex. toutes les cases dans la plage de température idéale ou au moins la case dorigine).
- **UI** : affichage dun sprite ou emprise sur plusieurs cases ; glisser-déposer dun animal multi-case déplace tout le bloc.
**Fichiers impactés** : `web/js/loot-tables.js`, `web/js/placement.js`, `web/js/grid-utils.js`, `web/js/ui.js`, `web/js/state.js` (structure cells).
**Dépendances** : Phase 0, 1.
---
## 3. Bâtiments zoo (types et niveaux)
**Objectif** : Implémenter tous les types de cases « achetables » avec 7 niveaux et leurs effets.
**Livrables** :
- **Centre de recherche** (`research`) : 7 niveaux. Produit des **unités de recherche** par tick (formule par niveau). Stock dans le game_state (ex. `researchPoints`). 1 unité = 10 zoos max couverts (par proximité sur la carte du monde) ; ces zoos débloquent des niveaux danimaux/bébés. Coût dupgrade par palier.
- **Billeterie** : 7 niveaux. Cap visiteurs en simultané = 20 × niveau (ou 20 par unité comme dans le rappel). Entrée des visiteurs uniquement via la billeterie (voir phase 8). Coût par palier.
- **Boutique** : passer à 7 niveaux. 1 unité = 5 visiteurs simultanés max (effet sur revenus quand un visiteur « passe » par une boutique). Coût par palier.
- **Nurserie** : 7 niveaux. 1 unité = 1 bébé max en croissance. Effet « plus rapide » et « meilleurs reproducteurs » (à lier à la reproduction, phase 7). Coût par palier.
- **Nourriture** : 7 niveaux. 1 unité = 5 animaux max nourris (voir phase 4). Coût par palier.
- **Accueil nouveaux animaux** : 7 niveaux. 1 unité = 1 animal en acclimatation. Durée dacclimatation selon niveau ; à la fin, état « animal prêt » déplaçable sur une case ou sur le camion. Coût par palier.
- **Camion** : 7 niveaux. Représentation : soit une case dédiée « camion », soit une zone comme aujourdhui ; 1 unité = 1 camion. Effets : plus rapide (durée trajet), dégrade moins le score de reproduction avec la durée du transport (à lier aux ventes et au score de reproduction).
- **Changement de milieu (couleur)** : 7 niveaux, payant. Permet de modifier la couleur/milieu dune case (ou dune zone selon niveau). Effets : plage de température plus précise, améliore reproduction, diminue besoin nourriture, allonge temps avant mort.
- **Changement de milieu (température)** : 7 niveaux, payant. Même idée pour la température des cases.
**Grille au lancement** (à appliquer en phase 11) : 1 Agrandissement zoo, 1 Recherche, 1 Billeterie, 1 Nurserie, 1 Accueil, 1 Nourriture, 1 Camion, 24 cases (3 couleurs). Pas de « changement de milieu » au lancement.
**Fichiers impactés** : `web/js/config.js`, `web/js/state.js`, `web/js/economy.js`, `web/js/placement.js`, `web/js/zoo.js`, `web/js/ui.js`, `server/` si game_state étendu.
**Dépendances** : Phase 0.
---
## 4. Bébés et flux nurserie / accueil (remplacement œufs)
**Objectif** : Ce ne sont plus des œufs qui apparaissent dans les zoos mais des bébés ; flux nurserie → bébé mature, achat/accueil → animal prêt.
**Livrables** :
- **Suppression du modèle « œuf »** comme objet acheté sur la carte du monde. Les zoos (et le labo) proposent des **bébés** ou des **animaux adultes** à lachat.
- **Nurserie** : un bébé est « en croissance » dans une case nurserie (1 bébé par unité de capacité). À la fin de la durée : état **bébé mature**. Déplacement possible : vers une case vide du zoo (devient animal) ou vers le camion (mise en vente, voir phase 9).
- **Accueil nouveaux animaux** : un animal acheté (ou reçu) est dabord en **accueil** (1 animal par unité). À la fin de lacclimatation : **animal prêt**. Déplacement possible : vers une case vide du zoo ou vers le camion (mise en vente).
- **Carte du zoo** : on peut **acheter** (occupe la case) : recherche, billeterie, boutique, nurserie, nourriture, accueil, camion, changement de milieu (couleur), changement de milieu (température). On peut **déplacer dessus** (occupe la case) : bébé mature, animal prêt.
- **État** : `pendingBabies` / `receptionAnimals` avec `readyAt`, `babyId` / `animalId`, lien vers case nurserie/accueil. Quand `now >= readyAt`, lentité est déplaçable (bébé mature / animal prêt).
**Fichiers impactés** : `web/js/state.js`, `web/js/zoo.js`, `web/js/placement.js`, `web/js/hatching.js` (remplacer par croissance bébé + acclimatation), `web/js/conveyor.js` (offres = bébés/animaux, pas œufs), `web/js/ui.js`, `web/js/world-map.js`, API offres.
**Dépendances** : Phase 0, 3.
---
## 5. Nourriture, consommation et morts
**Objectif** : Chaque animal a une consommation / unité de temps ; sinon il meurt. Toutes les causes de mort listées.
**Livrables** :
- **Nourriture** : par tick, calcul de la consommation totale des animaux du zoo. Les bâtiments « nourriture » ont une capacité (5 animaux × niveau ou 5 par unité). Répartition : nourrir jusquà la capacité ; les animaux non nourris accumulent un déficit (ou un timer « sans nourriture »).
- **Mort si pas nourri** : au-delà dun seuil (temps ou déficit), lanimal meurt (retiré de la grille, enregistré pour pénalités attractivité / naissances).
- **Autres causes de mort** (toutes à implémenter) :
- **Seul** : à définir (ex. animal seul sur lîle sans voisin après un délai).
- **Pas visité** : déjà en place (MaxSecondsWithoutVisit).
- **Manque de nourriture** : ci-dessus.
- **Tué par un autre animal dun autre zoo** : règle métier (ex. événement rare ou mécanique croisée entre zoos).
- **Niveau de recherche trop inférieur** : si niveau du centre de recherche du zoo < seuil requis pour le type danimal, après un délai lanimal meurt.
- **Bébé non vendu dans les délais** : si un bébé en vente nest pas vendu avant une date limite, il meurt (voir phase 9).
- **Bébé de nurserie prêt non placé dans les délais** : si bébé mature nest pas déplacé (case ou camion) avant un délai, il meurt.
- **Animal daccueil prêt non placé sur la carte après un délai** : idem.
- **Animal non placé sur la carte dans les délais (vente échouée)** : si une vente est annulée ou expire sans que lanimal soit récupéré, mort.
- **Température trop en écart** : si la température de la case (ou de la zone) nest pas dans la plage acceptable pour lanimal, après un délai mort.
- **Milieu (couleur) trop en écart** : idem pour le biome.
- **Historique des morts** : stockage (compteur ou liste récente) pour calcul dattractivité et de naissances (phases 8 et 7).
**Fichiers impactés** : `web/js/config.js`, `web/js/state.js`, nouveau `web/js/food.js` (ou dans `income.js`), `web/js/game-loop.js`, `web/js/animal-visits.js` (étendre pour morts), `web/js/loot-tables.js` (température idéale, plages par animal).
**Dépendances** : Phase 0, 1, 3, 4.
---
## 6. Reproduction
**Objectif** : Après un délai, en proximité dun autre animal de même type mais issu dun zoo différent, naissance dun bébé (nurserie ou vente). Score de reproduction du zoo et adéquation température/milieu influencent.
**Livrables** :
- **Proximité** : deux animaux de même type (même `animalId` ou même « type ») sur des cases adjacentes (ou à distance N). Un des deux doit avoir une origine « autre zoo » (vendue achetée) pour permettre la reproduction.
- **Délai** : timer par paire ou par animal ; à léchéance, génération dun **bébé**. Le bébé va en nurserie si une place est libre, sinon directement en vente (case de vente sur la carte du monde).
- **Score de reproduction du zoo** (voir phase 7) : utilisé pour accélérer larrivée du bébé (réduction du délai).
- **Température et milieu** : « très bonne adéquation » avec la température/milieu de lanimal réduit le délai ou augmente la chance de reproduction.
- **Score de reproduction par milieux (couleurs)** et **score de survie par milieux (couleurs)** : définis dans les données animaux ; utilisés dans les formules de reproduction et de mort.
- **Température idéale** : par type danimal (déjà prévu en phase 5 pour les morts) ; utilisée aussi pour la reproduction.
**Fichiers impactés** : `web/js/loot-tables.js`, nouveau `web/js/reproduction.js`, `web/js/state.js`, `web/js/game-loop.js`.
**Dépendances** : Phase 0, 1, 4, 5.
---
## 7. Score de reproduction du zoo
**Objectif** : Nombre de naissances, taux dalimentation, et score « vendu » attaché aux animaux.
**Livrables** :
- **Nombre de naissances** : compteur dans le game_state (incrémenté à chaque bébé né en reproduction).
- **Taux dalimentation** : ratio (animaux nourris / animaux total) sur une fenêtre ou instantané ; stocké ou dérivé pour laffichage et les formules.
- **Score de reproduction** (valeur agrégée du zoo) : formule combinant naissances, taux dalimentation, et éventuellement autres facteurs. Exposé pour lUI (carte du monde : case « score de reproduction » sous le nom du zoo).
- **Animal vendu** : quand un animal quitte le zoo (vente), il garde en mémoire le **score de reproduction du zoo au moment de la vente** (pour accélérer larrivée dun bébé dans le zoo acheteur, phase 6).
**Fichiers impactés** : `web/js/state.js`, `web/js/income.js` ou `web/js/food.js`, `web/js/reproduction.js`, `web/js/trade.js`, `web/js/world-map.js` (affichage score).
**Dépendances** : Phase 5, 6.
---
## 8. Attractivité et visiteurs (billeterie, 1 journée, boutiques)
**Objectif** : Visiteurs entrent par la billeterie, restent max 1 journée, plus longtemps avec boutiques et nombre danimaux différents. Attractivité du zoo avec toutes les composantes et pénalités.
**Livrables** :
- **Billeterie** : seule entrée des visiteurs dans le zoo. Capacité simultanée = 20 × niveau billeterie (ou 20 par unité). Le nombre de visiteurs présents est plafonné par cette capacité.
- **Durée max 1 journée** : chaque visiteur a une « arrivée » ; il repart au plus tard après 1 journée (temps de jeu). Il repart par la billeterie.
- **Temps passé** : les visiteurs restent plus longtemps dans la journée sil y a des boutiques et plus danimaux différents (formule à définir).
- **Déplacement** : les visiteurs se déplacent en étant attirés (déjà partiellement en place ; conserver et adapter si besoin).
- **Attractivité du zoo** (formule globale) :
- proportionnelle à la valeur cumulée des animaux du zoo
- proportionnelle au nombre danimaux différents
- proportionnelle à la rareté (niveau) des animaux
- proportionnelle au taux de remplissage en animaux
- **Pénalités** : les morts pénalisent lattractivité auprès des visiteurs à venir (depuis les villes) ; les morts pénalisent lapparition de naissances dans le zoo.
- **Bonus** : les naissances augmentent lattractivité auprès des visiteurs à venir ; les naissances augmentent lapparition dautres naissances dans le zoo.
- **Villes** : nombre de visiteurs maximum vers les zoos (voir phase 10). Lattractivité du zoo détermine combien de ces visiteurs sont « alloués » au zoo.
- **Affichage** : sur la carte du monde, sous le nom du zoo : une case « score dattractivité » (et une « score de reproduction », phase 7).
**Fichiers impactés** : `web/js/income.js`, `web/js/visitor-attraction.js`, `web/js/config.js`, `web/js/state.js`, `web/js/ui.js`, `web/js/world-map.js`.
**Dépendances** : Phase 3, 5, 7.
---
## 9. Carte du monde : agrandissement en unités de recherche et compteurs
**Objectif** : Agrandissement de la carte payé en unités de recherche ; affichage des compteurs et des cases zoo (attractivité, reproduction, vente).
**Livrables** :
- **Agrandissement de la carte** : plus payé en pièces mais en **unités de recherche** produites par les centres de recherche des zoos du joueur. Coût en unités par palier (plus cher par palier, même nombre de cases ajoutées). Si pas assez dunités, bouton/zone grisé.
- **Compteurs** (sur la carte du monde ou dans une barre dédiée) :
- Compteur de bébés à vendre (total ou par zoo)
- Compteur danimaux à vendre
- Compteur de laboratoires
- Compteur de zoos
- Compteur de villes
- **Cases monde au lancement** : 1 Agrandissement carte, 1 Compteur bébés à vendre, 1 Compteur animaux à vendre, 1 Compteur laboratoires, 1 Compteur zoos, 1 Compteur villes, 1 Accueil, 1 Nourriture, 1 Camion, 24 cases 3 couleurs.
- **Case du zoo (joueur et autres)** : 1 case nom du zoo, juste en dessous 1 case score dattractivité, juste en dessous 1 case score de reproduction, juste en dessous 1 case de vente (voir phase 10). Possibilité dacheter sur les cases voisines dautres cases de vente (achats multi-slots).
- Même principe pour zoos des autres joueurs et zoos bots.
**Fichiers impactés** : `web/js/state.js`, `web/js/economy.js`, `web/js/world-map.js`, `web/js/ui.js`, `web/js/config.js`.
**Dépendances** : Phase 3, 7, 8.
---
## 10. Ventes et enchères (bébés et animaux adultes)
**Objectif** : Bébés et animaux en vente sur la carte du monde ; enchères joueurs/bots ; vendeur valide ou non ; bébé invendu meurt.
**Livrables** :
- **Cases de vente** : sur la carte du monde, sous le nom de chaque zoo, une (ou plusieurs) case(s) de vente affichant un bébé ou un animal à vendre, avec le dernier montant denchère.
- **Mise en vente** : depuis la carte du zoo, déplacer un animal ou un bébé mature sur le camion → lentité sort du zoo et apparaît en **vente** sur la carte du monde (case de vente du joueur).
- **Enchères** : joueurs et bots peuvent enchérir. Montant initial décidé par le vendeur (ou dérivé dun prix de base). Après un temps, le **vendeur** choisit de valider ou non la vente (acceptation de la meilleure enchère ou refus).
- **Si vente validée** : lacheteur reçoit le bébé ou lanimal (en accueil dans son zoo, ou en nurserie si bébé). Le score de reproduction du zoo vendeur au moment de la vente est attaché à lentité (pour accélérer bébé en phase 6).
- **Si bébé invendu** (délai dépassé sans vente validée) : le bébé **meurt** (supprimé, pénalités éventuelles).
- **Animaux adultes** : les zoos vendent aussi des animaux adultes (pas seulement des bébés) ; même flux : mise sur le camion → case de vente → enchères → validation ou refus.
**Fichiers impactés** : `web/js/state.js`, `web/js/trade.js`, `web/js/world-map.js`, `web/js/ui.js`, `server/routes/zoos.js` ou nouveau `server/routes/trades.js` (enchères temps réel ou polling), `server/db.js` (table ou champs pour offres de vente / enchères).
**Dépendances** : Phase 4, 6, 7, 9.
---
## 11. Villes
**Objectif** : Cases des villes avec nom et nombre de visiteurs maximum vers les zoos.
**Livrables** :
- **Cases des villes** : sur la carte du monde, chaque ville a 1 case nom et 1 case « nombre de visiteurs maximum vers les zoos » (capacité totale ou par zoo à définir).
- **Règle** : ce nombre limite ou répartit les visiteurs qui peuvent aller vers les zoos (déjà partiellement en place avec CityAttractionScale ; adapter pour un plafond « max visiteurs vers zoos » par ville).
**Fichiers impactés** : `web/js/config.js`, `web/js/world-map.js`, `web/js/income.js` ou `web/js/visitor-attraction.js`, `web/js/ui.js`.
**Dépendances** : Phase 8.
---
## 12. UI et grille au lancement
**Objectif** : Grille zoo et monde conformes au rappel ; transitions douces visibles ; tous les types de cases et actions.
**Livrables** :
- **Carte du zoo au lancement** : 1 Agrandissement du zoo (+1 case, payant), 1 Recherche (en haut à gauche), 1 Billeterie, 1 Nurserie, 1 Accueil nouveaux animaux, 1 Nourriture, 1 Camion, 24 cases de 3 couleurs différentes. Positions exactes (ex. 1_1 = Recherche, 2_1 = Billeterie, …) à fixer dans `defaultState()` et config.
- **Carte du monde au lancement** : 1 Agrandissement de la carte (payé en unités de recherche), compteurs (bébés, animaux, labos, zoos, villes), 1 Accueil, 1 Nourriture, 1 Camion, 24 cases de 3 couleurs. Layout à définir (même zone que la grille zoo ou zone dédiée).
- **Transitions douces** : rendu des couleurs et températures avec interpolation (phase 1) visible sur les deux cartes.
- **Actions** : achat sur case vide (recherche, billeterie, boutique, nurserie, nourriture, accueil, camion, changement de milieu couleur, changement de milieu température) ; déplacement sur case vide (bébé mature, animal prêt). Messages derreur et feedback clairs.
- **Accessibilité** : ARIA, clavier, contraste (règles projet).
**Fichiers impactés** : `web/js/state.js`, `web/js/ui.js`, `web/js/world-map.js`, `web/css/main.css`.
**Dépendances** : Toutes les phases précédentes.
---
## 13. Migration et compatibilité
**Objectif** : Anciennes sauvegardes (modèle œufs/école actuel) restent jouables ou migration propre.
**Livrables** :
- **Détection de version** : `game_state.version` ou `game_state.specVersion` pour distinguer « ancien » (œufs, école, 5 niveaux) et « nouveau » (bébés, recherche, 7 niveaux, etc.).
- **Migration** : script ou logique au chargement : si ancienne version, soit conversion (œufs → bébés en nurserie, école → centre de recherche niveau 1, etc.), soit message « sauvegarde incompatible, recommencer ».
- **API et BDD** : extension de `game_state` (JSONB) pour tous les nouveaux champs ; pas de perte de données existantes si migration choisie.
**Fichiers impactés** : `web/js/state.js` (loadState, defaultState), `server/routes/zoos.js`, éventuellement script de migration côté serveur.
**Dépendances** : Toutes les phases 012.
---
## Synthèse des dépendances
```
0 (modèle) ─┬─ 1 (couleurs/temp) ─┬─ 2 (multi-cases)
│ └─ 5 (nourriture/morts)
├─ 3 (bâtiments)
└─ 4 (bébés/flux)
├─ 5 (nourriture/morts) ─ 7 (score repro)
├─ 6 (reproduction) ──── 7
├─ 8 (attractivité/visiteurs)
├─ 9 (carte monde recherche/compteurs)
└─ 10 (ventes/enchères) ─ 11 (villes)
└─ 12 (UI / grilles lancement) ─ 13 (migration)
```
**Ordre recommandé dimplémentation** : 0 → 1 → 3 → 4 → 2 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13.
---
## Checklist exhaustive (référence 174-324)
- [ ] Cases : couleur (milieu) + température ; transitions douces
- [ ] Animaux multi-cases
- [ ] Centre de recherche : 7 niv., unités de recherche, 10 zoos/unité, déblocage niveaux animaux/bébés
- [ ] Billeterie : 7 niv., 20 visiteurs/unité, entrée/sortie visiteurs
- [ ] Boutique : 7 niv., 5 visiteurs simultanés/unité
- [ ] Nurserie : 7 niv., 1 bébé/unité, bébé mature → case ou camion
- [ ] Nourriture : 7 niv., consommation/animal, mort si pas nourri, 5 animaux/unité, reproduction
- [ ] Accueil nouveaux animaux : 7 niv., 1 animal/unité, animal prêt → case ou camion
- [ ] Camion : 7 niv., bébé/animal sur camion → vente carte monde, 1 camion/unité
- [ ] Changement de milieu (couleur) : 7 niv., payant
- [ ] Changement de milieu (température) : 7 niv., payant
- [ ] Bébés animaux (plus dœufs) ; zoos vendent bébés et animaux adultes
- [ ] Morts : seuls, pas visités, nourriture, tué autre zoo, recherche trop basse, bébé non vendu à temps, bébé mature non placé à temps, animal accueil non placé à temps, vente échouée, température/milieu en écart
- [ ] Reproduction : délai, proximité même type autre zoo, score repro, température/milieu adéquats ; score repro/survie par milieu ; température idéale
- [ ] Score de reproduction du zoo : naissances, taux alimentation, score vendu sur lanimal
- [ ] Attractivité : valeur cumulée, nombre danimaux différents, rareté, taux remplissage ; pénalités morts ; bonus naissances
- [ ] Visiteurs : entrée billeterie, max 1 journée, plus longtemps avec boutiques et diversité animaux, déplacement attiré
- [ ] Carte du monde : agrandissement en unités de recherche ; compteurs bébés, animaux, labos, zoos, villes ; cases zoo (nom, attractivité, reproduction, vente) ; villes (nom, max visiteurs vers zoos)
- [ ] Ventes : cases de vente sous les zoos ; enchères joueurs/bots ; vendeur valide ou non ; bébé invendu meurt
- [ ] Grille zoo au lancement : 1 agrandissement, 1 recherche, 1 billeterie, 1 nurserie, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs
- [ ] Grille monde au lancement : 1 agrandissement carte (recherche), compteurs, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs
- [ ] Migration anciennes sauvegardes / compatibilité

View File

@@ -0,0 +1,192 @@
# Plan d'implémentation Specs Animaux, Morts, Saisons, Billeterie
Références : `docs/plan-action-cahier-des-charges.md` (§7 Animaux/morts/saisons, §8 Billeterie), `docs/features/causes-mort-audit.md`, et tous les fichiers de `docs/specs/` concernés.
---
## Spécifications couvertes
| Spec | Périmètre implémenté |
|------|----------------------|
| **animal_generique.md** | États faim/température/santé ; feedbacks visuels (froid=bleu/givre, chaud=rouge/vapeur, faim=icône, heureux=cœurs) ; pas de jauges. |
| **mort_bebe.md** | Causes déjà en place ; conséquence mort adulte vente échouée (aligné). |
| **inventaire_saisons.md** | Cycle 4 saisons ; modificateurs météo/température/reproduction/survie/visiteurs. |
| **temperature.md** | Modificateur saison (+0 Printemps, +10 Été, -2 Automne, -15 Hiver) ; modificateur jour/nuit (+5 jour, -5 nuit) ; feedback critique (spec déjà partiellement en place via tolerance). |
| **reproduction.md** | Impact saisons : Printemps +20% chance, Hiver -50% (sauf animaux froids). |
| **billeterie.md** | Flux entrée/sortie ; capacité 20/unité ; ouverture 08h20h ; 1 visiteur/s max entrée ; modificateurs saison (été +20% prix, hiver -10%). |
| **visiteur.md** | Arrivée par billeterie ; durée max (1 journée / stayDuration) ; départ par billeterie ; affluence selon heure (08h10h faible, 10h16h fort, >18h nul) ; multiplicateur saison (été x1.5, hiver x0.6, etc.). |
| **inventaire_heures.md** | Cycle jour/nuit (déjà timeOfDay) ; billeterie fermée la nuit. |
| **centre_recherche.md** | Niveau recherche (skill level) : si rareté animal > niveau recherche → mort (cause « niveau de recherche trop inférieur »). |
| **causes-mort-audit.md** | Seuls (animal seul meurt) ; recherche trop basse ; vente adulte échouée (deathCountRecent). |
---
## Phase 1 Causes de mort manquantes
**Objectif :** Compléter les causes de mort listées dans `docs/features/causes-mort-audit.md` (Non implémenté).
### 1.1 Vente adulte échouée
- **Fichier :** `web/js/trade.js`
- **Changement :** Dans `tickSaleListings`, lorsque `nowUnix >= listing.endAt` et `listing.isBaby === false`, incrémenter `state.deathCountRecent` (comme pour les bébés).
- **Spec :** causes-mort-audit §9.
### 1.2 Niveau de recherche trop inférieur
- **Fichier :** `web/js/food.js` (ou module commun appelé par `checkDeathCauses`)
- **Logique :** Pour chaque bloc animal sur la grille, récupérer `LootTables.Animals[cell.id].rarityLevel` et le comparer à `getSkillLevel(state)` (depuis `conveyor.js`). Si `rarityLevel > getSkillLevel(state)`, retirer le bloc et incrémenter `deathCountRecent`.
- **Config optionnelle :** `GameConfig.Research?.MaxRarityAllowed` ou utiliser directement skill level (18) vs rarityLevel (15) ; si le projet utilise skill level comme “niveau école” et que la spec centre_recherche parle de “rareté visible”, interpréter : animal de rareté > niveau compétence → mort.
- **Fichiers :** `web/js/food.js`, `web/js/config.js` (si config ajoutée), `docs/features/causes-mort-audit.md` (mise à jour).
### 1.3 Animal seul (solitude)
- **Spec :** animal_generique “Besoin de congénères (reproduction) ou de solitude (selon espèce)” ; causes-mort-audit §1 “Seuls”.
- **Interprétation :** Au moins une règle “animal seul meurt” : si aucun autre animal de la même espèce (même `cell.id`) dans un rayon de N cases (ex. 5), après un délai configurable, retirer lanimal et incrémenter `deathCountRecent`.
- **Fichiers :** `web/js/config.js` (`Animal.MinSameSpeciesInRadius`, `Animal.MaxSecondsAlone`), `web/js/food.js` dans `checkDeathCauses` (ou helper) : pour chaque origine animal, compter les autres blocs même `id` dans le rayon ; si 0 et `nowUnix - placedAt > MaxSecondsAlone`, retirer.
- **État :** Optionnel si “selon espèce” complique (toutes espèces = besoin congénères par défaut).
---
## Phase 2 Config et données saisons
**Objectif :** Introduire le cycle de saisons et la config sans encore brancher tous les impacts.
### 2.1 Config saisons
- **Fichier :** `web/js/config.js`
- **Ajout :** `Season: { DayLengthSeconds: 120, DaysPerSeason: 7 }` (ou 30 jours in-game). `Season.TemperatureModifier: { spring: 0, summer: 10, autumn: -2, winter: -15 }`. `Season.VisitorMultiplier: { spring: 1, summer: 1.5, autumn: 0.8, winter: 0.6 }`. `Season.ReproductionBonus: { spring: 0.2, summer: 0, autumn: 0, winter: -0.5 }` (Hiver -50% sauf animaux froids à traiter dans reproduction).
- **Référence :** `docs/specs/inventaire_saisons.md`, `temperature.md`, `visiteur.md`, `reproduction.md`.
### 2.2 State et temps de jeu “jour”
- **Fichier :** `web/js/types.js`
- **Ajout :** `gameDay?: number` (jour de jeu absolu, dérivé de `timeOfDay` et `DayLengthSeconds`) ou `season?: 'spring'|'summer'|'autumn'|'winter'`, `seasonDay?: number` (jour dans la saison).
- **Fichier :** `web/js/time-weather.js` ou nouveau `web/js/seasons.js`
- **Logique :** À partir de `state.timeOfDay` et `GameConfig.Time.DayLengthSeconds`, calculer un “game day” (entier). À partir de `gameDay` et `DaysPerSeason`, calculer `season` et `seasonDay`. Exporter `getCurrentSeason(state)`, `getSeasonTemperatureModifier(season)`, `getSeasonVisitorMultiplier(season)`, `getSeasonReproductionBonus(season)`.
---
## Phase 3 Cycle saisons et impacts
**Objectif :** Brancher la saison sur température, reproduction, visiteurs, billeterie.
### 3.1 Température affichée / calculée avec saison
- **Fichiers :** `web/js/placement.js` ou module température existant (ex. `getDisplayTemperature` dans food.js / grid-utils)
- **Changement :** `currentTemp = baseBiomeTemp + seasonMod + dayNightMod + caseRegulatorOffset`. Récupérer `seasonMod` depuis `getSeasonTemperatureModifier(getCurrentSeason(state))`.
- **Spec :** `temperature.md` (Impact Saisons, Impact Heure / Jour-Nuit).
### 3.2 Reproduction et saison
- **Fichier :** `web/js/reproduction.js`
- **Changement :** Intégrer un bonus/malus de saison (Printemps +20%, Hiver -50% sauf animaux “froids” selon biome) dans le calcul de chance de reproduction.
- **Spec :** `reproduction.md`, `inventaire_saisons.md`.
### 3.3 Visiteurs et saison
- **Fichier :** `web/js/income.js`
- **Changement :** Dans `getVisitorDemand`, multiplier par `getSeasonVisitorMultiplier(getCurrentSeason(state))`.
- **Spec :** `visiteur.md` (Impact Saisons).
### 3.4 Billeterie modificateur prix ticket par saison
- **Fichier :** `web/js/income.js` (ou economy)
- **Changement :** Prix ticket base ; si saison été : *1.2 ; si saison hiver : *0.9. Appliquer dans le calcul de `paymentPerVisitor` (entrée).
- **Spec :** `billeterie.md` (Impact Saisons).
### 3.5 Notification changement de saison
- **Fichier :** `web/js/ui.js` ou game-loop
- **Changement :** Lors dun changement de saison (comparer `getCurrentSeason(state)` à une valeur stockée), afficher un message type “Cest le [Saison] !” (toast ou texte temporaire). Stocker `lastSeason` dans le state si nécessaire.
- **Spec :** `inventaire_saisons.md` (Messages SEASON_CHANGE).
---
## Phase 4 Flux billeterie complet
**Objectif :** Heures douverture, départs explicites, limite 1 visiteur/s à lentrée.
### 4.1 Heures douverture (08h20h)
- **Fichier :** `web/js/config.js`
- **Ajout :** `Billeterie.OpenHour: 8`, `Billeterie.CloseHour: 20` (ou 20h = fermeture, pas dentrée après).
- **Fichier :** `web/js/income.js`
- **Changement :** Dans `tickVisitorArrivals`, ne pas ajouter de nouveaux visiteurs si `timeOfDay` est en dehors de [8, 20] (ou équivalent en phase “night”). Utiliser `getTimePhase(state.timeOfDay)` ; si phase “night” ou `timeOfDay < 8` ou `timeOfDay >= 20`, ne pas pousser de nouveaux `{ arrivedAt }`.
- **Spec :** `billeterie.md`, `inventaire_heures.md`.
### 4.2 Départs par billeterie (durée max “1 journée”)
- **Déjà en place :** `getStayDurationSeconds` et filtre `nowUnix < v.arrivedAt + stayDuration`. Sassurer que la durée est bien “1 journée” (DayLengthSeconds × facteur) selon spec. Optionnel : faire partir les visiteurs vers la “sortie” (billeterie) visuellement.
- **Spec :** `visiteur.md` (Durée max, Départ).
### 4.3 Limite 1 visiteur / seconde à lentrée
- **Fichier :** `web/js/income.js`
- **Changement :** Dans `tickVisitorArrivals`, au lieu dajouter `target - current` dun coup, limiter le nombre dentrées sur ce tick à au plus `ceil(dt)` ou 1 par tick si tick = 1s, ou stocker `lastVisitorSpawnAt` et najouter quun visiteur par seconde réelle. Adapter selon `IncomeTickMs` (ex. si tick 5s, ajouter au plus 5 nouveaux visiteurs par tick, ou 1 par seconde en interpolant).
- **Spec :** `billeterie.md` (“1 visiteur / seconde max”).
### 4.4 Affluence selon lheure (optionnel)
- **Fichier :** `web/js/income.js`
- **Changement :** Dans `getVisitorDemand`, appliquer un coefficient selon `timeOfDay` : 08h10h faible, 10h16h fort, 16h18h décroissant, >18h nul (ou très faible). Utiliser `state.timeOfDay` et `getTimePhase`.
- **Spec :** `visiteur.md` (Impact Heure / Jour-Nuit).
---
## Phase 5 Feedbacks visuels animaux
**Objectif :** Pas de jauges ; états visuels dérivés des données existantes (température, nourriture, visite, reproduction).
### 5.1 Détection des états par cellule animal
- **Fichier :** nouveau `web/js/animal-visual-state.js` ou dans `web/js/ui.js` / module rendu
- **Logique :** Pour une cellule animal (origine) : `getDisplayTemperature`, `lastFedAt`, `lastVisitedAt`, état reproduction (paire proche). Exporter `getAnimalVisualState(cell, state, grid)``{ cold: boolean, hot: boolean, hungry: boolean, sick: boolean, happy: boolean }` (sick si proche mort / mal nourri ; happy si récemment visité et nourri et temp ok, ou en reproduction).
- **Spec :** `animal_generique.md`, `temperature.md` (Feedback critique).
### 5.2 Rendu CSS / classes
- **Fichier :** `web/js/ui.js` (rendu grille)
- **Changement :** Pour chaque bloc animal rendu, ajouter des classes CSS selon `getAnimalVisualState` : ex. `animal-cold`, `animal-hot`, `animal-hungry`, `animal-sick`, `animal-happy`. Pas de jauges.
- **Fichier :** `web/css/main.css`
- **Changement :** Styles pour ces classes : teinte bleutée/givre (froid), rougeâtre/vapeur (chaud), icône faim (lent/maigre), ternes/mouches (malade), cœurs/couleurs vives (heureux). Utiliser filter, box-shadow ou pseudo-éléments pour icônes.
- **Spec :** `animal_generique.md` (Vie Quotidienne), `temperature.md` (Feedback critique).
---
## Phase 6 Documentation et clôture
- Mettre à jour `docs/features/causes-mort-audit.md` (causes implémentées : seuls, recherche, vente adulte).
- Créer ou mettre à jour `docs/features/saisons-phase.md` (cycle, config, impacts).
- Créer ou mettre à jour `docs/features/billeterie-flux.md` (heures, 1/s, départs).
- Créer `docs/features/feedbacks-visuels-animaux.md` (états, classes CSS, pas de jauges).
- Vérifier lint, types, compilation.
---
## Ordre dexécution recommandé
1. **Phase 1** Causes de mort (trade.js adulte, food.js recherche, optionnel solitude).
2. **Phase 2** Config et module saisons (config.js, seasons.js, types.js).
3. **Phase 3** Impacts saisons (température, reproduction, visiteurs, billeterie, notification).
4. **Phase 4** Flux billeterie (heures, 1/s, affluence heure).
5. **Phase 5** Feedbacks visuels animaux (animal-visual-state.js, ui.js, main.css).
6. **Phase 6** Documentation.
---
## Fichiers principaux impactés
| Fichier | Phases |
|---------|--------|
| `web/js/trade.js` | 1.1 |
| `web/js/food.js` | 1.2, 1.3 |
| `web/js/config.js` | 1.2, 1.3, 2.1, 4.1 |
| `web/js/types.js` | 2.2 |
| `web/js/time-weather.js` ou `web/js/seasons.js` | 2.2, 3.1 |
| `web/js/placement.js` ou module température | 3.1 |
| `web/js/reproduction.js` | 3.2 |
| `web/js/income.js` | 3.3, 3.4, 4.1, 4.3, 4.4 |
| `web/js/ui.js` | 3.5, 5.2 |
| `web/js/animal-visual-state.js` (nouveau) | 5.1 |
| `web/css/main.css` | 5.2 |
| `docs/features/*.md` | 6 |

View File

@@ -1,131 +0,0 @@
# Vérification des phases 0 à 9 avant phase 10
**Référence :** `docs/plan-implementation-rappel-grandes-regles.md`.
**Objectif :** Sassurer que tout le nécessaire pour la phase 10 (Ventes et enchères) est en place.
---
## Phase 0 Modèle de données et configuration
| Livrable | Statut | Note |
|----------|--------|------|
| Cases couleur + température | Fait | biome-rules, grid, config |
| Animaux multi-cases (shape, stockage) | Fait | cellsWide/cellsHigh dans types, placement, loot-tables |
| Types de bâtiments 7 niveaux | Fait | research, billeterie, souvenirShop, nursery, food, reception, truck, biomeChangeColor, biomeChangeTemp dans config |
| Entités déplaçables (bébé, animal) | Partiel | pendingBabies, receptionAnimals, saleListings en place ; conveyor et labo utilisent encore des œufs (eggType) |
| Config (niveaux max, coûts, capacités) | Fait | GameConfig étendu |
**Blocant phase 10 :** Non. saleListings, pendingBabies, receptionAnimals sont en place.
---
## Phase 1 Cartes : couleurs et températures
| Livrable | Statut |
|----------|--------|
| Biomes / température par case | Fait (biome-rules.js, getDisplayBiome, getDisplayTemperature) |
| Transitions douces (interpolation) | Fait |
| Rendu grille | Fait |
---
## Phase 2 Animaux multi-cases
| Livrable | Statut |
|----------|--------|
| cellsWide / cellsHigh (loot-tables, placement) | Fait |
| Stockage et mouvement du bloc | Fait (placement, zoo, hatching) |
---
## Phase 3 Bâtiments zoo (types et niveaux)
| Livrable | Statut |
|----------|--------|
| Research, Billeterie, Boutique, Nurserie, Food, Reception, Truck, BiomeColor, BiomeTemp | Fait (config 7 niv., build/upgrade dans zoo, placement, ui) |
---
## Phase 4 Bébés et flux nurserie / accueil
| Livrable | Statut | Note |
|----------|--------|------|
| Bébés (nurserie → mature) | Fait | pendingBabies, readyAt, placeMatureBabyOnCell |
| Accueil (reception → animal prêt) | Fait | receptionAnimals, placeReceptionAnimalOnCell |
| Achat / déplacement (bébé mature, animal prêt) | Fait | zoo, placement, ui |
| Suppression complète du modèle « œuf » | Partiel | Conveyor et labo exposent encore des œufs ; bébés/animaux en parallèle |
**Blocant phase 10 :** Non. Flux bébé/animal et saleListings (nursery full) existent.
---
## Phase 5 Nourriture, consommation et morts
| Livrable | Statut | Note |
|----------|--------|------|
| Nourriture (capacité, répartition, lastFedAt) | Fait | food.js, getFoodCapacity, tickFeeding |
| Mort si pas nourri | Fait | checkDeathCauses, MaxSecondsWithoutFood |
| Pas visité | Fait | MaxSecondsWithoutVisit |
| Température / milieu en écart | Fait | maybeDeathBlock (temp + biome) |
| Bébé mature non placé à temps | Fait | filterPendingBabies, MaxSecondsMatureNotPlaced |
| Animal accueil prêt non placé à temps | Fait | filterReceptionAnimals, MaxSecondsReadyNotPlaced |
| Autres causes (seul, tué autre zoo, recherche trop basse, bébé non vendu, vente échouée) | Non fait | Optionnel pour phase 10 ; « bébé invendu meurt » = phase 10 |
**Blocant phase 10 :** Non.
---
## Phase 6 Reproduction
| Livrable | Statut |
|----------|--------|
| Paires même type + autre zoo, adjacentes | Fait (findReproductionPairs, blocksAreAdjacent) |
| Délai (score repro, biome, température) | Fait (tickReproduction, timers, dueAt) |
| Bébé → nurserie ou vente (saleListings) | Fait (addPendingBaby, NoFreeNursery → saleListings) |
---
## Phase 7 Score de reproduction du zoo
| Livrable | Statut |
|----------|--------|
| getReproductionScore (birthCount, feedingRate) | Fait |
| Affichage carte monde (score repro) | Fait (world-map-zoo-reproduction-score) |
| reproductionScoreAtSale sur vente | Fait (reproduction.js lors du push saleListings) |
---
## Phase 8 Attractivité et visiteurs
| Livrable | Statut |
|----------|--------|
| Billeterie = seule entrée, cap 20/unité | Fait (getBilleterieCapacity, tickVisitorArrivals) |
| Durée max 1 journée par visiteur | Fait (visitorArrivals, arrivedAt, getStayDurationSeconds) |
| Prolongation boutiques / diversité | Fait (getStayMultiplier, StayMultiplierPerShopLevel, StayMultiplierPerSpecies) |
| Score attractivité (valeur, espèces, rareté, remplissage, pénalités, bonus) | Fait (getAttractivityScore) |
| Affichage carte monde (score attractivité) | Fait (world-map-zoo-attractivity-score) |
---
## Phase 9 Carte du monde : recherche et compteurs
| Livrable | Statut |
|----------|--------|
| Agrandissement carte en unités de recherche | Fait (getWorldMapUpgradeResearchCost, tryUpgradeWorldMap) |
| Compteurs (bébés à vendre, animaux à vendre, labos, zoos, villes) | Fait (worldMapCounters dans ui.js) |
| Case zoo : nom, score attractivité, score reproduction | Fait (world-map-zoo-name, -reproduction-score, -attractivity-score) |
| Case de vente sous le zoo | Partiel | Un slot « world-map-zoo-slot » existe ; il affiche conveyor offers (œufs / bébé/animal) ; phase 10 doit y afficher saleListings + enchères |
**Blocant phase 10 :** Non. Le slot existe ; phase 10 ajoute laffichage des ventes (saleListings) et les enchères.
---
## Synthèse pour la phase 10
- **Prérequis phase 10 (4, 6, 7, 9) :** Tous satisfaits au niveau nécessaire.
- **Manques non bloquants :**
- Phase 0/4 : modèle œuf encore présent (conveyor, labo) ; phase 10 peut sappuyer sur saleListings et bébés/animaux tels quils sont.
- Phase 5 : certaines causes de mort (seul, autre zoo, recherche trop basse, bébé non vendu) non implémentées ; « bébé invendu meurt » sera ajouté en phase 10.
- Phase 9 : case de vente = slot actuel ; phase 10 y branchera les saleListings et lUI denchères.
**Conclusion :** On peut démarrer la phase 10 (Ventes et enchères). Les écarts listés ci-dessus pourront être traités en parallèle ou dans les phases suivantes.

5664
docs/specs-format-audit.json Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 KiB

View File

@@ -1,11 +1,12 @@
# Spécifications : Accueil des Animaux
## Définition
Zone tampon pour les nouveaux animaux arrivant dans le zoo (achats adultes ou transferts).
Zone tampon pour les nouveaux animaux arrivant dans le zoo (achats adultes ou transferts). C'est le point d'entrée unique pour tout animal avant son placement en enclos.
## Fonctionnalités
- **Acclimatation** : Période obligatoire avant de pouvoir placer l'animal sur la grille active.
- **Stockage temporaire** : Évite de devoir placer immédiatement un animal acheté si le terrain n'est pas prêt.
- **Inspection** : Permet au joueur de voir les stats de l'animal avant placement.
## Niveaux d'Amélioration (7 niveaux)
- **Coût** : Progressif par palier.
@@ -19,115 +20,187 @@ Zone tampon pour les nouveaux animaux arrivant dans le zoo (achats adultes ou tr
```json
{
"id": "uuid",
"type": "animal_reception",
"type": "building_reception",
"created_at": "timestamp",
"updated_at": "timestamp",
"level": "integer (1-7)",
"position": { "x": "integer", "y": "integer" },
"slots": [
{ "animal_id": "uuid", "arrival_time": "timestamp", "ready_time": "timestamp" }
]
{
"slot_id": "integer (0-index)",
"animal_id": "uuid (nullable)",
"status": "enum (EMPTY, OCCUPIED, READY)",
"arrival_time": "timestamp",
"acclimatization_end_time": "timestamp",
"bonus_applied": "boolean"
}
],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
| Caractéristique | Valeur Initiale (Niv 1) |
| :--- | :--- |
| Temps Acclimatation | 10 minutes |
| Capacité | 1 animal |
| Caractéristique | Valeur Initiale (Niv 1) | Valeur Max (Niv 7) |
| :--- | :--- | :--- |
| Temps Acclimatation | 600 secondes (10 min) | 0 secondes (Instantané) |
| Capacité | 1 animal | 7 animaux |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
| :--- | :--- | :--- | :--- |
| Confort Quarantaine | 60 | 0-100 | Modifie le stress initial de lanimal lors du placement (\(-\)stress = +confort). |
| Risque Contamination | 2% | 0-25% | Probabilité dincident sanitaire (quarantaine prolongée, coût supplémentaire) par animal accueilli. |
| Traçabilité | 80 | 0-100 | Qualité des infos affichées au joueur (traits révélés, historique). |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Présent au démarrage.
Présent au démarrage du jeu (Tutorial ou Nouvelle Partie). Position fixe généralement près de l'entrée.
### Conditions de Disparition
Indestructible.
Indestructible. Ne peut pas être vendu ni déplacé (sauf si feature de réaménagement global).
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---|---|
| Accueil Niv 4+ | Trait temporaire “Calme” (+5 Satisfaction Visiteurs à proximité après placement) | 100% | Non (effet temporaire, non génétique) |
| Accueil Niv 7 | Trait temporaire “Confiant” (stress \(-15\) au placement) | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
Zone neutre (T° idéale simulée).
Zone neutre (T° idéale simulée). Les animaux ne subissent pas de dégâts de température ici.
### Impact Milieu (Biome)
Zone neutre.
Zone neutre. Compatible avec tous les biomes d'animaux.
### Impact Saisons
Protégé.
Protégé des intempéries.
### Impact Heure / Jour-Nuit
N/A
Fonctionne 24/7. Pas de pénalité la nuit.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
**Bonus Repro** : Un animal passant par un accueil de haut niveau gagne un bonus temporaire de fertilité (+10% à +50%).
**Bonus Repro** : Un animal passant par un accueil de haut niveau gagne un bonus temporaire de fertilité.
- Niv 1-3 : +0%
- Niv 4-6 : +10% fertilité (durée 2 jours in-game)
- Niv 7 : +25% fertilité (durée 5 jours in-game)
### Impact Mort
Pas de mort possible en zone d'accueil (Stase).
Pas de mort possible en zone d'accueil (Stase). Les jauges de faim/soif/santé sont gelées.
### Impact Nourriture
Nourri automatiquement.
Nourri automatiquement (coût nul ou inclus dans les frais de gestion globaux).
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| Façade entretenue (Propreté > 80) | +5 | 6 cases |
| File dattente visible (Capacité saturée) | -10 | 8 cases |
| Livraison spectaculaire (animal rare) | +20 | 10 cases |
### Impact Valeur
N/A
| Facteur | Variation Prix | Condition |
|---|---:|---|
| Niveau Accueil | +5% / niveau | Appliqué à la valeur du zoo (bâtiment clé non revendable). |
| Historique sans incident | +10% | Si aucun événement `QUARANTINE_ALERT` sur 7 jours in-game. |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
**Réduction Temps Acclimatation** :
| Niveau | Temps Base |
| :--- | :--- |
| 1 | 10 min |
| 2 | 8 min |
| 3 | 6 min |
| 4 | 4 min |
| 5 | 2 min |
| 6 | 1 min |
| 7 | Instantané |
| Niveau | Temps Base | Réduction % |
| :--- | :--- | :--- |
| 1 | 10 min | 0% |
| 2 | 8 min | 20% |
| 3 | 6 min | 40% |
| 4 | 4 min | 60% |
| 5 | 2 min | 80% |
| 6 | 1 min | 90% |
| 7 | Instantané | 100% |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût Hebdo | Maintenance |
|---|---:|---:|
| Consommables quarantaine | 50 pièces | 10 pièces |
| Nettoyage & désinfection | 30 pièces | 5 pièces |
| Contrôle vétérinaire | 80 pièces | 0 pièce (service périodique) |
### Trajet Visiteurs
N/A
| Trajet | Condition | Effet | Détails |
|---|---|---|---|
| Visiteurs passent devant | Chemin adjacent | Attraction faible | Le bâtiment nest pas une attraction nominale, mais une façade visible peut influer sur lambiance. |
| Visiteurs évitent la zone | `QUARANTINE_ALERT` actif | Déviation | Les visiteurs recalculent leur chemin pour éviter un rayon de 6 cases autour. |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Arrivée** : Animal livré par camion.
* **Prêt** : Animal prêt à être placé.
* **Arrivée (`ANIMAL_ARRIVAL`)** : Animal livré par camion, entre dans un slot libre.
* **Prêt (`ANIMAL_READY`)** : Le temps d'acclimatation est écoulé.
* **Placement (`ANIMAL_PLACED`)** : Le joueur sort l'animal de l'accueil vers un enclos.
## 7. Progression
### Tableau des Upgrades
| Niveau | Coût (Pièces) | Capacité | Temps Acclimatation | Temps Construction |
| :--- | :--- | :--- | :--- | :--- |
| 1 | 100 | 1 | 10 min | 0s |
| 2 | 200 | 2 | 8 min | 0s |
| 3 | 400 | 3 | 6 min | 0s |
| 4 | 800 | 4 | 4 min | 0s |
| 5 | 1600 | 5 | 2 min | 0s |
| 6 | 3200 | 6 | 1 min | 0s |
| 7 | 6400 | 7 | 0 min | 0s |
| 2 | 200 | 2 | 8 min | 10s |
| 3 | 400 | 3 | 6 min | 30s |
| 4 | 800 | 4 | 4 min | 1m |
| 5 | 1600 | 5 | 2 min | 2m |
| 6 | 3200 | 6 | 1 min | 5m |
| 7 | 6400 | 7 | 0 min | 10m |
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
function updateReception(center):
for slot in center.slots:
if currentTime >= slot.ready_time:
notifyPlayer("ANIMAL_READY", slot.animal_id)
```python
def update_reception(reception_center, current_time):
# Vérification de l'intégrité
if not reception_center or not reception_center.slots:
return error("Invalid reception center")
for slot in reception_center.slots:
if slot.status == "OCCUPIED":
# Vérifier si le temps est écoulé
if current_time >= slot.acclimatization_end_time:
slot.status = "READY"
trigger_event("ANIMAL_READY", {"animal_id": slot.animal_id})
def add_animal_to_reception(reception_center, animal):
# Trouver un slot vide
empty_slot = find_first_empty_slot(reception_center.slots)
if not empty_slot:
return error("RECEPTION_FULL")
# Calcul du temps selon le niveau
duration = get_acclimatization_duration(reception_center.level)
empty_slot.animal_id = animal.id
empty_slot.arrival_time = now()
empty_slot.acclimatization_end_time = now() + duration
empty_slot.status = "OCCUPIED"
return success()
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `ANIMAL_READY` | Info | "Un nouvel animal est prêt à rejoindre le zoo !" |
| `RECEPTION_FULL` | Warning | "Accueil saturé, impossible d'acheter." |
| ID | Niveau | Message | Condition |
| :--- | :--- | :--- | :--- |
| `ANIMAL_READY` | Info | "Un nouvel animal est prêt à rejoindre le zoo !" | `slot.status` passe à `READY` |
| `RECEPTION_FULL` | Warning | "Accueil saturé, impossible d'acheter." | Tentative d'achat sans slot libre |
| `PLACEMENT_ERROR` | Error | "Impossible de placer ici (Enclos plein / Biome incompatible)." | Drag & Drop invalide |
# 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)
### Arrivée Animal (Passif)
**Description UX** : Le camion décharge un animal. Il apparaît dans l'Accueil en mode "Attente".
@@ -135,19 +208,19 @@ function updateReception(center):
**Notification Push** : "Votre [Animal] est arrivé à l'accueil !" envoyée si le joueur est hors ligne.
**Emplacement** : Case Accueil.
**Intégration** : Suite de l'action Camion.
**Navigation** : N/A
**Navigation** : Clic sur Accueil → Bottom Sheet “Accueil” (liste slots) → action “Placer” ouvre le mode placement sur la carte du zoo.
**Événements** : `DELIVERY_COMPLETE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ambience_stable_soft.mp3` (léger, discret, pas intrusif).
- **Sons** : `truck_door.mp3`, `crate_drop.mp3`.
- **Graphiques** : Sprite Caisse en bois.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `reception_building.png` (bâtiment), `reception_icon.png` (icône), `badge_quarantine.png` (badge).
- **Vidéos** : `delivery_short.webm` (2s, loop optionnel sur notif).
- **Animations** : Camion qui repart.
- **Couleurs** : Marron (Caisse).
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : `RECEPTION_DELIVERY_DONE` = "Livraison effectuée", `RECEPTION_ANIMAL_ARRIVED` = "Votre {animalName} est arrivé à l'accueil !"
- **Formes** : Bulle (notif), badge rond (état).
### Consultation & Acclimatation (Consultation)
**Description UX** : Le joueur vérifie le temps restant avant de pouvoir placer l'animal.
@@ -158,11 +231,11 @@ function updateReception(center):
**Événements** : `OPEN_RECEPTION`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_modal_soft.mp3` (jingle court).
- **Sons** : `ui_open.mp3`
- **Graphiques** : Style "Quarantaine" ou "Étable propre".
- **Images** : Portrait animal.
- **Vidéos** : N/A
- **Vidéos** : `progress_fill.webm` (0.8s loop) pour la barre dacclimatation (optionnel).
- **Animations** : Barre de progression qui avance.
- **Couleurs** : Orange (En cours), Vert (Prêt).
- **Textes** : "Prêt dans X min".
@@ -178,12 +251,18 @@ function updateReception(center):
**Événements** : `PLACE_ANIMAL`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_confirm_place.mp3` (jingle court de confirmation).
- **Sons** : `animal_happy.mp3` (cri de l'animal).
- **Graphiques** : Sprite Animal.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `placement_ghost_ok.png`, `placement_ghost_ko.png` (surbrillance vert/rouge).
- **Vidéos** : `placement_glow.webm` (1.2s, non loop).
- **Animations** : Animal qui saute de joie au placement.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Vert (#2ECC71) placement valide, Rouge (#E74C3C) placement invalide, Ambre (#F39C12) état “en acclimatation”.
- **Textes** : `BTN_PLACE` = "Placer", `RECEPTION_READY` = "Prêt"
- **Formes** : Badge “!” (prêt), sablier (en cours).
### Vue Isométrique
- **Sprite Bâtiment** : 4 directions isométriques (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest) pour s'aligner avec les chemins.
- **Occlusion** : Le bâtiment doit être semi-transparent si le joueur passe la souris derrière (pour voir les objets cachés).
- **Indicateur d'état** : Une icône flottante (bulle) au-dessus du bâtiment indique si un animal est prêt (point d'exclamation vert) ou en cours (sablier).
- **Z-Index** : Doit être trié correctement par rapport aux visiteurs passant devant.

View File

@@ -1,24 +1,79 @@
# Spécifications : Achat et Upgrade des Boutiques
## Construction
- Peut être construite sur n'importe quelle case vide.
- Peut être construite sur n'importe quelle case vide de type "Terrain".
- Nécessite une connexion à un chemin pour être accessible aux visiteurs.
## Upgrade (7 Niveaux)
- **Attrait** : Attire les visiteurs de plus loin sur la grille.
- **Revenu** : Augmente le montant dépensé par chaque visiteur qui passe sur la case.
- **Capacité** : Augmente le nombre de visiteurs pouvant interagir simultanément.
- **Attrait** : Attire les visiteurs de plus loin sur la grille (Rayon d'action).
- **Revenu** : Augmente le montant dépensé par chaque visiteur qui passe sur la case (Multiplicateur de prix).
- **Capacité** : Augmente le nombre de visiteurs pouvant interagir simultanément (File d'attente).
# Annexes Techniques
## 1. Données et États
Voir `boutique.md` pour le modèle de données complet.
### Modèle de Données (Transaction Upgrade)
```json
{
"transaction_id": "uuid",
"building_id": "uuid",
"building_type": "shop",
"current_level": "integer",
"target_level": "integer",
"cost": "float",
"currency": "coins",
"status": "enum (PENDING, COMPLETED, FAILED)",
"timestamp": "timestamp"
}
```
*Voir `boutique.md` pour le modèle de données de l'entité Boutique.*
## 7. Progression
### Tableau des Upgrades
Voir `boutique.md` pour le tableau détaillé des coûts et effets par niveau.
*Voir `boutique.md` pour le tableau détaillé des coûts et effets par niveau.*
## 8. Logique et Interfaces
### Pseudo-code Interaction
```python
def upgrade_shop(shop, player_wallet):
# Vérification niveau max
if shop.level >= MAX_LEVEL:
return error("MAX_LEVEL_REACHED")
next_level_config = get_shop_config(shop.type, shop.level + 1)
cost = next_level_config.cost
# Vérification fonds
if player_wallet.coins < cost:
return error("INSUFFICIENT_FUNDS")
# Transaction
player_wallet.debit(cost)
shop.level += 1
shop.stats = next_level_config.stats
shop.visual_state = "UPGRADING" # Déclenche anim
start_upgrade_timer(shop, next_level_config.build_time)
return success("UPGRADE_STARTED")
```
### Cas Limites
- **Fonds insuffisants** : Bouton grisé + Tooltip rouge.
- **Upgrade en cours** : Impossible de lancer un autre upgrade tant que le précédent n'est pas fini.
- **Boutique utilisée** : L'upgrade n'éjecte pas les visiteurs actuels, mais bloque l'entrée de nouveaux pendant les travaux (si temps > 0).
# 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)
### Rénovation (Action)
**Description UX** : Améliorer la boutique change son apparence et ses stats.
@@ -29,12 +84,17 @@ Voir `boutique.md` pour le tableau détaillé des coûts et effets par niveau.
**Événements** : `UPGRADE_SHOP_VISUAL`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Musique d'ascenseur (Muzak) apaisante.
- **Sons** : `construction_finish.mp3`.
- **Graphiques** : Sprites Boutiques Niv 1-7.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Photo avant/après (style émission rénovation).
- **Vidéos** : Ruban d'inauguration coupé.
- **Animations** : Effet de "pop" ou échafaudage rapide.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Doré (pour les niveaux élevés).
- **Textes** : "Niveau Supérieur !".
- **Formes** : Particules Étoiles.
### Vue Isométrique
- **Travaux** : Si l'upgrade prend du temps, afficher un sprite "En travaux" (bâche, échafaudage) par-dessus la boutique.
- **Particules** : Lors de la complétion, explosion de confettis/étoiles en 3D isométrique au-dessus du toit.
- **Feedback** : Le bâtiment peut faire un petit saut (scale up/down) pour signifier l'upgrade.

View File

@@ -3,25 +3,68 @@
## Achat
- Le joueur possède un camion par défaut.
- Possibilité d'acheter des camions supplémentaires (si le design autorise plusieurs flottes).
- **Limite** : Nombre de camions limité par le niveau du Garage (si existant) ou du QG.
## Upgrade (7 Niveaux)
- **Niveau 1** : Camion standard.
- **Niveau 2-7** :
- **Vitesse** : Augmente la vitesse de déplacement sur la carte du monde.
- **Vitesse** : Augmente la vitesse de déplacement sur la carte du monde (réduit le temps de mission).
- **Confort** : Réduit la perte de santé/stress des animaux transportés.
- **Capacité** : (Optionnel) Transport de plusieurs animaux ? *Actuellement 1 unité = 1 camion.*
- **Fiabilité** : Réduit les chances de panne (événement aléatoire "Retard").
# Annexes Techniques
## 1. Données et États
Voir `camion.md` pour le modèle de données complet.
### Modèle de Données (Action)
```json
{
"action": "upgrade_truck",
"truck_id": "uuid",
"current_stats": { "speed": 50, "comfort": 10 },
"next_stats": { "speed": 60, "comfort": 20 },
"cost": 500
}
```
*Voir `camion.md` pour le modèle de données complet.*
## 7. Progression
### Tableau des Upgrades
Voir `camion.md` pour le tableau détaillé des coûts et effets par niveau.
*Voir `camion.md` pour le tableau détaillé des coûts et effets par niveau.*
## 8. Logique et Interfaces
### Pseudo-code
```python
def upgrade_truck(truck, player):
if truck.is_on_mission:
return error("TRUCK_BUSY", "Impossible d'améliorer un camion en mission.")
cost = get_upgrade_cost(truck.level + 1)
if player.money < cost:
return error("NO_MONEY")
player.money -= cost
truck.level += 1
truck.update_stats()
return success("TRUCK_UPGRADED")
```
### Cas Limites
- **Camion en mission** : Bouton upgrade désactivé avec message "En mission".
- **Niveau Max** : Afficher "Max" à la place du prix.
# 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)
### Garage / Atelier (Consultation)
**Description UX** : Le joueur gère sa flotte de camions.
@@ -32,15 +75,15 @@ Voir `camion.md` pour le tableau détaillé des coûts et effets par niveau.
**Événements** : `OPEN_GARAGE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Radio "Trucker" (Rock instrumental léger).
- **Sons** : `wrench.mp3` (bruit d'outil).
- **Graphiques** : Fond garage.
- **Images** : Sprites Camions évolutifs (Vieux tacot -> Camion futuriste).
- **Vidéos** : N/A
- **Animations** : N/A
- **Vidéos** : Rotation 360° du modèle de camion.
- **Animations** : Étincelles de soudure.
- **Couleurs** : Gris, Métal.
- **Textes** : "Niveau X".
- **Formes** : N/A
- **Formes** : Silhouettes de camions en arrière-plan.
### Customisation (Cosmétique)
**Description UX** : Changer la couleur du camion.
@@ -51,12 +94,16 @@ Voir `camion.md` pour le tableau détaillé des coûts et effets par niveau.
**Événements** : `PAINT_TRUCK`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Bruit de spray "Pshhh" musical.
- **Sons** : `spray.mp3`.
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Pistolet peinture.
- **Images** : Nuancier de couleurs (Texture brillante).
- **Vidéos** : Reflet de lumière sur la carrosserie (shader).
- **Animations** : Camion change de couleur.
- **Couleurs** : Palette 16 couleurs.
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Peinture fraîche !".
- **Formes** : Taches de peinture au sol.
### Vue Isométrique
- **Garage** : Si le garage est un bâtiment sur la carte, l'animation d'upgrade se joue dessus.
- **Carte Monde** : Le sprite du camion sur la carte du monde change pour refléter son niveau (ex: plus de fumée, design plus aérodynamique).

View File

@@ -3,6 +3,7 @@
## Construction
- Sur une case vide de type "Terrain", le joueur peut acheter un bâtiment.
- Le coût dépend du type de bâtiment.
- **Pré-requis** : Certaines cases peuvent nécessiter un déblayage (rochers, arbres) avant construction.
## Types Constructibles
- Nurserie
@@ -10,12 +11,22 @@
- (Les autres bâtiments comme Billeterie/Recherche sont souvent uniques et upgradables, mais on peut imaginer en construire d'autres si le design le permet).
## Upgrade de Case (Terrain)
- **Changement de Milieu** : Payer pour changer la couleur (Biome) d'une case.
- **Changement de Température** : Payer pour installer un régulateur thermique sur une case.
- **Changement de Milieu (Terraforming)** : Payer pour changer la couleur (Biome) d'une case.
- **Changement de Température** : Payer pour installer un régulateur thermique sur une case (invisible ou petit objet technique).
# Annexes Techniques
## 1. Données et États
### Modèle de Données (Modification Case)
```json
{
"tile_id": "x_y_coords",
"action": "terraform",
"target_biome": "savanna",
"cost": 500,
"duration_ms": 2000
}
```
Voir `case_zoo.md` et `achat_upgrade_generique.md`.
## 7. Progression
@@ -23,8 +34,8 @@ Voir `case_zoo.md` et `achat_upgrade_generique.md`.
**Changement de Milieu** :
| Niveau | Coût | Précision | Temps |
| :--- | :--- | :--- | :--- |
| 1 | 500 | Changement vers biome adjacent | 0s |
| 7 | 5000 | Changement vers n'importe quel biome | 0s |
| 1 | 500 | Changement vers biome adjacent uniquement | 5s |
| 7 | 5000 | Changement vers n'importe quel biome (Terraformation avancée) | 2s |
**Régulateur Thermique** :
| Niveau | Coût | Plage Réglage | Temps |
@@ -32,8 +43,38 @@ Voir `case_zoo.md` et `achat_upgrade_generique.md`.
| 1 | 200 | +/- 5°C | 0s |
| 7 | 2000 | +/- 50°C | 0s |
## 8. Logique et Interfaces
### Algorithme de Terraformation
```python
def terraform_tile(tile, target_biome, player):
# Vérifier adjacence (si niveau bas)
if player.terraform_level < 7:
neighbors = get_neighbors(tile)
if target_biome not in [n.biome for n in neighbors]:
return error("BIOME_NOT_ADJACENT", "Vous devez étendre un biome existant.")
if player.money < get_terraform_cost(target_biome):
return error("NO_MONEY")
player.money -= get_terraform_cost(target_biome)
tile.biome = target_biome
update_visuals(tile)
check_animal_compatibility(tile) # Alerte si un animal est dessus
return success()
```
# 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)
### Modification Terrain (Action)
**Description UX** : Le joueur sélectionne une case et choisit "Modifier Biome" ou "Température".
@@ -45,12 +86,17 @@ Voir `case_zoo.md` et `achat_upgrade_generique.md`.
**Événements** : `TERRAFORM_CASE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle "Travaux Publics" (bruits de chantier rythmés).
- **Sons** : `digging.mp3` (Biome), `hissing_gas.mp3` (Température).
- **Graphiques** : Icône Pelle, Thermomètre.
- **Images** : Textures sol (Herbe, Sable, Neige).
- **Vidéos** : N/A
- **Vidéos** : Animation de transition de biome (morphing de texture).
- **Animations** : Transition de couleur (Fade) sur la case.
- **Couleurs** : Vert, Jaune, Blanc.
- **Textes** : "Coût : X".
- **Formes** : N/A
- **Formes** : Curseur Pinceau.
### Vue Isométrique
- **Grid Overlay** : Lors de l'édition, afficher la grille en surbrillance pour bien délimiter les cases.
- **Feedback Visuel** : La case "saute" légèrement ou émet de la poussière lors du changement de biome.
- **Bords** : Gérer les transitions douces (blends) entre deux cases de biomes différents pour éviter l'effet damier trop strict (sauf si style voxel strict).

View File

@@ -4,25 +4,71 @@
- **Action** : Acheter une nouvelle parcelle de terrain adjacente à la grille existante.
- **Coût** : Très élevé, progressif selon la taille actuelle du zoo.
- **Contenu** : La nouvelle case arrive avec un biome par défaut (selon sa position géographique Prairie/Océan/Montagne) et vide.
- **Contraintes** : Limité par la taille de la carte globale ("Monde" ou "Région").
# Annexes Techniques
## 1. Données et États
### Modèle de Données (JSON)
Action sur l'objet `Zoo` (dimensions).
```json
{
"zoo_id": "uuid",
"dimensions": { "width": 5, "height": 6 },
"expansion_history": [
{ "direction": "EAST", "cost": 1000, "timestamp": "timestamp" }
],
"max_dimensions": { "width": 20, "height": 20 }
}
```
### Caractéristiques Initiales
N/A
**Taille Initiale** : 5x6 cases (30 cases).
## 7. Progression
### Tableau des Upgrades (Agrandissement)
| Extension | Coût (Pièces) | Gain |
| :--- | :--- | :--- |
| +1 Colonne | `1000 * (LargeurActuelle^2)` | +Hauteur cases |
| +1 Ligne | `1000 * (HauteurActuelle^2)` | +Largeur cases |
| +1 Colonne (Est) | 1000 | +Hauteur cases (6) |
| +1 Ligne (Sud) | 1000 | +Largeur cases (5) |
| +1 Colonne (Ouest) | 2000 | +Hauteur cases |
| +1 Ligne (Nord) | 2000 | +Largeur cases |
| +1 Colonne (Est 2) | 5000 | +Hauteur cases |
| +1 Ligne (Sud 2) | 5000 | +Largeur cases |
## 8. Logique et Interfaces
### Algorithme d'Expansion
```python
def expand_zoo(zoo, direction, player):
cost = calculate_expansion_cost(zoo, direction)
if player.money < cost:
return error("INSUFFICIENT_FUNDS")
if reaches_world_limit(zoo, direction):
return error("WORLD_LIMIT_REACHED")
player.money -= cost
# Mise à jour de la grille
new_cells = generate_new_strip(direction, zoo.dimensions)
zoo.grid.merge(new_cells)
zoo.update_dimensions(direction)
return success("ZOO_EXPANDED")
```
# 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)
### Achat Parcelle (Action)
**Description UX** : Le joueur clique sur une zone "Hors Limites" adjacente pour l'acheter.
@@ -33,12 +79,17 @@ N/A
**Événements** : `EXPAND_ZOO`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Vent dans les plaines" lors du survol.
- **Sons** : `land_buy.mp3`.
- **Graphiques** : Panneau "For Sale".
- **Images** : Texture herbe (cachée par brouillard).
- **Vidéos** : N/A
- **Vidéos** : Timelapse accéléré de la construction des clôtures (2s).
- **Animations** : Brouillard se dissipe, herbe apparaît.
- **Couleurs** : Gris (Inaccessible) -> Vert (Accessible).
- **Textes** : "Acheter Terrain (X Pièces)".
- **Formes** : Carré.
### Vue Isométrique
- **Brouillard de Guerre** : Les zones non achetées sont couvertes par des nuages ou un brouillard semi-transparent.
- **Dévoilement** : Lors de l'achat, les nuages se dissipent (fade out + scale up) pour révéler le nouveau terrain.
- **Clôtures** : Les clôtures délimitant le zoo se déplacent automatiquement vers la nouvelle limite.

View File

@@ -3,18 +3,64 @@
## Upgrade (7 Niveaux)
- **Production** : Augmente le nombre d'Unités de Recherche générées par heure.
- **Portée** : Augmente le rayon de visibilité sur les offres des autres zoos (voir les détails des animaux lointains).
- **Vitesse** : Réduit le temps nécessaire pour compléter une recherche technologique.
# Annexes Techniques
## 1. Données et États
Voir `centre_recherche.md` pour le modèle de données complet.
### Modèle de Données (Transaction)
```json
{
"action": "upgrade_research_center",
"building_id": "uuid",
"current_level": 2,
"cost": 1500,
"currency": "coins",
"timestamp": "timestamp"
}
```
*Voir `centre_recherche.md` pour le modèle de données complet.*
## 7. Progression
### Tableau des Upgrades
Voir `centre_recherche.md` pour le tableau détaillé des coûts et effets par niveau.
*Voir `centre_recherche.md` pour le tableau détaillé des coûts et effets par niveau.*
## 8. Logique et Interfaces
### Pseudo-code Interaction
```python
def upgrade_research_center(center, player):
# Vérifier si une recherche est en cours (bloquant ?)
if center.current_research_project:
return error("RESEARCH_BUSY", "Attendez la fin du projet en cours.")
cost = get_upgrade_cost("research_center", center.level + 1)
if player.money < cost:
return error("INSUFFICIENT_FUNDS")
player.money -= cost
center.level += 1
center.production_rate *= 1.2 # +20% par niveau
center.range += 1 # +1 case de rayon
return success("UPGRADE_COMPLETE")
```
### Cas Limites
- **Recherche Active** : L'upgrade ne doit pas annuler la recherche en cours, mais peut la mettre en pause ou simplement s'appliquer après. (Choix : S'applique immédiatement sur le taux de production restant).
- **Max Level** : Désactiver le bouton.
# 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)
### Arbre Technologique (Consultation)
**Description UX** : Visualiser les paliers de recherche.
@@ -25,12 +71,17 @@ Voir `centre_recherche.md` pour le tableau détaillé des coûts et effets par n
**Événements** : `VIEW_TECH_TREE`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Ambiance "Laboratoire High-Tech" (boucle subtile).
- **Sons** : `lab_hum.mp3`, `data_process.mp3`.
- **Graphiques** : Lignes de connexion.
- **Images** : Icônes Radar, Fiole.
- **Vidéos** : N/A
- **Animations** : N/A
- **Vidéos** : Hologramme rotatif de la technologie sélectionnée.
- **Animations** : Cadenas qui saute.
- **Couleurs** : Bleu (Science).
- **Textes** : "Niveau Suivant : Portée +10km".
- **Formes** : N/A
- **Formes** : Hexagones.
### Vue Isométrique
- **Antennes** : À chaque niveau, des antennes paraboliques ou des équipements s'ajoutent sur le toit.
- **Lumières** : Les lumières du bâtiment changent (plus intenses, clignotantes) pour montrer l'activité accrue.
- **Animation** : Les antennes tournent en boucle.

View File

@@ -13,80 +13,141 @@
## 1. Données et États
### Modèle de Données (JSON)
N/A
**Transaction** :
```json
{
"id": "uuid",
"type": "BUY/UPGRADE",
"item_type": "string",
"item_id": "uuid",
"cost": "int",
"currency": "coins",
"status": "enum (SUCCESS, FAILED)",
"failure_reason": "string (optional)",
"timestamp": "date",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
**Solde Joueur** : Voir `joueur.md`.
### Scores Initiaux
N/A
**Dépenses Totales** : 0.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
**Menu Achat** : Accessible via le HUD.
### Conditions de Disparition
N/A
**Fermeture Menu**.
### Hérédité
N/A
**Historique** : Les transactions sont loggées pour les stats.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Isolation** : Les bâtiments de haut niveau résistent mieux aux coûts énergétiques (Chauffage/Clim -10% par niveau).
### Impact Milieu (Biome)
N/A
**Adaptation** : Construire sur un biome "difficile" (Toundra, Désert) coûte +20% à l'achat initial (frais de fondations).
### Impact Saisons
N/A
**Soldes** : Certains items moins chers en Hiver (-15% sur les chauffages).
**Surcharge** : En Été, les stands de glaces coûtent +10% à l'achat (demande forte).
### Impact Heure / Jour-Nuit
N/A
**Tarif de Nuit** : Les travaux (Upgrades) lancés la nuit (22h-06h) sont 5% moins chers (main d'œuvre nocturne).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Couveuses** : L'achat d'upgrades "Confort" pour les enclos augmente la fertilité de +2%.
### Impact Mort
N/A
**Sécurité** : Les clôtures de haut niveau réduisent le risque de fuite et d'accident mortel de 99%.
### Impact Nourriture
N/A
**Stockage** : Les upgrades de "Réserve" permettent d'acheter la nourriture en gros (-5% prix unitaire).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Nouveauté** : Chaque nouvel achat génère un boost temporaire d'attractivité ("C'est tout neuf !" +10% pendant 2 jours).
### Impact Valeur
N/A
**Inflation** : Les prix augmentent légèrement si le joueur est très riche (équilibrage dynamique).
**Revente** : Un bâtiment peut être revendu pour 50% de son coût total (base + upgrades).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Livraison** : Instantanée pour les bâtiments, temps de trajet pour les animaux.
**Construction** : Les gros bâtiments (Laboratoire, Centre Recherche) prennent 24h in-game à être opérationnels.
### Dépenses (Boutiques/Visiteurs)
N/A
**Investissement** : Dépense principale du joueur.
**Maintenance** : Chaque niveau d'upgrade augmente les frais d'entretien quotidiens de +5%.
### Trajet Visiteurs
N/A
**Obstacle** : Un bâtiment en construction bloque le passage, forçant les visiteurs à faire un détour.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Promo** : Offre limitée dans le temps (-20%).
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Multiplicateur Coût | Effet Général | Apparence |
| :--- | :--- | :--- | :--- |
| 1 | x1.0 | Fonctionnalité de base | Standard |
| 2 | x1.5 | +10% Efficacité | +Détails |
| 3 | x2.2 | +25% Efficacité | +Couleurs |
| 4 | x3.3 | +45% Efficacité | +Éclairage |
| 5 | x5.0 | +70% Efficacité | +Enseigne |
| 6 | x7.5 | +100% Efficacité | +Moderne |
| 7 | x11.0 | +150% Efficacité | Futuriste (Or/Platine) |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function processPurchase(player, item):
# Vérification pré-requis (ex: niveau joueur)
if player.level < item.required_level:
emitEvent("BUY_FAIL", "Niveau joueur insuffisant")
return
# Vérification espace (si applicable)
if item.is_physical and not map.hasSpace(item.size):
emitEvent("BUY_FAIL", "Pas de place")
return
if player.coins >= item.cost:
player.coins -= item.cost
player.inventory.add(item)
emitEvent("BUY_SUCCESS")
logTransaction(player, item, "SUCCESS")
else:
emitEvent("BUY_FAIL", "Fonds insuffisants")
logTransaction(player, item, "FAILED")
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `FUNDS_LOW` | Alerte | "Pas assez de pièces !" |
| `LEVEL_LOW` | Alerte | "Niveau X requis pour acheter ceci." |
| `NO_SPACE` | Alerte | "Impossible de construire ici." |
# 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)
### Interface d'Achat (Consultation)
**Description UX** : Le joueur ouvre le menu de construction ou d'upgrade.
@@ -97,15 +158,15 @@ N/A
**Événements** : `OPEN_SHOP_MENU`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle "Caisse Enregistreuse" (court).
- **Sons** : `ui_hover.mp3`.
- **Graphiques** : Icônes Bâtiments.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Sprites des bâtiments dans le menu (2D isométrique).
- **Vidéos** : Mini-clip "Construction en cours" (optionnel).
- **Animations** : Bouton rebondit au survol.
- **Couleurs** : Fond sombre, Texte clair.
- **Textes** : Prix, Nom.
- **Formes** : Cartes carrées.
- **Formes** : Cartes carrées avec coins arrondis.
### Confirmation Achat (Action)
**Description UX** : Le joueur clique pour acheter.
@@ -116,12 +177,12 @@ N/A
**Événements** : `BUY_ITEM`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle "Succès" (trompettes légères).
- **Sons** : `buy_success.mp3`.
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Particules de pièces d'or.
- **Images** : Icône "Vendu" tamponnée.
- **Vidéos** : Transition de fermeture de menu (wipe).
- **Animations** : Compteur pièces descend.
- **Couleurs** : Rouge (déduction).
- **Textes** : "-500".
- **Formes** : N/A
- **Formes** : Effet d'onde de choc circulaire au clic.

View File

@@ -2,39 +2,86 @@
## Construction
- Nécessaire pour faire éclore plus d'œufs simultanément.
- Peut être construite sur une case vide.
## Upgrade (7 Niveaux)
- **Incubation** : Réduit le temps d'éclosion.
- **Soins** : Augmente les chances de survie des bébés (réduit l'impact des écarts de température).
- **Génétique** : (Niveaux élevés) Augmente légèrement la probabilité d'obtenir une rareté supérieure.
- **Génétique** : (Niveaux élevés) Augmente légèrement la probabilité d'obtenir une rareté supérieure (Shiny/Albinos).
- **Capacité** : Débloque des slots d'incubation supplémentaires.
# Annexes Techniques
## 1. Données et États
Voir `nurserie.md` pour le modèle de données complet.
### Modèle de Données (Action)
```json
{
"action": "upgrade_nursery",
"building_id": "uuid",
"unlocked_slots": 3,
"incubation_speed_bonus": 0.2
}
```
*Voir `nurserie.md` pour le modèle de données complet.*
## 7. Progression
### Tableau des Upgrades
Voir `nurserie.md` pour le tableau détaillé des coûts et effets par niveau.
*Voir `nurserie.md` pour le tableau détaillé des coûts et effets par niveau.*
## 8. Logique et Interfaces
### Pseudo-code
```python
def upgrade_nursery(nursery, player):
cost = get_upgrade_cost("nursery", nursery.level + 1)
if player.money < cost:
return error("NO_MONEY")
player.money -= cost
nursery.level += 1
# Déblocage de slots tous les 2 niveaux
if nursery.level % 2 == 0:
nursery.slots.append(create_empty_slot())
return success("NURSERY_UPGRADED")
```
### Cas Limites
- **Incubateurs pleins** : L'upgrade n'affecte pas les œufs en cours (ou réduit leur temps restant proportionnellement).
- **Max Slots** : Limité à 6 ou 8 slots max pour l'UI.
# 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)
### Extension (Action)
**Description UX** : Ajouter des slots d'œufs.
**Description UI** : La grille de slots s'agrandit (nouvelles cases déverrouillées).
**Emplacement** : Modal Nurserie.
**Intégration** : UI Grid.
**Navigation** : N/A
**Navigation** : Clic Nurserie -> Onglet Extension.
**Événements** : `UNLOCK_SLOT`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Berceuse douce (boîte à musique).
- **Sons** : `unlock.mp3`.
- **Graphiques** : Cadenas qui s'ouvre.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône "Œuf +" (Slot vide).
- **Vidéos** : Rayon de lumière sur le nouveau slot.
- **Animations** : Slot qui s'illumine.
- **Couleurs** : N/A
- **Couleurs** : Rose pastel et Bleu ciel.
- **Textes** : "Slot débloqué".
- **Formes** : N/A
- **Formes** : Cercles doux (œufs).
### Vue Isométrique
- **Taille** : Le bâtiment peut s'agrandir visuellement (ajouter une aile) aux niveaux 3 et 5.
- **Fenêtres** : On peut voir la lumière chaude à travers les fenêtres la nuit (incubateurs).

View File

@@ -0,0 +1,103 @@
# Affiche Enclos
## 1. Définition
Panneau informatif fixé sur la clôture d'un enclos, présentant l'espèce animale qui y réside. Il apparaît automatiquement lorsqu'un enclos est créé et se positionne sur une section horizontale visible de la barrière.
## 2. Fonctions
* **Information :** Indique aux visiteurs (et au joueur) quel animal se trouve ici.
* **Éducation :** Augmente légèrement le score d'éducation du zoo (les visiteurs s'arrêtent pour lire).
* **Esthétique :** Habille les clôtures et rend le zoo plus réaliste.
## 3. Icone
* **Représentation :** Panneau rectangulaire avec une photo d'animal.
* **Couleur dominante :** Bois et Blanc.
## 4. Interactions
* **Clic :** Ouvre la fiche encyclopédique de l'animal ("Zoopédia").
* **Personnalisation :** (Optionnel) Changer le style du cadre ou l'image.
* **Maintenance :** Peut être vandalisé (tagué) ou cassé, nécessitant une réparation par un agent d'entretien.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"sign_id": "sign_lion_01",
"parent_enclosure_id": "enclosure_lions_01",
"created_at": "timestamp",
"updated_at": "timestamp",
"position": {
"x": 10,
"y": 11,
"face": "enum (NORTH, SOUTH, EAST, WEST)"
},
"style_id": "wood_basic",
"status": "enum (OK, BROKEN, TAGGED)",
"status_since": "timestamp",
"repair_cost": "integer",
"clean_cost": "integer",
"cooldowns": {
"next_interaction_at": "timestamp"
},
"animal_info": {
"name": "Lion d'Afrique",
"scientific_name": "Panthera leo",
"conservation_status": "VU"
},
"i18n": {
"title_key": "string",
"subtitle_key": "string"
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Placement Auto :** Le jeu détermine la meilleure position (côté sud ou est généralement, face au chemin le plus proche).
* **Unicité :** Une seule affiche par enclos fusionné (ou une tous les X cases de périmètre).
* **Mise à jour :** Si l'animal change (enclos vidé puis rempli avec autre chose), l'affiche se met à jour automatiquement.
* **Dégradation** :
* `TAGGED` : naffecte pas la lisibilité mais réduit lattractivité (ex. -5 rayon 6 cases) jusquau nettoyage.
* `BROKEN` : la Zoopédia est inaccessible au clic, et malus attractivité plus fort (ex. -15 rayon 8 cases).
* **Cooldown clic** : éviter les spams ; appliquer `next_interaction_at` (ex. 1s) sur ouverture Zoopédia.
### Algorithme de Placement
```python
def place_sign(enclosure):
# Trouver les murs adjacents à un chemin
valid_walls = []
for wall in enclosure.walls:
if is_path(wall.neighbor):
valid_walls.append(wall)
# Priorité : Sud > Est > Ouest > Nord (pour visibilité isométrique)
best_wall = select_best_wall(valid_walls)
create_sign(best_wall.position, best_wall.orientation)
```
## 6. Annexes UX/UI
* **Visuel :** Petit panneau en bois avec une image miniature de l'animal.
* **Lisibilité :** Doit être visible sans cacher les animaux derrière.
* **Zoom :** Devient plus détaillé ou affiche une bulle d'info au survol de la souris.
* **Vue Isométrique :**
* **Orientation :** Le sprite doit correspondre à l'orientation du mur (4 sprites différents).
* **Z-Index :** Doit être dessiné *après* la clôture mais *avant* les visiteurs passant devant.
### Messages i18n (exemples)
* `ENCLOSURE_SIGN_OPEN` : FR "Ouvrir la Zoopédia" / EN "Open Zoopedia"
* `ENCLOSURE_SIGN_TAGGED` : FR "Affiche taguée" / EN "Sign tagged"
* `ENCLOSURE_SIGN_BROKEN` : FR "Affiche cassée" / EN "Sign broken"
# 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.

View File

@@ -0,0 +1,566 @@
# Agent de Sécurité
## 1. Définition
Employé responsable de l'ordre et de la sécurité dans le zoo. Il gère les visiteurs indisciplinés, prévient le vandalisme et peut intervenir en cas d'évasion d'animal (si fonctionnalité présente). Achetable avec des pièces.
## 2. Fonctions
* **Surveillance :** Patrouille dans les allées pour rassurer les visiteurs (+attractivité).
* **Intervention :** Expulse les visiteurs qui jettent des déchets ou embêtent les animaux.
* **Protection :** Capture les animaux échappés (avec filet ou tranquillisant).
* **Dissuasion :** Sa simple présence réduit la probabilité d'actes de vandalisme dans un rayon donné.
## 3. Icone
* **Représentation :** Écusson ou Casquette de police.
* **Couleur dominante :** Bleu marine et Jaune.
## 4. Interactions
* **Recrutement :** Menu "Employés", coût en pièces.
* **Ordre :** Le joueur peut cliquer sur une zone pour envoyer l'agent en priorité.
* **Licenciement :** Possible via le menu employé.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"employee_id": "security_05",
"type": "agent_securite",
"name": "Sgt. Pepper",
"created_at": "timestamp",
"salary": 40,
"hire_cost": 400,
"state": "enum (PATROL, CHASE, REST, INTERACT)",
"position": { "x": 12.5, "y": 14.0 },
"target_position": { "x": 20, "y": 10 },
"stats": {
"intimidation": 10,
"speed": 1.1,
"stamina": 100
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Rayon d'action :** 5 cases autour de lui.
* **Fatigue :** Doit se reposer au Staff Room toutes les 4h in-game.
* **Priorité :** Animal échappé > Vandalism > Déchets > Patrouille.
### Algorithme de Comportement (FSM)
```python
def update_security_agent(agent, world):
if agent.state == "REST":
agent.stamina += 5
if agent.stamina >= 100:
agent.state = "PATROL"
return
# Scan des menaces
threat = scan_for_threats(agent.position, radius=10)
if threat:
agent.state = "CHASE"
agent.target = threat.position
move_towards(agent, threat.position, agent.speed * 1.5) # Course
if distance(agent, threat) < 1:
neutralize(threat)
else:
agent.state = "PATROL"
patrol_randomly(agent)
```
## 6. Annexes UX/UI
* **Visuel Carte :** Personnage en uniforme bleu.
* **Animation :**
* **Marche :** Calme, mains dans le dos.
* **Course :** Rapide, sifflet à la bouche.
* **Action :** Sort un carnet (amende) ou un filet (animal).
* **Feedback :** Les visiteurs s'écartent sur son passage.
* **Vue Isométrique :** Sprite 8 directions pour des déplacements fluides.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Employé “Agent de sécurité” |
| Rôle | Maintenir lordre, réduire vandalisme/incidents, gérer visiteurs indisciplinés, intervenir (si feature) sur évasions. |
| IA | FSM/priority queue : Évasion > Vandalisme > Déchets > Patrouille. |
| Vue | Isométrique 2.5D, sprite 4 directions (le bloc “8 directions” existant est conservé comme option danimation), hitbox base-sprite. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Patrouille | Tick agent | routes, densité | présence | Choisit chemins (visiteurs attirés chemins) | Event `SECURITY_PATROL_TICK` |
| Dissuasion vandalisme | proximité incident | `intimidation`, rayon | proba vandalisme - | Effet plafonné ; dépend densité | Event `SECURITY_DETERRENCE_APPLIED` |
| Intervention visiteur | visiteur “indiscipliné” | target | expulsion/stop | Temps action ; cooldown | Event `SECURITY_INTERACT_START/END` |
| Gestion évasion (option) | animal `ESCAPED` | animal pos | capture | Nécessite équipement (filet) ou tranquillisant | Event `SECURITY_CAPTURE` |
| Gestion fatigue | temps actif | stamina | REST | Repos staff room obligatoire | Event `SECURITY_REST_START/END` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Écusson / casquette |
| Couleur dominante | Bleu marine / jaune |
| Variantes | `icon_security_badge.png`, `icon_security_cap.png` |
| États | Badge “alerte” (rouge), “patrouille” (pas), “recherche” (loupe) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Recruter | Action | coins ≥ `hire_cost` | Menu Employés → Sécurité → Confirmer | agent créé | `INSUFFICIENT_FUNDS`, `EMPLOYEE_CAP_REACHED` |
| Envoyer en priorité | Action | zone/cible valide | clic carte → “Envoyer sécurité” | target prioritaire | `NO_SECURITY_AVAILABLE`, `INVALID_TARGET` |
| Licencier | Action | pas en capture verrouillée | panel agent → “Licencier” | suppression | `ACTION_BLOCKED` |
| Inspecter incidents | Consultation | - | panel → incidents | liste + ETA | - |
| Activer mode “strict” | Configuration | upgrade / coût | toggle | intervention + mais visiteurs stress + | `LOCKED_FEATURE` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `employee_id` | string | `security_05` | DB | unique |
| `type` | enum | `agent_securite` | DB | constante |
| `created_at` | timestamp | - | DB | - |
| `salary` | int | 40 | config | coins/jour |
| `hire_cost` | int | 400 | config | one-shot |
| `state` | enum | `PATROL|CHASE|REST|INTERACT` | runtime | FSM |
| `position` | object | `{x,y}` | runtime | monde |
| `target_position` | object | `{x,y}` | runtime | chase |
| `stats.intimidation` | int | 10 | DB | [1..100] |
| `stats.speed` | float | 1.1 | DB | déplacement |
| `stats.stamina` | int | 100 | runtime | 0..100 |
| `radius` | int | 5 | config | action |
| `grid` | object | `{x,y}` | runtime | position grille zoo |
| `iso_x/iso_y` | int | - | rendu | projection |
| `z_index` | int | - | rendu | profondeur |
| `hitbox` | enum | `base_sprite` | rendu | click base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Rayon action | 5 | cases | règle existante |
| Vitesse | 1.1 | coef | - |
| Stamina max | 100 | points | - |
| Temps repos | 15 | min in-game | par cycle repos |
| Priorité | 4 niveaux | - | évasion > vandalisme > déchets > patrouille |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Incidents résolus/jour | 0 | 0..∞ | satisfaction + |
| Vandalisme évité | 0 | 0..∞ | réputation + |
| Temps réponse moyen | 0 | 0..∞ | performance |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | embauche | coins | entité | `PATROL` |
| Chase | menace détectée | target | déplacement | sprint consomme stamina |
| Interact | contact menace | menace | neutralisée | cooldown |
| Rest | stamina bas | temps | stamina + | staff room |
| Disparition | licenciement | - | suppression | stop chase |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Achat | coins ≥ `hire_cost` | vrai | création |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Licenciement | action joueur | vrai | suppression |
| Zoo supprimé | - | vrai | suppression |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Stats | Oui | persistées |
| Stamina | Non | reset quotidien |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Température | Effet | Condition |
|---|---|---|
| Extrême | patrouille - | fatigue + |
| Tempérée | neutre | - |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Chemins | déplacement + | patrouille efficace |
| Pont étroit | congestion | éviter chase sur pont |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Été | foule + | incidents + |
| Hiver | affluence - | incidents - |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| Jour | patrouille | - |
| Nuit | sécurité renforcée | incidents peur + si pas déclairage |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Bruit intervention | - | près enclos |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Évasion non gérée | risque mort + | collisions/ville |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| - | aucun | agent nalimente pas |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| État | Effet | Condition |
|---|---|---|
| Présence sécurité | confort + | rayon action |
| Interventions fréquentes | confort - | stress visiteurs |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action | Effet animaux | Condition |
|---|---|---|
| Capture évasion | stress + puis - | fin incident |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Zoo sûr | + | réputation/flux visiteurs |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Livraison équipements | + | si feature |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Gestion sortie | + | si foule panique |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Tech caméras | incidents - | si débloqué |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Déplacement visiteurs | - | si zones bloquées |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Vente souvenirs “police” | revenu + | coins | option |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Remboursement peur | -coins | coins | incidents peur |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaire | 40 | coins/jour | actif |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| dégâts évasion | 100 | coins | réparation |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| capture matériel | 50 | coins | filet |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | sécurité augmente confiance |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Incident | Enclos | évasion | zone bloquée |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteurs | Boutique | after incident | achats - |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Panique | sortie | peur | départ massif |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `VANDALISM_DETECTED` | scan | pos | chase |
| `ESCAPE_DETECTED` | animal escaped | animal_id | chase |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `SECURITY_CHASE` | menace | animation course |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `ZONE_BLOCKED` | intervention | pathing détour |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_CALMED` | sécurité proche | satisfaction + |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_EXPELLED` | interaction | sortie immédiate |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_SEND_SECURITY` | clic zone | priorité chase |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | patrouille base | - |
| 2 | 1500 | intimidation +2 | dissuasion |
| 3 | 3000 | speed +0.1 | réponse |
| 4 | 6000 | équipement capture | gestion évasion |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `scan_for_threats` | position, radius | threat | existant |
| `neutralize` | threat | resolved | expulsion/capture |
| `apply_deterrence` | intimidation | proba- | clamp |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `SECURITY_BUSY` | Warning | "Agent occupé." | chase/interact |
| `ESCAPE_ALERT` | Alerte | "Évasion détectée !" | animal escaped |
| `VANDALISM_ALERT` | Warning | "Vandalisme !" | incident |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Envoyer agent | résoudre incident | localisation | action contextuelle sur incident |
| Voir sécurité | confiance | info | badges sur carte |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Panel agent | stamina, état, target | patrol/chase/rest |
| Badge incident | type | priorité |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Carte | sprite agent | sélection base |
| Incidents | bulles | clic direct |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Pathfinding | zones bloquées | pas de fallback |
| Incidents visiteurs | expulsion | - |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir panel | clic agent | panel |
| Envoyer | clic incident | target |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_SECURITY_PANEL` | clic | panel |
| `CLICK_SEND_SECURITY` | clic zone | send |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `security_loop.mp3` | ambiance | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `whistle.mp3` | chase | moyen |
| `ui_alert.mp3` | alerte | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `security_sprite_[dir].png` | sprite | 4 dirs |
| `fx_alert_ring.png` | FX | overlay |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `icon_security_badge.png` | icône |
| `portrait_security.png` | panel |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `security_alert.webm` | popup | 0.9s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| ring alerte | incident | loop |
| dash | chase | burst |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `security_primary` | #1B3B6F | UI |
| `security_accent` | #F1C40F | badge |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `security.send` | Envoyer | Send |
| `security.busy` | Occupé | Busy |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Badge alerte | triangle arrondi | lisible |
| Panel | bottom sheet | standard |

View File

@@ -14,6 +14,16 @@ La carte du monde est vaste, mais le joueur ne voit initialement qu'une petite z
## 1. Données et États
### Modèle de Données (JSON)
Propriété `view_radius` sur `Zoo` ou `Player`.
```json
{
"player_id": "uuid",
"world_map_state": {
"view_radius_km": 100,
"unlocked_zones": ["zone_0_0", "zone_0_1"],
"fog_of_war_mask": "bitmask_string"
}
}
```
### Caractéristiques Initiales
| Caractéristique | Valeur Initiale |
@@ -32,8 +42,38 @@ Propriété `view_radius` sur `Zoo` ou `Player`.
| 6 | 2500 | 1200 km |
| 7 | 5000 | 2000 km |
## 8. Logique et Interfaces
### Algorithme d'Exploration
```python
def explore_world(player):
next_level = get_next_exploration_level(player.exploration_level)
cost = next_level.cost
if player.research_points < cost:
return error("NOT_ENOUGH_RP", "Points de recherche insuffisants.")
player.research_points -= cost
player.exploration_level += 1
player.view_radius = next_level.radius
# Révéler les POI dans le nouveau rayon
new_pois = find_pois_in_radius(player.zoo_location, player.view_radius)
notify_discovery(new_pois)
return success("EXPLORATION_SUCCESS")
```
# 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)
### Découverte (Passif/Action)
**Description UX** : En payant des points de recherche, le brouillard de guerre recule sur la carte du monde.
@@ -47,9 +87,13 @@ Propriété `view_radius` sur `Zoo` ou `Player`.
- **Musiques** : Jingle découverte (style Zelda/Civ).
- **Sons** : `wind_whoosh.mp3`.
- **Graphiques** : Nuages (Brouillard de guerre).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Carte au trésor (Icône).
- **Vidéos** : Effet de dissipation de brume.
- **Animations** : Fade out des nuages. Scale up de la vue (Dezoom).
- **Couleurs** : Blanc/Gris (Nuages).
- **Textes** : "Nouvelle zone découverte !".
- **Formes** : Cercle (Rayon de vue).
### Vue Isométrique
- **Carte** : La carte du monde peut être stylisée comme une carte papier posée sur une table, ou un globe holographique.
- **Bords** : Les bords de la zone connue sont flous ou déchirés.

View File

@@ -5,20 +5,19 @@ Entité biologique principale du jeu.
## Propriétés
- **Type/Espèce** : Défini par le loot (75 animaux possibles).
- **Affichage** : Apparaît "en petit" dans l'enclos fusionné.
- **Génétique** :
- **Couleur** : 15 variations.
- **Rareté** : 5 niveaux (pondération Fibonacci).
- **État** : Faim, Température, Santé, Âge.
- **Traits** : Caractéristiques spéciales (ex: "Gourmand", "Agile").
- **État** : Faim, Température, Santé, Âge, Stress.
- **Cycle de vie** : Œuf -> Bébé -> Adulte -> Mort.
## Besoins
- **Nourriture** : Consommation périodique.
- **Environnement** : Adéquation Biome/Température.
- **Social** : Besoin de congénères (reproduction) ou de solitude (selon espèce).
## Mort
Causes possibles : Faim, Froid/Chaud, Solitude, Maladie, Vieillesse (si implémenté), Attaque (si implémenté).
Conséquence : Perte sèche, pénalité d'attractivité.
- **Enrichissement** : Besoin d'un objet spécial dans l'enclos (ex: Arbre à singe).
# Annexes Techniques
@@ -36,14 +35,20 @@ Conséquence : Perte sèche, pénalité d'attractivité.
"health": "float (0-100)",
"hunger": "float (0-100)",
"temperature_comfort": "float (-1.0 to 1.0)",
"stress": "float (0-100)"
"stress": "float (0-100)",
"energy": "float (0-100)"
},
"genetics": {
"parent_a_id": "uuid_v4 | null",
"parent_b_id": "uuid_v4 | null",
"mutation_factor": "float"
"mutation_factor": "float",
"traits": ["glutton", "nocturnal"]
},
"position": { "x": "int", "y": "int" }
"position": { "x": "float", "y": "float", "z": "float" },
"orientation": "enum (N, S, E, W)",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -55,12 +60,6 @@ Conséquence : Perte sèche, pénalité d'attractivité.
| Stress | 0.0 |
| Âge | 0 (Bébé) |
### Scores Initiaux
| Score | Valeur |
| :--- | :--- |
| Valeur Vente (Base) | 10 * Fibonacci(Rareté) |
| Attractivité (Base) | 5 * Rareté |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
| Type | Condition |
@@ -77,12 +76,6 @@ Conséquence : Perte sèche, pénalité d'attractivité.
| Vente | Transaction validée |
| Libération | Action joueur |
### Hérédité
| Paramètre | Formule / Logique |
| :--- | :--- |
| Rareté | `Moyenne(Parents) + Random(-1, +1)` (Pondéré par mutation) |
| Couleur | `Parent_A` (50%) ou `Parent_B` (50%) + Faible chance mutation |
## 3. Impacts Environnementaux
### Impact Température
| Delta T° (Idéal - Réel) | Effet sur Santé / Heure | Effet sur Stress / Heure |
@@ -100,97 +93,31 @@ Conséquence : Perte sèche, pénalité d'attractivité.
| Adjacente (Cercle chromatique) | 0 | 0 |
| Opposée | -5 | +10 |
### Impact Saisons
| Saison | Modificateur Faim | Modificateur Santé |
| :--- | :--- | :--- |
| Printemps | Normal | Bonus Régénération |
| Été | +10% (Soif/Faim) | Malus si T° > Seuil |
| Automne | Normal | Normal |
| Hiver | +20% (Besoin énergie) | Malus si T° < Seuil |
### Impact Heure / Jour-Nuit
| Cycle | Modificateur Faim | Modificateur Stress |
| :--- | :--- | :--- |
| Jour | Normal | Normal |
| Nuit | -50% (Sommeil) | Récupération rapide (si calme) |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
| Condition | Bonus/Malus Score Repro |
| :--- | :--- |
| Santé > 80% | +10 |
| Faim < 20% | +10 |
| Stress < 10% | +20 |
| Partenaire compatible < 2 cases | Déclencheur |
### Impact Mort
| Événement | Effet |
| :--- | :--- |
| Mort d'un congénère (Rayon 5) | Stress +20 (Immédiat) |
| Mort isolée | N/A |
### Impact Nourriture
| État Faim | Effet Santé / Heure |
| :--- | :--- |
| 0-20% | +2 |
| 20-50% | 0 |
| 50-80% | -2 |
| 80-100% | -10 |
### Impact Attractivité (Visiteurs/Animaux)
| Rareté | Attractivité (Rayon d'action) |
| :--- | :--- |
| 1 (Commun) | 2 cases |
| 2 (Peu commun) | 3 cases |
| 3 (Rare) | 5 cases |
| 4 (Épique) | 8 cases |
| 5 (Légendaire) | 12 cases (Tout le zoo) |
### Impact Valeur
| Facteur | Multiplicateur Valeur |
| :--- | :--- |
| Santé 100% | x1.2 |
| Santé < 50% | x0.5 |
| Âge (Adulte jeune) | x1.5 |
| Âge (Vieux) | x0.8 |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A (Concerne les bâtiments)
### Dépenses (Boutiques/Visiteurs)
N/A
### Trajet Visiteurs
N/A
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Maladie** : Si Santé < 20% et hygiène faible.
* **Naissance** : Si conditions reproduction réunies.
* **Mort** : Si Santé <= 0.
## 7. Progression
### Tableau des Upgrades
N/A (L'animal n'a pas d'upgrade, il a de l'expérience/âge)
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
```javascript
function updateAnimal(animal, context):
# Gestion Température
deltaTemp = abs(animal.idealTemp - context.tileTemp)
if deltaTemp > 0:
animal.health -= tableImpactTemp[deltaTemp]
animal.stress += tableImpactTemp[deltaTemp] * 0.5
# Gestion Biome
if context.tileBiome != animal.idealBiome:
animal.stress += 5
if animal.hunger > 0:
# Gestion Faim
if animal.hunger < 100:
animal.hunger += baseHungerRate * context.seasonMod
else:
animal.health -= 10 # Famine
if animal.hunger >= 100:
animal.health -= 10
# Gestion Reproduction
if canReproduce(animal):
mate = findMate(animal)
if mate:
startReproduction(animal, mate)
```
### Messages d'Infos / Alerte
@@ -203,60 +130,36 @@ function updateAnimal(animal, context):
# 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)
### Vie Quotidienne (Passif)
**Description UX** : L'animal vit sa vie sur la grille. Il bouge, mange, dort.
**Description UI** : Sprite animé. Si problème (faim/froid), feedback visuel immédiat (changement couleur/tremblement).
**Emplacement** : Case Zoo.
**Intégration** : Grille principale.
**Navigation** : N/A
**Navigation** : Clic Animal (Focus).
**Événements** : `ANIMAL_IDLE`, `ANIMAL_MOVE`.
#### Assets
- **Musiques** : Ambiance nature (oiseaux, vent).
- **Sons** : Cris d'animaux aléatoires (faible volume).
- **Graphiques** : Sprites Pixel Art (4 directions).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Portraits HD pour les dialogues.
- **Vidéos** : Mini-cinématique d'introduction de l'espèce (découverte).
- **Animations** : Idle, Walk, Eat, Sleep.
- **Couleurs** : Selon espèce + Teinte bleue (Froid) / Rouge (Chaud).
- **Textes** : Bulle "Zzz" (Sommeil), "!" (Alerte).
- **Formes** : N/A
- **Formes** : Ombre portée ovale sous l'animal.
### Consultation (Consultation)
**Description UX** : Le joueur clique sur l'animal pour voir ses détails (Santé, Faim, Génétique).
**Description UI** : **Bottom Sheet** (Mobile) ou Panneau Latéral (Desktop) pour ne pas masquer le jeu. Jauges colorées. Arbre généalogique simplifié.
**Emplacement** : Case Zoo.
**Intégration** : Focus caméra sur l'animal.
**Navigation** : Clic Animal -> Panneau.
**Événements** : `SELECT_ANIMAL`.
#### Assets
- **Musiques** : N/A
- **Sons** : Cri spécifique de l'animal sélectionné.
- **Graphiques** : Portrait HD de l'animal.
- **Images** : Icônes Santé (Cœur), Faim (Cuisse), Température (Thermomètre).
- **Vidéos** : N/A
- **Animations** : Jauges qui se remplissent.
- **Couleurs** : Vert (>70%), Orange (30-70%), Rouge (<30%).
- **Textes** : Nom, Espèce, Âge.
- **Formes** : Panneau arrondi.
### Interaction (Action)
**Description UX** : Le joueur peut nourrir, soigner ou déplacer l'animal.
**Description UI** : Boutons d'action dans le panneau de consultation.
**Emplacement** : Panneau Consultation.
**Intégration** : Actions contextuelles.
**Navigation** : Clic Action -> Résultat immédiat.
**Événements** : `FEED_ANIMAL`, `HEAL_ANIMAL`, `MOVE_ANIMAL`.
#### Assets
- **Musiques** : N/A
- **Sons** : `eat.mp3`, `heal.mp3`.
- **Graphiques** : Particules (Cœurs, Étoiles).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Animal saute de joie.
- **Couleurs** : N/A
- **Textes** : "+10 PV", "-20 Faim".
- **Formes** : N/A
### Vue Isométrique
- **Sprites** : 4 directions (N, S, E, W) minimum. Idéalement 8 pour fluidité.
- **Occlusion** : L'animal doit être caché par les murs sud/est de son enclos, mais visible par-dessus les murs nord/ouest.
- **Comportement** : L'animal ne doit jamais traverser les murs (collision box stricte).

559
docs/specs/artiste.md Normal file
View File

@@ -0,0 +1,559 @@
# Artiste
## 1. Définition
Employé dédié au divertissement des visiteurs. Il réalise des spectacles de rue, joue de la musique ou peint, augmentant ainsi le bonheur des visiteurs et leur temps de séjour dans le zoo. Achetable avec des pièces.
## 2. Fonctions
* **Divertissement :** Crée une zone d'attractivité temporaire autour de lui.
* **Bonheur :** Augmente la jauge de bonheur des visiteurs à proximité.
* **Dons :** Peut générer de petits revenus supplémentaires (pourboires).
## 3. Icone
* **Représentation :** Masque de théâtre ou Notes de musique.
* **Couleur dominante :** Rose et Violet.
## 4. Interactions
* **Recrutement :** Menu "Employés", coût en pièces.
* **Placement :** Peut être assigné à une "scène" ou un point de passage stratégique.
* **Performance :** Le joueur peut déclencher un "Show Spécial" (cooldown) pour un gros boost.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"employee_id": "artist_03",
"type": "artiste",
"subtype": "musician", // "clown", "painter", "juggler"
"name": "Melody",
"salary": 45,
"hire_cost": 450,
"state": "enum (IDLE, PERFORMING, BREAK)",
"performance_cooldown_end": "timestamp",
"stats": {
"charisma": 15,
"radius": 3, // Rayon d'effet
"tips_collected": 0
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* L'efficacité diminue si l'artiste reste trop longtemps au même endroit (besoin de rotation ou de pause).
* Attire les foules, ce qui peut créer des bouchons (à gérer avec les chemins).
### Algorithme de Performance
```python
def update_artist(artist, visitors_nearby):
if artist.state == "PERFORMING":
for visitor in visitors_nearby:
visitor.happiness += artist.stats.charisma * 0.1
visitor.stay_duration += 5 # minutes
# Chance de pourboire
if random() < 0.05:
tip = random(1, 5)
artist.tips_collected += tip
add_coins(tip)
```
## 6. Annexes UX/UI
* **Visuel Carte :** Personnage coloré, jonglant ou jouant d'un instrument.
* **Effet :** Notes de musique ou étoiles flottant autour de lui.
* **Son :** Musique d'ambiance locale quand on zoome dessus.
* **Vue Isométrique :** Animation de jonglage ou de jeu d'instrument en boucle.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Employé “Artiste” |
| Rôle | Divertir les visiteurs pour augmenter satisfaction, temps de séjour et micro-revenus (pourboires). |
| Position | Se déplace sur chemins / points dintérêt (scène) avec un rayon deffet local. |
| Vue | Isométrique 2.5D, sprite 4 directions, hitbox base-sprite. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Divertissement de zone | Tick IA / début performance | `radius`, visiteurs proches | `+happiness`, `+stay_duration` | Effet décroissant si performance continue sans pause ; nécessite cases walkable | Event `ARTIST_PERF_TICK`, compteur visiteurs affectés |
| Show spécial | Action joueur | cooldown, coût optionnel | Bonus temporaire fort | Cooldown strict ; annule si artiste en pause forcée | Event `ARTIST_SPECIAL_SHOW_START/END` |
| Pourboires | Aléatoire pendant performance | RNG, densité foule | `+coins` | Plafond par minute ; augmente avec `charisma` | Event `ARTIST_TIP`, cumul `tips_collected` |
| Gestion fatigue | Temps passé en perf | durée | état `BREAK` | Pause obligatoire ; réduit efficacité avant pause | Event `ARTIST_BREAK_START/END` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Masque de théâtre / notes de musique |
| Couleur dominante | Rose / Violet |
| Variantes | `icon_artist_mask.png`, `icon_artist_music.png`, `icon_artist_paint.png` |
| États | Badge “cooldown” (horloge), “en pause” (Zzz) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Recruter | Action | Coins ≥ `hire_cost`, slot employé dispo | Menu Employés → Artiste → Confirmer | Artiste créé/assignable | `INSUFFICIENT_FUNDS`, `EMPLOYEE_CAP_REACHED` |
| Assigner à une scène | Action | Scène/POI existant, path possible | Sélection artiste → “Assigner” → clic scène | Itinéraire fixé + zone perf | `NO_PATH`, `SCENE_BUSY` |
| Déplacer manuellement | Action | Pas en show spécial verrouillé | Drag & drop / tap-to-move | Nouvelle position, recalcul foule | `INVALID_TILE` |
| Lancer show spécial | Action | Cooldown fini | Bouton “Show spécial” | Buff + FX + foule | `COOLDOWN_ACTIVE` |
| Inspecter stats | Consultation | - | Sélection artiste | Panel stats (charisma, tips) | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `employee_id` | string | `artist_03` | DB | Unique |
| `type` | enum | `artiste` | DB | Constante |
| `subtype` | enum | `musician|clown|painter|juggler` | DB | 1 parmi n |
| `salary` | int | 45 | config | Paiement journalier |
| `hire_cost` | int | 450 | config | Paiement à lembauche |
| `state` | enum | `IDLE|PERFORMING|BREAK` | runtime | Transitions contrôlées |
| `performance_cooldown_end` | timestamp | - | runtime | Non nul après show |
| `stats.charisma` | int | 15 | DB | [1..100] |
| `stats.radius` | int | 3 | DB | [1..8] |
| `stats.tips_collected` | int | 0 | runtime | Cumul session/jour |
| `grid` | object | `{x,y}` | runtime | Coord grille |
| `iso_x/iso_y` | int | - | rendu | Proj iso |
| `z_index` | int | - | rendu | Tri profondeur |
| `hitbox` | enum | `base_sprite` | rendu | Click sur base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Rayon effet | 3 | cases | `radius` |
| Chance pourboire | 5% | / tick perf | modulée par `charisma` |
| Bonus happiness | +0.1 × `charisma` | / tick | clamp max par visiteur |
| Pause requise | 10 | min in-game | après perf continue |
| Cooldown show spécial | 30 | min in-game | après activation |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Satisfaction locale | 0 | -100..+100 | Sajoute au calcul visiteur |
| Densité foule | 0 | 0..∞ | Conditionne bouchons |
| Revenu tips/jour | 0 | 0..∞ | Finance zoo |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | Embauche | coins, config | entité artiste | créé en `IDLE` |
| Activité | Tick | position, visiteurs | effets | pas de perf si `BREAK` |
| Disparition | Licenciement (si prévu) | - | suppression | pas de suppression si en show (attendre fin) |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Achat employé | coins ≥ `hire_cost` | vrai | création |
| Cap employé | slots > employés actifs | vrai | autorisé |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Licenciement | action joueur | vrai | suppression + arrêt effets |
| Zoo supprimé | - | vrai | suppression |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| `subtype` | Oui | reste identique |
| Stats (charisma/radius) | Oui | persistées |
| Tips collectés | Non | remis à 0 par jour |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Température | Effet sur artiste | Effet sur visiteurs | Condition |
|---|---|---|---|
| < 0°C | perf -20% | satisfaction - | si pas dabris proches |
| 1525°C | neutre | neutre | - |
| > 35°C | perf -10% (fatigue) | incidents “soif” + | canicule |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Chemin pavé | foule + | visitors préfèrent rester sur chemins |
| Boue / marécage | perf - | gêne visuelle + saleté |
| Pont | neutre | éviter attroupement sur pont étroit |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Été | demande shows + | tips +10% |
| Hiver | shows indoor | perf -10% si extérieur |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| 10h16h | affluence max | perf prioritaire |
| 18h20h | sortie visiteurs | show spécial conseillé |
| Nuit | zoo fermé | artiste `IDLE` |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Foule bruyante | -5% | si densité > seuil près denclos |
| Show doux (musician) | +2% | si proche enclos et calme |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Accident foule | incident | si bouchon + chemins étroits |
| Animal mort visible | choc | artiste stop perf, foule se disperse |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Boisson visiteur | ventes + | show près boutique boisson |
| Nourriture artiste | coût | si mécanique employé nourrit (option) |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain attractivité | Rayon | Notes |
|---|---:|---:|---|
| Performance active | +5 | 3 cases | cumul limité par zone |
| Show spécial | +20 | 5 cases | déclenche attroupement |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Bruit clown | stress + | espèces sensibles |
| Musique douce | stress - | espèces calmes |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Tips collectés | +coins | par tick perf |
| Réputation zoo | + | si artistes actifs sans incidents |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Livraison employés | neutre | pas dimpact direct |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | artiste naffecte pas nurserie |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| File entrée | + lente | foule show proche billeterie |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps de séjour | + | performance active |
| Déplacement | - | si attroupement crée bouchon |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Gestion file | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Stock goodies show | variable | coins | si boutique vend souvenirs |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Pourboires | +revenu (pas dépense) | coins | tips |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaire artiste | `salary` | coins/jour | employé actif |
| Embauche | `hire_cost` | coins | à lachat |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Cross-sell | - | - | section dupliquée conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Snacks show | 10 | coins | option “stand temporaire” |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation/attractivité | lartiste naffecte pas le flux initial |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Show | Enclos proche | curiosité | détour possible, congestion |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Show | Boutique | soif/envie souvenir | augmente dépenses |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Billeterie | Show proche | densité | risque file lente |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `EMPLOYEE_HIRED` | embauche | type, id | ajoute entité |
| `EMPLOYEE_SALARY_PAID` | fin jour | id, amount | dépense |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `CROWD_CONGESTION` | densité > seuil | ralentit pathing local |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `ARTIST_SPECIAL_SHOW_START` | clic show | buff + FX |
| `ARTIST_BREAK_START` | fatigue | stop perf |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_DONATION` | tip | coins + |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_HAPPINESS_GAIN` | tick perf | happiness + |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_TRIGGER_SHOW` | bouton | démarre cooldown |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | artiste basic | subtype 1 |
| 2 | 1000 | `radius` +1 | meilleur crowd control |
| 3 | 2500 | tips +10% | bonus revenu |
| 4 | 5000 | show spécial + | FX + durée |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `update_artist` | artiste, visiteurs proches | happiness/tips | cf. algo existant |
| `trigger_special_show` | artiste | buff | cooldown |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `ARTIST_ASSIGNED` | Info | "Artiste assigné." | assign ok |
| `ARTIST_COOLDOWN` | Warning | "Show spécial en recharge." | cooldown actif |
| `CROWD_BLOCKING` | Alerte | "Bouchon détecté près du show." | densité > seuil |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Recruter artiste | augmenter attractivité | coûts/slots | achat direct depuis panneau Employés |
| Lancer show | booster momentané | cooldown | bouton direct sur panneau artiste |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Panneau employé | salaire, rayon, subtype | IDLE/PERF/BREAK |
| Bouton show spécial | cooldown + tooltip | enabled/disabled |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| HUD | menu Employés | accès rapide |
| Carte | sprite artiste | sélection base |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Pathfinding visiteurs | densité/obstacles | éviter ponts étroits |
| Système incidents | foule/bouchons | événements dédiés |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir panneau | clic artiste | panel visible |
| Recruter | menu → confirmer | entité créée |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_EMPLOYEE_PANEL` | clic artiste | ouvre panel |
| `CLICK_SPECIAL_SHOW` | clic bouton | démarre show |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `artist_theme_loop.mp3` | zone perf | loop | mix selon subtype |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `crowd_cheer.mp3` | show spécial | moyen |
| `coin_tip.mp3` | tip | faible |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `artist_sprite_[subtype]_[dir].png` | sprite | 4 directions |
| `fx_music_notes.png` | FX | overlay |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `portrait_artist.png` | panel |
| `icon_artist_mask.png` | liste employés |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `artist_special_show.webm` | popup show | 1.2s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| notes flottantes | perf active | cadence 1/s |
| confetti | show spécial | burst |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `artist_primary` | #C86DD7 | UI |
| `artist_accent` | #FF77AA | FX |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `artist.hire` | Recruter | Hire |
| `artist.special_show` | Show spécial | Special show |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Badge cooldown | pill arrondi | lisible |
| Zone radius | cercle iso-projeté | overlay |

View File

@@ -18,45 +18,90 @@ Les visiteurs ne se déplacent pas au hasard. Ils ont des "cibles" d'intérêt.
## 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
N/A
| 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
N/A
| 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
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Visiteur spawn | true | Est | IA interne démarre (choix cibles). |
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Ennui | 70 | >= | Cible sortie (billeterie). |
| Heure | fermeture | >= | Cible sortie. |
### Hérédité
N/A
| 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)
N/A
| Biome | Compatibilité | Bonus/Malus |
|---|---:|---|
| Chemin pavés | 100% | fatigue -10%/min |
| Boue | 30% | fatigue +20%/min, satisfaction - |
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Été | recherche dombre/boutiques | soif + |
| Hiver | recherche dintérieur | fatigue + |
### Impact Heure / Jour-Nuit
N/A
| Période | Activité | Visibilité |
|---|---|---|
| 10h16h | exploration max | haute |
| 17h19h | achats sortie | moyenne |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Bébés visibles | + | visiteurs restent plus |
### Impact Mort
Voir `visiteur.md` (Départ immédiat).
### Impact Nourriture
N/A
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---:|---:|---:|
| Boisson | soif -50 | 5 | 5 |
### Impact Attractivité (Visiteurs/Animaux)
**Poids des Cibles** :
@@ -68,25 +113,39 @@ N/A
| Banc (si fatigué) | 200 |
### Impact Valeur
N/A
| Facteur | Variation Prix | Condition |
|---|---:|---|
| Visiteur VIP | dépense x2 | si satisfait |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| 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)
N/A
| 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
N/A
| 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
N/A
| 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
@@ -101,26 +160,38 @@ function chooseNextTarget(visitor, zoo):
```
### Messages d'Infos / Alerte
N/A
| 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** : N/A
**Navigation** : Aucune (passif). Option debug : toggle “Heatmap foule” dans HUD pour visualiser les zones dattroupement.
**Événements** : `CROWD_GATHER`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ambience_crowd_dynamic.mp3` (volume selon densité).
- **Sons** : Rumeur de foule (volume variable selon densité).
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **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** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Blanc/Jaune (flash), Or (star).
- **Textes** : `CROWD_GATHER` = "La foule se rassemble"
- **Formes** : Bulle BD (émotions).

View File

@@ -20,7 +20,7 @@ L'attraction est calculée pour chaque couple (Ville, Zoo).
## 1. Données et États
### Modèle de Données (JSON)
Calculé à la volée ou mis en cache.
Calculé à la volée, sans cache (cf. règle “pas de mémorisation”).
```json
{
"zoo_id": "uuid",
@@ -30,67 +30,105 @@ Calculé à la volée ou mis en cache.
```
### Caractéristiques Initiales
N/A
| Caractéristique | Valeur Initiale | Type | Description |
|---|---|---|---|
| Rayon attraction max | 30 | cases monde | Au-delà, attraction = 0 (plafond). |
| Facteur ville | 1.0 | float | Multiplie le flux (population/aisance). |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Attraction brute | 0 | 0-∞ | Avant concurrence/plafonds. |
| Flux visiteurs/jour | 0 | 0-∞ | Résultat final injecté à la billeterie. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Zoo et ville existent | true | Est | Calcul possible. |
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Zoo supprimé | true | Est | Flux devient 0. |
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Soft reset | Cartographie connue | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Condition | Effet |
|---|---|
| Températures extrêmes régionales | réduit la volonté de voyager | flux -10% à -30% |
### Impact Milieu (Biome)
N/A
| Biome / route | Effet |
|---|---|
| Montagne (routes lentes) | distance effective + | flux - |
### Impact Saisons
**Hiver** : Réduit la volonté de voyager (-20% rayon d'attraction).
### Impact Heure / Jour-Nuit
N/A
| Période | Effet |
|---|---|
| Nuit | pas de départs | flux 0 vers billeterie |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Naissances médiatisées | flux + | événement “baby boom” |
### Impact Mort
N/A
| Cause | Conséquence | Durée |
|---|---|---|
| Série de morts | flux - | 24h (décroissance) |
### Impact Nourriture
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Prix nourriture élevé | visiteurs budget - | dépense moyenne - |
### Impact Attractivité (Visiteurs/Animaux)
Voir formule.
### Impact Valeur
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Ville riche | dépense moyenne + | facteur ville > 1 |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Paramètre | Valeur | Unité | Effet |
|---|---:|---|---|
| Recalcul flux | 1 | jour in-game | Recalcul quotidien (ou lazy). |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Marketing ville ciblée | 5005000 | coins | augmente facteur ville temporaire |
### Trajet Visiteurs
N/A
| Trajet | Condition | Effet | Notes |
|---|---|---|---|
| Ville→Zoo | calcul distance | flux | distance^2 + plafond rayon |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `FLOW_UPDATED` | recalcul quotidien | met à jour overlay | instant |
| `CITY_FESTIVAL` | événement ville | flux - | 1 jour |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Flux visible sur carte monde |
| 2 | 2000 | réputation 300 | Rayon attraction +10% |
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -98,31 +136,43 @@ N/A
function calculateDailyVisitors(zoo, city):
dist = distance(zoo.pos, city.pos)
if dist > zoo.maxAttractionRange: return 0
baseFlow = city.population * (zoo.reputation / (dist * dist))
return baseFlow * seasonMod
```
### Messages d'Infos / Alerte
N/A
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Nouvelle estimation visiteurs/jour : {n}" | recalcul | 2 |
| Warn | "La distance réduit fortement vos visiteurs." | dist proche plafond | 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)
### Visualisation Flux (Consultation)
**Description UX** : Le joueur regarde la carte du monde pour voir d'où viennent ses visiteurs.
**Description UI** : Lignes pointillées mouvantes reliant les villes au zoo. Épaisseur = Volume flux. **Particules** : Petits points ou voitures circulant sur les lignes pour donner une sensation de vie.
**Emplacement** : Carte Monde.
**Intégration** : Overlay.
**Navigation** : N/A
**Navigation** : Toggle “Flux visiteurs” dans le HUD carte monde → survol dune ligne → affiche détail (ville, visiteurs/jour, facteur saison, distance).
**Événements** : `VIEW_FLOW`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : `ambience_world_flow.mp3` (léger, optionnel).
- **Sons** : `ui_flow_toggle.mp3` (toggle overlay).
- **Graphiques** : Lignes de flux.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `flow_dotted_line.png`, `car_particle.png`.
- **Vidéos** : `flow_ants.webm` (1s loop, optionnel).
- **Animations** : Pointillés qui avancent (effet fourmis).
- **Couleurs** : Blanc ou Vert fluo.
- **Textes** : "150 visiteurs/jour".

520
docs/specs/avatar_joueur.md Normal file
View File

@@ -0,0 +1,520 @@
# Avatar Joueur
## 1. Définition
Représentation visuelle du joueur dans l'interface du jeu. L'avatar est personnalisable (genre, apparence, vêtements) et s'affiche en permanence dans un coin de l'écran (généralement en haut à gauche ou à droite, à définir selon l'UI). Il sert d'identité visuelle pour le profil du joueur et est visible par les autres joueurs lors des visites ou classements.
## 2. Fonctions
* **Personnalisation :** Permet au joueur de choisir le genre (Homme/Femme) et d'équiper des skins (chapeaux, vêtements, accessoires).
* **Identité :** Associé au pseudonyme du joueur et à son niveau.
* **Feedback Visuel :** Peut réagir aux événements du zoo (sourire si tout va bien, inquiet si problème).
* **Social :** S'affiche sur la carte du monde à côté du zoo du joueur.
* **NPC Directeur :** Une version miniature de l'avatar se promène physiquement dans le zoo pour inspecter les enclos.
## 3. Icone
* **Représentation :** Tête de l'avatar actuel dans un cadre circulaire ou carré.
* **Couleur dominante :** Dépend des skins équipés.
## 4. Interactions
* **Click :** Ouvre le menu de profil du joueur et l'inventaire de skins.
* **Survol :** Affiche le niveau actuel et le titre du joueur (ex: "Directeur Débutant").
* **Level Up :** Animation spéciale lorsque le joueur gagne un niveau.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"avatar_id": "player_12345",
"gender": "female", // "male" | "female"
"level": 12,
"experience": 4500,
"next_level_xp": 5000,
"title": "Expert Zoologist",
"equipped_skins": {
"head": "skin_hat_safari",
"body": "skin_shirt_ranger",
"accessory": "skin_glasses_sun"
},
"unlocked_titles": ["Beginner", "Novice", "Expert"],
"mood_state": "happy" // "happy" | "neutral" | "worried"
}
```
### Règles Métier
* Le choix du genre est gratuit et modifiable.
* Les skins doivent être débloqués ou achetés avant d'être équipés.
* L'avatar est persistant entre les sessions.
## 6. Annexes UX/UI
* **Emplacement :** Coin supérieur (gauche ou droite) de l'interface principale (HUD).
* **Style :** Cartoon / Isométrique cohérent avec le reste du jeu.
* **Feedback :** Animation légère (clignement des yeux, mouvement de tête).
* **Vue Isométrique :** Le "Directeur" (NPC) a un pathfinding aléatoire mais priorise les zones à problèmes (animaux malades, déchets).
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Avatar du joueur (HUD) + “Directeur” (NPC miniature) |
| Rôle | Identité visuelle (pseudo/niveau/titre), personnalisation par skins, feedback détat global du zoo. |
| Visibilité | Toujours visible dans le HUD ; visible sur carte monde et potentiellement en visite/classements. |
| Vue | Isométrique 2.5D (NPC), sprite 4 directions, hitbox base-sprite pour sélection NPC. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Personnaliser | Action joueur | inventaire skins, genre | `equipped_skins` | Équiper uniquement skins possédés ; genre modifiable | Event `AVATAR_EQUIP`, `AVATAR_GENDER_SET` |
| Afficher identité | HUD render | pseudo, level, title | UI avatar | Toujours présent ; tooltip au hover | Event `HUD_AVATAR_RENDER` |
| Réagir état zoo | Tick / événements | incidents, survie, réputation | `mood_state` + anim | Mapping déterministe (pas de “best effort”) | Event `AVATAR_MOOD_CHANGED` |
| Level-up | XP gain | xp, seuil | level+1 | Animation + textes | Event `PLAYER_LEVEL_UP` |
| NPC Directeur | Tick IA | heatmap incidents | déplacement | Priorise zones critiques, respecte chemins | Event `DIRECTOR_NPC_MOVE` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Portrait tête (cadre rond/carré) |
| Couleur dominante | Dépend skins équipés |
| Variantes | `avatar_frame_round.png`, `avatar_frame_square.png` |
| États | Badge niveau, badge humeur (🙂/😟) via icônes, pas demoji dans UI final (icônes). |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Ouvrir profil | Action | - | Clic avatar HUD | ouvre panneau profil | - |
| Ouvrir inventaire skins | Action | - | Profil → onglet Skins | liste + preview | `NO_SKIN_OWNED` (info) |
| Équiper skin | Action | skin possédé | Clic skin → “Équiper” | update `equipped_skins` | `SKIN_LOCKED` |
| Changer genre | Action | - | Profil → genre | update `gender` | - |
| Inspecter NPC | Consultation | NPC visible | Clic base sprite NPC | mini panel | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `avatar_id` | string/uuid | `player_12345` | DB | unique |
| `gender` | enum | `male|female` | DB | modifiable |
| `level` | int | 12 | DB | monotone |
| `experience` | int | 4500 | DB | 0..∞ |
| `next_level_xp` | int | 5000 | config | recalcul |
| `title` | string | `Expert Zoologist` | DB | liste débloquée |
| `equipped_skins.head/body/accessory` | string | `skin_hat_safari` | DB | doit être possédé |
| `unlocked_titles` | string[] | - | DB | append-only |
| `mood_state` | enum | `happy|neutral|worried` | runtime | mapping événements |
| `director_npc` | object | - | runtime | si feature active |
| `grid` | object | `{x,y}` | runtime | NPC |
| `iso_x/iso_y` | int | - | rendu | NPC |
| `z_index` | int | - | rendu | NPC |
| `hitbox` | enum | `base_sprite` | rendu | NPC |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Genre | male/female | enum | choix initial |
| Niveau | 1 | level | départ |
| Mood | neutral | enum | départ |
| Slots skins | 3 | slots | head/body/accessory |
| NPC directeur | actif | bool | si feature |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| XP | 0 | 0..∞ | progression |
| Prestige (titre) | 0 | 0..∞ | cosmétiques |
| Incidents vus (NPC) | 0 | 0..∞ | debug IA |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Création | création compte | pseudo | avatar | persisté |
| Session | login | state | render | HUD constant |
| Level-up | XP seuil | xp | level+1 | animation |
| Disparition | suppression compte | - | supprimé | - |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Compte créé | true | est | avatar créé |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Compte supprimé | true | est | supprimé |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Skins équipés | Oui | persiste |
| Titres | Oui | persiste |
| Mood | Non | recalcul à louverture session |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Notes |
|---|---|---|
| Canicule | mood plus “worried” | si incidents chaleur |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Chemins | NPC préfère | pathing |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Notes |
|---|---|---|
| Hiver | tenue “hiver” (si skin) | visuel option |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Notes |
|---|---|---|
| Nuit | NPC plus lent / rentre | zoo fermé |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet | Condition |
|---|---|---|
| Mood “happy” | aucun direct | UI seulement |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Mort animal | mood worried | événement mort |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| - | aucun | avatar ne consomme pas |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Effet | Condition |
|---|---|---|
| Avatar soigné (skins VIP) | perception + | cosmétique |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| NPC inspecte | stress +/- | si sapproche |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Skins rares | valeur compte + | cosmétique |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat skins | variable | coins | boutique |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | avatar indirect |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `PLAYER_LEVEL_UP` | xp seuil | level | anim |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `DIRECTOR_NPC_MOVE` | tick | déplacement |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `AVATAR_MOOD_CHANGED` | incidents | expression |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `SHOW_PLAYER_AVATAR` | visite/classement | portrait |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `VISITOR_SEE_OWNER` | proximité NPC | réaction |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `AVATAR_EQUIP` | equip | update |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | avatar base | 3 slots |
| 2 | 0 | titres | badges |
| 3 | 1000 | emotes | mood FX |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `computeMoodState` | incidents/survie | mood_state | mapping |
| `renderAvatarHud` | avatar | DOM | - |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `SKIN_LOCKED` | Warning | "Skin non débloqué." | equip fail |
| `PLAYER_LEVEL_UP` | Info | "Niveau supérieur !" | level up |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Accéder skins | personnaliser | navigation | clic avatar → onglet skins direct |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| HUD avatar | portrait + badge | hover |
| Panel skins | grille + preview | equip |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| HUD | coin sup | fixe |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Inventaire skins | items | cf. `inventaire_skins.md` |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir profil | clic | panel |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_PROFILE` | clic avatar | panel |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `ui_profile_loop.mp3` | panel | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `ui_open.mp3` | open | faible |
| `equip_click.mp3` | equip | faible |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `avatar_portrait.png` | HUD | - |
| `director_sprite_[dir].png` | NPC | 4 dirs |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `icon_gender_male.png` | switch |
| `icon_gender_female.png` | switch |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `level_up.webm` | level up | 1.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| blink | idle | loop |
| smile/frown | mood change | 0.6s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `avatar_frame` | #FFFFFF | cadre |
| `avatar_badge` | #FFD700 | niveau |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `profile.open` | Profil | Profile |
| `skins.open` | Skins | Skins |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Avatar HUD | cercle | accessible |
| Boutons onglets | pills | lisible |

View File

@@ -0,0 +1,57 @@
# Banderole Accueil
## 1. Définition
Élément visuel marquant l'entrée principale du zoo. C'est une grande enseigne suspendue entre deux poteaux en bois (ou autre matériau selon le thème), affichant le nom du zoo choisi par le joueur.
## 2. Fonctions
* **Identité :** Affiche fièrement le nom du parc ("Zoo de Léo", "Safari Park", etc.).
* **Accueil :** Premier élément visible par les visiteurs (et le joueur).
* **Personnalisation :** Le texte est modifiable à tout moment (ou presque).
## 3. Icone
* **Représentation :** Arche avec un panneau.
* **Couleur dominante :** Bois et Texte coloré.
## 4. Interactions
* **Création :** Lors de la première partie, une pop-up demande le nom du zoo.
* **Modification :** Clic sur la banderole pour ouvrir l'éditeur de nom (peut coûter des pièces ou être gratuit avec cooldown).
## 5. Annexes Techniques
### Données (JSON)
```json
{
"banner_id": "main_entrance_banner",
"text": "Mon Super Zoo",
"font_style": "default", // "comic", "serif", "safari"
"font_color": "#FF5733",
"material": "wood", // "stone", "metal" (skins possibles)
"background_pattern": "stripes",
"last_rename": "timestamp",
"position": {"x": 15, "y": 0} // Entrée du zoo,
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Longueur Max :** Le nom est limité en caractères (ex: 20 chars) pour tenir sur l'affichage.
* **Filtre :** Interdiction des mots offensants (profanity filter).
* **Cooldown :** Changement de nom gratuit 1x/semaine, sinon payant (Gemmes/Pièces).
## 6. Annexes UX/UI
* **Visuel :** Modèle 3D/Iso d'une arche en bois rustique avec une planche suspendue par des cordes.
* **Animation :** La planche peut se balancer légèrement au vent.
* **Texte :** Police lisible et "fun", intégrée à la texture du panneau (Texture dynamique).
# 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.

View File

@@ -73,7 +73,7 @@ Voir `animal_generique.md`.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A (Un bébé ne se reproduit pas).
**Stérilité temporaire** : Un bébé ne peut pas se reproduire (Logique biologique).
### Impact Mort
| Événement | Effet Satisfaction |
@@ -96,36 +96,42 @@ N/A (Un bébé ne se reproduit pas).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Vitesse Croissance** : 1% toutes les 30 secondes (rapide) à 1h (lent) selon Rareté.
### Dépenses (Boutiques/Visiteurs)
N/A
**Soins Vétérinaires** : Coût x2 si malade (Fragilité pédiatrique).
### Trajet Visiteurs
N/A
**Aimant** : Priorité absolue pour les visiteurs si le bébé est visible (hors nurserie).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Croissance** : Passage à l'âge adulte (Notification).
* **Besoin Soin** : Alerte plus fréquente.
* **Premiers Pas** : Petit event mignon (+Satisfaction).
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Stades biologiques naturels.*
| Stade | Nom | Effet |
| :--- | :--- | :--- |
| 0-30% | Nouveau-né | Fragilité Max, Dort beaucoup. |
| 30-70% | Jeune | Commence à marcher, Joue. |
| 70-100% | Adolescent | Mange comme un adulte, Moins fragile. |
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
```javascript
function updateBaby(baby, context):
# Fragilité accrue
damageMultiplier = 2.0
growthRate = baseGrowthRate * nurserieLevelBonus
baby.growth_progress += growthRate
if baby.growth_progress >= 100:
transformToAdult(baby)
# Reste de la logique héritée de Animal avec damageMultiplier
```
@@ -137,25 +143,34 @@ function updateBaby(baby, context):
# 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)
### Croissance en Nurserie (Passif)
**Description UX** : Le bébé est visible dans son slot de nurserie. Il grandit visuellement (petite jauge).
**Description UI** : Sprite "Bébé" (tête disproportionnée, grands yeux). Jauge de croissance.
**Emplacement** : Modal Nurserie.
**Intégration** : Slot.
**Navigation** : N/A
**Navigation** : Clic Slot Nurserie (Zoom).
**Événements** : `BABY_GROWING`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Berceuse (Boîte à musique, boucle 30s).
- **Sons** : Petits bruits aigus.
- **Graphiques** : Sprite Bébé.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Photo "Échographie" (si œuf).
- **Vidéos** : Cinématique éclosion (optionnel).
- **Animations** : Respiration (Scale up/down léger).
- **Couleurs** : N/A
- **Couleurs** : Tons pastels.
- **Textes** : "Bébé [Espèce]".
- **Formes** : N/A
- **Formes** : Bulle de protection autour du bébé.
### Sortie Prématurée (Action)
**Description UX** : Le joueur décide de placer le bébé dans le zoo avant l'âge adulte (risqué).
@@ -166,22 +181,22 @@ function updateBaby(baby, context):
**Événements** : `PLACE_BABY`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Alerte "Danger" (rythme rapide).
- **Sons** : `warning_beep.mp3`.
- **Graphiques** : Icône Danger.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Fond d'écran rouge clignotant (léger).
- **Vidéos** : Effet de tremblement rouge sur le sprite.
- **Animations** : Tremblement de l'interface.
- **Couleurs** : Rouge.
- **Textes** : "Risque de mort élevé !".
- **Formes** : N/A
- **Formes** : Triangle d'avertissement.
### Passage Adulte (Événement)
**Description UX** : Le bébé atteint 100% de croissance. Il se transforme en adulte.
**Description UI** : Flash lumineux. Le sprite change. Notification "Adulte !".
**Emplacement** : Nurserie ou Zoo.
**Intégration** : Immédiat.
**Navigation** : N/A
**Navigation** : Auto (Cutscene).
**Événements** : `BECOME_ADULT`.
#### Assets
@@ -189,8 +204,508 @@ function updateBaby(baby, context):
- **Sons** : `level_up.mp3`.
- **Graphiques** : Particules brillantes.
- **Images** : Sprite Adulte.
- **Vidéos** : N/A
- **Vidéos** : Effet de morphing (shader).
- **Animations** : Morphing ou Fade cross.
- **Couleurs** : Blanc/Or.
- **Textes** : "Adulte".
- **Formes** : N/A
- **Formes** : Rayons de lumière.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Instance danimal au stade “bébé” (post-éclosion), avec progression de croissance vers ladulte. |
| Rôle | Introduire une phase de fragilité et de soins, visible en nurserie et/ou sur le zoo, avec effets dattractivité “mignon” et contraintes biologiques (non reproductible). |
| Portée | Une entité `Animal` (référence `animal_id`) au sein dun zoo, potentiellement rattachée à une `nurserie_id`. |
| Contrainte | Calculs dérivés (croissance, fragilité, dégâts) à la volée, sans cache/mémorisation ; pas de fallback silencieux en cas détat incohérent (log + erreur). |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Créer bébé | éclosion / naissance | `parents_ids?`, `species_id`, `genetics` | entité animal `is_baby=true` | Création atomique ; init `growth_progress=0` | Event `BABY_CREATED` |
| Assigner à une nurserie | placement automatique ou choix joueur | `animal_id`, `nurserie_id`, `slot_id` | bébé visible en slot | Un bébé peut être en nurserie ou sur grille, pas les deux | Event `BABY_ASSIGNED_NURSERY` |
| Progresser croissance | tick logique (lazy) | temps, conditions | `growth_progress` ↑ | Vitesse dépend de rareté + niveau nurserie ; clamp 0..100 | Event `BABY_GROWTH_UPDATED` |
| Appliquer fragilité | calcul impacts | température, faim, stress | santé ↓ | Multiplicateur fragilité > adulte ; pas dexception au biome/temp extrêmes | Event `BABY_FRAGILITY_APPLIED` |
| Interdire reproduction | tentative accouplement | `animal_id` | refus | Toujours refus tant que `is_baby=true` | Event `BABY_REPRO_BLOCKED` |
| Transformer en adulte | `growth_progress>=100` | `animal_id` | `is_baby=false` | Transition irréversible ; conserve identité + génétique | Event `BABY_BECAME_ADULT` |
| Mettre en vente (bébé) | action joueur | `animal_id`, type vente | listing créé | Vente possible si pas “en danger critique” | Event `BABY_LISTED_FOR_SALE` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Sprite “bébé” (tête plus grande), badge “B” sur coin UI |
| Couleur dominante | Pastel (bleu/rose selon thème), outline blanc au survol |
| Variantes | `animal_baby_<species>_dir_{N,E,S,W}.png` |
| États | `calme`, `affamé`, `froid/chaud`, `malade`, `en_croissance` |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Ouvrir fiche bébé | Consultation | bébé visible (nurserie ou zoo) | clic sprite/base → panneau | stats + actions | - |
| Nourrir bébé | Action | nourriture dispo | clic “Nourrir” | faim ↓, santé stable | `NO_FOOD`, `BABY_CRITICAL` |
| Soigner bébé | Action | employé/soigneur dispo | clic “Soigner” | maladie ↓ | `NO_STAFF`, `NETWORK_ERROR` |
| Sortie prématurée | Action | bébé en nurserie | drag vers case → confirm | bébé sur grille | `PLACEMENT_INVALID`, `BABY_TOO_FRAGILE` |
| Mettre en vente | Action | bébé stable | “Vendre” → choisir mode | listing créé | `BABY_CRITICAL` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `animal_id` | uuid_v4 | `...` | DB | identifiant stable |
| `species_id` | string | `PANDA` | DB | enum espèces |
| `is_baby` | boolean | true | DB | vrai jusquà transition adulte |
| `growth_progress` | float | 42.5 | calcul/DB | clamp 0..100 |
| `growth_stage` | string | `juvenile` | calcul | dérivé de `growth_progress` |
| `nurserie_id` | uuid_v4 \| null | `...` | DB | null si sur grille |
| `position.iso_x` | int \| null | 120 | DB | requis si sur grille |
| `position.iso_y` | int \| null | 88 | DB | requis si sur grille |
| `render.z_index` | int | 12088 | calcul | tri profondeur (iso) |
| `render.hitbox` | string | `base_sprite` | client | clic sur base |
| `health` | float | 100.0 | calcul/DB | 0..100 |
| `hunger` | float | 0.0 | calcul/DB | 0..100 |
| `stress` | float | 0.0 | calcul/DB | 0..100 |
| `timestamps.created_at` | timestamp | - | DB | UTC |
| `timestamps.updated_at` | timestamp | - | DB | UTC |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Santé | 100.0 | pts | base |
| Faim | 0.0 | pts | augmente plus vite quun adulte |
| Stress | 0.0 | pts | sensible aux écarts |
| Croissance | 0.0 | % | 0..100 |
| Fragilité | 2.0 | multiplicateur | dégâts environnement ×2 |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Attractivité “mignon” | +100% vs adulte | 0..+200% | augmente afflux visiteurs |
| Valeur potentielle | 150% du prix adulte | 50%..200% | décroît avec croissance |
| Malus réputation (mort bébé) | ×2 | ×1..×3 | punit davantage un accident |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Éclosion/Naissance | reproduction ok / timer œuf | genetics, species | bébé créé | `is_baby=true` |
| Croissance | temps + conditions | température, nourriture | `growth_progress` ↑ | monotone |
| Transition adulte | `growth_progress>=100` | animal | adulte | identité conservée |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Reproduction réussie | true | est | spawn bébé |
| Éclosion | timer fini | atteint | spawn bébé |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Croissance terminée | 100 | >= | devient adulte |
| Santé critique | 0 | <= | mort |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Génétique | Oui | copie des gènes (voir `animal_generique.md`) |
| Traits esthétiques | Oui | pattern/couleurs, appliqués au sprite bébé |
| Affinités milieu/temp | Oui | modifie fragilité effective |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet bébé | Notes |
|---|---|---|
| \(|\Delta T|\le 1\) | santé \(-2\) / h | fragilité ×2 vs adulte |
| \(|\Delta T|=2\) | santé \(-10\) / h | soins requis rapidement |
| \(|\Delta T|\ge 3\) | santé \(-40\) / h | mort rapide si non corrigé |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet bébé | Notes |
|---|---|---|
| Biome compatible | stress +0 | nominal |
| Biome incompatible | stress +2x | plus fort que ladulte |
#### Impact Saisons (tableau détaillé)
| Saison | Effet bébé | Notes |
|---|---|---|
| Hiver | risque froid ↑ | privilégier nurserie |
| Été | risque chaud ↑ | besoin deau/ombre |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet bébé | Notes |
|---|---|---|
| Nuit | sommeil ↑, faim ↑ | bébé se repose, métabolisme reste rapide |
| Jour | attractivité visiteurs ↑ | “mignon” visible |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Stade bébé | 0 | reproduction interdite |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Mort bébé | malus réputation ×2 | si visiteurs exposés à lévénement |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Nourriture espèce | faim \(-\) plus fréquemment | métabolisme ×1.5 |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain | Rayon | Notes |
|---|---:|---:|---|
| Bébé visible | +50% | +2 cases | priorité de visite |
| Bébé en nurserie | +0% sur grille | - | visible uniquement via UI |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Présence bébé | stress \(\pm\) selon espèce | certaines espèces parentales calment, dautres stressent |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Croissance 0..50% | +50% | potentiel maximum |
| Croissance 50..99% | décroissance vers adulte | linéaire |
| Santé < 50 | -30% | vente risquée |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Transport bébé | vitesse \(-20%\) | conduite prudente |
| Contrôle température | stabilité ↑ | camion équipé |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Niveau nurserie | croissance +\(\{0,10,20,30\}%\) | upgrade nurserie |
| Soins assignés | dégâts temp \(-25%\) | soigneur actif |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Check-in bébé | durée +10% | contrôles supplémentaires |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Étude bébé | progrès recherche +5% | si centre recherche dispose dun protocole |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Analyses | durée +15% | prélèvements délicats |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps devant bébé | +20% | “effet mignon” |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Communication “naissance” | 0 | - | événement interne, pas danalytics |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Souvenir “bébé” | +1 | item | si boutique souvenir |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Satisfaction (bonus) | + | points | si bébé visible |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Temps soigneur | +1 | min / tick | bébé fragile |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Slot nurserie | 5 | coins / h | par bébé |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Nourriture bébé | +20% | coins / ration | rations plus fréquentes |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Contrôle santé bébé | 10 | coins | à larrivée |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Caisson temp | 15 | coins | transport bébé |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | annonce naissance (in-game) | afflux modéré |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Entrée | Enclos bébé | bébé visible | priorité haute |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Enclos bébé | Boutique souvenir | souvenir dispo | achat impulsif |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Billetterie | Enclos bébé | visite planifiée | détour direct |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `BABY_CREATED` | éclosion/naissance | `animal_id`, `species_id` | ajoute entité |
| `BABY_GROWTH_UPDATED` | tick lazy | `animal_id`, `growth_progress` | UI jauge |
| `BABY_BECAME_ADULT` | seuil 100 | `animal_id` | swap sprite + stats |
| `BABY_CRITICAL` | santé basse | `animal_id`, raison | alerte |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `BABY_MARKER_SHOW` | map open | badge sur bâtiment nurserie |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `BABY_SELECTED` | clic sprite | ouvre panneau |
| `BABY_MOVED` | placement | maj position iso + z_index |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_ATTRACTED_BY_BABY` | bébé visible | route vers enclos |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_TAKES_PHOTO_BABY` | proche enclos | satisfaction + |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_FEEDS_BABY` | action | faim ↓ |
| `PLAYER_LISTS_BABY` | vente | listing |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| Nurserie 1 | 0 | croissance nominale | slots base |
| Nurserie 2 | 250 | croissance +10% | slot +1 |
| Nurserie 3 | 750 | dégâts temp -10% | protocole soins |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `computeBabyGrowth` | baby, now, nurserieLevel | float | clamp 0..100 |
| `computeBabyTempDamage` | deltaT, fragility | float | multiplicateur |
| `canReproduce` | baby | bool | false si `is_baby` |
| `transformToAdult` | baby | adult | conserve ID + génétique |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `BABY_GROWING` | Info | "Croissance en cours." | bébé actif |
| `BABY_BECAME_ADULT` | Info | "Un bébé est devenu adulte." | transition |
| `BABY_CRITICAL` | Critique | "Un bébé est en danger critique." | santé basse |
| `BABY_TOO_FRAGILE` | Warning | "Bébé trop fragile pour sortir." | sortie prématurée |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Consulter bébé | suivre croissance | trouver slot | notif deep-link vers slot |
| Nourrir | éviter danger | action répétée | bouton direct dans panneau sélection |
| Sortir prématurément | placer sur grille | validation risque | une seule modale de confirmation |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Slot nurserie | sprite + jauge | normal/critique |
| Panneau bébé | santé, faim, croissance | actions activées/désactivées |
| Badge “B” | état bébé | visible sur sprite et liste |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Nurserie | slots | vue principale |
| Zoo | sur case (iso) | clic sur base |
| Notifications | top UI | deep-link |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| `nurserie.md` | slots + jauge | croissance |
| `animal_generique.md` | base stats | mêmes champs + `is_baby` |
| `vente_*` | vente bébé | règles “pas critique” |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir bébé (nurserie) | notif → nurserie → slot | panneau ouvert |
| Ouvrir bébé (zoo) | clic sprite/base | panneau |
| Nourrir | panneau → bouton | action appliquée |
| Sortir prématurément | drag → modale → drop | bébé placé |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_BABY_PANEL` | clic | ouvre panneau |
| `CLICK_FEED_BABY` | bouton | action |
| `CONFIRM_PLACE_BABY` | modale | place |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `nursery_lullaby_loop.mp3` | nurserie | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `baby_chirp_01.mp3` | idle bébé | bas |
| `ui_warning_beep.mp3` | critique | moyen |
| `ui_level_up.mp3` | transition adulte | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `baby_outline_hover.png` | survol | overlay iso |
| `baby_growth_bar.png` | jauge | lisible petit |
| `baby_warning_icon.png` | critique | contraste |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `nursery_slot_frame.png` | slot |
| `baby_card_bg.png` | panneau |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `baby_hatch.webm` | éclosion | 2.0s |
| `baby_morph_to_adult.webm` | transition | 1.2s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| respiration légère | idle | 1.5s loop |
| tremblement | critique | 0.4s |
| flash + particules | adulte | 0.8s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `baby_pastel_blue` | #A7D8FF | nurserie |
| `baby_pastel_pink` | #FFB3D9 | accents |
| `baby_warning_red` | #D32F2F | critique |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `baby.title` | Bébé | Baby |
| `baby.feed` | Nourrir | Feed |
| `baby.heal` | Soigner | Heal |
| `baby.too_fragile` | Bébé trop fragile. | Baby too fragile. |
| `baby.became_adult` | Devenu adulte. | Became adult. |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Jauge croissance | rectangle arrondi | compacte |
| Badge “B” | pastille ronde | lisible |
| Alerte critique | triangle | contraste élevé |

View File

@@ -25,8 +25,15 @@ Bâtiment d'entrée du zoo. Point d'apparition et de départ des visiteurs.
"position": { "x": "int", "y": "int" },
"stats": {
"total_entries": "integer",
"daily_revenue": "integer"
}
"daily_revenue": "integer",
"current_queue_length": "integer"
},
"entry_log": [
{ "timestamp": "timestamp", "visitor_count": 5, "revenue": 50 }
],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -36,66 +43,6 @@ Bâtiment d'entrée du zoo. Point d'apparition et de départ des visiteurs.
| Prix Ticket | 10 pièces |
| Capacité Max | 20 visiteurs |
### Scores Initiaux
N/A
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Présent au démarrage (Unique).
### Conditions de Disparition
Indestructible.
### Hérédité
N/A
## 3. Impacts Environnementaux
### Impact Température
N/A
### Impact Milieu (Biome)
N/A
### Impact Saisons
| Saison | Modificateur Prix Ticket |
| :--- | :--- |
| Été | +20% (Haute saison) |
| Hiver | -10% (Basse saison) |
### Impact Heure / Jour-Nuit
**Ouverture** : 08h00 - 20h00. Fermé la nuit (sauf événements).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
### Impact Mort
N/A
### Impact Nourriture
N/A
### Impact Attractivité (Visiteurs/Animaux)
Point d'entrée unique. L'attractivité globale du zoo détermine le flux qui se présente à la billeterie.
### Impact Valeur
N/A
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
**Flux Entrée** : 1 visiteur / seconde max.
### Dépenses (Boutiques/Visiteurs)
Revenu principal (Ticket).
### Trajet Visiteurs
Point de départ (Spawn) et d'arrivée (Despawn).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Entrée** : Gain pièces.
* **Refoulement** : Si Capacité Max atteinte.
## 7. Progression
### Tableau des Upgrades
| Niveau | Coût (Pièces) | Prix Ticket | Capacité Max | Temps Construction |
@@ -110,82 +57,67 @@ Point de départ (Spawn) et d'arrivée (Despawn).
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
function processEntry(zoo):
potentialVisitors = calculateAttractionFlow(zoo)
if zoo.currentVisitors >= zoo.billeterie.capacity:
emitEvent("ZOO_FULL")
return
```python
def process_entry(zoo):
potential_visitors = calculate_attraction_flow(zoo)
actualVisitors = min(potentialVisitors, zoo.billeterie.capacity - zoo.currentVisitors)
for i in 0..actualVisitors:
spawnVisitor()
player.addCoins(zoo.billeterie.ticketPrice)
# Gestion de la file d'attente
zoo.billeterie.current_queue_length += potential_visitors
# Traitement des entrées (limité par la vitesse du guichet)
entries_per_tick = get_entry_speed(zoo.billeterie.level)
actual_entries = min(zoo.billeterie.current_queue_length, entries_per_tick)
# Vérification capacité zoo
if zoo.current_visitors + actual_entries > zoo.billeterie.capacity:
actual_entries = zoo.billeterie.capacity - zoo.current_visitors
emit_event("ZOO_FULL")
zoo.billeterie.current_queue_length -= actual_entries
for _ in range(actual_entries):
spawn_visitor()
player.add_coins(zoo.billeterie.ticket_price)
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `ZOO_FULL` | Alerte | "Le zoo est complet ! Agrandissez la billeterie." |
| `VIP_BUS` | Info | "Un bus de touristes arrive !" |
| `QUEUE_LONG` | Warning | "La file d'attente est trop longue, des visiteurs partent !" |
# 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)
### Consultation
**Description UX** : Le joueur clique sur la billeterie pour voir ses statistiques et son niveau.
**Description UI** : **Bottom Sheet** ou Panneau Latéral affichant le niveau actuel, la capacité, le prix du ticket et les revenus du jour.
**Emplacement** : Case Billeterie sur la grille du zoo.
**Intégration** : Bâtiment fixe (ne peut pas être déplacé ou supprimé).
**Navigation** : Clic -> Ouverture Panneau -> Fermeture (Croix ou clic extérieur).
**Intégration** : Bâtiment fixe.
**Navigation** : Clic -> Ouverture Panneau -> Fermeture.
**Événements** : `CLICK_BILLETERIE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Ambiance "Hall de Gare" (brouhaha léger).
- **Sons** : `ui_open.mp3`
- **Graphiques** : Pixel Art, style guichet.
- **Images** : `billeterie_lvl[1-7].png`
- **Vidéos** : N/A
- **Vidéos** : Flux vidéo surveillance (fictif, décoratif).
- **Animations** : Légère surbrillance au survol.
- **Couleurs** : Palette UI standard.
- **Textes** : "Billeterie", "Niveau X", "Revenus : Y".
- **Formes** : Carré (case).
### Amélioration (Upgrade)
**Description UX** : Le joueur décide d'améliorer la billeterie pour augmenter la capacité et le prix du ticket.
**Description UI** : Bouton "Améliorer" dans le panneau de consultation, avec coût et prévisualisation des gains.
**Emplacement** : Panneau de consultation.
**Intégration** : Action immédiate si fonds suffisants.
**Navigation** : Clic "Améliorer" -> Confirmation (optionnelle) -> Mise à jour UI.
**Événements** : `UPGRADE_BILLETERIE`.
#### Assets
- **Musiques** : N/A
- **Sons** : `upgrade_success.mp3` (caisse enregistreuse).
- **Graphiques** : Icône flèche vers le haut.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Particules de succès (confettis/étoiles) autour du bâtiment.
- **Couleurs** : Bouton Vert (si achetable), Gris (si fonds insuffisants).
- **Textes** : "Améliorer (X pièces)".
- **Formes** : Bouton rectangulaire arrondi.
### Flux Visiteurs (Passif)
**Description UX** : Le joueur observe les visiteurs entrer dans le zoo.
**Description UI** : Petits sprites de visiteurs apparaissant à la porte et se dispersant.
**Emplacement** : Devant la billeterie.
**Intégration** : Animation continue pendant les heures d'ouverture.
**Navigation** : N/A
**Événements** : `VISITOR_SPAWN`.
#### Assets
- **Musiques** : N/A
- **Sons** : `visitor_entry.mp3` (bruit de foule léger, pas à chaque spawn).
- **Graphiques** : Sprites visiteurs variés.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Marche (4 directions).
- **Couleurs** : Variées (vêtements).
- **Textes** : N/A
- **Formes** : N/A
### Vue Isométrique
- **File d'attente** : Afficher physiquement les sprites des visiteurs qui attendent devant le guichet.
- **Portiques** : Animation d'ouverture/fermeture des barrières.

View File

@@ -33,15 +33,26 @@ Sélection hiérarchique : **Famille** > **Spécialisation**.
"sell_animal_threshold": "float (price factor)",
"expand_map_priority": "int (0-10)",
"research_priority": "int (0-10)"
}
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
| Caractéristique | Valeur Initiale | Type | Description |
|---|---:|---|---|
| Fréquence min | 5 | minutes | Intervalle minimal entre actions. |
| Fréquence max | 60 | minutes | Intervalle maximal (profil lent). |
| Budget action | 10% | % coins | Part des coins max utilisable par action (plafond anti-ruine). |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Agressivité marché | 50 | 0-100 | Propension à acheter/vendre. |
| Prudence survie | 50 | 0-100 | Propension à acheter nourriture/soins. |
| Priorité expansion | 20 | 0-100 | Propension à agrandir carte/améliorer bâtiments. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -51,46 +62,72 @@ Activation par joueur (déconnexion) ou Spawn serveur (Bot permanent).
Connexion joueur.
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Profil choisi | Paramètres logique | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Condition | Effet |
|---|---|
| Froid/Chaud extrême | Augmente achats régulation/biome | priorité survie + |
### Impact Milieu (Biome)
N/A
| Biome | Effet |
|---|---|
| Biome défavorable à la majorité | Achats “changement milieu” | priorité survie + |
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Printemps | Focus reproduction | priorité éleveur + |
| Hiver | Focus survie | priorité conservateur + |
### Impact Heure / Jour-Nuit
N/A
| Période | Effet |
|---|---|
| Nuit | Actions limitées | fréquence + lente |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Score survie élevé | Bot tente reproduction | profil éleveur |
### Impact Mort
N/A
| Cause | Conséquence | Durée |
|---|---|---|
| Série de morts | Bot achète nourriture/soins | 24h |
### Impact Nourriture
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Stock bas | Achat immédiat | seuil profil |
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| Placements optimisés | + | zoo du bot |
### Impact Valeur
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Profil commerçant | Valeur cash + | ventes fréquentes |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
**Fréquence Action** : 1 action toutes les 5 à 60 minutes (selon profil).
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achats auto nourriture | variable | coins | selon seuil |
| Achat upgrades | variable | coins | selon priorité |
### Trajet Visiteurs
N/A
| Trajet | Règle | Notes |
|---|---|---|
| Rapport dabsence → décisions | Script profilé | Le bot ne “se déplace” pas : il calcule des actions sur létat du zoo et sur le marché. |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -98,7 +135,10 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Profil basique |
| 2 | 5000 | Réputation 300 | Stratégies avancées (arbitrage) |
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -107,10 +147,10 @@ function runBotLogic(bot, zoo):
if zoo.foodStock < bot.logic.buy_food_threshold:
buyFood(zoo)
return
if bot.family == 'BREEDER':
optimizePairs(zoo)
if bot.family == 'TRADER':
checkMarketArbitrage(zoo)
```
@@ -122,6 +162,15 @@ function runBotLogic(bot, zoo):
# 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)
### Sélection du Profil (Configuration)
**Description UX** : Le joueur choisit comment son zoo sera géré en son absence.
@@ -132,11 +181,11 @@ function runBotLogic(bot, zoo):
**Événements** : `SELECT_BOT_PROFILE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_bot_family_pick.mp3` (jingle court).
- **Sons** : `card_flip.mp3`.
- **Graphiques** : Illustrations des familles (ex: Conservateur avec bouclier, Commerçant avec bourse).
- **Images** : Portraits Bots.
- **Vidéos** : N/A
- **Vidéos** : `bot_family_cards.webm` (1s loop, optionnel).
- **Animations** : Flip de carte au choix.
- **Couleurs** : Code couleur par famille (Vert=Conservateur, Jaune=Commerçant, etc.).
- **Textes** : Titres et Descriptions courtes.
@@ -149,14 +198,13 @@ function runBotLogic(bot, zoo):
**Intégration** : Bloquant au démarrage.
**Navigation** : Lire -> Fermer.
**Événements** : `SHOW_REPORT`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_report_open.mp3` (jingle court).
- **Sons** : `notification.mp3`.
- **Graphiques** : Icône Robot.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : `icon_robot.png`, `report_bg.png`.
- **Vidéos** : `report_scroll.webm` (0.8s loop, optionnel).
- **Animations** : Apparition slide-in + highlight des lignes importantes.
- **Couleurs** : Gris/Métal.
- **Textes** : Liste des actions.
- **Formes** : Liste à puces.

View File

@@ -26,7 +26,10 @@ Bâtiment commercial générant des revenus passifs grâce aux visiteurs.
"stats": {
"revenue_total": "integer",
"visitors_served": "integer"
}
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -38,70 +41,76 @@ Bâtiment commercial générant des revenus passifs grâce aux visiteurs.
| Attractivité | 10 |
### Scores Initiaux
N/A
**Stock** : 100 unités.
**Popularité** : 10/100.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Construction par le joueur sur case vide.
### Conditions de Disparition
Destruction par le joueur (Remboursement partiel ?).
Destruction par le joueur (Remboursement 50%).
### Hérédité
N/A
**Franchise** : Coût construction -10% si 5 boutiques identiques déjà posées (Économie d'échelle).
## 3. Impacts Environnementaux
### Impact Température
N/A
**Canicule** : Vente Eau x3. Vente Chocolat -50%.
**Froid** : Vente Chocolat x3. Vente Glaces -80%.
### Impact Milieu (Biome)
N/A
**Thème** : +10% ventes si le skin boutique correspond au biome (ex: Cabane en bois en Forêt).
### Impact Saisons
| Saison | Modificateur Ventes |
| :--- | :--- |
| Été | +20% (Boissons/Glaces) |
| Hiver | +10% (Chocolat chaud/Cadeaux) |
| Automne | +5% (Parapluies) |
| Printemps | Standard |
### Impact Heure / Jour-Nuit
| Heure | Fréquentation |
| :--- | :--- |
| 12h-14h | Pic (Repas) |
| 16h-18h | Pic (Souvenirs avant départ) |
| 12h-14h | Pic (Repas - Food) |
| 16h-18h | Pic (Souvenirs avant départ - Gifts) |
| Nuit | Fermé (0 Ventes) |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Merchandising** : Vente peluche "Espèce du moment" x2 lors d'une naissance rare.
### Impact Mort
N/A
**Deuil** : Ventes -20% dans les boutiques proches d'une mort récente (Ambiance triste).
### Impact Nourriture
N/A
**Concurrence** : Si Stand Nourriture proche (< 3 cases), ventes Food partagées (-10% chacun).
### Impact Attractivité (Visiteurs/Animaux)
| Niveau | Rayon Attraction |
| :--- | :--- |
| 1 | 2 cases |
| 7 | 10 cases |
| 7 | 10 cases (Centre commercial) |
### Impact Valeur
N/A
**Revente** : 50% de l'investissement initial + upgrades.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
**Vitesse Service** : 1 visiteur / 5 secondes (Niv 1) -> 1 visiteur / 1 seconde (Niv 7).
**Vitesse Service** : 1 visiteur / 5 secondes (Niv 1) -> 1 visiteur / 1 seconde (Niv 7 - Caisses auto).
### Dépenses (Boutiques/Visiteurs)
Génère du revenu, ne coûte rien (sauf achat/upgrade).
Génère du revenu. Coût réapprovisionnement : 10% du CA (automatique).
### Trajet Visiteurs
Point d'intérêt majeur pour le pathfinding (Poids 50).
Point d'intérêt majeur pour le pathfinding (Poids 50). Arrêt obligatoire si besoin > 80.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Vente** : Gain de pièces.
* **File d'attente** : Si Capacité atteinte, visiteurs frustrés.
* **Rupture Stock** : Si stock géré, fermeture temporaire.
## 7. Progression
### Tableau des Upgrades
@@ -121,7 +130,7 @@ Point d'intérêt majeur pour le pathfinding (Poids 50).
function processShop(shop, visitors):
queue = visitors.filter(v => v.target == shop)
served = min(queue.length, shop.capacity)
for i in 0..served:
revenue = shop.baseRevenue * seasonMod
player.addCoins(revenue)
@@ -133,28 +142,38 @@ function processShop(shop, visitors):
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `SHOP_FULL` | Warning | "Boutique pleine ! Des clients partent." |
| `SHOP_PROMO` | Info | "Soldes lancées ! Affluence +20%." |
# 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)
### Vente (Passif)
**Description UX** : Les visiteurs entrent dans la boutique, y restent quelques secondes, puis ressortent. Des pièces volent vers le compteur.
**Description UI** : Animation de porte qui s'ouvre/ferme. Popups "+15" au-dessus du toit.
**Emplacement** : Case Boutique.
**Intégration** : Automatique.
**Navigation** : N/A
**Navigation** : Auto (Comportement).
**Événements** : `SALE_MADE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Musique d'ambiance "Supermarché" (Muzak).
- **Sons** : `coin_jingle.mp3` (volume bas, pas trop répétitif).
- **Graphiques** : Sprite Boutique (différents skins selon type : Burger, Cadeaux).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icônes Produits (Burger, Peluche, Ballon).
- **Vidéos** : Pub télévisée miniature sur l'écran de la boutique (détail).
- **Animations** : Pièce dorée qui monte et disparaît.
- **Couleurs** : Or #FFD700.
- **Textes** : "+XX".
- **Formes** : N/A
- **Formes** : Bulle de dialogue rectangulaire.
### Consultation Stats (Consultation)
**Description UX** : Le joueur clique pour voir combien la boutique a rapporté.
@@ -165,15 +184,15 @@ function processShop(shop, visitors):
**Événements** : `OPEN_SHOP`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle "Caisse" (court).
- **Sons** : `ui_open.mp3`
- **Graphiques** : N/A
- **Graphiques** : Graphique en barres simple.
- **Images** : Icône Caisse.
- **Vidéos** : N/A
- **Animations** : N/A
- **Couleurs** : N/A
- **Vidéos** : Graphique animé des ventes (barres qui montent).
- **Animations** : Barres qui montent progressivement.
- **Couleurs** : Vert (Profit).
- **Textes** : Chiffres clés.
- **Formes** : N/A
- **Formes** : Rectangle arrondi.
### Construction (Action)
**Description UX** : Le joueur choisit "Boutique" dans le menu construction et la place sur la grille.
@@ -185,12 +204,12 @@ function processShop(shop, visitors):
**Événements** : `BUILD_SHOP`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Bruit de chantier (marteau, scie).
- **Sons** : `construction_hammer.mp3`.
- **Graphiques** : Sprite Fantôme semi-transparent.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Plan bleu (Blueprint) au sol.
- **Vidéos** : Time-lapse construction (accéléré).
- **Animations** : Petit effet de poussière à la pose.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Bleu (Blueprint).
- **Textes** : "Construction".
- **Formes** : Grille de placement.

View File

@@ -29,7 +29,10 @@ Véhicule de transport pour les achats et les ventes d'animaux/œufs.
"status": "enum ('idle', 'moving_to_target', 'moving_home')",
"cargo": "animal_uuid | null",
"position": { "x": "float", "y": "float" },
"target_site_id": "uuid | null"
"target_site_id": "uuid | null",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -40,30 +43,32 @@ Véhicule de transport pour les achats et les ventes d'animaux/œufs.
| Confort | Basique (Stress normal) |
### Scores Initiaux
N/A
**Kilométrage** : 0 km.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Démarrage jeu.
### Conditions de Disparition
N/A
**Panne** : Immobilisation temporaire si pas d'entretien (Réparation requise).
### Hérédité
N/A
**Garage** : Conserve les upgrades de vitesse après reset (Véhicule de fonction).
## 3. Impacts Environnementaux
### Impact Température
N/A
**Surchauffe moteur** : Si T° > 40°C, vitesse -10%.
**Gel** : Si T° < -10°C, démarrage lent (+5s).
### Impact Milieu (Biome)
N/A
**Tout-terrain** : Bonus vitesse sur terre si pneus adaptés (Upgrade). Ralenti sur Sable.
### Impact Saisons
**Hiver** : Vitesse réduite de 20% (Neige).
**Automne** : Risque de boue (Vitesse -5%).
### Impact Heure / Jour-Nuit
N/A
**Phares** : Vitesse normale la nuit (si phares débloqués Niv 2). Sinon -30% (Prudence).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
@@ -77,13 +82,13 @@ N/A
Si trajet trop long (> 24h) sans confort, risque de mort (Faim/Stress).
### Impact Nourriture
N/A
**Carburant** : Consomme de l'essence (coût au km) ou électrique (recharge au zoo).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Design** : Un beau camion (Skin) fait "Pro" (+1 Attractivité).
### Impact Valeur
N/A
**Occasion** : Valeur de revente du camion (fictive, pour score richesse).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
@@ -99,15 +104,16 @@ N/A
| 7 | 200 km/h (Avion/Hélico ?) |
### Dépenses (Boutiques/Visiteurs)
N/A
**Entretien** : 10 pièces tous les 1000 km.
### Trajet Visiteurs
N/A
**Klaxon** : Écarte les visiteurs sur le passage (au zoo) pour éviter les accidents.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Départ** : Camion part.
* **Arrivée** : Camion revient avec marchandise.
* **Crevaison** : Retard aléatoire.
## 7. Progression
### Tableau des Upgrades
@@ -128,7 +134,7 @@ function updateTruck(truck, deltaTime):
if truck.status == 'moving':
distance = truck.speed * deltaTime
moveTowardsTarget(truck, distance)
if truck.cargo:
truck.cargo.stress += baseStress * (1.0 - truck.comfortFactor) * deltaTime
```
@@ -137,9 +143,19 @@ function updateTruck(truck, deltaTime):
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `TRUCK_ARRIVED` | Info | "Le camion est revenu au zoo." |
| `TRUCK_DELAY` | Info | "Le camion a du retard (Météo/Panne)." |
# 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)
### Envoi en Mission (Action)
**Description UX** : Le joueur achète un animal sur la carte du monde. Le camion part automatiquement le chercher.
@@ -150,15 +166,15 @@ function updateTruck(truck, deltaTime):
**Événements** : `TRUCK_DEPART`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Bruit de moteur au démarrage.
- **Sons** : `engine_start.mp3`, `horn.mp3`.
- **Graphiques** : Sprite Camion (Vue dessus et côté).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Carte routière (Icône).
- **Vidéos** : Zoom caméra sur le camion qui part.
- **Animations** : Roues qui tournent, fumée échappement.
- **Couleurs** : Jaune/Noir (Chantier) ou Blanc (Livraison).
- **Textes** : "En route vers [Destination]".
- **Formes** : N/A
- **Formes** : Flèche de direction.
### Suivi Trajet (Passif/Actif)
**Description UX** : Le joueur peut suivre le camion sur la carte du monde.
@@ -169,15 +185,14 @@ function updateTruck(truck, deltaTime):
**Événements** : `TRACK_TRUCK`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Sonar "Ping" régulier.
- **Sons** : Bruit moteur continu (faible).
- **Graphiques** : Ligne pointillée (trajet).
- **Images** : N/A
- **Vidéos** : N/A
- **Vidéos** : Ligne de trajet qui se dessine.
- **Animations** : Déplacement linéaire.
- **Couleurs** : Ligne Blanche.
- **Textes** : "Arrivée dans MM:SS".
- **Formes** : N/A
- **Formes** : Cercle autour du camion.
### Activité d'Attente (Gameplay)
**Description UX** : Pendant le trajet (temps mort), le joueur peut cliquer sur le camion pour le "booster" ou nettoyer le pare-brise (mini-jeu simple) pour gagner quelques secondes ou de l'XP.
@@ -192,11 +207,11 @@ function updateTruck(truck, deltaTime):
- **Sons** : `wipe.mp3` (essuie-glace). **Design ASMR** : Bruit d'éponge mouillée ou de raclette satisfaisant.
- **Graphiques** : Taches de boue/insectes.
- **Images** : Vue cockpit simplifiée.
- **Vidéos** : N/A
- **Vidéos** : Reflet du soleil sur le pare-brise.
- **Animations** : Essuie-glace qui bouge.
- **Couleurs** : N/A
- **Couleurs** : Marron (Boue), Vert (Insectes).
- **Textes** : "Boost !"
- **Formes** : N/A
- **Formes** : Éponge (Curseur).
### Arrivée (Passif)
**Description UX** : Le camion revient au zoo et se gare.
@@ -204,16 +219,15 @@ function updateTruck(truck, deltaTime):
**Notification Push** : "Le camion est de retour !" (si application fermée).
**Emplacement** : Case Camion.
**Intégration** : Fin cycle.
**Navigation** : N/A
**Navigation** : Automatique (Cinématique).
**Événements** : `TRUCK_ARRIVE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Bruit de freins pneumatiques "Pschhh".
- **Sons** : `truck_stop.mp3`.
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Traces de pneus au sol.
- **Vidéos** : Fumée d'échappement qui se dissipe.
- **Animations** : Freinage.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Rouge (Feux stop).
- **Textes** : "Livraison effectuée".
- **Formes** : Carré de stationnement.

View File

@@ -25,15 +25,18 @@ Une carte est une grille de cases représentant un espace de jeu ou de navigatio
"height": "integer",
"grid": [
[ { "case_ref": "case_id" } ]
]
],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A (Dépendant du type)
**Taille** : Définie à la création.
### Scores Initiaux
N/A
**Densité** : 0% occupée.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -43,64 +46,79 @@ Création à l'initialisation du jeu/compte.
Suppression du compte.
### Hérédité
N/A
**Configuration** : La disposition des biomes peut être conservée ou régénérée.
## 3. Impacts Environnementaux
### Impact Température
N/A (Porté par les cases)
**Globale** : La carte porte la météo globale qui affecte toutes les cases.
### Impact Milieu (Biome)
N/A (Porté par les cases)
**Distribution** : La carte gère la répartition des biomes (Génération procédurale ou fixe).
### Impact Saisons
N/A
**Cycle** : La carte orchestre le changement de saison pour toutes les entités.
### Impact Heure / Jour-Nuit
N/A
**Cycle** : La carte gère l'horloge mondiale.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Population** : La carte suit le nombre total d'animaux pour les limites globales.
### Impact Mort
N/A
**Cimetière** : La carte peut garder une trace des morts (statistiques).
### Impact Nourriture
N/A
**Ressources** : La carte gère les stocks globaux si centralisés.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Score Global** : Somme des attractivités locales.
### Impact Valeur
N/A
**Valorisation** : Valeur totale du terrain.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Temps** : La carte gère le `deltaTime` global.
### Dépenses (Boutiques/Visiteurs)
N/A
**Économie** : La carte centralise les flux financiers (optionnel).
### Trajet Visiteurs
N/A
**Réseau** : La carte définit le graphe de navigation global.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Tick** : Mise à jour périodique de toutes les entités.
## 7. Progression
### Tableau des Upgrades
N/A
Voir `agrandissement_carte.md`.
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateMap(map):
foreach entity in map.entities:
entity.update()
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `MAP_LOADED` | Info | "Carte chargée avec succès." |
# 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)
### Navigation (Action)
**Description UX** : Le joueur explore la carte.
@@ -114,8 +132,8 @@ N/A
- **Musiques** : Ambiance calme (Zoo) / Aventure (Monde).
- **Sons** : Vent léger.
- **Graphiques** : Grille (Grid lines) subtile.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Fond d'écran (Skybox).
- **Vidéos** : Nuages qui passent (Overlay).
- **Animations** : Inertie du mouvement.
- **Couleurs** : Fond neutre hors carte.
- **Textes** : Coordonnées (Debug).

View File

@@ -41,7 +41,10 @@ La carte du monde est l'espace multijoueur où sont situés les zoos des joueurs
"width": "integer (très grand)",
"height": "integer",
"sites": [ { "id": "uuid", "type": "zoo|city|lab", "pos": { "x": "int", "y": "int" } } ],
"trucks": [ { "id": "uuid", "owner_id": "uuid", "pos": { "x": "float", "y": "float" }, "target": "uuid" } ]
"trucks": [ { "id": "uuid", "owner_id": "uuid", "pos": { "x": "float", "y": "float" }, "target": "uuid" } ],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -53,7 +56,7 @@ La carte du monde est l'espace multijoueur où sont situés les zoos des joueurs
| Nb Labos | 2 (dans rayon départ) |
### Scores Initiaux
N/A
**Score Exploration** : 0% (Carte dévoilée).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -63,51 +66,52 @@ Unique (Singleton serveur).
Jamais.
### Hérédité
N/A
**Cartographie** : Les zones découvertes restent visibles après un reset (Connaissance acquise).
## 3. Impacts Environnementaux
### Impact Température
N/A
**Météo Globale** : Nuages, Pluie ou Neige visibles sur la carte (Effet visuel + Gameplay).
### Impact Milieu (Biome)
N/A
**Diversité** : Les biomes influencent le type de zoo bot (ex: Zoo Polaire au Nord, Zoo Tropical à l'Équateur).
### Impact Saisons
N/A
**Visuel** : La carte change de teinte (Blanc en Hiver, Orange en Automne, Vert vif au Printemps).
### Impact Heure / Jour-Nuit
N/A
**Cycle Jour/Nuit** : Assombrissement global. Les villes et zoos s'allument (Pixel Art lumineux).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Migration** : En saison des amours, des troupeaux sauvages (décoratifs) migrent sur la carte.
### Impact Mort
N/A
**Cimetière des Éléphants** : Lieu légendaire caché (Easter Egg) donnant un bonus si découvert.
### Impact Nourriture
N/A
**Ressources** : Les villes produisent de la nourriture (Champs autour des villes).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Rayonnement** : Un zoo très attractif (> 10k visiteurs) émet un halo doré visible de loin.
### Impact Valeur
N/A
**Économie** : Les prix du marché fluctuent selon l'offre globale (Loi de l'offre et la demande simulée).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Voyage Rapide** : Coût en pièces pour téléportation instantanée (si module "Héliport" débloqué).
### Dépenses (Boutiques/Visiteurs)
N/A
**Péages** : Taxe de passage sur certaines routes commerciales (1% valeur cargaison).
### Trajet Visiteurs
Calcul des distances Ville -> Zoo pour l'attractivité.
Calcul des distances Ville -> Zoo pour l'attractivité. Les visiteurs prennent le chemin le plus court.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Spawn Bot** : Apparition nouveau zoo bot.
* **Spawn Truck** : Camion visible.
* **Embouteillage** : Ralentissement sur les routes principales.
## 7. Progression
### Tableau des Upgrades
@@ -115,13 +119,33 @@ Voir `agrandissement_carte.md`.
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateWorldMap(map, deltaTime):
for truck in map.trucks:
moveTruck(truck, deltaTime)
if hasArrived(truck):
processTransaction(truck)
updateWeather(map)
updateDayNightCycle(map)
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `MAP_EVENT` | Info | "Un événement météo touche la région Nord." |
# 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)
### Vue Globale (Passif)
**Description UX** : Le joueur voit les autres acteurs et les flux économiques.
@@ -136,7 +160,7 @@ N/A
- **Sons** : Vent, Bruit lointain trafic.
- **Graphiques** : Fond carte (Biomes flous).
- **Images** : Icônes Sites.
- **Vidéos** : N/A
- **Vidéos** : Nuages dynamiques (shader).
- **Animations** : Camions qui bougent.
- **Couleurs** : Desaturées (pour faire ressortir les icônes).
- **Textes** : Noms des villes/zoos.
@@ -147,16 +171,16 @@ N/A
**Description UI** : Nuages ou zone sombre en périphérie.
**Emplacement** : Bords Carte.
**Intégration** : Mask.
**Navigation** : N/A
**Événements** : N/A
**Navigation** : Zoom-out via upgrade carte ; au clic sur une zone masquée, afficher un tooltip “Zone non explorée”.
**Événements** : `FOG_HOVER`, `FOG_CLICK_BLOCKED`
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : `ambience_fog_soft.mp3` (optionnel, très discret).
- **Sons** : `fog_whoosh.mp3` (au reveal), `ui_denied.mp3` (clic zone bloquée).
- **Graphiques** : Texture Nuages.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Masque alpha (bords flous).
- **Vidéos** : Effet de brume (particules).
- **Animations** : Nuages qui dérivent lentement.
- **Couleurs** : Blanc/Gris.
- **Textes** : "Zone Inexplorée".
- **Formes** : N/A
- **Formes** : Zone non cliquable.

View File

@@ -4,6 +4,8 @@
La carte du zoo est l'espace principal de gestion du joueur où il place ses bâtiments et ses animaux.
## Structure
- **Vue** : Isométrique (2.5D).
- **Affichage** : Plein écran sous la barre du haut, dézoom possible.
- **Grille** : Composée de cases individuelles.
- **Biomes** : Divisée en tiers de largeur :
- Gauche : Prairie
@@ -37,7 +39,33 @@ La carte du zoo est l'espace principal de gestion du joueur où il place ses bâ
"owner_id": "uuid",
"width": "integer (init 5)",
"height": "integer (init 6)",
"cases": [ ... ]
"cases": [
{
"id": "uuid",
"grid": { "x": "integer", "y": "integer" },
"iso": { "iso_x": "integer", "iso_y": "integer" },
"z_index": "integer",
"biome": "enum('prairie','ocean','montagne')",
"terrain": {
"ground_type": "enum('herbe','terre','sable','roche','eau')",
"path_type": "enum('none','terre','gravier','paves','bois_pont')",
"decoration_ids": "uuid[]"
},
"occupancy": {
"type": "enum('empty','animal','building','service','enclosure_fence','water_obstacle')",
"entity_id": "uuid | null"
},
"render": {
"tile_variant": "string (auto-tiling key)",
"occluder": "boolean",
"click_hitbox": "enum('tile','base_sprite','custom_polygon')"
},
"timestamps": {
"created_at": "timestamp",
"updated_at": "timestamp"
}
}
]
}
```
@@ -48,60 +76,61 @@ La carte du zoo est l'espace principal de gestion du joueur où il place ses bâ
| Biomes | 3 (Tiers) |
### Scores Initiaux
N/A
**Score Aménagement** : 0/100 (Utilisation de l'espace).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Création du compte joueur.
### Conditions de Disparition
N/A
**Reset Joueur** : Suppression du compte ou Faillite totale.
### Hérédité
N/A
**Fondations** : Les extensions de terrain achetées sont conservées en cas de "Soft Reset" (Prestige).
## 3. Impacts Environnementaux
### Impact Température
N/A (Géré par case)
**Micro-climats** : Les cases adjacentes à l'Océan sont plus fraîches (-2°C). Celles en Montagne sont plus froides (-5°C).
### Impact Milieu (Biome)
N/A (Géré par case)
**Bonus Synergie** : Placer 4 cases de même biome en carré crée un "Super Biome" (+10% efficacité).
### Impact Saisons
N/A
**Décor** : Les arbres (décoration) changent de couleur (Vert -> Orange -> Blanc -> Bourgeons).
### Impact Heure / Jour-Nuit
N/A
**Lumières** : Les lampadaires et bâtiments s'allument la nuit (Ambiance).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Intimité** : Les buissons (décoration) placés autour d'un enclos augmentent la fertilité (+5%).
### Impact Mort
N/A
**Compost** : Un animal mort fertilise le sol. L'herbe devient plus verte sur cette case après disparition du corps.
### Impact Nourriture
N/A
**Pousse** : L'herbe (nourriture gratuite) repousse lentement sur les cases Prairie vides.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Beauté** : +1 Attractivité par élément de décoration (Arbre, Banc, Fontaine).
### Impact Valeur
N/A
**Foncier** : Chaque case achetée augmente la valeur théorique du zoo.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Chemins** : Augmentent la vitesse de déplacement des visiteurs (+50%).
### Dépenses (Boutiques/Visiteurs)
N/A
**Entretien Espaces Verts** : Coût hebdomadaire pour garder le zoo propre (1 pièce/case).
### Trajet Visiteurs
Support du pathfinding (A* sur la grille).
Support du pathfinding (A* sur la grille). Les visiteurs évitent les obstacles (Rochers, Eau profonde).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Agrandissement** : Ajout d'une colonne/ligne ou case adjacente.
* **Catastrophe** : Inondation (Océan déborde) ou Éboulement (Montagne).
## 7. Progression
### Tableau des Upgrades
@@ -109,7 +138,7 @@ Voir `achat_upgrade_case_zoo.md`.
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
```javascript
function initZooMap():
width = 6
height = 5
@@ -120,10 +149,22 @@ function initZooMap():
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `MAP_EXPAND` | Succès | "Le zoo s'agrandit ! Nouvelles terres disponibles." |
# Annexes UX/UI
## 0. Direction Artistique & Vue
* **Vue** : Isométrique (2.5D).
* **Grille** : Les déplacements se font sur une grille losange.
* **Sprites** : 4 directions (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest).
* **Profondeur** : Gestion du Z-index (les éléments "en bas" cachent ceux "en haut").
* **Style Visuel** : Inspiré de `IMG_20260303_170253.jpg`.
* Coloré, vivant, détails foisonnants.
* Aspect "dessiné à la main" ou "cartoon soigné".
* Couleurs vives et contours nets.
## 1. Expérience Utilisateur (UX)
### Interaction Grille (Action)
**Description UX** : Le joueur clique sur une case pour voir son contenu ou construire.
@@ -134,14 +175,13 @@ N/A
**Événements** : `CLICK_CASE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Pop" discret.
- **Sons** : `click_tile.mp3`.
- **Graphiques** : Cadre de sélection blanc/brillant.
- **Images** : N/A
- **Vidéos** : N/A
- **Vidéos** : Effet de "Pop" au clic.
- **Animations** : Pulsation du cadre.
- **Couleurs** : Blanc.
- **Textes** : N/A
- **Textes** : Nom de l'objet sélectionné.
- **Formes** : Carré.
### Mode Construction (Action)
@@ -155,12 +195,11 @@ N/A
**Événements** : `ENTER_BUILD_MODE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Musique "Mode Édition" (calme, boucle).
- **Sons** : `grid_snap.mp3`.
- **Graphiques** : Grille semi-transparente.
- **Images** : N/A
- **Vidéos** : N/A
- **Vidéos** : Effet de grille holographique.
- **Animations** : Snap to grid.
- **Couleurs** : Vert/Rouge (Alpha 0.5).
- **Textes** : N/A
- **Textes** : "Placer ici".
- **Formes** : Carrés.

View File

@@ -8,10 +8,7 @@ Une case est l'unité élémentaire de la grille (Zoo ou Monde).
- **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).
## Règles
- Les transitions de propriétés (couleur, température) entre cases adjacentes doivent être douces.
- **État** : Peut avoir des indicateurs visuels (herbe jaunie, givre, fertilité).
# Annexes Techniques
@@ -21,102 +18,88 @@ Une case est l'unité élémentaire de la grille (Zoo ou Monde).
{
"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",
"temperature_offset": "float",
"biome_type": "enum('prairie','ocean','montagne','savane','toundra','desert','jungle','marais')",
"temperature_offset": "float (°C, additive)",
"content_ref": "uuid | null",
"content_type": "string",
"state_flags": ["frozen", "dry", "dirty"]
"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"
}
```
### Caractéristiques Initiales
N/A
### Scores Initiaux
N/A
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération carte.
### Conditions de Disparition
N/A
### Hérédité
N/A
## 3. Impacts Environnementaux
### Impact Température
`Température_Réelle = Température_Biome + Température_Offset + Saison_Mod`
### Impact Milieu (Biome)
Définit la couleur de fond.
### Impact Saisons
N/A
### Impact Heure / Jour-Nuit
N/A
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
### Impact Mort
N/A
### Impact Nourriture
N/A
### Impact Attractivité (Visiteurs/Animaux)
N/A
### Impact Valeur
N/A
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
### Dépenses (Boutiques/Visiteurs)
N/A
### Trajet Visiteurs
N/A
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
## 7. Progression
### Tableau des Upgrades
N/A
### 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` sapplique 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
N/A
```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
N/A
| 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)
### Feedback État (Passif)
**Description UX** : La case montre son état physique.
**Description UI** : Overlay de texture (Givre, Craquelures, Boue).
**Emplacement** : Case.
**Intégration** : Layer 1 (Au-dessus du fond, sous le contenu).
**Navigation** : N/A
**Événements** : `STATE_UPDATE`.
### 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** : N/A
- **Sons** : N/A
- **Graphiques** : Textures alpha (Givre blanc, Craquelures marron).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Apparition progressive (Fade).
- **Couleurs** : Blanc, Marron, Gris.
- **Textes** : N/A
- **Formes** : Carré.
- **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.

View File

@@ -20,77 +20,93 @@ Hérite de `Case (Générique)`.
Pas de propriétés supplémentaires spécifiques.
### Caractéristiques Initiales
N/A
**Vide** : Par défaut, une case monde est du vide spatial (ou océan) sauf si un site est généré dessus.
### Scores Initiaux
N/A
**Trafic** : 0 camions passés.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération monde.
### Conditions de Disparition
N/A
**Jamais** : La grille est immuable.
### Hérédité
N/A
**Routes** : Les chemins empruntés fréquemment deviennent des "routes" visibles (bonus vitesse) au fil des resets.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Météo Locale** : La case porte la météo de la région (Nuage, Pluie).
### Impact Milieu (Biome)
N/A
**Fond** : Définit le coût de traversée (Montagne > Plaine).
### Impact Saisons
N/A
**Visuel** : La case change de couleur selon la saison globale.
### Impact Heure / Jour-Nuit
N/A
**Luminosité** : S'assombrit la nuit.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Faune locale** : Reproduction simulée en arrière-plan pour les animaux sauvages (décoratif).
### Impact Mort
N/A
**Cycle naturel** : Les animaux sauvages meurent et disparaissent.
### Impact Nourriture
N/A
**Ressources** : Certaines cases contiennent des buissons de baies.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Influence** : Si proche d'une ville, la case a une "Valeur de Passage" élevée.
### Impact Valeur
N/A
**Terrain** : Prix fictif au m² (pour le lore).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Frottement** : Ralentit les camions selon le biome (Sable = lent).
### Dépenses (Boutiques/Visiteurs)
N/A
**Péage** : Traverser certaines zones coûte des pièces.
### Trajet Visiteurs
N/A
**Flux** : Visualisation des flux migratoires.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Météo** : Orage sur la case.
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Effet |
| :--- | :--- | :--- |
| 1 | 1000 | Route pavée (Vitesse +10%) |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function getTravelCost(case):
return baseCost * biomeMultiplier
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `ZONE_DISCOVERED` | Info | "Nouvelle zone découverte !" |
# 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)
### Survol (Passif)
**Description UX** : Explorer la carte du monde.
@@ -101,12 +117,12 @@ N/A
**Événements** : `HOVER_WORLD_CASE`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Musiques** : Thème "Exploration".
- **Sons** : `hover_soft.mp3`.
- **Graphiques** : Highlight case.
- **Images** : Texture Biome.
- **Vidéos** : Effet de brillance au survol.
- **Animations** : Légère surbrillance.
- **Couleurs** : Blanc (Alpha).
- **Textes** : Coordonnées X,Y.
- **Formes** : Carré/Hexagone.

View File

@@ -30,11 +30,27 @@ Case spécifique à la grille du zoo, pouvant accueillir les éléments de gesti
Hérite de `Case (Générique)`.
```json
{
"last_visit_time": "timestamp",
"quality_score": "float (0-100)"
"last_visit_time": "timestamp | null",
"visit_count_total": "integer",
"visit_count_day": "integer",
"heatmap_score": "float (0-100)",
"quality_score": "float (0-100)",
"pathing": {
"walkable": "boolean",
"movement_cost": "float (>= 1.0)",
"preferred": "boolean (true for path tiles)"
},
"zoo_specific_flags": [
"enum('premium_spot','near_entry','near_shop','near_enclosure','staff_only')"
]
}
```
### Contraintes (Invariants)
* **Walkable** : une case avec `content_type` bâtiment/animal est généralement `walkable=false` pour les visiteurs (sauf exceptions design).
* **last_visit_time** : mis à jour uniquement quand un visiteur “observe” réellement (pas juste traverse) si la mécanique de “visite” est distincte.
* **movement_cost** : > 1.0 sur herbe/boue, = 1.0 sur chemins, < 1.0 interdit (évite vitesse infinie).
### Caractéristiques Initiales
| Caractéristique | Valeur Initiale |
| :--- | :--- |
@@ -42,17 +58,19 @@ Hérite de `Case (Générique)`.
| Qualité | 100 |
### Scores Initiaux
N/A
**Passages** : 0 (Heatmap de fréquentation).
**Propreté** : 100 (aucun déchet).
**Coût de marche** : 1.2 (herbe) par défaut, 1.0 (chemin) si la case est convertie.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération zoo.
### Conditions de Disparition
N/A
**Jamais** : Une case ne disparaît pas, elle change juste de contenu.
### Hérédité
N/A
**Qualité du Sol** : Un sol bien entretenu (fertilisé) garde ses bonus après un reset partiel.
## 3. Impacts Environnementaux
### Impact Température
@@ -62,40 +80,41 @@ Voir `case_generique.md`.
Voir `case_generique.md`.
### Impact Saisons
N/A
**Neige** : La case devient blanche en hiver (si T° < 0).
### Impact Heure / Jour-Nuit
N/A
**Ombres** : Les ombres des objets sur la case tournent avec le soleil.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Lieu de rencontre** : Les cases "Buissons" favorisent les rencontres.
### Impact Mort
N/A
**Lieu de décès** : Une case où un animal est mort garde une "odeur" (malus stress) pendant 24h.
### Impact Nourriture
N/A
**Pâturage** : Une case herbeuse peut être broutée (devient terreuse).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Vue** : Une case "Point de Vue" (hauteur) augmente l'attractivité des animaux alentour.
### Impact Valeur
N/A
**Emplacement** : Une case proche de l'entrée vaut plus cher (emplacement premium pour boutiques).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Revêtement** : Herbe (Lent), Terre (Moyen), Pavés (Rapide).
### Dépenses (Boutiques/Visiteurs)
N/A
**Nettoyage** : Coût si la case est sale (déchets visiteurs).
### Trajet Visiteurs
N/A
**Obstacle** : Une case occupée par un bâtiment ou de l'eau est infranchissable (sauf pont).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Passage Visiteur** : Met à jour `last_visit_time`.
* **Salissure** : Apparition d'un déchet.
## 7. Progression
### Tableau des Upgrades
@@ -110,10 +129,23 @@ function checkAnimalDisappearance(case):
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `CASE_DIRTY` | Info | "Une case est sale." |
| `PATH_BLOCKED` | Warning | "Chemin bloqué : les visiteurs recalculent leur trajet." |
| `ANIMAL_NOT_VISITED` | Warning | "Un animal n'a pas été observé depuis longtemps." |
# 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)
### Sélection (Action)
**Description UX** : Clic sur une case zoo.
@@ -124,12 +156,12 @@ N/A
**Événements** : `SELECT_ZOO_CASE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Click".
- **Sons** : `select_soft.mp3`.
- **Graphiques** : Cadre sélection.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Icône Menu Contextuel.
- **Vidéos** : Effet de sélection (contour brillant).
- **Animations** : Rebondissement léger du contenu.
- **Couleurs** : Blanc.
- **Textes** : N/A
- **Textes** : "Case [X,Y]".
- **Formes** : Carré.

View File

@@ -25,7 +25,10 @@ Bâtiment produisant des points de science/recherche.
"stats": {
"points_generated": "integer",
"last_collection": "timestamp"
}
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -37,7 +40,7 @@ Bâtiment produisant des points de science/recherche.
| Rareté Visible | Niveau 1 (Commun) |
### Scores Initiaux
N/A
**Archives** : 0 découvertes.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -47,36 +50,37 @@ Présent au démarrage.
Indestructible (ou un seul obligatoire).
### Hérédité
N/A
**Archives** : 10% des points de recherche conservés au reset (Savoir accumulé).
## 3. Impacts Environnementaux
### Impact Température
N/A
**Surchauffe** : Production -10% si Canicule (Surchauffe serveurs/cerveaux).
### Impact Milieu (Biome)
N/A
**Stabilité** : Terrain stable requis (pas de marais). Si Marais : Coût construction x2.
### Impact Saisons
N/A
**Rentrée scolaire** : +10% production en Automne (Stagiaires).
**Vacances** : -5% production en Été.
### Impact Heure / Jour-Nuit
Production continue 24h/24.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Étude** : +50 pts recherche à chaque naissance rare dans le zoo.
### Impact Mort
N/A
**Autopsie** : +20 pts recherche à chaque mort (Triste mais utile).
### Impact Nourriture
N/A
**Cafétéria** : Consomme 5 unités nourriture/jour pour le personnel.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Conférences** : +10 Attractivité le week-end (Vulgarisation scientifique).
### Impact Valeur
N/A
**Brevets** : Valeur intrinsèque élevée. Revente impossible (Bien public).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
@@ -92,14 +96,15 @@ N/A
| 7 | 600 |
### Dépenses (Boutiques/Visiteurs)
N/A
**Subventions** : Coût fonctionnement réduit de 50% si Réputation Zoo > 80.
### Trajet Visiteurs
N/A
**Musée** : Si module Musée (Niv 4+), attire visiteurs comme une attraction secondaire.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Découverte** : Déblocage d'une nouvelle zone carte monde.
* **Percée** : Gain immédiat de 500 pts (Aléatoire).
## 7. Progression
### Tableau des Upgrades
@@ -119,7 +124,7 @@ N/A
function updateResearch(center):
points = center.productionRate * deltaTime
player.addResearchPoints(points)
visibleRarity = center.maxRarityVisible
updateWorldMapVisibility(center.range, visibleRarity)
```
@@ -128,9 +133,19 @@ function updateResearch(center):
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `RESEARCH_UNLOCK` | Info | "Nouvelle zone de carte découverte !" |
| `RESEARCH_BOOST` | Info | "Percée scientifique ! +500 pts." |
# 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)
### Collecte de Points (Action)
**Description UX** : Les points de recherche s'accumulent. Le joueur clique sur le bâtiment pour les récolter (ou collecte auto si implémenté).
@@ -141,11 +156,11 @@ function updateResearch(center):
**Événements** : `COLLECT_RESEARCH`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Science" (synthé léger).
- **Sons** : `bubble_pop.mp3` ou `sci_fi_bloop.mp3`. **Design ASMR** : "Bloop" liquide ou tintement cristallin.
- **Graphiques** : Icône Fiole bleue/violette.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Particules d'atomes.
- **Vidéos** : Effet de liquide bouillonnant (shader).
- **Animations** : Flottement (bobbing) de l'icône. Trajectoire courbe des points vers le HUD.
- **Couleurs** : Bleu Science #0088FF.
- **Textes** : "+10 RP".
@@ -160,11 +175,11 @@ function updateResearch(center):
**Événements** : `OPEN_RESEARCH`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Ambiance "Laboratoire" (bourdonnement machines).
- **Sons** : `ui_open.mp3`
- **Graphiques** : Style High-Tech / Labo.
- **Images** : `radar_icon.png`.
- **Vidéos** : N/A
- **Vidéos** : Écran de contrôle avec données défilantes.
- **Animations** : Radar qui balaie (décoratif).
- **Couleurs** : Blanc, Gris, Bleu néon.
- **Textes** : "Portée Radar : X km".
@@ -179,12 +194,481 @@ function updateResearch(center):
**Événements** : `UPGRADE_RESEARCH`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Upgrade" futuriste.
- **Sons** : `upgrade_tech.mp3` (son électronique).
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Schéma technique (Blueprint).
- **Images** : Icône Puce Électronique.
- **Vidéos** : Hologramme de construction.
- **Animations** : Flash bleu sur le bâtiment.
- **Couleurs** : Bleu.
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Upgrade Terminé".
- **Formes** : Hexagones.
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Production RP | Tick / delta | `level`, mod saison/météo | `research_points +` | Production continue 24h/24 ; modifs cumulables avec caps | Event `RESEARCH_TICK`, compteurs `/h` et `/jour` |
| Déblocage carte | Action joueur | `research_points`, coût | `world_map_unlocks +` | Dépense atomique, refuse si points insuffisants | Event `RESEARCH_SPEND_UNLOCK` |
| Radar offres | Tick visibilité | `range`, `rarity_visible` | UI offre filtrée | La visibilité est une règle daffichage, pas un cache | Event `WORLD_OFFER_VISIBILITY_UPDATED` |
| Musée / conférences | Calendrier | week-end, level | attractivité + | Actif si module/milestone atteint | Event `RESEARCH_TALK` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Fiole / atome / radar |
| Couleur dominante | Bleu science |
| Variantes | `icon_research_flask.png`, `icon_research_atom.png`, `icon_research_radar.png` |
| États | Badge “collectable” (+RP), “boost” (éclair), “surchauffe” (thermo) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Collecter points | Action | points disponibles | Clic bâtiment | RP crédités | `RESEARCH_NOT_READY` |
| Ouvrir détail | Consultation | - | Double clic / bouton “Détails” | panneau stats/upgrade | - |
| Améliorer | Action | coins ≥ coût | Bouton upgrade | level +1 | `INSUFFICIENT_FUNDS` |
| Consommer RP | Action | RP ≥ coût | Arbre/Carte monde → déverrouiller | unlock | `INSUFFICIENT_RESEARCH_POINTS` |
| Affecter chercheurs | Action | slots < 3 | Panel centre → slots | production + | `RESEARCH_CENTER_FULL` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `id` | uuid | - | DB | unique |
| `type` | enum | `research_center` | DB | constante |
| `level` | int | 1..7 | DB | clamp |
| `stats.points_generated` | int | 0..∞ | runtime | monotone |
| `stats.last_collection` | timestamp | - | runtime | null au début |
| `production_rate_per_hour` | int | 10..600 | config | selon tableau |
| `range_zoos` | int/string | 10..Tout | config | niveau 7 = Tout |
| `rarity_visible` | int | 1..5 | config | 1=commun, 5=légendaire |
| `assigned_researchers` | uuid[] | max 3 | runtime | cf. `chercheur.md` |
| `grid` | object | `{x,y}` | runtime | position |
| `iso_x/iso_y` | int | - | rendu | projection |
| `z_index` | int | - | rendu | profondeur |
| `hitbox` | enum | `base_sprite` | rendu | click base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Production | 10 | RP/heure | niv 1 |
| Portée radar | 10 | zoos | proximité |
| Rareté visible | 1 | niveau | commun |
| Slots chercheurs | 0/3 | slots | activés si feature employés |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Archives découvertes | 0 | 0..∞ | progression méta |
| RP cumulés | 0 | 0..∞ | déverrouillages |
| Boost actif | 0 | 0/1 | modifie production |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | début partie | seed | bâtiment | présent au démarrage |
| Production | tick | delta | RP + | 24h/24 |
| Collecte | clic | points | RP global + | atomicité |
| Disparition | supprimé compte | - | supprimé | indestructible en jeu |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Début partie | true | est | présent |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Compte supprimé | true | est | supprimé |
| Destruction | - | interdit | refus |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Archives | Oui | 10% des RP conservés |
| Level | Oui | persiste |
| RP non collectés | Non | convertis/collectés au login (lazy update) |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Modificateur |
|---|---|---|
| Canicule | production - | -10% |
| Tempérée | neutre | 0% |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Règle |
|---|---|---|
| Marais | coût construction | x2 |
| Terrain stable | normal | x1 |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Automne | rentrée | +10% |
| Été | vacances | -5% |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| Jour | production | normale |
| Nuit | production | normale (24h/24) |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Déclencheur | Gain RP | Condition |
|---|---:|---|
| Naissance rare | +50 | rareté ≥ 3 |
#### Impact Mort (tableau détaillé)
| Déclencheur | Gain RP | Condition |
|---|---:|---|
| Mort | +20 | autopsie active |
#### Impact Nourriture (tableau détaillé)
| Poste | Consommation | Unité | Condition |
|---|---:|---|---|
| Cafétéria | 5 | unités/jour | personnel centre |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain | Rayon | Notes |
|---|---:|---:|---|
| Conférences | +10 | zoo | week-end |
| Musée module | + | local | niv 4+ |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Aucune interaction directe | aucun | centre nest pas un enclos |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Brevets | valeur élevée | non revendable |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Livraison matériel | indirect | si feature équipement |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Tech incub | accélère | si recherche débloquée |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Niveau | Points / Heure | Unité | Notes |
|---|---:|---|---|
| 1 | 10 | RP/h | base |
| 2 | 20 | RP/h | - |
| 3 | 40 | RP/h | - |
| 4 | 80 | RP/h | - |
| 5 | 150 | RP/h | - |
| 6 | 300 | RP/h | - |
| 7 | 600 | RP/h | - |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | indirect | via tech |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps de séjour | + | musée/conférences |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Souvenirs science | stock | coins | boutique |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Conférences | 0 | - | included |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaires chercheurs | variable | coins/jour | selon `chercheur.md` |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Cafétéria | 5 | unités/jour | centre |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | attractivité | centre augmente attractivité |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Centre | Enclos | curiosité | détour (si musée) |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Centre | Boutique | souvenirs | dépense + |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Entrée | Centre | halo science | visite guidée |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `RESEARCH_TICK` | tick | amount | RP+ |
| `RESEARCH_SPEND_UNLOCK` | spend | cost | unlock |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `WORLD_OFFER_VISIBILITY_UPDATED` | level/range | UI filtre |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `RESEARCH_BOOST` | percée | +500 RP |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `RESEARCH_TALK` | week-end | attractivité + |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `VISITOR_INTEREST_SCIENCE` | musée | stay + |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `COLLECT_RESEARCH` | clic | collecte |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût (Pièces) | Production | Portée (Zoos) | Rareté Visible | Notes |
|---|---:|---:|---|---:|---|
| 1 | 0 | 10 | 10 | 1 | base |
| 2 | 300 | 20 | 20 | 2 | - |
| 3 | 600 | 40 | 30 | 2 | - |
| 4 | 1200 | 80 | 50 | 3 | musée possible |
| 5 | 2400 | 150 | 80 | 3 | - |
| 6 | 4800 | 300 | 120 | 4 | - |
| 7 | 9600 | 600 | Tout | 5 | max |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `updateResearch` | center, delta | rp | basé sur `level` |
| `updateWorldMapVisibility` | range, rarity | UI | pas de cache |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `RESEARCH_UNLOCK` | Info | "Nouvelle zone de carte découverte !" | spend ok |
| `RESEARCH_BOOST` | Info | "Percée scientifique ! +500 pts." | random proc |
| `INSUFFICIENT_RESEARCH_POINTS` | Warning | "Points de recherche insuffisants." | spend fail |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Collecter | récupérer RP | oubli | badge + clic direct |
| Upgrader | augmenter prod | coût | comparaison “actuel/suivant” |
| Déverrouiller | étendre monde | navigation | deep-link carte monde |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Badge RP | +RP | visible quand dispo |
| Panel centre | prod/h, portée, rareté | level 1..7 |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Carte zoo | bâtiment | clic base |
| HUD | compteur RP | global |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Carte monde | portée radar | overlay |
| Achats upgrades | coût coins | - |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir panel | clic | panel |
| Aller carte monde | bouton | navigation |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_RESEARCH` | clic | ouvre |
| `UPGRADE_RESEARCH` | bouton | upgrade |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `research_center_loop.mp3` | ambiance | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `sci_fi_bloop.mp3` | collecte | faible |
| `upgrade_tech.mp3` | upgrade | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `fx_atoms.png` | overlay | isométrique |
| `radar_sweep.png` | radar | décoratif |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `radar_icon.png` | panel |
| `icon_research_atom.png` | HUD |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `hologram_upgrade.webm` | upgrade | 1.2s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| icône bobbing | points dispo | loop |
| trajectoire points | collecte | 0.6s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `research_primary` | #0088FF | UI |
| `research_neon` | #00E5FF | accent |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `research.collect` | Collecter | Collect |
| `research.upgrade` | Améliorer | Upgrade |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Badge RP | cercle | lisible |
| Panel | bottom sheet | standard |

55
docs/specs/chemin.md Normal file
View File

@@ -0,0 +1,55 @@
# Spécifications : Chemin
## Définition
Les chemins sont des cases aménagées permettant aux visiteurs et au staff de se déplacer efficacement à travers le zoo. Ils connectent les différentes infrastructures (Enclos, Boutiques, Services).
## Fonctions
* **Circulation :** Permet le déplacement des entités (Visiteurs, Staff).
* **Connexion :** Relie les bâtiments entre eux pour former un réseau accessible.
* **Esthétique :** Améliore l'aspect visuel du zoo.
# Annexes Techniques
## 1. Données et États
### Modèle de Données (JSON)
```json
{
"type": "path",
"material": "gravel",
"x": 10,
"y": 12,
"connected_neighbors": ["N", "S", "E"],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
## 2. Règles Métier
* **Connexion Automatique :** Les textures des chemins se connectent automatiquement aux chemins adjacents (Auto-tiling).
* **Vitesse :** Bonus de vitesse de déplacement pour les entités sur les chemins.
# 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.
## 0. Direction Artistique & Vue
* **Vue** : Isométrique (2.5D).
* **Grille** : Les déplacements se font sur une grille losange.
* **Sprites** : 4 directions (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest).
* **Profondeur** : Gestion du Z-index (les éléments "en bas" cachent ceux "en haut").
* **Style Visuel** : Inspiré de `IMG_20260303_170253.jpg`.
* Coloré, vivant, détails foisonnants.
* Aspect "dessiné à la main" ou "cartoon soigné".
* Couleurs vives et contours nets.
## 1. Détails Spécifiques
* **Textures Connectées :** Les chemins utilisent des textures connectées (Terre, Gravier, Pavés) pour éviter les coupures nettes entre les cases.
* **Variété :** Différents types de sols disponibles (Terre, Gravier, Pavés).

531
docs/specs/chercheur.md Normal file
View File

@@ -0,0 +1,531 @@
# Chercheur
## 1. Définition
Employé travaillant dans le Centre de Recherche pour générer des points de science (ou débloquer des technologies). Il est distinct du personnel de laboratoire (qui s'occupe de la génétique/bébés). Achetable avec des pièces.
## 2. Fonctions
* **Recherche :** Génère passivement des points de recherche.
* **Découverte :** Accélère le déblocage de nouveaux animaux, bâtiments ou améliorations.
* **Collaboration :** Travaille plus efficacement en équipe (bonus de synergie).
## 3. Icone
* **Représentation :** Microscope ou Atome.
* **Couleur dominante :** Bleu ciel et Blanc.
## 4. Interactions
* **Recrutement :** Menu "Employés", coût en pièces.
* **Assignation :** Doit être assigné à un Centre de Recherche (max 3 par centre).
* **Formation :** Peut être envoyé en stage pour augmenter son intelligence (coût + temps).
## 5. Annexes Techniques
### Données (JSON)
```json
{
"employee_id": "researcher_01",
"type": "chercheur",
"name": "Dr. Curie",
"salary": 60,
"hire_cost": 600,
"assigned_building": "research_center_01",
"fatigue_level": "float (0-100)",
"current_task": "enum (IDLE, RESEARCHING, TRAINING)",
"stats": {
"intelligence": 10, // Points de recherche par cycle
"specialty": "genetics" // Bonus dans un domaine
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Limite :** Maximum 3 chercheurs par bâtiment "Centre de Recherche".
* **Fatigue :** L'efficacité diminue si la fatigue > 80%. Doit prendre des pauses.
* **Synergie :** 3 chercheurs de la même spécialité dans un centre = Bonus +20%.
## 6. Annexes UX/UI
* **Visuel Carte :** Visible à travers les fenêtres du Centre de Recherche ou entrant/sortant.
* **Interface Bâtiment :** Slots d'employés (0/3) dans le menu du Centre de Recherche.
* **Feedback :** Bulles de science (fioles, atomes) s'élevant du bâtiment quand ils travaillent.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Employé “Chercheur” |
| Rôle | Générer des unités de recherche (science) via `centre_recherche.md` ; distinct du laboratoire de la carte monde. |
| Capacité | Max 3 chercheurs par centre de recherche (contrainte métier). |
| Vue | Isométrique 2.5D, sprite 4 directions, sélection base-sprite. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Production recherche | Tick centre | `intelligence`, fatigue, bonus centre | `research_units +` | Production réduite si fatigue élevée ; pause obligatoire | Event `RESEARCH_TICK`, métriques /jour |
| Spécialisation | Assignation | `specialty` | bonus ciblé | Bonus appliqué aux recherches du domaine | Event `RESEARCH_SPECIALTY_APPLIED` |
| Synergie | 3 chercheurs | spécialité identique | +20% | Uniquement si même centre | Event `RESEARCH_SYNERGY_ON/OFF` |
| Formation | Action joueur | coût, temps | `intelligence +` | Immobilise le chercheur pendant training | Event `RESEARCHER_TRAIN_START/END` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Microscope / atome |
| Couleur dominante | Bleu ciel / blanc |
| Variantes | `icon_research_microscope.png`, `icon_research_atom.png` |
| États | Badge “en recherche” (fioles), “en stage” (diplôme), “fatigué” (Zzz) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Recruter | Action | coins ≥ `hire_cost` | Menu Employés → Chercheur → Confirmer | Chercheur créé (non assigné) | `INSUFFICIENT_FUNDS`, `EMPLOYEE_CAP_REACHED` |
| Assigner au centre | Action | centre dispo, slots < 3 | Centre → Slots → Sélectionner → Assigner | Prod active | `RESEARCH_CENTER_FULL`, `NO_PATH` |
| Démarrer formation | Action | coins ≥ coût, centre présent | Panel chercheur → “Former” → Confirmer | état `TRAINING` | `COOLDOWN_ACTIVE`, `INSUFFICIENT_FUNDS` |
| Changer spécialité | Action (si permis) | stage débloqué | Panel → spécialité | bonus différent | `SPECIALTY_LOCKED` |
| Inspecter production | Consultation | - | Centre → onglet Recherche | graphiques / taux | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `employee_id` | string | `researcher_01` | DB | Unique |
| `type` | enum | `chercheur` | DB | Constante |
| `salary` | int | 60 | config | coins/jour |
| `hire_cost` | int | 600 | config | one-shot |
| `assigned_building` | uuid/string | `research_center_01` | runtime | null si non assigné |
| `fatigue_level` | float | 0..100 | runtime | réduit prod |
| `current_task` | enum | `IDLE|RESEARCHING|TRAINING` | runtime | transitions contrôlées |
| `stats.intelligence` | int | 10 | DB | unités/cycle |
| `stats.specialty` | enum | `genetics|ecology|marketing|logistics` | DB | 1 parmi n |
| `grid` | object | `{x,y}` | runtime | position (si visible) |
| `iso_x/iso_y` | int | - | rendu | projection |
| `z_index` | int | - | rendu | profondeur |
| `hitbox` | enum | `base_sprite` | rendu | click base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Production brute | 10 | units/cycle | `intelligence` |
| Fatigue départ | 0 | % | - |
| Seuil fatigue malus | 80 | % | prod -30% au-delà |
| Pause | 15 | min in-game | après cycle long |
| Synergie | +20% | prod | si 3 mêmes spécialités |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Units/jour | 0 | 0..∞ | progression recherches |
| Efficacité centre | 100 | 0..200 | résume bonus/malus |
| Coût salarial/jour | 60 | 0..∞ | dépenses employé |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | embauche | coins | entité | `IDLE` |
| Assignation | action centre | slot dispo | `RESEARCHING` | max 3/centre |
| Training | action joueur | coins + temps | `intelligence +` | immobilisé |
| Disparition | licenciement (si prévu) | - | suppression | stop production |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Achat | coins ≥ `hire_cost` | vrai | création |
| Centre existant | optionnel | - | assignation possible |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Licenciement | action joueur | vrai | suppression |
| Zoo supprimé | - | vrai | suppression |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Spécialité | Oui | persistée |
| Intelligence | Oui | persistée |
| Fatigue | Non | recalcul / reset quotidien |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Température | Effet sur prod | Condition |
|---|---|---|
| Extrême | -10% | si bâtiment non amélioré (isolation) |
| Tempéré | 0 | - |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Ville/route | neutre | centre en intérieur |
| Zone humide | malus | humidité (option visuelle) |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | chauffage coûte + | prod stable |
| Été | canicule | fatigue +5%/jour |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| Jour | prod normale | - |
| Nuit | prod réduite | -20% si “horaires normaux”, 0% si centre fermé |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet | Condition |
|---|---|---|
| Recherche “fertilité” | +taux | si tech débloquée |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Accident labo | none | chercheur ≠ labo monde |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Café (option) | fatigue - | mécanique employé |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain | Rayon | Notes |
|---|---:|---:|---|
| Centre actif visible | +5 | 2 cases | bulles science |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Aucun effet direct | aucun | le chercheur ninteragit pas directement avec les animaux |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Recherche débloquée | + | débloque upgrades, économie |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Livraison composants | - | si mécanique ravitaillement centre |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Recherche incub | + | si tech appliquée |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Production units | + | intelligence/synergie |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | indirect | via tech |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | indirect | via attractivité centre |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Vente “science kit” | +revenu | coins | boutique souvenirs |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaire | `salary` | coins/jour | actif |
| Stage | 300 | coins | par formation |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | attractivité/réputation | chercheur indirect |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Centre | Enclos | curiosité | détour si FX visibles |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Centre | Boutique | achat souvenir | dépense + |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Entrée | Centre | halo science | visite guidée |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `RESEARCH_UNIT_GAINED` | tick | amount | progression |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `BUILDING_ACTIVE_FX` | centre actif | bulles science |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `RESEARCH_CENTER_FULL` | slots=3 | bloque assignation |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_INTEREST_SCIENCE` | centre proche | temps séjour + |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_PHOTO` | FX visibles | satisfaction + |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_START_TRAINING` | bouton | start stage |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | recrutement | base |
| 2 | 1500 | intelligence +2 | prod + |
| 3 | 3000 | fatigue -10% | endurance |
| 4 | 6000 | spécialités avancées | nouveaux domaines |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `update_researcher` | fatigue, intelligence | units | clamp + pause |
| `apply_synergy` | team | multiplier | 3 mêmes |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `RESEARCH_CENTER_FULL` | Warning | "Centre complet." | slots=3 |
| `RESEARCHER_FATIGUED` | Warning | "Chercheur fatigué." | fatigue>80 |
| `RESEARCH_UNLOCKED` | Info | "Recherche débloquée." | units seuil |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Assigner chercheurs | augmenter production | slots | drag & drop dans slots |
| Former | améliorer prod | coût/temps | bouton direct sur carte employé |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Panel centre | slots 0/3, prod/h | actifs/plein |
| Carte chercheur | spécialité, fatigue | researching/training |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Menu Employés | HUD | liste |
| Centre recherche | carte | sélection |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Système unités | accumulation | pas de cache |
| Upgrades | coût/effet | via `achat_upgrade_*` |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir centre | clic bâtiment | panel |
| Assigner | slot → choisir | start prod |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_RESEARCH_CENTER` | clic centre | panel |
| `ASSIGN_RESEARCHER` | drag/drop | assign |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `research_center_loop.mp3` | ambiance centre | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `science_bubble.mp3` | FX | faible |
| `ui_assign.mp3` | assignation | faible |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `fx_atoms.png` | bulles science | overlay |
| `researcher_sprite_[dir].png` | sprite | 4 dirs |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `icon_microscope.png` | icône |
| `portrait_researcher.png` | panel |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `research_unlock.webm` | pop unlock | 1.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| fioles qui montent | production | loop |
| badge “+units” | tick | 0.4s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `research_primary` | #6EC6FF | UI |
| `research_accent` | #FFFFFF | highlights |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `research.assign` | Assigner | Assign |
| `research.train` | Former | Train |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Slots employés | cartes | drag target |
| Badge unités | pill | lisible |

View File

@@ -29,12 +29,15 @@ Mécanisme de vente entre joueurs/bots sur la Carte du Monde.
"highest_bidder_id": "uuid | null",
"end_time": "timestamp",
"status": "enum ('active', 'pending_validation', 'finalizing', 'completed', 'cancelled')",
"finalization_timer": "timestamp (end)"
"finalization_timer": "timestamp (end)",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
**Durée par défaut** : 24h.
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -42,13 +45,13 @@ N/A
function placeBid(auction, bidder, amount):
if amount <= auction.current_bid: return Error
if bidder.coins < amount: return Error
auction.current_bid = amount
auction.highest_bidder_id = bidder.id
function finalizeAuction(auction):
if now < auction.finalization_timer: return
transferCoins(auction.highest_bidder_id, auction.seller_id, auction.current_bid)
transferAnimal(auction.seller_id, auction.highest_bidder_id, auction.animal_ref)
auction.status = 'completed'
@@ -59,10 +62,19 @@ function finalizeAuction(auction):
| :--- | :--- | :--- |
| `BID_PLACED` | Info | "Offre placée avec succès." |
| `OUTBID` | Alerte | "Vous avez été surenchéri !" |
| `AUCTION_WON` | Succès | "Vous avez remporté l'enchère ! Livraison en cours..." |
| `AUCTION_WON` | Succès | "Vous avez remporté l'enchère ! Livraison en cours." |
# 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)
### Consultation des Offres (Consultation)
**Description UX** : Le joueur survole les zoos sur la carte du monde pour voir les offres.
@@ -73,11 +85,11 @@ function finalizeAuction(auction):
**Événements** : `HOVER_OFFER`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_market_hover.mp3` (jingle discret optionnel).
- **Sons** : `hover_soft.mp3`.
- **Graphiques** : Cadre Offre (Doré si rare).
- **Images** : Icône Animal.
- **Vidéos** : N/A
- **Vidéos** : `offer_hover_glow.webm` (0.6s loop, optionnel).
- **Animations** : Prix qui clignote si nouvelle enchère.
- **Couleurs** : Vert (Abordable), Rouge (Trop cher).
- **Textes** : "Lapin Rare - 500$".
@@ -92,15 +104,15 @@ function finalizeAuction(auction):
**Événements** : `PLACE_BID`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_market_bid.mp3` (jingle court).
- **Sons** : `bid_placed.mp3` (bruit de marteau).
- **Graphiques** : Icône Marteau.
- **Images** : Portrait Animal HD.
- **Vidéos** : N/A
- **Vidéos** : `bid_counter_up.webm` (0.8s loop, optionnel).
- **Animations** : Compteur prix qui monte.
- **Couleurs** : Bouton Vert.
- **Textes** : "Enchérir".
- **Formes** : N/A
- **Formes** : Boutons rapides (+10/+50/+100), champ numérique.
### Sablier de Validation (Attente)
**Description UX** : L'enchère est remportée, le transfert est en cours (10 min).
@@ -108,19 +120,19 @@ function finalizeAuction(auction):
**Notification Push** : "Enchère remportée ! Animal livré." à la fin du timer.
**Emplacement** : Carte Monde & HUD.
**Intégration** : Statut "En cours".
**Navigation** : N/A
**Navigation** : Clic sur sablier dans HUD → ouvre le détail transaction (temps restant, statut, destination).
**Événements** : `TIMER_START`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_timer_soft.mp3` (optionnel, très discret).
- **Sons** : `tick_tock.mp3` (ambiance très discrète si focus).
- **Graphiques** : Sablier animé.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `icon_hourglass.png`, `badge_pending.png`.
- **Vidéos** : `hourglass_flow.webm` (1s loop, optionnel).
- **Animations** : Sable qui coule.
- **Couleurs** : Orange.
- **Textes** : "Validation : MM:SS".
- **Formes** : N/A
- **Formes** : Badge rond (HUD), icône sur slot.
### Activité "Clic" (Gameplay)
**Description UX** : Pendant les 10 min, le joueur peut cliquer sur le sablier pour "accélérer" (symboliquement) ou gagner un petit bonus (XP/Pièce) pour patienter.
@@ -131,12 +143,12 @@ function finalizeAuction(auction):
**Événements** : `CLICK_HOURGLASS`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_click_reward.mp3` (jingle court).
- **Sons** : `sand_shake.mp3`. **Design ASMR** : Bruit de sable qui crisse ou petit choc mat.
- **Graphiques** : Particules de sable.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `sand_particle.png`.
- **Vidéos** : `hourglass_shake.webm` (0.5s non loop, optionnel).
- **Animations** : Secousse.
- **Couleurs** : N/A
- **Couleurs** : Doré.
- **Textes** : "+1 XP".
- **Formes** : N/A
- **Formes** : Bouton rond (tap cible), badge sablier (HUD).

101
docs/specs/enclos.md Normal file
View File

@@ -0,0 +1,101 @@
# Enclos
## 1. Définition
Espace délimité destiné à accueillir une ou plusieurs espèces animales. L'enclos est constitué de cases de terrain modifiées pour répondre aux besoins des animaux (biome, végétation, eau). Une caractéristique clé est la fusion automatique des cases adjacentes contenant le même animal pour former un grand enclos unique.
## 2. Fonctions
* **Hébergement :** Lieu de vie des animaux.
* **Fusion (Merge) :** Si deux cases "Enclos [Animal X]" sont posées côte à côte, les barrières internes disparaissent pour créer un espace commun (Auto-tiling).
* **Visibilité :** Permet aux visiteurs d'observer les animaux (augmente l'attractivité).
* **Sécurité :** Empêche les animaux de s'enfuir (si entretenu).
## 5. Annexes Techniques
### Données (JSON)
```json
{
"enclosure_id": "uuid",
"owner_zoo_id": "uuid",
"created_at": "timestamp",
"updated_at": "timestamp",
"animal_type": "string (ref inventaire_animaux)",
"biome_type": "enum('prairie','ocean','montagne','savane','toundra','desert','jungle','marais')",
"cells": [
{"x": 10, "y": 10},
{"x": 10, "y": 11},
{"x": 11, "y": 10},
{"x": 11, "y": 11}
],
"area": 4,
"capacity": 6,
"current_population": 3,
"cleanliness": 85,
"fence_health": 100,
"decoration_score": 15,
"perimeter_edges": "integer",
"fence_style_id": "string (skin/theme)",
"sign": {
"enabled": "boolean",
"sign_id": "uuid | null"
},
"render": {
"auto_tile_key": "string",
"fence_segments": [
{
"edge": "enum('N','S','E','W')",
"x": "integer",
"y": "integer",
"variant": "string",
"occluder": "boolean"
}
]
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Algorithme de Fusion :** À chaque placement/suppression de case enclos, recalculer les composants connectés (Connected Components) pour mettre à jour les murs.
* **Murs :** Les murs ne sont générés que sur les bords de la zone connectée qui ne touchent pas une autre case du même enclos.
* **Cohérence espèce** : un composant connecté ne peut contenir quun `animal_type` nominal. Si une case est convertie, elle déclenche un split/merge.
* **Capacité** : `capacity = floor(area * capacity_per_tile)``capacity_per_tile` dépend de lespèce (valeur par défaut 1.5).
* **Propreté** : décroît par présence animale et par visiteurs proches ; remonte via employé (soigneur/nourisseur selon design) et/ou nettoyage.
### Cas limites (Edge cases)
* **Split** : retirer une case centrale peut séparer lenclos en 2 composants → créer 2 enclos (nouveaux `enclosure_id`) et recalculer clôtures/affiches.
* **Pont/chemin** : une case chemin/pont adjacente ne fait pas partie de lenclos mais influence la pose de laffiche (priorité visibilité).
* **Occlusion** : si un segment de clôture masque lanimal (S/E), utiliser variante basse ou alpha réduit.
## 6. 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.
### 0. Direction Artistique & Vue
* **Note** : ce bloc double un autre bloc similaire ; les deux sont conservés. Celui-ci précise les règles de grille/profondeur.
* **Vue** : Isométrique (2.5D).
* **Grille** : Les déplacements se font sur une grille losange.
* **Sprites** : 4 directions (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest).
* **Profondeur** : Gestion du Z-index (les éléments "en bas" cachent ceux "en haut").
* **Style Visuel** : Inspiré de `IMG_20260303_170253.jpg`.
* Coloré, vivant, détails foisonnants.
* Aspect "dessiné à la main" ou "cartoon soigné".
* Couleurs vives et contours nets.
### Détails Spécifiques
* **Visuel Barrières :** Génération procédurale des barrières uniquement sur le pourtour (Auto-tiling). Fusion visuelle des barrières si adjacents.
* **Isométrique :** Les barrières au Sud et à l'Est doivent être semi-transparentes ou plus basses pour ne pas cacher les animaux.
* **Signalétique :** Affiche de l'animal visible sur la clôture.
### Interactions (sélection / inspection)
* **Sélection enclos** : clic sur une clôture ou sur une case enclos ouvre un panneau “Enclos”.
* **Panneau** : espèce, population/capacité, propreté, santé clôture, bonus déco, bouton “Améliorer clôture”, bouton “Déplacer affiche” (si optionnel).
* **Erreurs** : tentative dajouter un animal dune autre espèce dans un enclos fusionné → refus + message.

View File

@@ -23,10 +23,10 @@ Liste d'enums ou flags dans l'objet `Animal` ou `Case`.
`visual_states: ["frozen", "hungry"]`
### Caractéristiques Initiales
N/A
**État par défaut** : Neutre.
### Scores Initiaux
N/A
**Compteur États** : 0 actifs.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -36,7 +36,7 @@ Déclenchés par les seuils de stats (Santé, Faim, T°).
Retour à la normale des stats.
### Hérédité
N/A
**Sensibilité** : Les enfants héritent de la résistance aux états (Froid/Chaud) des parents.
## 3. Impacts Environnementaux
### Impact Température
@@ -46,10 +46,10 @@ Déclencheurs Froid/Chaud.
Déclencheurs Mauvais Biome.
### Impact Saisons
N/A
**Hiver** : Augmente la fréquence de l'état "Froid".
### Impact Heure / Jour-Nuit
N/A
**Nuit** : Augmente la fréquence de l'état "Sommeil".
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
@@ -65,25 +65,41 @@ Déclencheur Faim.
Les états négatifs (Sale, Malade) repoussent les visiteurs.
### Impact Valeur
N/A
**Malus** : Un animal avec un état négatif vaut -20% à la vente.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Contexte | État | Effet vitesse | Condition | Notes |
|---|---|---:|---|---|
| Visiteurs | “Confort OK” | x1.0 | Température 530°C, sol non boueux | Vitesse nominale. |
| Visiteurs | “Stress” | x0.85 | Animal malade visible / zone sale | Les visiteurs ralentissent pour observer/éviter. |
| Animaux | “Faim” | x0.7 | `hunger > 70` | Animation lente, impact visuel. |
| Animaux | “Heureux” | x1.1 | Conditions idéales + visite récente | Sautillements, micro-boost. |
### Dépenses (Boutiques/Visiteurs)
N/A
| État | Coût | Unité | Déclencheur | Règle |
|---|---:|---|---|---|
| “Sale” | 10 | pièces / case / jour | Déchets non ramassés | Nettoyage automatique si employé dédié, sinon manuel. |
| “Malade” | 50 | pièces / animal | Maladie / mort proche | Frais vétérinaires ; si non payés, risque de mort augmente. |
| “T° critique” | 10 | pièces / degré / jour | Chauffage/Clim régule | Dépend de `temperature.md` (régulateurs). |
### Trajet Visiteurs
N/A
**Fuite** : Les visiteurs évitent les animaux avec l'état "Malade".
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `STATE_APPLIED` | Ajout dun flag visuel | Met à jour rendu | Instantané |
| `STATE_CLEARED` | Retour à la normale | Retire overlay/particules | Instantané |
| `STATE_CRITICAL` | Seuil critique franchi | Alerte + focus optionnel | Tant que critique |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Effet |
| :--- | :--- |
| 1 | Détection simple |
| 2 | Détection avancée (Prévision) |
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -95,26 +111,37 @@ elif animal.temp > animal.idealTemp + 10:
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `STATE_CRITICAL` | Alerte | "État critique détecté !" |
# 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)
### Lecture Immédiate (Passif)
**Description UX** : Le joueur comprend la situation d'un coup d'œil sans ouvrir de menu.
**Description UI** : Pas d'UI. Tout passe par le rendu graphique des entités.
**Emplacement** : Grille Zoo.
**Intégration** : Moteur de rendu.
**Navigation** : N/A
**Navigation** : Automatique.
**Événements** : `STATE_CHANGE`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Nappe sonore (battement cœur).
- **Sons** : `heartbeat.mp3`.
- **Graphiques** : Shaders (Color Overlay), Systèmes de particules.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône État.
- **Vidéos** : Shader overlay.
- **Animations** : Animations spécifiques (Trembler, Boiter).
- **Couleurs** : Code universel (Bleu=Froid, Rouge=Chaud, Vert=OK, Jaune=Malade).
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : Nom de l'état.
- **Formes** : Icône flottante.

View File

@@ -42,28 +42,37 @@ function applyImpact(target, impactType, value):
target.attractiveness += value
elif impactType == 'SURVIVAL':
target.survival_score += value
logEvent(target.id, impactType, value)
```
# 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)
### Feedback Visuel d'Impact (Passif)
**Description UX** : Le joueur voit les conséquences de ses actions.
**Description UI** : Popups flottants ("Floating Text") au-dessus des entités concernées.
**Emplacement** : World Space.
**Intégration** : Temporaire (Fade out).
**Navigation** : N/A
**Navigation** : Automatique.
**Événements** : `IMPACT_APPLIED`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle court.
- **Sons** : `positive.mp3` (montant), `negative.mp3` (descendant).
- **Graphiques** : Flèches Vertes (Haut) / Rouges (Bas).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône Flèche.
- **Vidéos** : Particules.
- **Animations** : Texte qui monte et disparaît.
- **Couleurs** : Vert, Rouge.
- **Textes** : "+10 Attractivité", "-5 Santé".
- **Formes** : N/A
- **Formes** : Texte flottant.

View File

@@ -25,82 +25,114 @@ Table statique `animal_types`.
"rarity": "int",
"ideal_biome": "int",
"ideal_temp": "float",
"base_value": "int"
"base_value": "int",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
**Compteur** : 0 animaux découverts.
**Filtre Défaut** : "Tous".
### Scores Initiaux
N/A
**Score Collectionneur** : 0% (Progression globale).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
**Découverte** : Premier achat, naissance ou observation d'un animal.
### Conditions de Disparition
N/A
**Vente/Mort** : L'animal disparaît de l'inventaire actif mais reste dans le "Livre des Records" (grisé).
### Hérédité
N/A
**Bonus Famille** : Si le joueur possède le couple (Mâle/Femelle), l'icône de l'espèce est dorée.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Indicateur** : L'inventaire affiche l'icône "Froid/Chaud" à côté des animaux qui souffrent actuellement.
### Impact Milieu (Biome)
N/A
**Tri** : Possibilité de trier par Biome d'origine.
### Impact Saisons
N/A
**Saisonnalité** : Met en avant les animaux "Tendance" de la saison actuelle.
### Impact Heure / Jour-Nuit
N/A
**Activité** : Affiche "Dort" si l'animal est nocturne et qu'il fait jour.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Statut** : Affiche "Fertile" ou "Gestante" sur les fiches.
### Impact Mort
N/A
**Cimetière** : Les animaux morts apparaissent grisés avec la date de décès.
### Impact Nourriture
N/A
**Alerte** : Badge rouge sur l'icône si Faim > 80%.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Set Complet** : Avoir tous les animaux d'un Biome donne un bonus global +5% Attractivité.
### Impact Valeur
N/A
**Estimation** : Affiche la valeur totale théorique du cheptel.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Recherche Rapide** : Barre de recherche instantanée.
### Dépenses (Boutiques/Visiteurs)
N/A
**Coût Total** : Affiche le coût journalier total en nourriture.
### Trajet Visiteurs
N/A
**Popularité** : Trie les animaux par nombre de vues visiteurs.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Nouveau** : Badge "New" sur une espèce fraîchement acquise.
* **Record** : Badge "Record" si un animal bat un record d'âge/valeur.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Niveaux de Badge Collectionneur.*
| Niveau | Nom | Condition | Bonus |
| :--- | :--- | :--- | :--- |
| 1 | Amateur | 5 Espèces | +1% Attractivité |
| 2 | Passionné | 15 Espèces | +2% Attractivité |
| 3 | Expert | 30 Espèces | +5% Attractivité |
| 4 | Maître | 50 Espèces | +10% Attractivité |
| 5 | Légende | 75 Espèces | +20% Attractivité |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function getCollectionBonus(player):
count = countDistinctSpecies(player.animals)
if count >= 75: return 0.20
if count >= 50: return 0.10
if count >= 30: return 0.05
if count >= 15: return 0.02
if count >= 5: return 0.01
return 0
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `COLLECTION_LEVEL_UP` | Succès | "Nouveau rang de collectionneur atteint !" |
# 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)
### Bestiaire / Encyclopédie (Consultation)
**Description UX** : Le joueur consulte les animaux découverts/possédés.
@@ -111,12 +143,12 @@ N/A
**Événements** : `OPEN_BESTIARY`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Thème "Bibliothèque" (calme).
- **Sons** : `page_turn.mp3`.
- **Graphiques** : Fond Livre ancien.
- **Images** : 75 Icônes Animaux.
- **Vidéos** : N/A
- **Animations** : N/A
- **Vidéos** : Aperçu de l'animal en mouvement (survol).
- **Animations** : Tourne la page.
- **Couleurs** : Sépia/Papier.
- **Textes** : Lore/Description.
- **Formes** : N/A
- **Formes** : Marque-page.

View File

@@ -12,93 +12,111 @@ Pour chaque animal adulte, il existe une version "Bébé".
Même table que `animal_types` avec flag `is_baby`.
### Caractéristiques Initiales
N/A
**Compteur Bébés** : 0.
### Scores Initiaux
N/A
**Score Maternité** : 0.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
Naissance ou Achat Œuf.
### Conditions de Disparition
N/A
Croissance (Devient Adulte) ou Mort.
### Hérédité
N/A
**Lien** : Lien cliquable vers les parents depuis la fiche bébé.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Alerte Froid** : Icône "Flocon" clignotante si bébé en danger.
### Impact Milieu (Biome)
N/A
**Filtre** : "Bébés en danger" (Mauvais biome).
### Impact Saisons
N/A
**Printemps** : Mise en avant des naissances saisonnières.
### Impact Heure / Jour-Nuit
N/A
**Sommeil** : Indique "Dort" (les bébés dorment plus).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Futur** : Indique le potentiel génétique (Étoiles grisées).
### Impact Mort
N/A
**Historique** : "Mort-né" ou "Mort en bas âge" (Triste mais informatif).
### Impact Nourriture
N/A
**Biberon** : Icône Biberon si faim.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Bonus Mignonnerie** : Avoir 10 bébés différents simultanément = +5% Ventes Boutique Peluches (Effet "Mode").
### Impact Valeur
N/A
**Potentiel** : Affiche la valeur estimée à l'âge adulte.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Croissance** : Barre de progression temps réel.
### Dépenses (Boutiques/Visiteurs)
N/A
**Coût Soins** : Estimation des frais vétérinaires à venir.
### Trajet Visiteurs
N/A
**Vedette** : Indique si le bébé est le plus regardé du zoo.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Éclosion** : Animation dans l'inventaire.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Niveaux de la Nurserie (voir `nurserie.md`).*
| Niveau | Nom | Bonus |
| :--- | :--- | :--- |
| 1 | Mignonnerie | +10% Attractivité |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function getBabyBonus(baby):
if baby.isCute(): return 1.5 // Multiplicateur attractivité
return 1.0
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `BABY_BORN` | Info | "Un nouveau bébé est né !" |
# 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)
### Visualisation Bébé (Passif)
**Description UX** : Différencier les bébés des adultes.
**Description UI** : Sprite plus petit (50% taille), tête plus grosse, yeux plus grands.
**Emplacement** : Grille / Nurserie.
**Intégration** : Sprite.
**Navigation** : N/A
**Événements** : N/A
**Navigation** : Clic Bébé.
**Événements** : `CLICK_BABY`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Berceuse.
- **Sons** : Cris plus aigus.
- **Graphiques** : Sprites Chibi.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône Tétine.
- **Vidéos** : Vidéo "Premiers pas" (décoratif).
- **Animations** : Démarche maladroite.
- **Couleurs** : Identiques Adulte.
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Bébé".
- **Formes** : Rond.

View File

@@ -13,59 +13,59 @@
Table statique.
### Caractéristiques Initiales
N/A
**Heure Départ** : 08:00 (Ouverture).
### Scores Initiaux
N/A
**Jours passés** : 0.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Cycle perpétuel.
### Conditions de Disparition
N/A
**Jamais** : Le temps ne s'arrête pas (sauf pause).
### Hérédité
N/A
**Temps de Jeu** : Cumulé sur le profil joueur.
## 3. Impacts Environnementaux
### Impact Température
Voir `temperature.md`.
### Impact Milieu (Biome)
N/A
**Lumière** : Les biomes réagissent à la lumière (Bioluminescence).
### Impact Saisons
N/A
**Durée Jour** : Variable selon saison.
### Impact Heure / Jour-Nuit
N/A
**Cycle** : C'est la définition même.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Nuit** : Bonus fertilité.
### Impact Mort
N/A
**Nuit** : Risque froid.
### Impact Nourriture
N/A
**Repas** : Heures fixes (Matin/Soir) pour les animaux.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Horaires** : Zoo fermé la nuit = 0 Visiteurs.
### Impact Valeur
N/A
**Recette du Jour** : Calculée à la fermeture (20h).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Temps** : Accélérateur de temps (x1, x2, x3).
### Dépenses (Boutiques/Visiteurs)
N/A
**Salaire** : Payé à la journée.
### Trajet Visiteurs
N/A
**Sortie** : À 19h, tous les visiteurs se dirigent vers la sortie.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -73,33 +73,52 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
**Horaires Étendus** (Recherche) :
| Niveau | Effet |
| :--- | :--- |
| 1 | Fermeture 21h |
| 2 | Fermeture 22h |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateTime(world, deltaTime):
world.time += deltaTime * speedFactor
if world.time >= 24: world.time = 0
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `DAY_START` | Info | "Bonjour ! Le zoo ouvre." |
# 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)
### Cycle Jour/Nuit (Passif)
**Description UX** : La luminosité change progressivement.
**Description UI** : Filtre global de couleur (Bleu nuit -> Orange aube -> Blanc jour -> Orange crépuscule).
**Emplacement** : Écran entier.
**Intégration** : Layer FX.
**Navigation** : N/A
**Navigation** : Boutons Vitesse (x1, x2, Pause).
**Événements** : `TIME_CHANGE`.
#### Assets
- **Musiques** : Thème Jour / Thème Nuit (plus calme).
- **Sons** : Coq (Matin), Hibou (Nuit).
- **Graphiques** : Ombres qui tournent (si 3D ou simulé).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Soleil / Lune (HUD).
- **Vidéos** : Timelapse ciel (Skybox).
- **Animations** : Transition couleur.
- **Couleurs** : Palette Cycle.
- **Textes** : Horloge "14:00".
- **Formes** : N/A
- **Formes** : Cadran.

View File

@@ -15,10 +15,10 @@
Table statique.
### Caractéristiques Initiales
N/A
**Météo Actuelle** : Ensoleillé (Défaut).
### Scores Initiaux
N/A
**Durée Météo** : 4h restantes.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -28,36 +28,50 @@ Probabilités selon Saison.
Changement toutes les X heures ou jours.
### Hérédité
N/A
**Climat** : Le climat général du zoo (Tropical, Tempéré) influence les probabilités météo.
## 3. Impacts Environnementaux
### Impact Température
Voir liste ci-dessus.
| Météo | Modificateur Température | Notes |
|---|---:|---|
| Ensoleillé | +1°C | Bonus attractivité. |
| Nuageux | 0°C | Neutre. |
| Pluvieux | 0°C | Humidité, pousse herbe. |
| Orage | 0°C | Stress animaux. |
| Neige | -5°C | Risque froid. |
| Canicule | +5°C | Risque chaud. |
### Impact Milieu (Biome)
N/A
**Réaction** : La pluie remplit les mares (visuel). La neige couvre le sol.
### Impact Saisons
N/A
**Probabilités** : Neige impossible en Été.
### Impact Heure / Jour-Nuit
N/A
**Visibilité** : Orage la nuit = Éclairs très visibles.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Calme** : La pluie favorise l'intimité (Repro +5%).
### Impact Mort
N/A
**Froid** : Neige + Nuit = Danger mortel.
### Impact Nourriture
N/A
**Pousse** : Pluie = Herbe pousse plus vite.
### Impact Attractivité (Visiteurs/Animaux)
Voir liste ci-dessus.
| Météo | Modificateur visiteurs | Notes |
|---|---:|---|
| Ensoleillé | +10% | Confort. |
| Nuageux | 0% | Neutre. |
| Pluvieux | -15% | Sans abris, départs plus rapides. |
| Orage | -30% | Peur, incidents. |
| Neige | -20% | Froid, sauf événements. |
| Canicule | -10% | Sauf glaces/ombre (boutiques). |
### Impact Valeur
N/A
**Ventes** : Parapluies vs Glaces.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
@@ -67,7 +81,7 @@ N/A
**Pluie** : Augmente vente parapluies/abris.
### Trajet Visiteurs
N/A
**Abri** : Les visiteurs courent se mettre à l'abri s'il pleut.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -75,11 +89,20 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
**Machine Météo** (Endgame) :
| Niveau | Effet |
| :--- | :--- |
| 1 | Déclenche Pluie |
| 2 | Déclenche Soleil |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateWeather(world):
if random() < changeChance:
world.weather = pickNewWeather(world.season)
applyWeatherEffects(world)
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
@@ -88,22 +111,31 @@ N/A
# 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)
### Ambiance Météo (Passif)
**Description UX** : Le joueur ressent la météo actuelle.
**Description UI** : Overlay plein écran (Pluie, Neige, Rayons soleil). Nuages qui passent (ombres).
**Emplacement** : Écran entier.
**Intégration** : Layer FX.
**Navigation** : N/A
**Navigation** : Auto.
**Événements** : `WEATHER_FX`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Bruit de pluie relaxant.
- **Sons** : Pluie, Vent, Tonnerre.
- **Graphiques** : Particules Pluie/Neige.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône Météo HUD.
- **Vidéos** : Éclairs (Flash).
- **Animations** : Chute particules.
- **Couleurs** : Teinte Bleue (Nuit/Pluie), Jaune (Soleil).
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Il pleut".
- **Formes** : Gouttes.

View File

@@ -24,77 +24,107 @@
Table statique (Reference Data).
### Caractéristiques Initiales
Voir liste ci-dessus.
| Milieu | Couleur | T° base (°C) | Walkable | Notes |
|---|---|---:|---|---|
| Prairie Tendre | Vert clair | 20 | Oui | Biome neutre de départ. |
| Forêt Dense | Vert foncé | 18 | Oui | Bonus ombre (été). |
| Savane | Jaune/Ocre | 28 | Oui | Favorise espèces chaudes. |
| Désert | Sable | 38 | Oui | Coût eau élevé. |
| Plage | Beige | 30 | Oui | Transition océan. |
| Océan Surface | Bleu clair | 22 | Non (sans pont) | Aquatique. |
| Océan Profond | Bleu foncé | 10 | Non | Infranchissable, pont interdit si “profond”. |
| Récif | Corail | 24 | Non (sans pont) | Visuel riche, attractivité. |
| Montagne Basse | Gris vert | 12 | Oui | Ralentit camions. |
| Roche | Gris | 8 | Oui | Froid, peu fertile. |
| Sommet Enneigé | Blanc | -5 | Oui | Hiver permanent. |
| Volcanique | Noir/Rouge | 45 | Oui | Danger chaleur. |
| Marécage | Vert boue | 16 | Oui | Boue, maladies. |
| Toundra | Bleu gris | 0 | Oui | Froid, adapté polaire. |
| Jungle | Vert saturé | 32 | Oui | Humidité, croissance. |
### Scores Initiaux
N/A
**Surface** : 0 cases.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
Génération carte ou Terraformation.
### Conditions de Disparition
N/A
Terraformation (Remplacement).
### Hérédité
N/A
**Mémoire** : Le sol garde des traces de l'ancien biome (fertilité).
## 3. Impacts Environnementaux
### Impact Température
Chaque milieu a une T° par défaut.
**Base** : Chaque milieu a une T° de base.
### Impact Milieu (Biome)
N/A
**Voisinage** : Bonus si adjacent à un biome compatible.
### Impact Saisons
N/A
**Visuel** : Changement de texture selon saison.
### Impact Heure / Jour-Nuit
N/A
**Visuel** : Assombrissement.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Compatibilité** : Requise pour reproduction optimale.
### Impact Mort
N/A
**Incompatibilité** : Stress mortel si mauvais biome.
### Impact Nourriture
N/A
**Production** : Certains biomes produisent de la nourriture (Herbe).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Diversité** : Bonus si zoo varié.
### Impact Valeur
N/A
**Coût** : Prix de terraformation variable.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Terrain** : Vitesse déplacement variable.
### Dépenses (Boutiques/Visiteurs)
N/A
**Entretien** : Coût variable (Eau pour Désert).
### Trajet Visiteurs
N/A
**Obstacle** : Eau/Montagne infranchissable.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Modification** : Changement de biome.
## 7. Progression
### Tableau des Upgrades
N/A
Voir `achat_upgrade_case.md`.
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function getBiomeEffect(biome):
return biomeEffects[biome.id]
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `BIOME_SELECTED` | Info | "Biome sélectionné." |
# 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)
### Palette Biome (Consultation)
**Description UX** : Le joueur consulte la liste des biomes disponibles pour terraformer.
@@ -105,12 +135,12 @@ N/A
**Événements** : `SELECT_BIOME`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Sons d'ambiance nature (boucle).
- **Sons** : `select.mp3`.
- **Graphiques** : Carrés de texture.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Photos paysage (référence).
- **Vidéos** : Survol drone du biome.
- **Animations** : Texture animée (Eau, Herbe).
- **Couleurs** : Palette 15 couleurs.
- **Textes** : Noms des milieux.
- **Formes** : Carrés.

View File

@@ -2,7 +2,7 @@
## Liste des Incidents
1. **Soif** : "J'ai soif !" -> Nécessite un stand de boisson ou une boutique proche.
2. **Fatigue** : "J'ai mal aux pieds..." -> Nécessite un banc.
2. **Fatigue** : "J'ai mal aux pieds" -> Nécessite un banc.
3. **Saleté** : "C'est sale ici !" -> Nécessite un nettoyage (clic) ou une poubelle.
4. **Frustration** : "On ne voit rien !" -> Animal trop loin ou caché.
5. **Envie** : "Je veux une peluche !" -> Nécessite une boutique de souvenirs.
@@ -15,10 +15,10 @@
Table statique.
### Caractéristiques Initiales
N/A
**Compteur Incidents** : 0.
### Scores Initiaux
N/A
**Satisfaction Moyenne** : 50%.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -28,46 +28,46 @@ Aléatoire sur Visiteur.
Résolution ou Départ visiteur.
### Hérédité
N/A
**Réputation** : Si beaucoup d'incidents non résolus, la réputation baisse durablement.
## 3. Impacts Environnementaux
### Impact Température
**Canicule** : Augmente probabilité "Soif".
### Impact Milieu (Biome)
N/A
**Boue** : Augmente probabilité "Saleté" sur biome Terre/Marais.
### Impact Saisons
N/A
**Pluie** : Augmente "Inconfort" (si pas de parapluie).
### Impact Heure / Jour-Nuit
N/A
**Nuit** : Augmente "Peur" (si pas de lumière).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Calme** : Les visiteurs bruyants (incidents) dérangent la reproduction (-5%).
### Impact Mort
N/A
**Choc** : Voir un animal mort crée un incident "Traumatisme".
### Impact Nourriture
N/A
**Faim** : Incident "J'ai faim".
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Plaintes** : Trop d'incidents = Baisse Attractivité.
### Impact Valeur
N/A
**Remboursement** : Un visiteur très mécontent peut demander le remboursement.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Départ** : Un visiteur avec un incident non résolu marche plus vite vers la sortie.
### Dépenses (Boutiques/Visiteurs)
N/A
**Opportunité** : Résoudre un incident (ex: Soif) génère souvent une vente.
### Trajet Visiteurs
N/A
**Détour** : Le visiteur cherche le bâtiment adéquat pour résoudre son problème.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -76,17 +76,36 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
**Formation Staff** :
| Niveau | Effet |
| :--- | :--- |
| 1 | Résolution auto lente |
| 2 | Résolution auto rapide |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function checkVisitorNeeds(visitor):
if visitor.thirst > 80:
createIncident(visitor, "THIRST")
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `INCIDENT_ALERT` | Warning | "Un visiteur se plaint !" |
# 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)
### Bulles d'Incidents (Action)
**Description UX** : Voir `visiteur.md`.
@@ -97,12 +116,12 @@ N/A
**Événements** : `INCIDENT_ICON`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Brouhaha de foule.
- **Sons** : Variés selon incident (Bruit eau, Bâillement).
- **Graphiques** : Set d'icônes vectorielles.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Emotes.
- **Vidéos** : Animation de la bulle (pop).
- **Animations** : Pop.
- **Couleurs** : Noir sur Blanc.
- **Textes** : N/A
- **Textes** : "J'ai soif !".
- **Formes** : Bulle.

View File

@@ -17,15 +17,18 @@
"objective_type": "string",
"target_value": "int",
"reward_coins": "int",
"is_completed": "boolean"
"is_completed": "boolean",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
**Quêtes actives** : 3.
### Scores Initiaux
N/A
**Points de Quête** : 0.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -35,46 +38,46 @@ Reset quotidien (Minuit serveur).
Complétion ou Reset.
### Hérédité
N/A
**Série** : Bonus de connexion quotidienne (Streak).
## 3. Impacts Environnementaux
### Impact Température
N/A
**Quête Météo** : "Vendre 10 glaces pendant une canicule".
### Impact Milieu (Biome)
N/A
**Quête Biome** : "Avoir 50% de cases Océan".
### Impact Saisons
N/A
**Quête Saisonnière** : "Planter 10 arbres en Automne".
### Impact Heure / Jour-Nuit
N/A
**Quête Nocturne** : "Observer un animal nocturne".
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Quête Naissance** : "Faire naître un animal Rare".
### Impact Mort
N/A
**Quête Deuil** : "Honorer un animal disparu" (Planter un arbre).
### Impact Nourriture
N/A
**Quête Stock** : "Avoir 1000 unités de nourriture".
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Quête Popularité** : "Atteindre 100 Attractivité".
### Impact Valeur
N/A
**Quête Richesse** : "Avoir 10.000 pièces en banque".
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Quête Livraison** : "Livrer 5 animaux en moins de 10 minutes".
### Dépenses (Boutiques/Visiteurs)
N/A
**Quête Investissement** : "Dépenser 5000 pièces".
### Trajet Visiteurs
N/A
**Quête Flux** : "Optimiser le chemin vers les Lions".
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -82,11 +85,22 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
**Journal de Quêtes** :
| Niveau | Effet |
| :--- | :--- |
| 1 | 3 Quêtes / jour |
| 2 | 5 Quêtes / jour |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function checkQuests(player, action):
for quest in player.quests:
if quest.type == action.type:
quest.progress += action.value
if quest.progress >= quest.target:
completeQuest(quest)
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
@@ -95,6 +109,15 @@ N/A
# 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)
### Suivi Quêtes (Permanent)
**Description UX** : Le joueur voit ses objectifs en cours.
@@ -105,11 +128,11 @@ N/A
**Événements** : `QUEST_UPDATE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Jingle victoire.
- **Sons** : `quest_complete.mp3`.
- **Graphiques** : Icône Parchemin.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Coffre au trésor (Récompense).
- **Vidéos** : Ouverture du coffre.
- **Animations** : Flash vert à la complétion.
- **Couleurs** : Blanc (En cours), Vert (Fini).
- **Textes** : Titre Quête, Progression.

View File

@@ -52,10 +52,10 @@ Chaque saison dure un nombre défini de jours de jeu (ex: 7 jours réels ou 30 j
Table statique.
### Caractéristiques Initiales
N/A
**Saison Départ** : Printemps.
### Scores Initiaux
N/A
**Jours écoulés** : 0.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -65,46 +65,64 @@ Cycle annuel fixe.
Fin de durée saison.
### Hérédité
N/A
**Calendrier** : Le jour de l'année est conservé entre les sessions.
## 3. Impacts Environnementaux
### Impact Température
Voir liste ci-dessus.
| Saison | Modificateur Global | Notes |
|---|---:|---|
| Printemps | +0°C | Référence neutre. |
| Été | +10°C | Peut déclencher canicule via météo. |
| Automne | -2°C | Accentue pluie/vent. |
| Hiver | -15°C | Peut déclencher neige/vague de froid via météo. |
### Impact Milieu (Biome)
N/A
**Adaptation** : Les biomes réagissent visuellement (Neige sur Montagne en Hiver).
### Impact Saisons
N/A
**Cycle** : Définit la saison suivante.
### Impact Heure / Jour-Nuit
N/A
**Durée Jour** : Plus long en Été, plus court en Hiver.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
Voir liste ci-dessus.
| Saison | Modificateur | Condition |
|---|---:|---|
| Printemps | +20% | Bonus général (sauf espèces “solitaires” si définies). |
| Été | +0% | Neutre. |
| Automne | +0% | Neutre. |
| Hiver | -50% | Sauf espèces adaptées au froid (cf. `inventaire_milieux.md`). |
### Impact Mort
Voir liste ci-dessus.
| Saison | Risque additionnel | Condition |
|---|---:|---|
| Été | +10% | Pour espèces froides si pas de régulation. |
| Hiver | +20% | Pour espèces tropicales si pas de régulation. |
### Impact Nourriture
N/A
**Disponibilité** : Fruits abondants en Été (Prix bas), rares en Hiver (Prix haut).
### Impact Attractivité (Visiteurs/Animaux)
Voir liste ci-dessus.
| Saison | Modificateur visiteurs | Notes |
|---|---:|---|
| Printemps | x1.0 | Standard. |
| Été | x1.5 | Vacances. |
| Automne | x0.8 | Pluie/vent. |
| Hiver | x0.6 | Froid, sauf événements spéciaux. |
### Impact Valeur
N/A
**Offre/Demande** : Prix des glaces x2 en Été.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Météo** : Risque de tempête en Automne (Ralentissement).
### Dépenses (Boutiques/Visiteurs)
N/A
**Chauffage** : Coût en Hiver. **Clim** : Coût en Été.
### Trajet Visiteurs
N/A
**Préférence** : Les visiteurs restent en intérieur (Boutiques) s'il pleut/neige.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -112,35 +130,55 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
**Prévisions Météo** (Centre Recherche) :
| Niveau | Effet |
| :--- | :--- |
| 1 | Prévision à 1 jour |
| 2 | Prévision à 3 jours |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateSeason(world):
world.day++
if world.day > SEASON_LENGTH:
world.season = nextSeason(world.season)
world.day = 0
emitEvent("SEASON_CHANGE")
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| 3 | Prévision à 7 jours |
| `SEASON_CHANGE` | Info | "C'est le [Saison] !" |
# 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)
### Ambiance Saisonnière (Passif)
**Description UX** : Le décor change selon la saison.
**Description UI** : Tilesets modifiés (Herbe verte -> Herbe jaune -> Feuilles mortes -> Neige).
**Emplacement** : Grille Zoo.
**Intégration** : Assets graphiques.
**Navigation** : N/A
**Navigation** : Auto.
**Événements** : `SEASON_VISUAL_UPDATE`.
#### Assets
- **Musiques** : Thèmes saisonniers (Vivaldi remix ?).
- **Musiques** : Thèmes saisonniers (Vivaldi remix)..
- **Sons** : Vent hivernal, Oiseaux printemps.
- **Graphiques** : 4 variantes de chaque Tile.
- **Images** : Icône Saison HUD.
- **Vidéos** : N/A
- **Vidéos** : Pluie/Neige (Overlay).
- **Animations** : Feuilles qui tombent (Automne).
- **Couleurs** : Vert, Jaune, Orange, Blanc.
- **Textes** : "Printemps", "Été", etc.
- **Formes** : N/A
- **Formes** : Icône Soleil/Flocon.

View File

@@ -0,0 +1,61 @@
# Inventaire Skins
## 1. Définition
Interface de gestion permettant au joueur de visualiser, trier et équiper les éléments cosmétiques (skins) acquis pour son avatar ou son zoo. Il gère les pièces de skins unitairement.
## 2. Fonctions
* **Stockage :** Centralise tous les skins (têtes, corps, accessoires, décors).
* **Équipement :** Permet d'appliquer un skin à l'avatar ou de sélectionner un skin par défaut pour les bâtiments.
* **Visualisation :** Affiche les items possédés et ceux manquants (grisés).
## 3. Icone
* **Représentation :** Coffre ouvert ou Cintre.
* **Couleur dominante :** Marron (cuir) et Or.
## 4. Interactions
* **Ouverture :** Depuis le menu profil ou la boutique.
* **Filtrage :** Par catégorie (Chapeaux, T-shirts, Zoo), par thème (Jungle, Espace) ou par rareté.
* **Sélection :** Clic sur un item pour voir les détails et le bouton "Équiper".
## 5. Annexes Techniques
### Données (JSON)
```json
{
"inventory_id": "inv_skins_player_123",
"items": [
{
"item_id": "skin_hat_01",
"acquired_date": "2026-03-01",
"is_equipped": true
},
{
"item_id": "skin_shirt_05",
"acquired_date": "2026-03-02",
"is_equipped": false
}
],
"capacity": "unlimited" // Ou valeur numérique si limite
}
```
### Règles Métier
* L'inventaire sépare les skins d'avatar des skins de zoo.
* Impossible de vendre ou supprimer un skin (sauf si fonctionnalité de recyclage prévue).
* Mise à jour en temps réel lors d'un achat ou d'un gain.
## 6. Annexes UX/UI
* **Grille :** Affichage des items sous forme de grille scrollable.
* **Paper Doll :** Prévisualisation de l'avatar au centre ou sur le côté avec les équipements actuels.
* **Drag & Drop :** (Optionnel) Glisser un item sur la prévisualisation pour l'équiper.
# 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.

View File

@@ -16,93 +16,112 @@
Table statique.
### Caractéristiques Initiales
N/A
**T° Moyenne** : 20°C.
### Scores Initiaux
N/A
**Record Chaud** : 20°C.
**Record Froid** : 20°C.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
Constante physique.
### Conditions de Disparition
N/A
**Jamais** : La température est toujours présente.
### Hérédité
N/A
**Climat** : Le climat de départ définit la plage de température moyenne.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Auto-référence** : Définit les états (Gel, Vapeur).
### Impact Milieu (Biome)
N/A
**Inertie** : L'eau change de T° moins vite.
### Impact Saisons
N/A
**Variation** : +10°C en Été, -10°C en Hiver.
### Impact Heure / Jour-Nuit
N/A
**Cycle** : +5°C le jour, -5°C la nuit.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Confort** : T° idéale requise.
### Impact Mort
N/A
**Extrêmes** : T° mortelle si hors tolérance.
### Impact Nourriture
N/A
**Conservation** : La nourriture pourrit vite si T° > 30°C.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Confort** : Visiteurs aiment 20-25°C.
### Impact Valeur
N/A
**Coût** : Maintenir une T° artificielle coûte cher.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Gel** : Verglas ralentit les camions.
### Dépenses (Boutiques/Visiteurs)
N/A
**Énergie** : Facture chauffage/clim.
### Trajet Visiteurs
N/A
**Ombre** : Recherche d'ombre si chaud.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Vague de Froid/Chaud** : Event temporaire.
## 7. Progression
### Tableau des Upgrades
N/A
**Chauffage Central** :
| Niveau | Effet |
| :--- | :--- |
| 1 | Rayon 5 cases |
| 2 | Rayon 10 cases |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function getTemp(case):
return baseTemp + seasonMod + dayMod + heaterMod
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| 7 | Rayon Global (Tout le Zoo) |
| `TEMP_CRITICAL` | Alerte | "Température critique !" |
# 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)
### Thermomètre (Consultation)
**Description UX** : Le joueur voit la température actuelle.
**Description UI** : Jauge verticale (Thermomètre) avec mercure rouge. Graduations colorées (Bleu bas, Rouge haut).
**Emplacement** : HUD ou Info Case.
**Intégration** : Widget.
**Navigation** : N/A
**Navigation** : Clic -> Détail.
**Événements** : `UPDATE_TEMP`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Bruit de vent glacé / Cigales.
- **Sons** : `shiver.mp3`.
- **Graphiques** : Sprite Thermomètre.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône Soleil/Flocon.
- **Vidéos** : Effet de chaleur (ondulation).
- **Animations** : Niveau qui monte/descend.
- **Couleurs** : Dégradé Bleu/Rouge.
- **Textes** : "20°C".
- **Formes** : N/A
- **Formes** : Jauge.

View File

@@ -34,7 +34,10 @@ L'utilisateur humain.
"settings": {
"music_enabled": "boolean",
"bot_profile_id": "integer"
}
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -46,7 +49,7 @@ L'utilisateur humain.
| Animaux | 3 couples (6 animaux) |
### Scores Initiaux
N/A
**Niveau Joueur** : 1.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -56,46 +59,57 @@ Inscription.
Suppression compte.
### Hérédité
N/A
**Héritage** : Le joueur garde son niveau et ses recherches après un reset.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Confort** : Le joueur doit gérer la température pour ses animaux.
### Impact Milieu (Biome)
N/A
**Stratégie** : Le joueur choisit les biomes à développer.
### Impact Saisons
N/A
**Planification** : Le joueur adapte sa stratégie aux saisons.
### Impact Heure / Jour-Nuit
N/A
**Gestion** : Le joueur gère les cycles d'ouverture.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
**Démarrage autonome** : Le joueur reçoit 3 couples reproducteurs basiques (Lapins/Poules/Canards selon biome) pour garantir une reproduction immédiate et alimenter le marché bas prix.
### Impact Mort
N/A
**Gestion Crise** : Le joueur doit réagir aux décès.
### Impact Nourriture
N/A
**Logistique** : Le joueur achète la nourriture.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Objectif** : Maximiser l'attractivité.
### Impact Valeur
N/A
**Finance** : Gérer le budget.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Domaine | Paramètre | Valeur | Unité | Règle |
|---|---|---:|---|---|
| Camion | Actions/minute | 6 | actions | Limite anti-spam côté UI (évite double-clic achats/ventes). |
| Nurserie | Ouverture panel | 250 | ms | Transition UI (snappy) pour boucles fréquentes. |
| Accueil | Placement animal | 1 | interaction | Tap-to-select → Tap-to-place en 1 geste (accessibilité). |
| Recherche | Lancement projet | 1 | clic | 1 clic depuis menu achats → centre recherche → projet. |
| Labo | Achat offre rare | 1 | drag/drop | Alternatif : tap offre → tap camion (mobile). |
| Visite | Pan/zoom | 60 | FPS | Cible de fluidité sur la carte isométrique. |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition | Impact |
|---|---:|---|---|---|
| Parking | 05 | pièces / visite | Selon politique du joueur | Ajuste satisfaction visiteurs et revenus. |
| Marketing | 05000 | pièces / action | Campagne publicitaire | Augmente affluence temporaire. |
| Skins / thèmes | 02000 | pièces / item | Achat cosmétique | Aucun impact gameplay (sauf attractivité visuelle si spécifié ailleurs). |
### Trajet Visiteurs
N/A
**Design** : Le joueur trace les routes.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -104,11 +118,18 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Avantage |
| :--- | :--- | :--- |
| 1 | 0 | Accès de base |
| 2 | 1000 | Accès statistiques avancées |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function playerAction(action):
if checkResources(action.cost):
execute(action)
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
@@ -118,6 +139,15 @@ N/A
# 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)
### HUD Principal (Permanent)
**Description UX** : Le joueur voit en permanence ses ressources et accès rapides.
@@ -128,11 +158,11 @@ N/A
**Événements** : `UI_CLICK`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_hud_ambience.mp3` (très léger, optionnel, volume 15%).
- **Sons** : `ui_click.mp3`.
- **Graphiques** : Style UI "Bois et Pierre" ou "Moderne Clean".
- **Images** : Icônes (Pièce, Fiole, Marteau, Carte).
- **Vidéos** : N/A
- **Vidéos** : `hud_counters_hint.webm` (micro-anim 1s, loop, optionnel sur tutoriel).
- **Animations** : Compteurs qui défilent quand gain/perte.
- **Couleurs** : Or, Bleu, Blanc.
- **Textes** : Chiffres, Labels menus.
@@ -147,12 +177,12 @@ N/A
**Événements** : `SAVE_PROFILE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_profile_open.mp3` (jingle court).
- **Sons** : `save_success.mp3`.
- **Graphiques** : Portraits de bots.
- **Images** : Avatars joueurs.
- **Vidéos** : N/A
- **Animations** : N/A
- **Couleurs** : N/A
- **Textes** : Description des bots ("Le Conservateur : Achète de la nourriture...").
- **Vidéos** : `profile_avatar_spin.webm` (aperçu rotation/pose, 2s, loop).
- **Animations** : Checkmark vert.
- **Couleurs** : Bleu UI.
- **Textes** : Description des bots ("Le Conservateur : Achète de la nourriture, évite les risques").
- **Formes** : Cartes de sélection.

View File

@@ -1,118 +1,385 @@
# Spécifications : Laboratoire (Site)
## Définition
Un laboratoire est un point d'intérêt spécial sur la Carte du Monde (POI).
Un laboratoire est un point d'intérêt spécial sur la Carte du Monde (POI) dédié à la recherche avancée et à l'obtention de spécimens rares. Il permet au joueur d'accéder à des animaux génétiquement modifiés ou disparus, ainsi qu'à des technologies de pointe pour son zoo.
## Fonction
- **Offres Spéciales** : Propose périodiquement des œufs ou bébés animaux rares.
- **Prix Fixe** : Contrairement aux zoos, les ventes du laboratoire sont souvent à prix fixe, sans enchères (ou règles spécifiques).
- **Icône** : 🔬
## Fonctions
| Fonction | Description | Entrées | Sorties |
|---|---|---|---|
| Offres Spéciales | Propose périodiquement des œufs ou bébés animaux rares, souvent introuvables ailleurs. | Argent, Réputation | Animal Rare (Œuf/Bébé) |
| Analyse Génétique | Permet d'analyser l'ADN d'un animal pour découvrir ses traits cachés ou potentiels de mutation. | Échantillon (Animal), Argent | Rapport Génétique complet |
| Synthèse | Création d'animaux à partir de fragments d'ADN collectés (feature avancée). | Fragments ADN, Argent, Temps | Nouvel Animal (Clone) |
## Interaction
- **Achat** : Glisser l'offre du laboratoire vers le camion du joueur.
## Icone de base
Microscope stylisé bleu néon sur fond sombre, évoquant la haute technologie.
# Annexes Techniques
## Interactions
| Acteur A | Action | Acteur B | Résultat |
|---|---|---|---|
| Joueur | Cliquer | Laboratoire | Ouvre l'interface des offres et services du labo. |
| Joueur | Glisser-Déposer | Offre (Animal) vers Camion | Achète l'animal et lance le transport vers le zoo. |
| Joueur | Sélectionner | Animal du Zoo | Lance une analyse génétique (si le labo est débloqué). |
## 1. Données et États
### Modèle de Données (JSON)
```json
{
"id": "uuid",
"type": "lab",
"current_offer": { "animal_type": "string", "rarity": "int", "price": "int", "expires_at": "timestamp" }
}
```
## Annexes Techniques
### Caractéristiques Initiales
N/A
### 1. Données et États
### Scores Initiaux
N/A
#### Caractéristiques Initiales
| Caractéristique | Valeur Initiale | Type | Description |
|---|---|---|---|
| Niveau Tech | 1 | Entier | Niveau technologique du labo, débloquant des offres plus rares. |
| Slots Offres | 3 | Entier | Nombre d'animaux proposés simultanément. |
| Réputation Requise | 500 | Entier | Score de réputation minimum pour accéder au labo. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération carte.
#### Scores Initiaux
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---|---|---|
| Fiabilité | 90% | 0-100% | Probabilité de succès des synthèses ou analyses sans erreur. |
| Prestige | 10 | 0-100 | Influence la rareté des animaux proposés (plus haut = plus rare). |
### Conditions de Disparition
N/A
### 2. Cycles de Vie et Apparition
### Hérédité
N/A
#### Conditions d'Apparition
| Condition | Seuil | Opérateur | Résultat |
|---|---|---|---|
| Exploration Carte | Zone "Ville" ou "Industrie" | Est | Le laboratoire est découvert sur la carte du monde. |
| Niveau Joueur | 5 | >= | Le laboratoire devient interactif. |
## 3. Impacts Environnementaux
### Impact Température
N/A
#### Conditions de Disparition
| Condition | Seuil | Opérateur | Résultat |
|---|---|---|---|
| Événement "Faillite Labo" | Aléatoire | Est | Le laboratoire ferme temporairement (24h). |
| Offre Expirée | 24h | > | L'offre d'animal est remplacée par une nouvelle. |
### Impact Milieu (Biome)
N/A
#### Hérédité
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---|---|
| Animal Cloné | Traits Génétiques | 99% | Oui (1% instabilité génétique) |
| Animal Analysé | Aucun | 0% | Non (Analyse non invasive) |
### Impact Saisons
N/A
### 3. Impacts Environnementaux
### Impact Heure / Jour-Nuit
N/A
#### Impact Température
| Plage Température | Effet sur l'entité | Bonus/Malus |
|---|---|---|
| < 0°C | Ralentissement des machines (synthèse) | Durée +20% |
| > 35°C | Surchauffe des serveurs (analyse) | Coût Énergie +15% |
| 20°C (Optimal) | Fonctionnement optimal | Vitesse +5% |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
#### Impact Milieu (Biome)
| Biome | Compatibilité | Bonus/Malus |
|---|---|---|
| Urbain | 100% | Aucun (Emplacement standard) |
| Toundra | 80% | Coût maintenance +10% (Chauffage) |
| Désert | 70% | Coût maintenance +20% (Climatisation) |
### Impact Mort
N/A
#### Impact Saisons
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | Recherche sur animaux polaires favorisée | Rareté Animaux Froids +10% |
| Été | Recherche sur animaux tropicaux favorisée | Rareté Animaux Chauds +10% |
| Printemps | Pic de naissances (offres bébés) | Nombre Offres +1 |
| Automne | Analyse de maladies (prévention) | Coût Analyse -10% |
### Impact Nourriture
N/A
#### Impact Heure / Jour-Nuit
| Période | Activité | Visibilité |
|---|---|---|
| Jour (08h-20h) | Ouvert au public (visites scolaires) | Haute (Enseignes allumées) |
| Nuit (20h-08h) | Recherche intensive (offres "sombres") | Basse (Lumières tamisées) |
### Impact Attractivité (Visiteurs/Animaux)
N/A
### 4. Impacts Biologiques et Sociaux
### Impact Valeur
N/A
#### Impact Reproduction
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Fertilité Assistée | +20% | Si recherche "Fécondation In Vitro" débloquée |
| Clonage | Reproduction Naturelle = 0%, Production par Synthèse = 100% | Si l'espèce est éteinte ou si loption \"Synthèse\" est utilisée au lieu dun cycle de reproduction |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
**Rotation Offres** : 1 offre toutes les 4h à 24h.
#### Impact Mort
| Cause | Conséquence | Durée |
|---|---|---|
| Échec Synthèse | Perte des fragments ADN | Instantané |
| Accident Labo | Fermeture temporaire pour décontamination | 48h |
### Dépenses (Boutiques/Visiteurs)
N/A
#### Impact Nourriture
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---|---|---|
| Nutriments Synthétiques | +50 (pour clones) | 200$ / dose | 5 (Indispensable pour clones) |
| Nourriture Standard | +10 (pour clones) | 50$ / kg | 1 (Mal digéré par clones) |
### Trajet Visiteurs
N/A
#### Impact Attractivité Visiteurs
| Action/État | Gain Attractivité | Rayon d'action |
|---|---|---|
| Découverte Espèce Éteinte | +500 (Global Zoo) | Monde entier (Buzz médiatique) |
| Visite du Labo (si module) | +20 | 10m autour du bâtiment |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Nouvelle Offre Rare** : Notification globale ou locale.
#### Impact Attractivité Animaux
| Espèce | Interaction | Effet Stress |
|---|---|---|
| Toutes | Prélèvement ADN | +10 (Stress léger) |
| Clones | Retour à la vie sauvage | +50 (Stress fort, inadapté) |
## 7. Progression
### Tableau des Upgrades
N/A
#### Impact Valeur
| Facteur | Variation Prix | Condition |
|---|---|---|
| Rareté Génétique | +200% | Si l'animal a des traits "Légendaires" |
| Défaut de Clonage | -50% | Si l'animal a le trait "Instable" |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
### 5. Impacts Logistiques et Économiques
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `LAB_OFFER` | Info | "Le laboratoire propose un spécimen rare !" |
#### Vitesse (Camion)
| Type Route | Vitesse Max | Consommation |
|---|---|---|
| Autoroute (vers Labo) | 110 km/h | 10 L/100 |
| Piste (accès difficile) | 30 km/h | 20 L/100 |
# Annexes UX/UI
#### Vitesse (Nurserie)
| Action | Durée de base | Réduction par Upgrade |
|---|---|---|
| Incubation Œuf Rare | 72h | -10% par niveau d'incubateur |
| Soin Post-Clonage | 24h | -5% par niveau de vétérinaire |
## 1. Expérience Utilisateur (UX)
### Offre Rare (Passif)
**Description UX** : Le laboratoire a un stock spécial.
**Description UI** : Halo brillant autour du labo. Icône "!" ou "ADN".
**Emplacement** : Carte Monde.
**Intégration** : Effet visuel.
**Navigation** : N/A
**Événements** : `LAB_GLOW`.
#### Vitesse (Accueil)
| Flux | Visiteurs/Minute | Capacité Max |
|---|---|---|
| Entrée Labo (Visite) | 5 | 50 (Groupe restreint) |
#### Assets
- **Musiques** : N/A
- **Sons** : `sci_fi_hum.mp3`.
- **Graphiques** : Halo bleu néon.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Pulsation.
- **Couleurs** : Bleu électrique / Violet.
- **Textes** : N/A
- **Formes** : N/A
#### Vitesse (Recherche)
| Projet | Durée (Jours) | Coût Accélération |
|---|---|---|
| Séquençage ADN | 2 jours | 1000$ |
| Résurrection Mammouth | 30 jours | 50,000$ |
#### Vitesse (Labo)
| Analyse | Durée | Fiabilité |
|---|---|---|
| Test Paternité | 1h | 99.9% |
| Dépistage Maladies | 4h | 95% |
#### Vitesse (Visite)
| Zone | Temps Moyen | Facteur Ralentissement |
|---|---|---|
| Hall d'exposition | 15 min | Si guide présent (+10 min) |
#### Dépenses (Billeterie)
| Poste | Coût Hebdo | Maintenance |
|---|---|---|
| Guichet Spécial Labo | 500$ | 50$ |
#### Dépenses (Boutiques)
| Article | Coût Achat | Marge |
|---|---|---|
| Kit Petit Chimiste | 20$ | 40% |
| Peluche Dinosaure | 15$ | 60% |
#### Dépenses (Visiteurs)
| Type Dépense | Montant Moyen | Fréquence |
|---|---|---|
| Don pour la Recherche | 10$ | 1 visiteur sur 20 |
| Ticket Visite Guidée | 25$ | 1 visiteur sur 10 |
#### Dépenses (Employés)
| Rôle | Salaire | Prime |
|---|---|---|
| Généticien | 3000$ / mois | +500$ par découverte majeure |
| Agent de Sécurité | 1800$ / mois | Aucune |
#### Dépenses (Nurseries)
| Soin | Coût Matériel | Coût Personnel |
|---|---|---|
| Suivi Clonage | 500$ / jour | 200$ / jour |
#### Dépenses (Nourriture)
| Type | Prix/Kg | Fournisseur |
|---|---|---|
| Gel Nutritif | 100$ | LaboCorp |
#### Dépenses (Acceuil des animaux)
| Installation | Coût Construction | Entretien |
|---|---|---|
| Enclos Stérile | 10,000$ | 500$ / semaine |
#### Dépenses (Camion)
| Trajet | Coût Essence | Usure |
|---|---|---|
| Zoo <-> Labo (50km) | 50$ | 2% |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville
| Moyen Transport | Temps | Coût | Fréquence |
|---|---|---|---|
| Navette Scientifique | 30 min | 5$ | 1/h |
##### Trajet Visiteurs vers/depuis les animaux
| Chemin | Distance | Attrait |
|---|---|---|
| Tunnel Vitré | 50m | 8/10 (Vue sur labo) |
##### Trajet Visiteurs vers/depuis les boutiques
| Emplacement | Détour Moyen | Taux de Conversion |
|---|---|---|
| Sortie Labo | 0m (Passage obligé) | 30% |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo)
| Flux | Temps Attente | Saturation |
|---|---|---|
| Entrée VIP Labo | 0 min | 10% |
### 6. Événements
#### Événements du Jeu
| Event | Déclencheur | Effet Global | Durée |
|---|---|---|---|
| Découverte Majeure | Aléatoire (1/an) | Attractivité Science +20% | 1 mois |
| Fuite de Spécimen | Sécurité < 20% | Panique (Visiteurs partent) | Jusqu'à capture |
#### Événements du Carte
| Event | Lieu | Impact Zone |
|---|---|---|
| Conférence Science | Ville voisine | Hôtels complets, affluence +10% |
#### Événements du Zoo
| Event | Cible | Conséquence |
|---|---|---|
| Mutation Spontanée | Animal en gestation | Naissance d'un variant rare |
#### Événements du Ville / Visiteur
| Event | Impact Affluence | Impact Budget |
|---|---|---|
| Manifestation Anti-Clonage | -15% | Sécurité +10% (Coût) |
#### Événements du Visiteur
| Action | Satisfaction | Besoin |
|---|---|---|
| Voir un clone | +20 (Émerveillement) | Éducation |
| Voir une expérience ratée | -30 (Dégoût) | Sécurité |
#### Événements du Joueur
| Action | Coût Action | Gain XP |
|---|---|---|
| Financer Recherche | 10,000$ | +500 XP Science |
### 7. Progression
#### Tableau des Upgrades
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---|---|---|
| Labo Niv 1 | 50,000$ | Zoo Niv 3 | Analyses simples, Offres standards |
| Labo Niv 2 | 150,000$ | Labo Niv 1 | Séquençage ADN, Offres Rares |
| Labo Niv 3 | 500,000$ | Labo Niv 2 | Clonage, Offres Légendaires |
### 8. Logique et Interfaces
#### Pseudo-code Impacts
| Algorithme | Entrées | Logique Simplifiée | Sortie |
|---|---|---|---|
| Calcul Succès Clonage | Fiabilité Labo, Rareté Animal | `Succès = Fiabilité - (Rareté * 5)` | Booléen (Réussite/Échec) |
| Génération Offre | Niveau Labo, Seed Aléatoire | `Rareté = Rand(1, Niveau * 2)` | Animal proposé |
#### Messages d'Infos / Alerte
| Type | Message | Condition | Priorité |
|---|---|---|---|
| Info | "Le laboratoire propose un spécimen rare !" | Nouvelle offre générée | 3 |
| Warn | "Échec de la synthèse génétique." | Synthèse ratée | 4 |
| Error | "Alerte de sécurité au laboratoire !" | Fuite ou Intrusion | 5 (Max) |
## 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)
#### Description UX
| Étape Utilisateur | Action Attendue | Feedback Système |
|---|---|---|
| Notification Offre | Clic sur notif | Caméra centre sur Labo + Halo |
| Consultation Offres | Clic sur Labo | Ouverture Modal "Offres du Labo" |
| Achat Animal | Drag & Drop vers Camion | Son "Validation", Animation particule ADN |
#### Description UI
| Élément | Type (Bouton/Panel) | Contenu | État par défaut |
|---|---|---|---|
| Panel Labo | Fenêtre Modale | Liste animaux, Stats Labo | Caché |
| Bouton Synthèse | Bouton Action | Icône éprouvette | Grisé (si pas de fragments) |
#### Emplacement
| Élément | Position | Ancrage | Z-Index |
|---|---|---|---|
| Notif Labo | Haut Droite | Top-Right | 100 |
| Modal Labo | Centre Écran | Center | 200 |
#### Intégration
| Composant Parent | Contraintes | Responsive |
|---|---|---|
| HUD Principal | Max 80% largeur écran | Oui |
#### Navigation
| De l'écran | Vers l'écran | Transition | Trigger |
|---|---|---|---|
| Carte Monde | Vue Labo | Zoom fluide | Clic Batiment |
| Vue Labo | Carte Monde | Dezoom | Bouton Fermer |
#### Événements
| Input Utilisateur | Action Système | Son | Animation |
|---|---|---|---|
| Hover Offre | Affiche Tooltip Détails | `hover_tech.mp3` | Scale 1.05 |
| Clic Achat | Débite argent, ajoute animal | `buy_success.mp3` | Flash vert |
#### Assets Skinables
##### Musiques
| Piste | Contexte | Loop | Volume |
|---|---|---|---|
| `lab_ambient.mp3` | Vue intérieure Labo | Oui | 40% |
##### Sons
| SFX | Trigger | Priorité |
|---|---|---|
| `sci_fi_hum.mp3` | Ambiance fond | Basse |
| `dna_scan.mp3` | Analyse terminée | Haute |
##### Graphiques
| Asset | Format | Résolution |
|---|---|---|
| `icon_lab.png` | PNG | 128x128 |
| `bg_lab_interior.jpg` | JPG | 1920x1080 |
##### Images
| Image | Usage | Alt Text |
|---|---|---|
| `dna_strand.png` | Décoration UI | "Brin d'ADN stylisé" |
##### Vidéos
| Clip | Usage | Durée |
|---|---|---|
| `cloning_process.mp4` | Cinématique succès | 5s |
##### Animations
| Nom | Cible | Durée | Type (CSS/JS) |
|---|---|---|---|
| `pulse_neon` | Bordures UI | 2000ms | CSS Keyframes |
##### Couleurs
| Code Hex | Usage | Sémantique |
|---|---|---|
| #00FFFF | Texte, Bordures | Technologie, Futur |
| #202040 | Fond Panel | Mystère, Science |
##### Textes
| Clé i18n | Valeur FR | Valeur EN |
|---|---|---|
| `LAB_TITLE` | Laboratoire de Génétique | Genetics Lab |
| `BTN_SYNTHESIZE` | Synthétiser | Synthesize |
##### Formes
| Forme | Usage | Style Bordure |
|---|---|---|
| Hexagone | Icônes, Boutons | Solid 2px |

65
docs/specs/menu_achats.md Normal file
View File

@@ -0,0 +1,65 @@
# Menu Achats
## 1. Définition
Interface centralisée dédiée aux transactions utilisant la monnaie premium (pièces du zoo) ou standard, regroupant les employés, la nourriture spéciale, les skins et les améliorations. C'est le "hub" économique du joueur.
## 2. Fonctions
* **Catalogue :** Présente tous les articles achetables de manière organisée.
* **Transaction :** Gère la validation des achats et le débit des ressources.
* **Offres :** Peut afficher des promotions ou des packs (bundles).
## 3. Icone
* **Représentation :** Caisse enregistreuse ou Panier d'achat.
* **Couleur dominante :** Vert (billet) et Or (pièce).
## 4. Interactions
* **Accès :** Bouton principal dans la barre d'interface (HUD).
* **Navigation :** Onglets par catégorie (Animaux, Enclos, Employés, Déco, Spécial).
* **Achat Rapide :** Possibilité d'acheter en quantité (x1, x10).
## 5. Annexes Techniques
### Données (JSON)
```json
{
"shop_categories": [
{
"id": "employees",
"label": "Personnel",
"items": ["healer_01", "feeder_01", "security_01"]
},
{
"id": "consumables",
"label": "Nourriture Spéciale",
"items": ["food_boost_lion", "food_boost_monkey"]
}
],
"currency_balance": {
"coins": 1500,
"gems": 50
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Déblocage :** Certains articles ne sont visibles qu'à partir d'un certain niveau de zoo.
* **Stock :** Certains items peuvent être en quantité limitée (ex: offres du jour).
## 6. Annexes UX/UI
* **Design :** Fenêtre modale propre, avec de grandes icônes et des prix clairs.
* **Feedback Achat :** Animation de pièces qui volent vers le compteur total lors de la dépense.
* **Confirmation :** Pop-up de confirmation pour les achats coûteux (> 1000 pièces).
# 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.

View File

@@ -7,7 +7,7 @@ Le milieu représente l'environnement écologique d'une case, défini par sa cou
- **Prairie** (Tiers Gauche)
- **Océan** (Tiers Milieu)
- **Montagne** (Tiers Droite)
- *Note : D'autres milieux (Forêt, Désert...) peuvent être définis par des couleurs intermédiaires.*
- *Note : D'autres milieux (Forêt, Désert, Savane, Jungle, Marécage, Toundra, Volcanique) peuvent être définis par des couleurs intermédiaires.*
## Impact
- **Survie** : Chaque animal a un milieu de prédilection. Un écart trop important entre la couleur de la case et la couleur idéale de l'animal entraîne stress, maladie et mort.
@@ -24,7 +24,10 @@ Le milieu représente l'environnement écologique d'une case, défini par sa cou
"name": "string",
"color_hex": "string (#RRGGBB)",
"default_temperature": "float",
"fertility_bonus": "float"
"fertility_bonus": "float",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -36,17 +39,17 @@ Le milieu représente l'environnement écologique d'une case, défini par sa cou
| 9 | Montagne Basse | #A9A9A9 | 5°C |
### Scores Initiaux
N/A
**Dominance Biome** : % de la surface du zoo (ex: 30% Prairie).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération carte (fixe).
### Conditions de Disparition
N/A
**Terraformation** : Remplacement par un autre biome via upgrade.
### Hérédité
N/A
**Maîtrise** : Bonus de fertilité (+5%) sur les biomes maîtrisés dans une partie précédente.
## 3. Impacts Environnementaux
### Impact Température
@@ -63,37 +66,37 @@ Référence pour la compatibilité animale.
| Prairie | Moyenne |
### Impact Heure / Jour-Nuit
N/A
**Bioluminescence** : Certains biomes (Océan profond, Forêt magique) brillent la nuit.
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
**Bonus** : +10% fertilité si animal sur son biome exact.
### Impact Mort
N/A
**Décomposition** : Rapide en Jungle (Chaud/Humide), Lente en Toundra (Froid).
### Impact Nourriture
N/A
**Ressources** : La Jungle produit des fruits (1/jour), la Savane de l'herbe (1/jour). Le Désert ne produit rien.
### Impact Attractivité (Visiteurs/Animaux)
**Esthétique** : Un zoo avec des biomes variés est plus attractif (+5% par biome différent utilisé).
### Impact Valeur
N/A
**Coût Terrain** : Le Désert est moins cher à l'achat que la Prairie (Terres arides).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Terrain difficile** : Sable et Neige ralentissent les visiteurs (-30%).
### Dépenses (Boutiques/Visiteurs)
N/A
**Arrosage** : Coût élevé en Désert pour maintenir des plantes.
### Trajet Visiteurs
N/A
**Vue** : Les visiteurs aiment les panoramas (Montagne = Point de vue).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Floraison** : Le biome Prairie devient fleuri au printemps (+Attractivité).
## 7. Progression
### Tableau des Upgrades
@@ -105,13 +108,32 @@ N/A
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function checkBiomeCompatibility(animal, tile):
if animal.idealBiome == tile.biome:
return "PERFECT"
elif isAdjacent(animal.idealBiome, tile.biome):
return "OK"
else:
return "BAD"
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `BIOME_CHANGE` | Succès | "Le biome de la case a été modifié." |
# 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)
### Identification Visuelle (Passif)
**Description UX** : Le joueur identifie le biome à la couleur du sol.
@@ -119,15 +141,15 @@ N/A
**Textures** : Motifs discrets (brins d'herbe, cailloux, craquelures) superposés à la couleur pour l'accessibilité (daltonisme).
**Emplacement** : Fond de Case.
**Intégration** : Layer 0 (Background).
**Navigation** : N/A
**Navigation** : Survol Souris / Toucher Long.
**Événements** : `MAP_RENDER`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Ambiance sonore changeante selon biome survolé (Vent, Vagues, Forêt).
- **Sons** : Bruit de pas spécifique (Craquement, Sable, Herbe).
- **Graphiques** : Tilesets (15 variations de couleur/texture).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Vignettes de biomes pour l'éditeur.
- **Vidéos** : Fond animé de l'eau (shader).
- **Animations** : Eau qui ondule (Océan), Herbe qui bouge (Prairie).
- **Couleurs** : Palette 15 couleurs (Cercle chromatique).
- **Textes** : Tooltip "Biome : Prairie".
@@ -138,16 +160,16 @@ N/A
**Description UI** : L'herbe sous l'animal jaunit ou devient boueuse. L'animal a une bulle "Beurk".
**Emplacement** : Case Zoo.
**Intégration** : Overlay Case.
**Navigation** : N/A
**Navigation** : Auto (Détection).
**Événements** : `BIOME_MISMATCH`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Son "Malaise" (basse fréquence).
- **Sons** : Bruit de dégoût "Yuck".
- **Graphiques** : Overlay "Sol Mort".
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône "Sol incompatible" (Sens interdit).
- **Vidéos** : Effet de flétrissement (shader).
- **Animations** : Transition lente vers le jaune/marron.
- **Couleurs** : Jaune paille, Marron.
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Sol Inadapté !".
- **Formes** : Croix rouge sur le sol.

View File

@@ -17,71 +17,83 @@
Événement loggé.
### Caractéristiques Initiales
N/A
**Compteur Morts** : 0.
### Scores Initiaux
N/A
**Taux Mortalité Infantile** : 0%.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Voir Causes.
### Conditions de Disparition
N/A
**Oubli** : Le souvenir (et le malus) s'estompe après 7 jours in-game.
### Hérédité
N/A
**Traumatisme** : Les parents ont -50% fertilité pendant 1 semaine (Choc émotionnel).
## 3. Impacts Environnementaux
### Impact Température
Voir `bebe_animal.md`.
### Impact Milieu (Biome)
N/A
**Tombe** : Une petite stèle apparaît temporairement sur la case (décoratif, disparaît au clic).
### Impact Saisons
N/A
**Hiver rigoureux** : Cause fréquente de mortalité infantile (Froid).
### Impact Heure / Jour-Nuit
N/A
**Nuit glaciale** : Moment critique (baisse T°).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Deuil** : Pas de reproduction possible pour les parents pendant 24h.
### Impact Mort
N/A
**Effet domino** : Tristesse contagieuse aux animaux proches (Stress +10).
### Impact Nourriture
N/A
**Gaspillage** : La nourriture allouée au bébé est perdue (pourrit).
### Impact Attractivité (Visiteurs/Animaux)
**Malus** : -50 points de Réputation (temporaire 24h).
**Malus** : -50 points de Réputation (temporaire 24h). Les visiteurs pleurent.
### Impact Valeur
N/A
**Perte sèche** : Valeur potentielle (élevée) perdue définitivement.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Décomposition** : Le corps reste 1h avant de disparaître (Urgence sanitaire).
### Dépenses (Boutiques/Visiteurs)
N/A
**Frais d'équarrissage** : 10 pièces pour enlever le corps.
### Trajet Visiteurs
N/A
**Évitement** : Les visiteurs contournent la zone de mort (Rayon 2 cases).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Mort Bébé** : Notification critique.
* **Enterrement** : Animation de disparition.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Prévention via Infirmerie.*
| Niveau Infirmerie | Réduction Risque Mort |
| :--- | :--- |
| 1 | -10% |
| 2 | -20% |
| 3 | -50% |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function handleBabyDeath(baby):
zoo.reputation -= 50
baby.parents.forEach(p => p.fertilityMod = 0.5)
spawnGrave(baby.position)
notifyPlayer("BABY_DIED")
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
@@ -90,25 +102,34 @@ N/A
# 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)
### Drame (Événement)
**Description UX** : Le bébé meurt.
**Description UI** : Le sprite devient gris/fantôme puis disparaît (montée au ciel). Musique triste.
**Emplacement** : Case Zoo/Nurserie.
**Intégration** : Immédiat.
**Navigation** : N/A
**Navigation** : Auto (Cinématique).
**Événements** : `DEATH_ANIMATION`.
#### Assets
- **Musiques** : Jingle Triste (Violon).
- **Sons** : `gong.mp3` ou vent lugubre.
- **Graphiques** : Fantôme.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Pierre tombale (Sprite).
- **Vidéos** : Effet de pluie (Overlay).
- **Animations** : Opacité 100% -> 0%. Translation Y vers le haut.
- **Couleurs** : Gris, Noir.
- **Textes** : "RIP".
- **Formes** : N/A
- **Formes** : Halo sombre.
### Notification (Alerte)
**Description UX** : Le joueur est informé de la perte.
@@ -119,12 +140,483 @@ N/A
**Événements** : `DEATH_ACKNOWLEDGE`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Silence (Coupure son).
- **Sons** : Bruit de tonnerre lointain.
- **Graphiques** : Crâne (icône).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Portrait du bébé avec ruban noir.
- **Vidéos** : `death_alert_glitch.webm` (0.7s loop, optionnel), `black_ribbon_fade.webm` (1.2s non loop).
- **Animations** : Tremblement de la fenêtre.
- **Couleurs** : Noir #000000.
- **Textes** : Cause du décès.
- **Formes** : N/A
- **Formes** : Bordure noire épaisse.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Événement de décès dun animal au stade bébé, avec cause, conséquences (réputation, stress), et traces visuelles temporaires. |
| Rôle | Sanctionner les erreurs de gestion (nurserie pleine, conditions extrêmes), informer clairement le joueur, et déclencher des impacts sociaux/logistiques sans silence. |
| Portée | Un `animal_id` (bébé) + un contexte (zoo, emplacement iso) + une cause normalisée. |
| Contrainte | Pas de fallback silencieux : cause inconnue => log + erreur ; calculs à la volée, sans cache/mémorisation. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Détecter décès bébé | tick logique / action | `animal_id`, états | event décès | Mort si `health<=0` ou condition spéciale | Event `BABY_DIED` |
| Normaliser cause | au décès | signaux (nurserie pleine, temp, vente) | `cause_code` | Cause dans enum, sinon `UNKNOWN` + erreur | Log structuré `baby_death_unknown_cause` |
| Appliquer malus réputation | au décès | `cause_code` | réputation ↓ | Malus fort ; pondéré par visibilité visiteurs | Event `REPUTATION_CHANGED` |
| Appliquer stress proche | au décès | position iso | stress ↑ | Rayon 2 cases iso autour | Event `ANIMAL_STRESS_APPLIED` |
| Créer trace visuelle | au décès | position | stèle/fantôme | Trace TTL (ex. 1h) ; supprimable par clic | Event `GRAVE_SPAWNED` |
| Facturer enlèvement | au décès | - | coût | Coût fixe “équarrissage” si option active | Event `SANITATION_FEE_CHARGED` |
| Alerter joueur | au décès | cause + animal | notification | Modal dack obligatoire si critique | Event `UI_DEATH_ALERT_SHOWN` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Icône crâne + ruban noir, variante “bébé” (petit crâne) |
| Couleur dominante | Noir / gris |
| Variantes | `icon_baby_death.png`, `icon_grave.png` |
| États | `critique` (rouge), `info` (gris), `acknowledged` (ruban) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Voir détail décès | Consultation | événement présent | clic notif | panneau cause + impacts | - |
| Acknowledge modal | Action | modal affichée | clic OK | fermeture + trace possible | - |
| Retirer stèle | Action | trace visible | clic stèle | suppression trace | `GRAVE_NOT_FOUND` |
| Aller à lemplacement | Navigation | position connue | clic “Voir sur la carte” | caméra centre | `LOCATION_UNAVAILABLE` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `death_id` | uuid_v4 | `uuid_v4` | DB | identifiant event |
| `animal_id` | uuid_v4 | `uuid_v4` | DB | cible |
| `is_baby` | boolean | true | DB | invariant |
| `cause_code` | string | `NURSERY_FULL` | calcul | enum |
| `scope.zoo_id` | uuid_v4 | `uuid_v4` | DB | - |
| `location.iso_x` | int \| null | 120 | DB | null si nurserie (slot) |
| `location.iso_y` | int \| null | 88 | DB | null si nurserie (slot) |
| `location.nurserie_id` | uuid_v4 \| null | `uuid_v4` | DB | null si sur grille |
| `location.slot_id` | int \| null | 3 | DB | requis si nurserie |
| `effects.reputation_delta` | int | -50 | calcul | signé |
| `effects.stress_radius_tiles` | int | 2 | config | iso |
| `effects.cleanup_fee` | int | 10 | config | coins |
| `ttl.grave_seconds` | int | 3600 | config | suppression auto |
| `timestamps.created_at` | timestamp | - | DB | UTC |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Compteur morts bébés | 0 | count | par zoo |
| Frais enlèvement | 10 | coins | configurable |
| Durée trace | 3600 | s | stèle/fantôme |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Taux mortalité infantile | 0% | 0..100% | affichage suivi, pas danalytics |
| Malus réputation moyen | 0 | points | calcul à la volée sur fenêtre |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Détection | tick | états bébé | décès | cause déterminée |
| Notification | décès | cause | modal | ack requis |
| Trace | décès | position | stèle | TTL |
| Oubli | temps | 7 jours in-game | malus amorti | fenêtre glissante |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Bébé meurt | true | est | event `BABY_DIED` |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Trace TTL | 3600 | atteint | suppression auto |
| Clic stèle | true | est | suppression manuelle |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Deuil parents | Oui | fertilité \(-50%\) pendant 1 semaine in-game |
| Historique décès | Oui | visible journal zoo |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Notes |
|---|---|---|
| Temp extrême | risque décès ↑ | cf. `bebe_animal.md` |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| - | stèle décorative | apparaît sur case (si décès sur grille) |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Notes |
|---|---|---|
| Hiver | cause fréquente (froid) | surveillance accrue |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Notes |
|---|---|---|
| Nuit | risque froid ↑ | baisse T° |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Deuil | \(-50%\) | parents du bébé |
| Blocage court | 0 | 24h in-game après décès |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Domino | stress +10 | animaux à ≤2 cases iso |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Ration allouée | perdue | décès avant consommation |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain | Rayon | Notes |
|---|---:|---:|---|
| Décès visible | - | 2 cases | visiteurs évitent |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Décès proche | stress ↑ | zone impact |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Perte potentielle | -100% | bébé disparu |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Décès en camion | blocage slot | vente échouée, non rapatriée |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Saturation | risque décès | nurserie pleine + éclosion |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | - | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | - | - |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | - | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Zone de décès | ralentit flux | évitement visiteurs |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Intervention sanitaire | 10 | coins | option équarrissage |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Upgrade prévention | variable | coins | infirmerie/nurserie |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Rapatriement | 5 | coins | vente échouée |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | baisse fréquentation si répétée |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Allées | Zone décès | proximité | évitement |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Zone décès | Boutique | fuite | déplacement rapide |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Zone décès | Sortie | choc | sortie anticipée |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `BABY_DIED` | décès | `animal_id`, `cause_code` | impacts |
| `GRAVE_SPAWNED` | trace | `iso_x`, `iso_y` | stèle |
| `SANITATION_FEE_CHARGED` | option | `amount` | coins - |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `DEATH_MARKER_SHOW` | map open | marker zone |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `UI_DEATH_ALERT_SHOWN` | notif | modal |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_AVOID_DEATH_ZONE` | proximité | reroute |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_CRIES` | mort visible | satisfaction - |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_ACK_DEATH` | clic OK | clôture |
| `PLAYER_REMOVE_GRAVE` | clic stèle | suppression |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| Infirmerie 1 | 100 | risque -10% | soins |
| Infirmerie 2 | 250 | risque -20% | urgence |
| Infirmerie 3 | 800 | risque -50% | protocole |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `handleBabyDeath` | baby, cause | event | applique malus |
| `computeDeathVisibility` | location, visitors | bool | pondère impacts |
| `spawnGrave` | location | grave | TTL |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `BABY_DIED` | Critique | "Un bébé est mort." | décès |
| `NURSERY_FULL_DEATH` | Critique | "Nurserie pleine : décès." | cause `NURSERY_FULL` |
| `SALE_TRUCK_DEATH` | Warning | "Décès en camion : vente échouée." | cause `SALE_TRUCK_TIMEOUT` |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Recevoir lalerte | comprendre la cause | choc | modal + bouton “voir sur carte” |
| Retirer trace | nettoyer zone | navigation | clic direct sur stèle |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Modal décès | cause + impacts | critique/ack |
| Stèle | sprite décoratif | clickable/ttl |
| Marker carte | icône | visible/masqué |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| HUD | notifications | priorité haute |
| Carte zoo | sur case | stèle |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| `bebe_animal.md` | fragilité temp | causes |
| `score_reputation.md` | malus réputation | impacts |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir détail | notif → modal | cause affichée |
| Aller sur carte | bouton modal | caméra centre |
| Retirer stèle | clic stèle | suppression |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_DEATH_MODAL` | event | modal |
| `CLICK_VIEW_ON_MAP` | bouton | caméra |
| `CLICK_REMOVE_GRAVE` | stèle | suppression |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `baby_death_sting.mp3` | décès | 2.0s | triste |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `ui_death_gong.mp3` | alerte | moyen |
| `ui_modal_close.mp3` | ack | bas |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `grave_stone_iso.png` | stèle | iso 4 dirs |
| `baby_ghost_fx.png` | fantôme | overlay |
| `death_skull_icon.png` | icône | contraste |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `black_ribbon.png` | modal |
| `death_bg_noise.png` | overlay |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `death_alert_glitch.webm` | modal | 0.7s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| fade fantôme | décès | 1.0s |
| tremblement modal | alerte | 0.5s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `death_black` | #000000 | fond |
| `death_gray` | #616161 | texte |
| `death_red` | #D32F2F | critique |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `death.baby.title` | Décès dun bébé | Baby death |
| `death.baby.cause` | Cause | Cause |
| `death.ack` | OK | OK |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Modal | rectangle arrondi | accessible |
| Icône | rond | constant |

529
docs/specs/nourisseur.md Normal file
View File

@@ -0,0 +1,529 @@
# Nourisseur
## 1. Définition
Employé chargé de l'approvisionnement en nourriture des enclos. Il remplit les mangeoires vides et s'assure que les animaux n'ont pas faim. Achetable avec des pièces.
## 2. Fonctions
* **Remplissage :** Détecte les mangeoires vides et va les remplir.
* **Qualité :** Peut (avec amélioration) fournir une nourriture de meilleure qualité (+santé).
* **Automatisation :** Évite au joueur de devoir cliquer manuellement pour nourrir (si mécanique manuelle existe).
## 3. Icone
* **Représentation :** Seau ou Sac de graines.
* **Couleur dominante :** Marron et Orange.
## 4. Interactions
* **Recrutement :** Menu "Employés", coût en pièces.
* **Gestion :** Définir des priorités (ex: nourrir les bébés en premier).
## 5. Annexes Techniques
### Données (JSON)
```json
{
"employee_id": "feeder_02",
"type": "nourisseur",
"name": "Bob",
"salary": 30,
"hire_cost": 300,
"stats": {
"capacity": 50, // Quantité de nourriture transportable
"speed": 1.2
},
"current_task": "moving_to_enclosure_12",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* Les animaux affamés perdent de la santé et du bonheur.
* Le nourisseur doit retourner au stock (bâtiment de service) pour se ravitailler.
## 6. Annexes UX/UI
* **Visuel Carte :** Personnage avec une brouette ou un sac sur le dos.
* **Animation :** Verse de la nourriture dans l'auge.
* **Alerte :** Icône "Faim" rouge clignotante si le nourisseur est débordé.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Employé “Nourisseur” |
| Rôle | Approvisionner les mangeoires, éviter la faim, appliquer (si présent) la nourriture spéciale ciblée. |
| Logistique | Transport capacité `stats.capacity`, ravitaillement depuis stock. |
| Vue | Isométrique 2.5D, sprite 4 directions, sélection base-sprite. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Détection auge vide | Tick nourisseur | enclos, jauges auge | liste tâches | Priorité bébés > adultes | Event `FEEDER_SCAN` |
| Remplissage | Arrivée en enclos | stock, capacity | auge + | Consomme stock global, clamp max auge | Event `FEEDER_FILL_START/END` |
| Ravitaillement stock | capacity=0 | stock bâtiment | capacity reset | Retour “service stock” obligatoire | Event `FEEDER_RESTOCK` |
| Qualité nourriture | upgrade | niveau/skill | santé + | Bonus si nourriture premium active | Event `FEEDER_PREMIUM_APPLIED` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Seau / sac de graines |
| Couleur dominante | Marron / orange |
| Variantes | `icon_feeder_bucket.png`, `icon_feeder_bag.png` |
| États | Badge “en route” (flèche), “débordé” (rouge), “capacity vide” (0) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Recruter | Action | coins ≥ `hire_cost` | Menu Employés → Nourisseur → Confirmer | entité créée | `INSUFFICIENT_FUNDS`, `EMPLOYEE_CAP_REACHED` |
| Définir priorités | Action | - | panel nourisseur → priorités | ordre tâches | - |
| Assigner zone/enclos | Action | cible valide | “Assigner” → clic | couverture | `INVALID_TARGET` |
| Forcer nourrir | Action | enclos sélectionné | bouton “Nourrir maintenant” | tâche top priorité | `NO_FEEDER_AVAILABLE`, `OUT_OF_FOOD_STOCK` |
| Inspecter stock | Consultation | - | panel stock | quantités | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `employee_id` | string | `feeder_02` | DB | unique |
| `type` | enum | `nourisseur` | DB | constante |
| `salary` | int | 30 | config | coins/jour |
| `hire_cost` | int | 300 | config | one-shot |
| `stats.capacity` | int | 50 | DB | [10..200] |
| `stats.speed` | float | 1.2 | DB | déplacement |
| `current_task` | string | `moving_to_enclosure_12` | runtime | debug |
| `state` | enum | `IDLE|MOVING|FILLING|RESTOCK|BREAK` | runtime | FSM |
| `carried_food` | int | 0..capacity | runtime | décrémente |
| `assigned_zone` | uuid/null | null | runtime | null=global |
| `grid` | object | `{x,y}` | runtime | position |
| `iso_x/iso_y` | int | - | rendu | projection |
| `z_index` | int | - | rendu | profondeur |
| `hitbox` | enum | `base_sprite` | rendu | click base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Capacité | 50 | unités | transport |
| Vitesse | 1.2 | coef | marche |
| Temps remplissage | 1 | min in-game | par auge |
| Temps restock | 2 | min in-game | au stock |
| Seuil faim critique | 80 | % | déclenche urgence |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Auges remplies/jour | 0 | 0..∞ | faim - |
| Ruptures évitées | 0 | 0..∞ | survie + |
| Coût nourrissage/jour | 30 | 0..∞ | dépenses employés |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | embauche | coins | entité | `IDLE` |
| Action | auge vide | stock | auge + | pas si stock=0 |
| Restock | capacity=0 | stock bâtiment | capacity reset | chemin valide |
| Disparition | licenciement (si prévu) | - | suppression | stop tâches |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Achat | coins ≥ `hire_cost` | vrai | création |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Licenciement | action joueur | vrai | suppression |
| Zoo supprimé | - | vrai | suppression |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Stats | Oui | persistées |
| Carried food | Non | remis à 0 au reset |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Température | Effet | Condition |
|---|---|---|
| Extrême | consommation + | animaux mangent plus selon règles |
| Tempérée | neutre | - |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Chemins | déplacement + | visiteurs attirés aux chemins |
| Sable/neige | déplacement - | ralentissement |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | ration + | +10% conso |
| Été | eau/boisson + | incidents soif visiteurs + |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| Matin | repas 1 | tâche batch |
| Soir | repas 2 | tâche batch |
| Nuit | urgence | uniquement si faim critique |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Faim basse | + | si animaux bien nourris |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Stock 0 | risque mort + | faim extrême prolongée |
#### Impact Nourriture (tableau détaillé)
| Type | Effet | Condition |
|---|---|---|
| Standard | neutre | base |
| Spéciale | buff | selon `nourriture_speciale.md` |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| État | Effet | Condition |
|---|---|---|
| Animaux actifs (pas affamés) | satisfaction + | enclos proches |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action | Effet animaux | Condition |
|---|---|---|
| Nourrir | stress - | faim résolue |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Animal bien nourri | +5% | vente animal |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Livraison nourriture | +stock | via camion/achat |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Priorité bébés | + | si règle activée |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Tech nutrition | + | réduit conso ou augmente qualité |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps séjour | + | animaux visibles actifs |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Vente nourriture visiteurs | revenu + | coins | canicule |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Plainte faim | remboursement | coins | si incidents |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaire | 30 | coins/jour | actif |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Lait/bébés | +conso | stock | si bébés présents |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat nourriture | variable | coins | menu achats |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Ration arrivée | 5 | coins | accueil |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Transport nourriture | 10 | coins | livraison |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | nourisseur indirect |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Nourisseur | Enclos | auge vide | déplacement sur chemins |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur | Boutique | faim/soif | achat |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur mécontent | sortie | incidents | départ |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `FEED_LOW` | auge < seuil | enclosure_id | warning |
| `FEED_FILLED` | fin remplissage | enclosure_id | info |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `FEEDER_MOVING` | tâche | rendu déplacement |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `FOOD_STOCK_EMPTY` | stock=0 | alerte |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_BUY_FOOD` | faim/soif | revenu |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `VISITOR_COMPLAINT_HUNGER` | faim | satisfaction - |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_FORCE_FEED` | bouton | tâche urgente |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | remplissage base | - |
| 2 | 1000 | capacity +20 | moins restocks |
| 3 | 2500 | speed +0.1 | réactivité |
| 4 | 5000 | qualité + | premium |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `scan_empty_troughs` | enclos | list | priorités |
| `fill_trough` | stock, carried | trough | clamp |
| `restock` | stock building | carried reset | - |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `OUT_OF_FOOD_STOCK` | Alerte | "Stock de nourriture vide." | stock=0 |
| `FEEDER_OVERLOADED` | Warning | "Nourisseur débordé." | trop tâches |
| `FEED_FILLED` | Info | "Mangeoire remplie." | fin |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Automatiser nourrissage | éviter morts | manque stock | deep-link menu achats |
| Prioriser bébés | survie | réglages | preset “bébés dabord” |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Panel nourisseur | capacity, tâches | moving/filling |
| Badge faim | icône rouge | clignote |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| HUD | menu employés | - |
| Enclos | jauge auge | overlay |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Stock nourriture | global | pas de cache |
| Nourriture spéciale | ciblée | cf. spec |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir panel | clic nourisseur | panel |
| Forcer nourrir | clic enclos | tâche |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_FEEDER_PANEL` | clic | panel |
| `CLICK_FORCE_FEED` | bouton | urgence |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `feeder_loop.mp3` | ambiance | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `pour_food.mp3` | verse | faible |
| `ui_food_empty.mp3` | stock 0 | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `feeder_sprite_[dir].png` | sprite | 4 dirs |
| `fx_grains.png` | FX | overlay |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `icon_feeder_bag.png` | icône |
| `portrait_feeder.png` | panel |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `feed_success.webm` | popup | 0.8s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| grains qui tombent | filling | loop |
| jauge auge + | fin | 0.4s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `feeder_primary` | #E67E22 | UI |
| `feeder_alert` | #E74C3C | faim |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `feeder.force` | Nourrir maintenant | Feed now |
| `food.empty` | Stock vide | Empty stock |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Jauge auge | barre | lisible |
| Badge faim | rond | clignote |

View File

@@ -0,0 +1,56 @@
# Nourriture Spéciale
## 1. Définition
Consommable premium achetable avec des pièces, offrant un boost temporaire aux statistiques d'un animal ou d'un groupe d'animaux. Contrairement à la nourriture de base (foin, viande standard), celle-ci est une friandise ou un complément alimentaire de haute qualité. Chaque animal a une nourriture préférée.
## 2. Fonctions
* **Boost :** Augmente temporairement la santé, le bonheur ou la fertilité (reproduction).
* **Soin rapide :** Peut aider à rétablir un animal affaibli plus vite.
* **Affinité :** Renforce le lien avec le joueur (si mécanique de "tamagotchi" existe).
## 3. Icone
* **Représentation :** Steak doré, Pomme brillante ou Poisson argenté.
* **Couleur dominante :** Or et Rouge.
## 4. Interactions
* **Achat :** Menu contextuel de l'animal ou boutique.
* **Utilisation :** Drag & drop sur l'animal ou sélection dans le menu de nourriture.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"food_id": "special_meat_premium",
"name": "Steak de Kobe",
"target_animal": "lion", // ou catégorie "carnivore"
"cost": 50, // Pièces
"duration_seconds": 3600, // 1 heure
"effects": {
"happiness_boost": 50,
"health_regen": 5,
"reproduction_chance": 1.5 // x1.5
}
}
```
### Règles Métier
* **Préférence :** Donner la "mauvaise" nourriture spéciale (ex: salade à un lion) est impossible ou sans effet (gaspillage).
* **Durée Limitée :** L'effet est un buff temporaire visible par une icône de statut.
* **Cooldown :** Impossible de gaver l'animal (temps d'attente entre deux friandises).
## 6. Annexes UX/UI
* **Particules :** Effet scintillant autour de l'animal pendant la durée du boost.
* **Icône de Buff :** Petite icône (éclair, cœur) à côté de la barre de vie de l'animal.
* **Son :** Bruit de mastication joyeux.
# 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.

View File

@@ -24,7 +24,10 @@ Bâtiment dédié à l'éclosion des œufs et à la croissance des bébés anima
"level": "integer (1-7)",
"slots": [
{ "slot_id": 1, "content": "egg_uuid | baby_uuid | null", "timer_end": "timestamp" }
]
],
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -36,7 +39,7 @@ Bâtiment dédié à l'éclosion des œufs et à la croissance des bébés anima
| Protection T° | +/- 2°C tolérance |
### Scores Initiaux
N/A
**Taux Survie** : 100% (si conditions respectées).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -57,29 +60,31 @@ La nurserie régule la température interne.
| 7 | +/- 10°C (Climatisation parfaite) |
### Impact Milieu (Biome)
N/A
**Adaptation** : Bonus croissance +10% si le biome de la case Nurserie correspond au biome de l'œuf (ex: Œuf Pingouin sur case Neige).
### Impact Saisons
Protège des effets négatifs des saisons (Hiver/Été).
**Printemps** : Bonus Vitesse +10% (Nature en éveil).
### Impact Heure / Jour-Nuit
Fonctionne 24h/24.
Fonctionne 24h/24. Veilleuse de nuit (pas de malus obscurité).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A (Lieu de résultat de la reproduction).
**Incubateur** : +10% vitesse si les parents sont présents dans le zoo (Lien affectif simulé).
### Impact Mort
Réduit drastiquement la mortalité infantile (Santé ne baisse pas sauf si Faim extrême).
**Urgence** : Peut accueillir un bébé malade pour le soigner (Niv 4+).
### Impact Nourriture
Les bébés sont nourris automatiquement si stock nourriture global > 0.
Les bébés sont nourris automatiquement si stock nourriture global > 0. Consommation réduite de 50% par rapport à un adulte.
### Impact Attractivité (Visiteurs/Animaux)
N/A (Les visiteurs ne voient pas l'intérieur).
**Webcam** : +5 Attractivité (Les gens aiment voir les bébés en ligne sur le site du zoo).
### Impact Valeur
N/A
**Valorisation** : Un bébé né en nurserie et bien traité vaut +10% à la revente (Certificat de bonne santé).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
@@ -95,15 +100,16 @@ N/A
| 7 | x10.0 |
### Dépenses (Boutiques/Visiteurs)
N/A
**Électricité** : 5 pièces/heure (Chauffage lampes).
### Trajet Visiteurs
N/A
**Vitrine** : Les visiteurs s'agglutinent devant la vitre (si module Vitrine installé au Niv 3).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Éclosion** : Œuf -> Bébé.
* **Maturité** : Bébé -> Adulte (prêt à sortir).
* **Jumeaux** : 1% chance d'avoir 2 bébés pour 1 œuf.
## 7. Progression
### Tableau des Upgrades
@@ -133,9 +139,19 @@ function updateNurserie(nurserie):
| :--- | :--- | :--- |
| `EGG_HATCHED` | Info | "Un œuf a éclos en Nurserie !" |
| `NURSERIE_FULL` | Warning | "Nurserie pleine, impossible d'acheter/reproduire." |
| `TWINS` | Info | "Incroyable ! Des jumeaux sont nés !" |
# 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)
### Gestion des Slots (Consultation)
**Description UX** : Le joueur clique sur la nurserie pour voir l'état de ses œufs et bébés.
@@ -146,11 +162,11 @@ function updateNurserie(nurserie):
**Événements** : `OPEN_NURSERIE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Berceuse douce (boîte à musique).
- **Sons** : `ui_open.mp3`
- **Graphiques** : Style "Couveuse" ou "Nid douillet".
- **Images** : `egg_[rarity].png`, `baby_[species].png`.
- **Vidéos** : N/A
- **Vidéos** : Fond animé avec des nuages qui passent.
- **Animations** : Œuf qui tremble légèrement quand proche éclosion.
- **Couleurs** : Tons pastels (rose, bleu clair, jaune paille).
- **Textes** : "Slot X", "Temps restant : MM:SS".
@@ -161,19 +177,19 @@ function updateNurserie(nurserie):
**Description UI** : Animation de l'œuf "volant" vers la nurserie (si visible) ou simple apparition dans le slot.
**Emplacement** : HUD -> Nurserie.
**Intégration** : Automatique.
**Navigation** : N/A
**Navigation** : Clic sur notif “Œuf ajouté” → ouvre la nurserie sur le slot concerné (deep-link) ; sinon aucun parcours requis.
**Événements** : `EGG_ADDED`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Pop" doux.
- **Sons** : `pop_soft.mp3`
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Ombre portée de l'œuf.
- **Images** : Icône Œuf.
- **Vidéos** : Effet de téléportation (particules).
- **Animations** : Fade in + Scale up de l'œuf dans le slot.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Couleurs** : Blanc coquille.
- **Textes** : "Placé".
- **Formes** : Cercle.
### Éclosion (Action)
**Description UX** : Quand le timer est fini, l'œuf se fissure. Le joueur clique pour "ouvrir" l'œuf et découvrir le bébé.
@@ -188,7 +204,7 @@ function updateNurserie(nurserie):
- **Sons** : `crack_egg.mp3`, `baby_cry.mp3`.
- **Graphiques** : Coquilles brisées.
- **Images** : Sprite bébé.
- **Vidéos** : N/A
- **Vidéos** : Rayons de lumière émanant de l'œuf.
- **Animations** : Séquence d'éclosion (3 frames).
- **Couleurs** : Rayons dorés/blancs.
- **Textes** : "C'est un [Espèce] [Rareté] !".
@@ -204,12 +220,12 @@ function updateNurserie(nurserie):
**Événements** : `DRAG_START`, `DRAG_DROP`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Son "Sélection".
- **Sons** : `pickup.mp3`, `place_ok.mp3` / `place_error.mp3`.
- **Graphiques** : Grille de placement overlay.
- **Images** : Sprite fantôme (translucide) sous le curseur.
- **Vidéos** : N/A
- **Animations** : N/A
- **Vidéos** : Pulsation de la case cible.
- **Animations** : Rebondissement du sprite au drop.
- **Couleurs** : Vert #00FF00 (OK), Rouge #FF0000 (KO).
- **Textes** : Tooltip "Placer ici".
- **Formes** : N/A
- **Formes** : Carré de sélection.

View File

@@ -0,0 +1,80 @@
# Objet Enclos
## 1. Définition
Élément d'enrichissement spécifique à chaque espèce animale, placé à l'intérieur de l'enclos pour améliorer le bien-être et stimuler les comportements naturels. Chaque animal possède son objet unique (ex: Arbre à singe, Grattoir à ours, Rocher chauffant pour lézards).
## 2. Fonctions
* **Bien-être :** Augmente significativement le bonheur des animaux.
* **Animation :** Déclenche des animations uniques (le singe grimpe, l'ours se frotte, etc.).
* **Attractivité :** Les visiteurs adorent voir les animaux interagir avec ces objets.
## 3. Icone
* **Représentation :** Ballon de jeu ou Tronc d'arbre.
* **Couleur dominante :** Variable selon l'objet.
## 4. Interactions
* **Achat/Placement :** Via le menu de l'enclos ou la boutique (onglet "Enrichissement").
* **Interaction Animal :** L'animal s'y rend périodiquement pour jouer ou se reposer.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"object_id": "enrichment_monkey_tree",
"name": "Arbre à Singe",
"compatible_animals": ["chimpanzee", "lemur"],
"cost": 150,
"created_at": "timestamp",
"updated_at": "timestamp",
"durability": 100,
"repair_cost": 30,
"bonus_happiness": 20,
"bonus_attractiveness": 10,
"cooldowns": {
"use_interval_seconds": 120,
"next_usable_at": "timestamp"
},
"placement": {
"enclosure_id": "uuid",
"grid": { "x": "integer", "y": "integer" },
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer",
"hitbox": "enum('tile','base_sprite','custom_polygon')"
},
"render": {
"sprite_id": "string",
"variant_seed": "integer"
}
}
```
### Règles Métier
* **Exclusivité :** Un objet conçu pour les lions ne fonctionnera pas (ou mal) pour les pingouins.
* **Espace :** Occupe de la place dans l'enclos (réduit la surface "libre" mais augmente la qualité).
* **Limite :** 1 objet spécial par X cases d'enclos pour éviter la surcharge.
* **Effet “mauvaise compatibilité”** : si un animal non compatible interagit, bonus réduit à 10% et risque de casse +5%.
* **Usure** : `durability` baisse à chaque utilisation (ex. -1) et par jour (ex. -2/jour). En dessous de 20 : animation “abîmé” + malus (bonus_happiness / 2).
* **Réparation** : action joueur ou employé (soigneur/agent selon design) ramène `durability` à 100 contre `repair_cost`.
* **Pathfinding** : lobjet est un obstacle interne à lenclos (visiteurs ne le traversent pas si lenclos est visitable ; animaux lutilisent comme target).
## 6. Annexes UX/UI
* **Visuel 3D/Iso :** Modèle détaillé correspondant au thème de l'animal.
* **Feedback :** Cœurs ou étoiles émanant de l'animal lorsqu'il utilise l'objet.
### États visuels
* **Neuf** : couleurs vives + petite animation idle.
* **Usé** (`durability < 50`) : texture éraflée, bruit plus sec.
* **Cassé** (`durability <= 0`) : sprite “cassé”, interaction désactivée jusquà réparation.
# 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.

View File

@@ -0,0 +1,522 @@
# Passe Saisonnier
## 1. Définition
Système de progression temporaire (durée typique : 1 mois) offrant des récompenses exclusives (skins, thèmes, monnaie) aux joueurs qui accomplissent des tâches ou jouent régulièrement. Chaque passe est centré sur une thématique spécifique (Jungle, Tigre, Ours, Lapin, Lion, Chat, Dinosaure, Panthère, Jaguar, Crocodile 3D, etc.).
## 2. Fonctions
* **Engagement :** Incite à jouer quotidiennement pour progresser dans le passe.
* **Monétisation :** Peut comporter une voie gratuite et une voie payante (Premium) offrant plus de récompenses.
* **Distribution de Contenu :** Moyen principal d'obtenir les nouveaux thèmes et skins.
## 3. Icone
* **Représentation :** Ticket doré ou Calendrier avec une étoile.
* **Couleur dominante :** Or et Rouge.
## 4. Interactions
* **Consultation :** Bouton dédié sur l'écran principal affichant la barre de progression du passe.
* **Réclamation :** Clic sur les paliers débloqués pour récupérer les récompenses.
* **Achat :** Bouton pour acheter la version Premium du passe.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"pass_id": "pass_season_05",
"theme_name": "Tigre",
"duration_days": 30,
"start_date": "2026-05-01",
"end_date": "2026-05-31",
"levels": [
{
"level": 1,
"xp_required": 100,
"reward_free": "coins_100",
"reward_premium": "skin_tiger_hat"
},
{
"level": 30,
"xp_required": 3000,
"reward_free": "skin_tiger_statue",
"reward_premium": "theme_tiger_full"
}
]
}
```
### Règles Métier
* Les récompenses cosmétiques (thèmes) sont temporaires pour les joueurs non-VIP (liées à la durée du passe).
* Les joueurs VIP débloquent la conservation permanente des thèmes acquis via le passe.
* La progression se fait via l'XP gagnée en jeu ou des quêtes spécifiques au passe.
## 6. Annexes UX/UI
* **Barre de Progression :** Visuel clair de l'avancement (jauge remplie).
* **Paliers :** Icônes des récompenses cliquables pour détails.
* **Mise en avant :** Pop-up à la connexion annonçant le nouveau passe ou les récompenses non réclamées.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Passe de progression **temporaire** (ex. 30 jours) avec paliers + récompenses. |
| Thématique | Une saison = une thématique (Jungle/Tigre/Ours/Lapin/Lion/Chat/Dinosaure/Panthère/Jaguar/Crocodile 3D…). |
| Accès | Voie gratuite + voie premium (achat). |
| Conservation | Non-VIP : accès thèmes/packs du passe **pendant la durée du passe**. VIP : accès conservé **tant que VIP actif** (cf. `vip.md`). |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Accumuler XP passe | actions/quetes | événements jeu | `pass_xp +` | Sources XP listées, caps journaliers | Event `PASS_XP_GAINED` |
| Déverrouiller palier | XP atteint | xp total | niveau débloqué | Déverrouillage monotone | Event `PASS_LEVEL_UNLOCKED` |
| Réclamer récompense | clic palier | type voie | item ajouté | Doit être idempotent | Event `PASS_REWARD_CLAIMED` |
| Acheter premium | achat | paiement | premium actif | Upgrade voie ; rétroactif sur paliers | Event `PASS_PREMIUM_PURCHASED` |
| Fin de saison | date fin | now | close | Non-VIP : gating thèmes ; VIP : gating par VIP | Event `PASS_ENDED` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Ticket / calendrier étoilé |
| Couleur dominante | Or / rouge |
| Variantes | `icon_pass_ticket.png`, `icon_pass_calendar.png` |
| États | Badge “nouveau”, “récompenses à réclamer”, “premium” |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Ouvrir passe | Consultation | passe actif | bouton HUD | écran passe | - |
| Voir palier | Consultation | - | scroll paliers | détail reward | - |
| Réclamer | Action | palier débloqué | clic reward | item ajouté | `REWARD_LOCKED`, `ALREADY_CLAIMED` |
| Acheter premium | Action | non premium | clic CTA | premium actif | `PAYMENT_FAILED` |
| Aller quêtes passe | Navigation | - | bouton “Quêtes” | liste quêtes | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `pass_id` | string | `pass_season_05` | DB | unique |
| `theme_name` | string | `Tigre` | config | - |
| `duration_days` | int | 30 | config | - |
| `start_date/end_date` | date | - | config | UTC |
| `levels[]` | array | - | config | 1..N |
| `levels.level` | int | 1 | config | monotone |
| `levels.xp_required` | int | 100 | config | monotone |
| `reward_free/reward_premium` | string | `skin_tiger_hat` | config | item ids |
| `player_state.pass_xp` | int | 0..∞ | DB | cumul |
| `player_state.premium_active` | bool | false | DB | - |
| `player_state.claimed_rewards` | set | - | DB | idempotence |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| XP passe | 0 | xp | départ |
| Premium actif | false | bool | départ |
| Niveaux | 30 | levels | exemple |
| Cap XP/jour | 1000 | xp | anti farm |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Niveaux débloqués | 0 | 0..N | progression |
| Récompenses non réclamées | 0 | 0..∞ | badge UI |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | début saison | config | passe actif | dates |
| Progression | actions | xp | unlocks | monotone |
| Fin | date | now | passe clos | gating |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Date >= start | true | est | passe visible |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Date > end | true | est | passe inactif |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| XP gagné | Oui | persiste pour historique |
| Récompenses | Oui | items acquis restent possédés ; accès thèmes dépend VIP |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Notes |
|---|---|---|
| Canicule | quêtes spécifiques | “vendre glaces” |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Jungle | quêtes liées | thème |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Notes |
|---|---|---|
| Saison du passe | contenu | paliers |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Notes |
|---|---|---|
| Reset quotidien | quêtes | distribution |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet | Condition |
|---|---|---|
| Quêtes “naissance” | XP passe + | si complétée |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Mort bébé | quête/objectif | XP passe + si “résoudre incident” |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Quêtes nourriture | XP + | acheter/consommer |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Effet | Condition |
|---|---|---|
| Thèmes saisonniers | attractivité + | si actif |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Skins animaux | visuel | pas de stats |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Items rares | valeur cosmétique + | collection |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête livraison | XP + | délai |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête naissance | XP + | baby |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête réception | XP + | nouveau animal |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête RP | XP + | collecter |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête labo monde | XP + | achat rare |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Quête visiteurs | XP + | satisfaction |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Quête revenus | - | - | objectif |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat premium | variable | monnaie | passe |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Quête staff | - | - | embauche |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Upgrade nurserie | variable | coins | objectif |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat nourriture | variable | coins | objectif |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat animaux | variable | coins | objectif |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Livraison | variable | coins | objectif |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | quêtes flux |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur | Enclos | curiosité | objectifs |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur | Boutique | soif/envie | objectifs |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur | Sortie | fin journée | objectifs |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `PASS_STARTED` | start | pass_id | visible |
| `PASS_ENDED` | end | pass_id | close |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PASS_POPUP_LOGIN` | login | CTA |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PASS_XP_GAINED` | action zoo | xp + |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PASS_VISITOR_GOAL` | satisfaction | xp + |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `PASS_PHOTO_BONUS` | photo | xp + |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `PASS_PREMIUM_PURCHASED` | achat | premium |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau passe | XP requis | Free reward | Premium reward | Notes |
|---|---:|---|---|---|
| 1 | 100 | coins_100 | skin_tiger_hat | exemple |
| 30 | 3000 | skin_tiger_statue | theme_tiger_full | exemple |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `addPassXp` | action xp | pass_xp | cap/jour |
| `unlockLevels` | pass_xp | unlocked | monotone |
| `claimReward` | level, track | item | idempotent |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `REWARD_LOCKED` | Warning | "Palier verrouillé." | xp insuffisant |
| `ALREADY_CLAIMED` | Info | "Déjà réclamé." | idempotence |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Suivre progression | motivation | scroll long | raccourci “prochain reward” |
| Réclamer | récupérer items | oubli | badge non réclamés |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Écran passe | rail paliers | free/premium |
| CTA premium | prix | purchased |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| HUD | bouton passe | badge |
| Modal | plein écran | scroll |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Inventaire skins | ajout items | idempotent |
| VIP | conservation | gating |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir passe | HUD | écran |
| Aller boutique | CTA | achat |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_PASS` | clic | écran |
| `CLICK_CLAIM_REWARD` | clic | claim |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `pass_screen_loop.mp3` | écran | loop | thème saison |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `reward_claim.mp3` | claim | moyen |
| `level_unlock.mp3` | unlock | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `pass_track_free.png` | UI | - |
| `pass_track_premium.png` | UI | - |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `pass_badge.png` | HUD |
| `pass_reward_icons.png` | paliers |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `pass_intro.webm` | popup | 2.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| jauge fill | xp gain | smooth |
| sparkles | claim | burst |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `pass_gold` | #D4AF37 | premium |
| `pass_red` | #C0392B | accent |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `pass.claim` | Réclamer | Claim |
| `pass.buy_premium` | Acheter Premium | Buy Premium |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Cartes reward | rectangles arrondis | - |
| Jauge | barre | - |

View File

@@ -17,84 +17,160 @@ Classe abstraite ou interface commune.
```json
{
"id": "uuid",
"type": "string",
"type": "enum('player','bot','visitor','animal','staff')",
"created_at": "timestamp",
"updated_at": "timestamp",
"position": { "x": "int", "y": "int" },
"active": "boolean"
"active": "boolean",
"status_flags": ["enum('selected','moving','interacting','hidden','dead','sleeping','busy')"],
"hitbox": "enum('tile','base_sprite','custom_polygon')",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A (Spécifique aux sous-types)
| Caractéristique | Valeur Initiale | Type | Description |
|---|---|---|---|
| active | true | bool | Lentité est simulée/rendue si active. |
| hitbox | base_sprite | enum | Sélection via base sprite (isométrique). |
| status_flags | [] | enum[] | Liste vide au spawn, enrichie par le comportement. |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| visibilité | 100 | 0-100 | Probabilité dêtre rendu/affiché (ex. foule dense). |
| priorité interaction | 50 | 0-100 | Arbitre quel élément capte le clic en cas de chevauchement. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Spawn système | true | Est | Création de lentité (par règle métier). |
| Ressources dispo | selon type | >= | Autorise création (ex. staff payé). |
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| active | false | Est | Retrait du rendu/simulation. |
| status_flags contient dead | true | Est | Retrait ou état “cadavre” selon design. |
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Classe dérivée | Champs spécifiques | 100% | Non |
| Skins | Palette/cosmétiques | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Plage Température | Effet sur lentité | Bonus/Malus |
|---|---|---|
| < 0°C | Animations “froid” (si entité sensible) | vitesse -10% (visiteurs) |
| > 30°C | Animations “chaud” | soif +20% (visiteurs) |
### Impact Milieu (Biome)
N/A
| Biome | Compatibilité | Bonus/Malus |
|---|---:|---|
| Chemin | 100% | coût de mouvement 1.0 |
| Herbe | 100% | coût de mouvement 1.2 |
| Boue | 60% | coût de mouvement 1.5 |
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Été | foule + | visiteurs + |
| Hiver | foule - | visiteurs - |
### Impact Heure / Jour-Nuit
N/A
| Période | Activité | Visibilité |
|---|---|---|
| Jour | simulation normale | haute |
| Nuit | entités “dorment” selon type | moyenne/basse |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Proximité | augmente | si entité = animal |
### Impact Mort
N/A
| Cause | Conséquence | Durée |
|---|---|---|
| État critique | passage dead | selon règles type |
### Impact Nourriture
N/A
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---:|---:|---:|
| selon type | variable | variable | 15 |
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| entité rare visible | + | 8 cases |
### Impact Valeur
N/A
| Facteur | Variation Prix | Condition |
|---|---:|---|
| rareté cosmétique | + | si skin rare |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Domaine | Paramètre | Valeur | Unité |
|---|---|---:|---|
| Déplacement | coût de mouvement | >= 1.0 | multiplicateur |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| maintenance entité | variable | /jour | si staff/bâtiment associé |
### Trajet Visiteurs
N/A
| Trajet | Règle | Priorité | Notes |
|---|---|---:|---|
| vers POI | A* pondéré | 50 | chemins préférés |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `ENTITY_SPAWN` | création | rendu + simulation | instant |
| `ENTITY_DESPAWN` | suppression | retrait | instant |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | comportement de base |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```text
computeZIndex(x, y):
return y * 1000 + x
hitTest(click):
candidates = entities.sortedBy(z_index desc)
return first(entity where click inside entity.hitbox)
```
### Messages d'Infos / Alerte
N/A
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Entité sélectionnée." | clic valide | 2 |
| Warn | "Interaction impossible." | état busy/dead | 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)
### Identification (Passif)
**Description UX** : Reconnaître le type de personnage au premier coup d'œil.
@@ -105,12 +181,12 @@ N/A
**Événements** : `HOVER_CHARACTER`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : `ui_hover_soft.mp3` (jingle court, optionnel).
- **Sons** : `ui_hover.mp3`, `ui_select.mp3`.
- **Graphiques** : Silhouettes archétypales.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : `badge_player.png`, `badge_bot.png`, `badge_visitor.png`, `badge_animal.png`.
- **Vidéos** : `hover_glow.webm` (0.6s loop, optionnel).
- **Animations** : Glow pulse (hover), pop (select).
- **Couleurs** : Joueur (Bleu), Bot (Rouge/Gris), Visiteur (Multicolore), Animal (Naturel).
- **Textes** : Nom, Rôle.
- **Formes** : N/A
- **Formes** : Badge rond + tooltip rect arrondi.

78
docs/specs/pont.md Normal file
View File

@@ -0,0 +1,78 @@
# Pont
## 1. Définition
Structure permettant aux visiteurs (et au personnel) de traverser les étendues d'eau. Il fonctionne techniquement comme un chemin mais peut être construit sur les cases de type "Eau".
## 2. Fonctions
* **Traversée :** Rend accessible des zones isolées par des rivières ou des lacs.
* **Esthétique :** Ajoute du relief et de la variété au paysage du zoo.
* **Observation :** Peut servir de point de vue pour observer des animaux aquatiques (si enclos aquatique en dessous).
## 3. Icone
* **Représentation :** Pont en arc ou Planches sur l'eau.
* **Couleur dominante :** Bois et Bleu.
## 4. Interactions
* **Construction :** Outil "Pont" (ou outil "Chemin" détectant l'eau automatiquement).
* **Coût :** Plus cher qu'un chemin standard de même niveau.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"bridge_id": "uuid",
"owner_zoo_id": "uuid",
"type": "enum('wood_planks','stone_bridge','rope_bridge')",
"created_at": "timestamp",
"updated_at": "timestamp",
"coordinates": {"x": 15, "y": 15},
"water_underneath": true,
"connected_neighbors": ["enum('N','S','E','W')"],
"durability": "integer (0-100)",
"stats": {
"speed_modifier": 1.0,
"attractiveness_bonus": 5
},
"cost_per_tile": 50,
"repair_cost": 20,
"render": {
"auto_tile_key": "string",
"height_offset_px": "integer (>= 0)",
"occluder": "boolean"
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* **Support :** Doit commencer et finir sur la terre ferme (ou se connecter à un autre pont).
* **Hauteur :** En vue isométrique, le pont peut être légèrement surélevé par rapport à l'eau.
* **Auto-tiling** : se connecte aux ponts adjacents et (optionnellement) aux chemins si le bord touche la terre.
* **Usure** : `durability` baisse de 1/jour + 1 par X passages (ex. 50 passages). En dessous de 20, bruit de craquement + risque incident (arrêt temporaire) si non réparé.
* **Erreur construction** : interdite si la tuile deau est “profonde” et non pontable (flag terrain), ou si collision avec un bâtiment.
## 6. Annexes UX/UI
* **Visuel :** Planches de bois avec rambardes, piliers plongeant dans l'eau.
* **Son :** Bruit de pas sur le bois (creux).
* **Reflet :** Reflet du pont dans l'eau (si moteur graphique le permet).
# 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. Interactions UI (construction / réparation)
* **Construction** : mode “peinture” possible (drag) pour poser plusieurs tuiles de pont daffilée, avec preview auto-tiling.
* **Réparation** : clic sur pont (durabilité < 100) → bouton “Réparer” (coût affiché) → animation marteau + retour à 100.
* **Messages** :
* `BRIDGE_BUILD_BLOCKED` : "Impossible de construire un pont ici."
* `BRIDGE_NEEDS_REPAIR` : "Pont endommagé : réparation recommandée."

View File

@@ -22,17 +22,18 @@
Logique serveur.
### Caractéristiques Initiales
N/A
**Fertilité de base** : 50%.
**Cooldown** : 24h (in-game) après une naissance.
### Scores Initiaux
N/A
**Taux de natalité du zoo** : 0 naissances/jour.
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
**Saison des amours** : Événement aléatoire ou Printemps.
### Conditions de Disparition
N/A
**Ménopause/Vieillesse** : Fin de fertilité à 80% de l'espérance de vie.
### Hérédité
| Parent A | Parent B | Enfant (Probabilités) |
@@ -42,87 +43,109 @@ N/A
## 3. Impacts Environnementaux
### Impact Température
**Condition** : T° doit être dans la plage "Idéale" (+/- 2°C).
**Condition** : T° doit être dans la plage "Idéale" (+/- 2°C). Si écart > 5°C, libido = 0.
### Impact Milieu (Biome)
**Condition** : Biome doit être "Parfait".
**Condition** : Biome doit être "Parfait". Sol confortable requis.
### Impact Saisons
**Printemps** : +20% chance réussite.
**Hiver** : -50% chance réussite (sauf animaux froids).
**Hiver** : -50% chance réussite (sauf animaux polaires).
### Impact Heure / Jour-Nuit
N/A
**Nuit** : +20% chance (Intimité, calme).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Consanguinité** : Risque de malus génétique (Santé max -10%) si parents trop proches (Frère/Sœur).
### Impact Mort
N/A
**Mort en couche** : Risque très faible (1%) pour la mère si Santé < 50% au moment de la naissance.
### Impact Nourriture
**Condition** : Faim < 20%.
**Condition** : Faim < 20%. Si Faim > 50%, avortement spontané.
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Buzz** : Une naissance rare attire la presse (+Attractivité temporaire "Baby Boom").
### Impact Valeur
N/A
**Lignée** : Un bébé issu de champions (Parents Rareté 5) vaut 2x plus cher.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Durée Gestation** : Variable selon espèce (ex: Lapin 1h, Éléphant 24h).
### Dépenses (Boutiques/Visiteurs)
N/A
**Suivi Vétérinaire** : 50 pièces prélevées à la conception (Échographie).
### Trajet Visiteurs
N/A
**Zone calme requise** : Si > 10 visiteurs autour de l'enclos, Stress monte -> Échec reproduction.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Accouplement** : Tentative.
* **Grossesse** : Délai avant naissance.
* **Fausse couche** : Si stress trop élevé.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Recherches au Centre de Recherche.*
| Niveau Recherche | Nom | Bonus Fertilité |
| :--- | :--- | :--- |
| 1 | Observation | +5% |
| 2 | Compléments | +10% |
| 3 | Insémination | +15% |
| 4 | Clonage (Interdit) | Débloqué au niveau max (Secret) |
| 5 | Génétique Avancée | +25% |
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
```javascript
if checkConditions(parentA, parentB):
chance = baseChance + seasonBonus + zooReproScoreBonus
if isNight(): chance *= 1.2
if random() < chance:
createBaby(parentA, parentB)
else:
emitEvent("REPRO_FAIL", "Tentative échouée")
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `REPRO_SUCCESS` | Succès | "Un couple attend un heureux événement !" |
| `REPRO_FAIL` | Info | "La tentative de reproduction a échoué." |
# 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)
### Amour (Passif)
**Description UX** : Deux animaux compatibles se rencontrent. Des cœurs apparaissent.
**Description UI** : Particules Cœurs au-dessus des animaux. Ils se rapprochent.
**Emplacement** : Case Zoo.
**Intégration** : Animation comportementale.
**Navigation** : N/A
**Navigation** : Auto (Animation).
**Événements** : `MATING_START`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Musique Romantique (Saxophone soft).
- **Sons** : `kiss.mp3` ou bruit doux.
- **Graphiques** : Cœurs roses.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône "Love" au-dessus des têtes.
- **Vidéos** : Effet de flou artistique (Bloom).
- **Animations** : Cœurs qui montent.
- **Couleurs** : Rose.
- **Textes** : N/A
- **Textes** : "Accouplement en cours".
- **Formes** : Cœur.
### Naissance (Événement)
@@ -137,9 +160,9 @@ if checkConditions(parentA, parentB):
- **Musiques** : Jingle Naissance.
- **Sons** : `tada.mp3`.
- **Graphiques** : Cigogne (icône).
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Photo du bébé.
- **Vidéos** : Feu d'artifice miniature.
- **Animations** : Confettis.
- **Couleurs** : Rose/Bleu.
- **Textes** : "Bienvenue au nouveau [Espèce] !".
- **Formes** : N/A
- **Formes** : Étoile explosive.

View File

@@ -26,30 +26,50 @@ Propriété de `Zoo`.
| Réputation | 0 |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Prestige | 0 | 0-10000 | Sert de base au flux visiteurs (via attractivité ville → zoo). |
| Malus décès récent | 0 | 0-5000 | Décroît sur 24h ; pénalise flux visiteurs. |
| Bonus diversité | 0 | 0-2000 | Bonus si plusieurs espèces présentes. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Premier animal placé | 1 | >= | La réputation devient calculable (sinon 0). |
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Zoo supprimé | true | Est | Score supprimé avec le zoo. |
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Soft reset / prestige | Bonus de départ | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Condition | Effet |
|---|---|
| Trop chaud / trop froid (global) | Réputation -10% temporaire si > X animaux en état critique |
### Impact Milieu (Biome)
N/A
| Biome | Effet |
|---|---|
| Enclos adaptés | + réputation via survie + satisfaction visiteurs |
### Impact Saisons
N/A
| Saison | Effet |
|---|---|
| Été | Réputation “visible” +5% (affluence) si incidents faibles |
| Hiver | Réputation “visible” -5% si gestion température mauvaise |
### Impact Heure / Jour-Nuit
N/A
| Période | Effet |
|---|---|
| Jour | Variation normale |
| Nuit | Pas de hausse via visiteurs (zoo fermé), seulement décroissance des malus |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
@@ -59,23 +79,33 @@ N/A
**Malus** : -50 pts par mort (décroissance sur 24h).
### Impact Nourriture
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Stock nourriture stable | +1% / jour | Aucun animal en faim critique |
### Impact Attractivité (Visiteurs/Animaux)
C'est la métrique de base de l'attractivité.
### Impact Valeur
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Réputation élevée | Prix de vente animaux +5% | si marché utilise réputation vendeur |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Domaine | Paramètre | Valeur | Unité | Effet |
|---|---|---:|---|---|
| Mise à jour score | Période | 60 | s | Recalcul périodique ou lazy update. |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Campagnes image | 10005000 | coins | Augmente temporairement la réputation visible |
### Trajet Visiteurs
N/A
| Mécanisme | Impact | Détail |
|---|---|---|
| Flux ville→zoo | Direct | Réputation est un facteur principal de flux |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -83,7 +113,10 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Réputation visible + tooltips |
| 2 | 1000 | Boutique niv 2 | Affichage détaillé des composantes |
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -92,10 +125,22 @@ score = sum(animal.rarity * 10) + (uniqueSpecies * 50) + buildingsValue - deathP
```
### Messages d'Infos / Alerte
N/A
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Réputation +{delta}" | hausse significative | 2 |
| Warn | "Réputation en baisse : trop de morts/incidents" | seuil franchi | 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)
### Affichage Score (Permanent)
**Description UX** : Le joueur connaît son niveau de prestige.
@@ -106,11 +151,11 @@ N/A
**Événements** : `SCORE_UPDATE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `level_up_jingle.mp3` (court), `ui_score_tick.mp3` (optionnel).
- **Sons** : `level_up_jingle.mp3`.
- **Graphiques** : Icône Couronne.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `icon_crown.png`, `reputation_star.png`.
- **Vidéos** : `crown_glint.webm` (0.8s non loop, optionnel).
- **Animations** : Brillance quand augmente.
- **Couleurs** : Or.
- **Textes** : "Niveau 5 (4500 pts)".

View File

@@ -25,17 +25,27 @@ Propriété de `Zoo`.
| Survie | 100% |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Survie globale | 100 | 0-100 | Conditionne reproduction, maladies, perception valeur animaux. |
| Risque maladie | 0% | 0-100% | Monte si survie < 60. |
| Malus mortalité | 0 | 0-100 | Monte si survie < 30, augmente probas décès. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Premier animal vivant | 1 | >= | Score calculable (sinon 100 par convention de vide). |
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Zoo supprimé | true | Est | Score supprimé avec le zoo. |
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Soft reset | Bonus de départ (+10) | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
@@ -45,10 +55,15 @@ Moyenne des adéquations T°.
Moyenne des adéquations Biome.
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | Températures plus dures | survie -5 si pas de régulation |
| Été | Canicule | survie -5 si pas dombre/eau |
### Impact Heure / Jour-Nuit
N/A
| Période | Effet | Modificateur |
|---|---|---|
| Nuit | Récupération | +1 survie/h si conditions OK |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
@@ -61,28 +76,47 @@ Seuil critique : < 20% (Risque épidémie).
Moyenne des Faims.
### Impact Attractivité (Visiteurs/Animaux)
N/A
| État | Effet | Condition |
|---|---|---|
| Survie > 90 | Visiteurs satisfaits | bonus attractivité local |
| Survie < 50 | Visiteurs inquiets | malus attractivité |
### Impact Valeur
N/A
| Facteur | Variation Prix | Condition |
|---|---:|---|
| Survie > 90 | +10% | animal en vente |
| Survie < 50 | -20% | animal en vente |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Domaine | Paramètre | Valeur | Unité | Effet |
|---|---|---:|---|---|
| Recalcul score | Période | 60 | s | Recalcul périodique ou lazy update. |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Soins vétérinaires | 50 | coins / animal | si état critique |
| Régulation T° | variable | coins / jour | selon `temperature.md` |
### Trajet Visiteurs
N/A
| Mécanisme | Effet | Détail |
|---|---|---|
| Évitement zones malades | détour | réduit densité autour animaux malades |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `SURVIVAL_DROP` | passage sous seuil | alerte | tant que < seuil |
| `DISEASE_OUTBREAK` | survie < 20 + RNG | maladie | 24h in-game |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Monitoring basique |
| 2 | 2000 | centre recherche niv 2 | Détection précoce maladies |
## 8. Logique et Interfaces
### Pseudo-code Impacts
@@ -97,6 +131,15 @@ survivalScore = average(allAnimals.health)
# 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)
### Monitoring Santé (Permanent)
**Description UX** : Le joueur surveille la santé globale de son zoo.
@@ -107,11 +150,11 @@ survivalScore = average(allAnimals.health)
**Événements** : `HEALTH_UPDATE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_health_soft.mp3` (jingle discret), `ui_critical_pulse.mp3` (optionnel).
- **Sons** : `heartbeat.mp3` (si critique).
- **Graphiques** : Icône Cœur.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `icon_heart.png`, `icon_cross.png`.
- **Vidéos** : `heart_pulse.webm` (0.8s loop, optionnel).
- **Animations** : Battement (Pulsation).
- **Couleurs** : Vert -> Jaune -> Rouge.
- **Textes** : "98%".

View File

@@ -22,82 +22,142 @@ Un site est un lieu d'intérêt positionné sur la Carte du Monde.
"id": "uuid",
"type": "enum",
"name": "string",
"position": { "x": "int", "y": "int" }
"position": { "x": "int", "y": "int" },
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
| Caractéristique | Valeur Initiale | Type | Description |
|---|---:|---|---|
| Visibilité | 100 | 0-100 | Probabilité dêtre visible/affichable selon fog-of-war et zoom. |
| Interactions activées | true | bool | Désactivable pour sites “décoratifs”. |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Popularité | 0 | 0-100 | Pour ville : influence flux ; pour zoo : reflète attractivité. |
| Danger | 0 | 0-100 | Pour labos/événements : risque dincident. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération procédurale ou création joueur.
### Conditions de Disparition
N/A
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Type “événement” | fin timer | >= | Site supprimé (si événement temporaire). |
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Monde | Découverte | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Condition | Effet |
|---|---|
| Tempête régionale | modifie les flux/visites | impact de contexte |
### Impact Milieu (Biome)
N/A
| Biome | Effet |
|---|---|
| Biome ville | type de visiteurs | modifie budget moyen |
### Impact Saisons
N/A
| Saison | Effet |
|---|---|
| Hiver | routes plus lentes | dist effective + |
### Impact Heure / Jour-Nuit
N/A
| Période | Effet |
|---|---|
| Nuit | lumières sites | rendu + |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Labo événement | boost génétique | si lab actif |
### Impact Mort
N/A
| Cause | Conséquence | Durée |
|---|---|---|
| Catastrophe sur site | fermeture | 24h |
### Impact Nourriture
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Ville agricole | stock nourriture + | économie |
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| Zoo halo | + | visibilité monde |
### Impact Valeur
N/A
| Facteur | Variation | Condition |
|---|---|---|
| Emplacement premium | + | proche villes |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Domaine | Paramètre | Valeur | Unité | Notes |
|---|---|---:|---|---|
| Survol/tooltip | délai | 200 | ms | évite popups instantanés |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Taxe régionale | 1% | transaction | route commerciale |
### Trajet Visiteurs
N/A
| Trajet | Condition | Effet | Notes |
|---|---|---|---|
| Ville→Zoo | attraction | flux | cf. attractivité |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `SITE_HOVER` | survol | tooltip | tant que hover |
| `SITE_SELECTED` | clic | panneau détail | jusquà fermeture |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Tooltips |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```text
onHoverSite(site):
showTooltip(site.name, site.type, site.keyMetric)
onClickSite(site):
openDetailPanel(site)
```
### Messages d'Infos / Alerte
N/A
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Site sélectionné." | clic | 2 |
| Warn | "Site indisponible." | fermé/lock | 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)
### Info-bulle (Consultation)
**Description UX** : Survoler un site donne ses détails.
@@ -108,11 +168,11 @@ N/A
**Événements** : `HOVER_SITE`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_tooltip_soft.mp3` (jingle discret).
- **Sons** : `pop.mp3` léger.
- **Graphiques** : Fond noir semi-transparent.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `site_icon_zoo.png`, `site_icon_city.png`, `site_icon_lab.png`.
- **Vidéos** : `tooltip_fade.webm` (0.6s loop, optionnel).
- **Animations** : Fade in rapide.
- **Couleurs** : Blanc sur Noir.
- **Textes** : "Paris (1M hab.)".

502
docs/specs/skin.md Normal file
View File

@@ -0,0 +1,502 @@
# Skin
## 1. Définition
Élément cosmétique permettant de modifier l'apparence de l'avatar du joueur ou de certains éléments du zoo (bâtiments, animaux). Les skins sont purement esthétiques et n'influencent pas les statistiques de gameplay (sauf mention contraire rare). Ils s'obtiennent via la boutique, les passes saisonniers ou des événements spéciaux.
## 2. Fonctions
* **Personnalisation :** Permet au joueur de se différencier.
* **Collection :** Incite à la progression et à l'achat (monétisation).
* **Thématisation :** Renforce l'immersion lors des saisons (ex: skin Noël, Halloween).
## 3. Icone
* **Représentation :** T-shirt plié ou Masque de carnaval.
* **Couleur dominante :** Violet (souvent associé à la cosmétique/rare).
## 4. Interactions
* **Achat :** Via le menu boutique ou menu skins.
* **Équipement :** Via l'inventaire de skins (drag & drop ou clic).
* **Visualisation :** Prévisualisation sur l'avatar ou l'objet avant validation.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"skin_id": "skin_hat_pirate",
"name": "Chapeau de Pirate",
"type": "avatar_head", // "avatar_body", "zoo_building", "animal_texture"
"rarity": "rare",
"source": "shop", // "pass", "event", "achievement"
"price": {
"amount": 500,
"currency": "coins"
},
"asset_path": "assets/skins/avatar/head/pirate_hat.png",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* Un skin acheté est acquis définitivement (sauf skins liés à un passe temporaire expiré pour les non-VIP).
* Certains skins sont exclusifs à un genre d'avatar ou un type de bâtiment.
## 6. Annexes UX/UI
* **Inventaire :** Grille d'icônes représentant les skins possédés.
* **Rareté :** Bordure de couleur autour de l'icône (Gris=Commun, Vert=Atypique, Bleu=Rare, Violet=Épique, Or=Légendaire).
* **Notification :** "Nouveau skin débloqué !" avec animation de coffre ou d'éclat.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Skin = item cosmétique (avatar/zoo/animal/building/path). |
| Rôle | Modifier lapparence sans modifier les stats (sauf si explicitement listé et validé). |
| Acquisition | Boutique, passe, événement, achievement. |
| Gating | Skins pass/thèmes : selon règles `passe_saisonnier.md` + `vip.md`. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Afficher catalogue | UI open | filtres | liste skins | Tri par rareté/type, sans cache applicatif | Event `SKIN_CATALOG_OPEN` |
| Acheter | clic achat | coins, prix | item acquis | Transaction atomique ; idempotence sur retry | Event `SKIN_PURCHASED` |
| Équiper | clic equip | inventaire | `equipped` | Un seul par slot ; compatibilité type | Event `SKIN_EQUIPPED` |
| Prévisualiser | hover/clic | skin_id | preview render | Ne modifie pas létat tant que non validé | Event `SKIN_PREVIEW` |
| Appliquer au zoo | apply | theme/skin | rendu map | Mise à jour rendu sans fallback silencieux | Event `ZOO_SKIN_APPLIED` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | T-shirt / masque |
| Couleur dominante | Violet (cosmétique) |
| Variantes | `icon_skin_shirt.png`, `icon_skin_mask.png` |
| États | Bordure rareté, lock, “new” |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Ouvrir inventaire | Consultation | - | Profil → Skins | grille | - |
| Filtrer | Action | - | catégories/rareté | liste filtrée | - |
| Prévisualiser | Consultation | item visible | clic item | preview | - |
| Équiper | Action | possédé | “Équiper” | slot update | `SKIN_LOCKED`, `INCOMPATIBLE_SKIN` |
| Acheter | Action | coins suffisants | “Acheter” | possédé | `INSUFFICIENT_FUNDS` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `skin_id` | string | `skin_hat_pirate` | config | unique |
| `name` | string | `Chapeau de Pirate` | i18n | affichage |
| `type` | enum | `avatar_head|avatar_body|zoo_building|animal_texture|path_texture|banner_material` | config | whitelist |
| `rarity` | enum | `common|uncommon|rare|epic|legendary` | config | bordures |
| `source` | enum | `shop|pass|event|achievement` | config | gating |
| `price.amount` | int | 500 | config | coins |
| `asset_path` | string | - | build | pas de remote |
| `compatibility` | object | - | config | slot/gender/type |
| `lifecycle.available_from/to` | date|null | - | config | gating saison |
| `timestamps.created_at/updated_at` | timestamp | - | DB | audit |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Slots avatar | 3 | slots | head/body/accessory |
| Skins zoo | 0 | count | départ |
| Prix base rare | 500 | coins | exemple |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Skins possédés | 0 | 0..∞ | collection |
| Rareté max | common | enum | gating UI |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | config | pass/event/shop | item visible | depends dates |
| Acquisition | achat/gain | coins/xp | possédé | idempotent |
| Équipement | action | skin_id | slot update | 1 per slot |
| Gating | VIP/pass | vip/pass state | allow/deny | suspension vs perte |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Disponible | date in window | vrai | visible |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Retrait shop | date > to | vrai | non achetable (reste possédé si acquis) |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Skin acheté | Oui | persiste |
| Skin pass | Oui | persiste mais accès peut être gated si non VIP |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Notes |
|---|---|---|
| - | visuel uniquement | - |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Jungle | skins adaptés | thématique |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Notes |
|---|---|---|
| Noël | skins saison | dates |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Notes |
|---|---|---|
| Nuit | skins néon visibles | rendu |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet | Condition |
|---|---|---|
| - | aucun | cosmétiques |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Effet | Condition |
|---|---|---|
| Skins zoo | attractivité + | esthétique |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Texture animal | visuel | pas de stats |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Collection rare | + | prestige |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Déblocage skins | visible | via RP/achievements |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps visite | + | attractivité via skins |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat skin | prix | coins | shop |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | esthétique | skins indirect |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur | Boutique | envie souvenir | achat |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `SKIN_PURCHASED` | achat | skin_id | possédé |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `SKIN_PREVIEW` | preview | render |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `ZOO_SKIN_APPLIED` | apply | update visuel |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| - | - | - |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| - | - | - |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `SKIN_EQUIPPED` | equip | slot update |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | inventaire skins | equip |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `equipSkin` | skin_id, slot | ok/err | compat |
| `applyRarityBorder` | rarity | css/token | UI |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `SKIN_LOCKED` | Warning | "Skin verrouillé." | non possédé |
| `INCOMPATIBLE_SKIN` | Warning | "Skin incompatible." | slot/type |
| `INSUFFICIENT_FUNDS` | Warning | "Pièces insuffisantes." | achat |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Equiper | custom avatar | navigation | accès direct depuis avatar HUD |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Grille skins | items | owned/locked |
| Preview | paper doll | slots |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Profil | onglet skins | - |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Inventaire | items possédés | pas de cache |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir | profil | grille |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_SKIN_INVENTORY` | clic | modal |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `skins_loop.mp3` | screen | loop | - |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `equip_click.mp3` | equip | faible |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `rarity_border.png` | UI | 5 couleurs |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `skin_thumb.png` | item |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `skin_unlock.webm` | unlock | 1.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| glow | unlock | 0.8s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `rarity_common` | #B0B0B0 | border |
| `rarity_legendary` | #D4AF37 | border |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `skin.equip` | Équiper | Equip |
| `skin.buy` | Acheter | Buy |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Carte skin | carré arrondi | grid |

535
docs/specs/soigneur.md Normal file
View File

@@ -0,0 +1,535 @@
# Soigneur
## 1. Définition
Employé spécialisé dans la santé des animaux. Il intervient pour prévenir les maladies, soigner les animaux malades et s'assurer de leur bien-être général. Il est achetable avec des pièces du zoo.
## 2. Fonctions
* **Prévention :** Réduit la probabilité d'apparition de maladies dans les enclos assignés ou proches.
* **Soin :** Intervient automatiquement sur les animaux malades pour les guérir (durée d'action).
* **Bien-être :** Augmente légèrement le score de bien-être des animaux.
## 3. Icone
* **Représentation :** Croix verte ou Trousse de secours.
* **Couleur dominante :** Blanc et Vert.
## 4. Interactions
* **Recrutement :** Via le menu "Employés" contre des pièces.
* **Assignation :** Peut être assigné à une zone ou un enclos spécifique (drag & drop ou menu contextuel).
* **Amélioration :** (Optionnel) Formation pour augmenter l'efficacité.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"employee_id": "healer_01",
"type": "soigneur",
"name": "Dr. Doolittle",
"salary": 50, // Coût par cycle (jour/mois)
"hire_cost": 500, // Coût d'achat en pièces
"stats": {
"speed": 1.0,
"efficiency": 0.8,
"range": 5 // Rayon d'action en cases
},
"assigned_zone": null // null = tout le zoo, ou ID de zone,
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Règles Métier
* Un animal malade non soigné peut mourir ou contaminer les autres.
* Le soigneur doit se déplacer physiquement (ou virtuellement avec délai) jusqu'à l'enclos.
* Le coût de recrutement augmente avec le nombre de soigneurs déjà possédés.
## 6. Annexes UX/UI
* **Visuel Carte :** Personnage en blouse blanche avec une mallette.
* **Feedback :** Icône de croix verte au-dessus de l'animal soigné.
* **Notification :** "Un animal est malade !" (si pas de soigneur dispo) ou "Animal soigné par [Nom]".
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Entité | Employé “Soigneur” |
| Rôle | Prévenir/traiter maladies, stabiliser les états critiques, améliorer bien-être. |
| Portée | Zone ou enclos assigné + rayon `stats.range`. |
| Contraintes | Se déplace (coût temps), file de tâches, disponibilité. |
| Vue | Isométrique 2.5D, sprite 4 directions, hitbox base-sprite. |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Prévention maladies | Tick soigneur / tick zoo | `efficiency`, enclos, densité | probas maladies - | Effet plafonné ; dépend propreté enclos | Event `HEALER_PREVENTION_TICK`, métrique “maladies évitées” |
| Soin automatique | Animal `SICK` | animal, soigneur dispo | état animal amélioré | Priorité: critique > contagieux > léger | Event `HEALER_TREAT_START/END` |
| Quarantaine (si prévue) | Animal contagieux | enclos, iso | propagation - | nécessite zone dédiée | Event `HEALER_QUARANTINE` |
| Boost bien-être | Tick | `efficiency` | `wellbeing +` | Bonus léger, cumul limité/jour | Event `HEALER_WELLBEING_TICK` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Croix verte / trousse de soin |
| Couleur dominante | Blanc / vert |
| Variantes | `icon_healer_cross.png`, `icon_healer_bag.png` |
| États | Badge “occupé” (sablier), “urgence” (rouge), “en pause” (Zzz) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Recruter | Action | coins ≥ `hire_cost` | Menu Employés → Soigneur → Confirmer | entité créée | `INSUFFICIENT_FUNDS`, `EMPLOYEE_CAP_REACHED` |
| Assigner zone/enclos | Action | zone existe, path possible | Sélection soigneur → “Assigner” → clic zone/enclos | priorité locale | `NO_PATH`, `INVALID_TARGET` |
| Forcer intervention | Action | animal malade visible | clic animal → “Appeler soigneur” | tâche ajoutée | `NO_HEALER_AVAILABLE` |
| Former | Action (option) | ressources/temps | panel → “Former” | `efficiency +` | `INSUFFICIENT_FUNDS` |
| Inspecter file | Consultation | - | panel soigneur | liste tâches + ETA | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `employee_id` | string | `healer_01` | DB | unique |
| `type` | enum | `soigneur` | DB | constante |
| `salary` | int | 50 | config | coins/jour |
| `hire_cost` | int | 500 | config | one-shot |
| `stats.speed` | float | 1.0 | DB | modifie déplacement |
| `stats.efficiency` | float | 0.8 | DB | [0..1.5] |
| `stats.range` | int | 5 | DB | [1..10] |
| `assigned_zone` | uuid/null | null | runtime | null = global |
| `task_queue` | array | - | runtime | FIFO + priorités |
| `state` | enum | `IDLE|MOVING|TREATING|BREAK` | runtime | transitions contrôlées |
| `grid` | object | `{x,y}` | runtime | position |
| `iso_x/iso_y` | int | - | rendu | projection |
| `z_index` | int | - | rendu | profondeur |
| `hitbox` | enum | `base_sprite` | rendu | click base |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Rayon action | 5 | cases | `range` |
| Efficacité | 0.8 | coef | prévention/soin |
| Temps soin léger | 2 | min in-game | tâche |
| Temps soin moyen | 5 | min in-game | tâche |
| Temps soin critique | 10 | min in-game | tâche |
| Pause | 15 | min in-game | toutes 4h in-game |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Animaux soignés/jour | 0 | 0..∞ | santé globale |
| Maladies évitées/jour | 0 | 0..∞ | survie |
| Coût santé/jour | 50 | 0..∞ | dépenses employés |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | embauche | coins | entité | état `IDLE` |
| Action | détection maladie | animal | tâche | priorité |
| Pause | fatigue | temps | état `BREAK` | pas de soin |
| Disparition | licenciement (si prévu) | - | suppression | stop tâches |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Achat | coins ≥ `hire_cost` | vrai | création |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Licenciement | action joueur | vrai | suppression |
| Zoo supprimé | - | vrai | suppression |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| `stats` | Oui | persistées |
| `task_queue` | Non | vidée au reset jour |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Température | Effet | Condition |
|---|---|---|
| Extrême | charge + | plus danimaux critiques |
| Tempérée | neutre | - |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Chemins | déplacement + | visiteurs attirés aux chemins |
| Boue | déplacement - | pénalité path |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | maladies froid + | tâches + |
| Été | stress chaleur + | tâches + |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Règle |
|---|---|---|
| Jour | soins actifs | - |
| Nuit | interventions urgentes uniquement | sinon pause |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| Soins réguliers | + | animaux non malades |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| Animal critique sans soigneur | risque mort + | file saturée |
| Animal contagieux traité | mortalité - | quarantaine/soin |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| Nourriture spéciale | soins + efficaces | si buff actif |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| État | Effet | Condition |
|---|---|---|
| Animaux visibles en bonne santé | satisfaction + | enclos propres |
| Animaux malades visibles | satisfaction - | incidents |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action | Effet animaux | Condition |
|---|---|---|
| Soins | stress - | traitement réussi |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Certificat santé | +10% | vente animal si soigné récemment |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Transport animaux malades | interdit | vente/transport bloqué |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Urgence bébé | soin possible | nurserie niv 4+ |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Réception | - | pas deffet direct |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Tech médecine | soins + rapides | si débloquée |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps visite | + | zoo sain |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Vente soins | revenu + | coins | boutique pharmacie (si ajoutée) |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Remboursement | -coins | coins | visiteur choqué |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Salaire | 50 | coins/jour | actif |
| Formation | 300 | coins | upgrade |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Soins bébé | 10 | coins | action “urgence” |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Médicaments | 5 | coins/soin | si consommable |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Diagnostic arrivée | 10 | coins | si check santé |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Transport vers clinique | 100 | coins | si feature externe |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | soigneur indirect (via santé zoo) |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Soigneur | Enclos | tâche | déplacement sur chemins |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteurs | Boutique | santé/incident | achats + |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Visiteur mécontent | sortie | incident non résolu | départ + |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `ANIMAL_SICK` | état maladie | animal_id | alerte |
| `ANIMAL_HEALED` | fin soin | animal_id | info |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `HEALER_MOVING` | tâche | rendu déplacement |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `HEALTH_SYSTEM_OVERLOADED` | trop malades | alerte |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_WORRIED` | animal malade vu | satisfaction - |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VISITOR_REFUND_REQUEST` | très mécontent | remboursement |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `PLAYER_CALL_HEALER` | bouton | tâche prioritaire |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | prévention base | - |
| 2 | 1500 | `range` +1 | couverture |
| 3 | 3000 | `efficiency` +0.1 | soins plus rapides |
| 4 | 6000 | soins contagieux + | quarantaine (option) |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `scan_sick_animals` | zoo state | list | priorités |
| `enqueue_heal_task` | animal | task | file |
| `apply_treatment` | animal, efficiency | state | clamp |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `NO_HEALER_AVAILABLE` | Alerte | "Aucun soigneur disponible." | file saturée |
| `ANIMAL_HEALED` | Info | "Animal soigné." | fin soin |
| `DISEASE_SPREAD` | Warning | "Risque de contagion." | cluster |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Recruter | diminuer morts | coût | bouton recruter direct |
| Traiter urgence | sauver animal | localisation | deep-link depuis notif |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Panel soigneur | file tâches, range | IDLE/MOVING/TREATING |
| Badge maladie | icône croix/virus | levels |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Carte | sprite soigneur | sélection base |
| Panel animal | bouton “Appeler” | urgence |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| États animaux | `SICK/CRITICAL` | pas de fallback |
| Notifications | push HUD | - |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir panel | clic soigneur | panel |
| Appeler | clic animal → bouton | tâche |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_HEALER_PANEL` | clic | panel |
| `CLICK_CALL_HEALER` | bouton | tâche |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `clinic_soft_loop.mp3` | ambiance soin | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `ui_alert_med.mp3` | alerte maladie | moyen |
| `heal_success.mp3` | fin soin | faible |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `healer_sprite_[dir].png` | sprite | 4 dirs |
| `fx_green_cross.png` | FX | overlay |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `icon_healer_cross.png` | HUD |
| `portrait_healer.png` | panel |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `heal_popup.webm` | popup | 1.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| pulsation croix | animal malade | loop |
| sparkles verts | soin | burst |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `healer_primary` | #2ECC71 | UI |
| `healer_alert` | #E74C3C | urgence |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `healer.call` | Appeler le soigneur | Call healer |
| `healer.busy` | Soigneur occupé | Healer busy |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Badge maladie | rond | lisible |
| Barre santé | rectangulaire | standard |

View File

@@ -12,11 +12,16 @@
### Frontend
- **Framework** : React ou Vue.js.
- **État** : Zustand ou Pinia (léger et performant).
- **Rendu Grille** : Canvas API (via PixiJS ou Konva) si > 100 éléments animés, sinon DOM optimisé (CSS Grid + Transforms).
- **Rendu Grille** : Canvas API (via PixiJS ou Konva) pour la **Vue Isométrique**.
- Gestion de la profondeur (z-index) pour les bâtiments et animaux.
- Système de tuiles (Tilemap) isométriques.
- **Optimisation** : Culling (ne pas rendre ce qui est hors écran).
### Infrastructure
- **Cache** : Redis (pour les sessions, les compteurs temps réel et les files d'attente de jobs).
- **Message Broker** : BullMQ (Redis) ou RabbitMQ pour les tâches asynchrones (morts, naissances, enchères).
- **Cache** : Interdit (aucun cache applicatif, aucune mémorisation). Les lectures doivent refléter létat courant calculé/stocké, sans couche de cache.
- **Queue / Jobs** : File de tâches sans cache.
- Option A : RabbitMQ (messages durables) pour les tâches asynchrones (morts, naissances, enchères).
- Option B : Jobs en base PostgreSQL (table `jobs` + workers) avec verrous transactionnels (SKIP LOCKED) pour éviter les doubles traitements.
---
@@ -41,9 +46,9 @@ CREATE TABLE animals (
zoo_id UUID REFERENCES zoos(id),
type VARCHAR(50),
birth_date TIMESTAMPTZ,
state JSONB, -- { health, hunger, stress, ... }
genetics JSONB, -- { color, rarity, parents... }
position JSONB -- { x, y }
state JSONB, -- { health, hunger, stress, happiness, lastFedAt, lastVisitedAt }
genetics JSONB, -- { color, rarity, parents, mutations, lineageId }
position JSONB -- { x, y, iso_x, iso_y, z_index }
);
```
@@ -70,7 +75,9 @@ Calculer l'état d'un zoo **uniquement quand c'est nécessaire** (lecture par le
### Exceptions (Workers)
Certains événements doivent arriver même si le joueur est hors ligne (ex: Enchères, Morts impactant le marché).
* Utiliser des **Cron Jobs** ou des **Delayed Jobs** (Redis) pour traiter ces événements spécifiques à leur heure d'échéance prévue.
* Utiliser des **Cron Jobs** ou des **Delayed Jobs** sans cache pour traiter ces événements à lheure déchéance prévue.
* Option A : messages planifiés via RabbitMQ (plugin de scheduling si utilisé).
* Option B : table PostgreSQL `jobs` (colonnes `run_at`, `locked_at`, `attempts`, `last_error`) + worker(s) avec `SELECT FOR UPDATE SKIP LOCKED`.
---
@@ -90,29 +97,38 @@ Certains événements doivent arriver même si le joueur est hors ligne (ex: Enc
### Système
- `POST /api/auth/login` : Authentification par clé.
- `GET /api/config` : Récupère les tables statiques (Animaux, Coûts, Saisons) pour le cache client.
- `GET /api/config` : Récupère les tables statiques (Animaux, Coûts, Saisons) pour initialiser le client, sans mécanisme de cache applicatif.
# 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)
### Chargement (Feedback)
**Description UX** : Le joueur attend le calcul du Lazy Update à la connexion.
**Description UI** : Écran de chargement avec barre de progression ou animation (Animal qui marche).
**Emplacement** : Plein écran (Démarrage).
**Intégration** : Bloquant.
**Navigation** : N/A
**Navigation** : Aucune (écran dattente avant accès au jeu).
**Événements** : `APP_LOAD`.
#### Assets
- **Musiques** : Thème Principal.
- **Sons** : N/A
- **Sons** : `ui_loader_tick.mp3` (boucle courte et discrète), `ui_loaded_pop.mp3` (fin de chargement).
- **Graphiques** : Logo Jeu.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `loading_mascot.png` (mascotte), `loading_background.png` (fond).
- **Vidéos** : `loading_anim.webm` (animation courte, loop).
- **Animations** : Loader.
- **Couleurs** : Thème Jeu.
- **Textes** : "Calcul de la simulation...", "Rattrapage du temps...".
- **Formes** : N/A
- **Textes** : "Calcul de la simulation", "Rattrapage du temps".
- **Formes** : Cercle (spinner), barre (progress).
### Erreur Connexion (Feedback)
**Description UX** : Perte de connexion ou erreur API.
@@ -123,12 +139,12 @@ Certains événements doivent arriver même si le joueur est hors ligne (ex: Enc
**Événements** : `NETWORK_ERROR`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Ducking du thème principal (-6 dB) pendant laffichage de lerreur.
- **Sons** : `error.mp3`.
- **Graphiques** : Icône Wifi barré.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `icon_wifi_off.png`, `modal_error_bg.png`.
- **Vidéos** : `network_error_glitch.webm` (optionnel, 0.8s loop).
- **Animations** : Secousse.
- **Couleurs** : Rouge.
- **Textes** : "Connexion perdue".
- **Formes** : N/A
- **Formes** : Rectangle arrondi (modal), toast (pill).

View File

@@ -24,24 +24,28 @@ Propriété de `Case`.
Définie par le biome (voir `milieu.md`).
### Scores Initiaux
N/A
**T° Moyenne** : 20°C (Référence).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
Système Météo Global.
### Conditions de Disparition
N/A
**Permanence** : La température est une constante physique, elle ne disparaît jamais (sauf bug univers).
### Hérédité
N/A
**Climat** : Le joueur choisit son climat de départ au reset (Tropical, Tempéré, Polaire).
## 3. Impacts Environnementaux
### Impact Température
N/A (C'est la définition même).
| Paramètre | Valeur | Unité | Règle |
|---|---:|---|---|
| Inertie eau | 0.5 | facteur | Un changement global (saison/météo) affecte leau à 50% de lamplitude. |
| Inertie sol | 1.0 | facteur | Le sol suit lamplitude complète. |
| Lissage | 15 | min in-game | La variation sapplique progressivement sur la durée (évite “saut” visuel brutal). |
### Impact Milieu (Biome)
N/A
**Inertie** : L'eau change de T° moins vite que la terre (Tampon thermique).
### Impact Saisons
| Saison | Modificateur Global |
@@ -68,20 +72,20 @@ N/A
**Froid** : Augmente la consommation de nourriture (+20% par tranche de 5°C sous l'idéal).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Confort Visiteur** : T° idéale (22°C) = Bonus satisfaction. Si > 30°C ou < 5°C, satisfaction baisse plus vite.
### Impact Valeur
N/A
**Coût Énergie** : Chauffage/Clim coûte cher (10 pièces/degré corrigé).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Gel** : Si T° < 0°C, vitesse déplacement -20% (Verglas).
### Dépenses (Boutiques/Visiteurs)
N/A
**Facture Énergétique** : Coût mensuel lié aux régulateurs thermiques.
### Trajet Visiteurs
N/A
**Ombre** : Les visiteurs cherchent l'ombre en été (Pathfinding modifié).
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -94,6 +98,8 @@ N/A
| Niveau | Coût | Plage Réglage | Temps |
| :--- | :--- | :--- | :--- |
| 1 | 200 | +/- 5°C | 0s |
| 2 | 500 | +/- 10°C | 0s |
| 3 | 1000 | +/- 20°C | 0s |
| 7 | 2000 | +/- 50°C | 0s |
## 8. Logique et Interfaces
@@ -109,6 +115,15 @@ currentTemp = baseBiomeTemp + seasonMod + dayNightMod + caseRegulatorOffset
# 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)
### Visualisation Thermique (Passif)
**Description UX** : Le joueur voit la température de chaque case.
@@ -119,31 +134,31 @@ currentTemp = baseBiomeTemp + seasonMod + dayNightMod + caseRegulatorOffset
**Événements** : `TOGGLE_THERMAL_VIEW`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Sonar "Ping" lors de l'activation.
- **Sons** : `switch.mp3`.
- **Graphiques** : Overlay dégradé Bleu/Rouge semi-transparent.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Légende thermique (Barre de couleur).
- **Vidéos** : Effet de chaleur (ondulation de l'air).
- **Animations** : Fade In/Out de l'overlay.
- **Couleurs** : Bleu (#0000FF) -> Rouge (#FF0000).
- **Textes** : "25°C" (sur chaque case).
- **Formes** : N/A
- **Formes** : Grille colorée.
### Feedback Critique (Alerte)
**Description UX** : Une case est mortelle pour son occupant.
**Description UI** : La case clignote ou a un bord rouge. L'animal tremble (froid) ou transpire (chaud).
**Emplacement** : Case.
**Intégration** : Immédiat.
**Navigation** : N/A
**Navigation** : Auto (Alerte).
**Événements** : `TEMP_ALERT`.
#### Assets
- **Musiques** : N/A
- **Musiques** : Sirène "Alerte Météo" (lointaine).
- **Sons** : `shiver.mp3` (dents qui claquent) ou `pant.mp3`.
- **Graphiques** : Particules Givre ou Vapeur.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : Icône Flocon ou Flamme.
- **Vidéos** : Effet de gel (bords écran blancs).
- **Animations** : Tremblement sprite.
- **Couleurs** : Bleu Glace / Rouge Feu.
- **Textes** : N/A
- **Formes** : N/A
- **Textes** : "Danger T° !".
- **Formes** : Pulsation rouge autour de la case.

499
docs/specs/theme.md Normal file
View File

@@ -0,0 +1,499 @@
# Thème
## 1. Définition
Ensemble cohérent de skins et d'éléments visuels transformant l'ambiance générale du zoo ou de l'interface. Un thème peut inclure des skins pour l'avatar, des textures pour les chemins, des apparences pour les bâtiments et une musique de fond spécifique. Les thèmes sont souvent liés aux passes saisonniers (ex: Jungle, Tigre, Ours, Dinosaures).
## 2. Fonctions
* **Immersion :** Change l'atmosphère du jeu.
* **Récompense :** Objectif principal des passes saisonniers.
* **Fidélisation :** Renouvellement visuel régulier pour éviter la lassitude.
## 3. Icone
* **Représentation :** Pinceau et palette ou Paysage stylisé.
* **Couleur dominante :** Arc-en-ciel ou Variable selon le thème.
## 4. Interactions
* **Activation :** Via le menu des paramètres ou le menu de personnalisation du zoo.
* **Aperçu :** Possibilité de voir le rendu du thème avant de l'appliquer.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"theme_id": "theme_jungle_2026",
"name": "Saison de la Jungle",
"associated_pass_id": "pass_jungle",
"assets": {
"background_music": "music_jungle_loop.mp3",
"ui_style": "jungle_skin",
"default_path_texture": "texture_path_mossy",
"zoo_entrance_skin": "entrance_temple"
},
"active_period": {
"start": "2026-06-01",
"end": "2026-06-30"
}
}
```
### Règles Métier
* L'accès à un thème est temporaire (durée du passe, ex: 1 mois) pour les joueurs standards.
* **Exception VIP :** Les joueurs VIP conservent l'accès aux thèmes débloqués de manière permanente tant qu'ils conservent leur statut VIP.
* Un thème s'applique globalement mais peut être désactivé par le joueur.
## 6. Annexes UX/UI
* **Sélecteur de Thème :** Carrousel ou liste déroulante dans les options graphiques.
* **Transition :** Fondu au noir ou effet de "rideau" lors du changement de thème.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Thème = pack cohérent de skins + style UI + ambiance audio/FX. |
| Portée | Global zoo + UI (selon `assets.ui_style`). |
| Source | Passe saisonnier, boutique, VIP gating. |
| Contrainte | Application immédiate et réversible ; pas de cache applicatif (état courant). |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Lister thèmes | open UI | filtres | liste | gating par possession/VIP | Event `THEME_LIST_OPEN` |
| Prévisualiser | hover/clic | theme_id | preview | sandbox visuel (sans commit) | Event `THEME_PREVIEW` |
| Activer | clic apply | possession, gating | theme actif | Un thème actif à la fois ; idempotent | Event `THEME_APPLIED` |
| Désactiver | clic | - | retour default | revert complet | Event `THEME_REMOVED` |
| Appliquer assets | apply | `assets` | rendu | map textures, UI tokens, musique | Event `THEME_ASSETS_BOUND` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Palette/pinceau / paysage |
| Couleur dominante | variable selon thème |
| Variantes | `icon_theme_palette.png`, `icon_theme_landscape.png` |
| États | lock, “actif”, “expire bientôt” |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Ouvrir sélecteur | Consultation | - | Paramètres → Thèmes | liste | - |
| Prévisualiser | Consultation | thème visible | clic item | preview | - |
| Appliquer | Action | possédé + gating ok | bouton “Appliquer” | thème actif | `THEME_LOCKED`, `VIP_REQUIRED` |
| Désactiver | Action | thème actif | “Désactiver” | default | - |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `theme_id` | string | `theme_jungle_2026` | config | unique |
| `name` | string | `Saison de la Jungle` | i18n | affichage |
| `associated_pass_id` | string | `pass_jungle` | config | gating |
| `assets.background_music` | string | `music_jungle_loop.mp3` | build | loop |
| `assets.ui_style` | string | `jungle_skin` | build | tokens |
| `assets.default_path_texture` | string | `texture_path_mossy` | build | iso tiles |
| `assets.zoo_entrance_skin` | string | `entrance_temple` | build | banderole/entrée |
| `active_period.start/end` | date | - | config | window |
| `player_state.active_theme_id` | string|null | - | DB | 1 actif |
| `timestamps.created_at/updated_at` | timestamp | - | DB | audit |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| Thème actif | none | id | default |
| Nombre thèmes dispo | 0..n | count | selon possession |
| Musique | default | asset | fallback interdit, donc default est un thème “base” explicitement défini |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Thèmes possédés | 0 | 0..∞ | collection |
| Thèmes actifs/jour | 0 | 0..∞ | debug |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | passe/shop | theme_id | visible | gating dates |
| Activation | apply | id | actif | unique |
| Fin période | end_date | now | gating | VIP rule |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Possédé | true | est | visible |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Non-VIP + fin période | true | est | non activable (reste listé “verrouillé”) |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Possession thème | Oui | persiste |
| Activation | Oui | persiste |
| Accès après saison | conditionnel | VIP gating |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet | Notes |
|---|---|---|
| Hiver | textures neige | visuel |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet | Notes |
|---|---|---|
| Jungle | palette verte | cohérence |
#### Impact Saisons (tableau détaillé)
| Saison | Effet | Notes |
|---|---|---|
| Saison du passe | thème recommandé | UI |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet | Notes |
|---|---|---|
| Nuit | néon/torches | rendu |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet | Condition |
|---|---|---|
| - | aucun | cosmétique |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Effet | Condition |
|---|---|---|
| Thème cohérent | attractivité + | esthétique |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| Skins enclos/objets | visuel | pas de stats |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Thèmes rares | + | prestige |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps visite | + | attractivité via thème |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Achat thème | variable | coins | pass/shop |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | esthétique | thème indirect |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `THEME_APPLIED` | apply | theme_id | actif |
| `THEME_REMOVED` | remove | - | default |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `THEME_ASSETS_BOUND` | apply | bind |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `THEME_PREVIEW` | preview | render |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| - | - | - |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| - | - | - |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|---|
| `OPEN_THEME_SELECTOR` | open | UI |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | 0 | sélecteur thèmes | apply |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `applyTheme` | theme_id | ok/err | gating |
| `bindAssets` | assets | renderer | - |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `THEME_LOCKED` | Warning | "Thème verrouillé." | non possédé |
| `VIP_REQUIRED` | Warning | "VIP requis." | gating |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Changer thème | ambiance | preview | bouton “Prévisualiser” + “Appliquer” |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Sélecteur | liste/carrousel | locked/active |
| Transition | rideau/fondu | - |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Options | menu | - |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| UI tokens | css/theme | cohérence |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir | options | liste |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_THEME_SELECTOR` | clic | modal |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `music_jungle_loop.mp3` | fond | loop | thème |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `ui_theme_apply.mp3` | apply | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `theme_cards.png` | UI | - |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `theme_preview.png` | preview |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `theme_transition.webm` | transition | 1.2s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| rideau | apply | 1.0s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `theme_primary` | variable | UI |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `theme.apply` | Appliquer | Apply |
| `theme.preview` | Prévisualiser | Preview |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Cartes | rectangles arrondis | - |

View File

@@ -2,7 +2,7 @@
## Types de Ventes
- **Aux Enchères** : Vers d'autres joueurs (prix potentiellement élevé).
- **Libération (Vente rapide)** : Vente au "système" (prix bas fixe) pour faire de la place rapidement (si implémenté pour éviter la mort). *Note : Le cahier des charges privilégie le marché joueurs, la libération est une option de secours.*
- **Libération (Vente rapide)** : Vente au "système" (prix plancher fixe) pour libérer de la place rapidement (optionnelle selon design retenu). *Note : Le cahier des charges privilégie le marché joueurs ; la libération est un mode de vente alternatif.*
## Contraintes
- Un animal malade ou mourant ne peut pas être mis en vente.
@@ -12,80 +12,151 @@
## 1. Données et États
### Modèle de Données (JSON)
N/A
```json
{
"sale_id": "uuid",
"seller_zoo_id": "uuid",
"seller_player_id": "uuid | null (null si bot)",
"animal_id": "uuid",
"sale_type": "enum('auction_adult','auction_baby','release_system')",
"status": "enum('draft','in_transit','listed','pending_validation','completed','expired','cancelled')",
"created_at": "timestamp",
"updated_at": "timestamp",
"listing": {
"start_price": "integer",
"buy_now_price": "integer | null",
"currency": "enum('coins')",
"duration_seconds": "integer (3600|14400|86400)",
"end_at": "timestamp"
},
"bids": [
{
"bid_id": "uuid",
"bidder_zoo_id": "uuid",
"amount": "integer",
"created_at": "timestamp"
}
],
"validation": {
"accepted_bid_id": "uuid | null",
"pending_until": "timestamp | null (sablier 10 min)",
"finalized_at": "timestamp | null"
},
"transport": {
"truck_id": "uuid",
"from_site_id": "uuid",
"to_site_id": "uuid | null",
"climate_control": "boolean",
"insurance": "boolean",
"transport_started_at": "timestamp",
"transport_eta_at": "timestamp"
},
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
### Caractéristiques Initiales
N/A
**Total Vendu** : 0 animaux.
### Scores Initiaux
N/A
**Réputation Vendeur** : Neutre (0).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
N/A
**Marché** : Offre publiée par le joueur.
### Conditions de Disparition
N/A
**Vente conclue** (Achat par tiers) ou **Annulation** (Retour au zoo).
### Hérédité
N/A
**Certificat** : L'acheteur voit les parents et l'arbre généalogique.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Transport** : Camion climatisé requis si T° extrême (Coût +10%).
### Impact Milieu (Biome)
N/A
**Export** : Le biome d'origine est indiqué (Bonus adaptation si même biome cible).
### Impact Saisons
N/A
**Demande** : Varie selon saison (ex: Rennes très demandés en Hiver, Lapins au Printemps).
### Impact Heure / Jour-Nuit
N/A
**Enchères** : Souvent le soir (18h-22h) pour maximiser les vues (Prime Time).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Vente Reproducteur** : Un animal fertile vaut 2x plus cher.
### Impact Mort
N/A
**Assurance** : Remboursement 50% si mort pendant transport (si assurance payée).
### Impact Nourriture
N/A
**Panier repas** : Coût inclus dans frais vente (L'animal ne doit pas arriver affamé).
### Impact Attractivité (Visiteurs/Animaux)
N/A
**Perte Star** : Vendre son meilleur animal (Légendaire) baisse l'attractivité du zoo (-10%).
### Impact Valeur
**Prix Libération** : 10% de la valeur théorique de l'animal.
**Prix Libération** : 10% de la valeur théorique de l'animal (Prix plancher).
**Prix Enchère** : Potentiellement infini (Offre/Demande).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Durée Enchère** : 1h, 4h, 24h (au choix).
### Dépenses (Boutiques/Visiteurs)
N/A
**Taxe Salle Vente** : 10% du prix final prélevé par le jeu.
### Trajet Visiteurs
N/A
**Départ** : Les visiteurs font signe "au revoir" quand le camion part.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Offre** : Mise en ligne.
* **Bid** : Nouvelle enchère reçue.
* **Sold** : Vente terminée.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Compétences Marchand.*
| Niveau | Nom | Avantage |
| :--- | :--- | :--- |
| 1 | Vendeur Rue | Taxe 10% |
| 2 | Négociant | Taxe 8% |
| 3 | Exportateur | Taxe 5%, Visibilité Mondiale |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function sellAnimal(animal, price, mode):
if mode == "RELEASE":
player.coins += animal.value * 0.10
removeAnimal(animal)
else:
createOffer(animal, price)
animal.status = "TRANSIT"
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `ANIMAL_SOLD` | Succès | "Animal vendu pour {amount} pièces !" |
| `ANIMAL_RELEASED` | Info | "Animal relâché dans la nature." |
# 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)
### Libération (Action)
**Description UX** : Le joueur relâche un animal (vente système).
@@ -96,12 +167,12 @@ N/A
**Événements** : `RELEASE_ANIMAL`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_warning_soft.mp3` (jingle court à louverture de confirmation).
- **Sons** : `bird_fly_away.mp3` (bruit de nature positif).
- **Graphiques** : Icône Cage ouverte.
- **Images** : N/A
- **Vidéos** : N/A
- **Images** : `icon_release.png`, `modal_confirm.png`.
- **Vidéos** : `release_fade.webm` (1.2s non loop, optionnel).
- **Animations** : Animal s'estompe ou court hors de l'écran.
- **Couleurs** : Vert (Nature).
- **Textes** : "Libéré !".
- **Formes** : N/A
- **Formes** : Bouton danger (rouge) + modal arrondie.

View File

@@ -17,10 +17,17 @@ Identique à la vente de bébés, mais avec des tolérances plus grandes sur les
Identique à `vente_enchere_bebe.md`.
### Caractéristiques Initiales
N/A
| Caractéristique | Valeur | Notes |
|---|---|---|
| Durée Enchère | 4h - 24h | Les adultes tolèrent des durées plus longues que les bébés. |
| Délai Validation | 10 min | Identique au générique enchères (sablier). |
| Dégradation âge | Oui | Prix perçu diminue avec lâge (cf. `animal_generique.md`). |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Valeur perçue (âge) | 100 | 0-150 | Modifie la propension des bots à enchérir. |
| Résistance transport | 80 | 0-100 | Réduit les risques dincident pendant vente/transport. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -30,64 +37,126 @@ Action joueur.
Vente ou Expiration.
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Parents (si connus) | Arbre généalogique | 100% | Non |
| Vendeur | “Certificat dentretien” | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Plage Température | Effet sur l'entité | Bonus/Malus |
|---|---|---|
| < 0°C | Fatigue + | Risque incident +5% si pas de camion climatisé |
| 1525°C | Stable | 0 |
| > 35°C | Fatigue + | Risque incident +5% si pas de camion climatisé |
### Impact Milieu (Biome)
N/A
| Biome | Compatibilité | Bonus/Malus |
|---|---:|---|
| Marché (UI) | 100% | Aucun |
| Transport long | 90% | Légère fatigue (adultes résistent) |
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Hiver | Demande espèces froides + | Bids +10% (espèces adaptées) |
| Été | Demande espèces chaudes + | Bids +10% (espèces adaptées) |
### Impact Heure / Jour-Nuit
N/A
| Période | Activité marché | Impact |
|---|---|---|
| 18h22h | Prime time | +10% bids |
| Nuit | Faible | -15% bids |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Adulte fertile vendu | Prix x2 | Si fertilité > seuil et pas en cooldown |
### Impact Mort
**Risque** : Si `status == expired` et non récupéré sous 24h -> Mort.
### Impact Nourriture
N/A
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---:|---:|---:|
| Rations transport | stable | inclus | 3 |
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| Vente star (rare) | -10% attractivité zoo | Global (zoo vendeur) |
### Impact Valeur
N/A
| Facteur | Variation Prix | Condition |
|---|---:|---|
| Âge élevé | -20% | au-delà du seuil “senior” |
| Santé parfaite | +10% | survival élevé |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Paramètre | Valeur | Unité | Règle |
|---|---:|---|---|
| Fenêtre récupération invendu | 24 | h | sinon risque mort adulte (cf. spec) |
| Délai validation | 10 | min | après acceptation |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Taxe marché | 10% | du prix final | prélevée à finalisation |
| Assurance transport | 3% | du prix final | optionnel |
### Trajet Visiteurs
N/A
| Trajet | Condition | Effet | Notes |
|---|---|---|---|
| Consultation marché | ouverture UI | tri | pas de visiteurs physiques |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
| Event | Déclencheur | Effet | Durée |
|---|---|---|---|
| `AUCTION_CREATED_ADULT` | création enchère | listing visible | jusquà fin |
| `AUCTION_EXPIRED_ADULT` | end_time atteint | statut expired | jusquà récupération |
| `AUCTION_FINALIZED_ADULT` | validation finie | transfert | instant |
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Accès enchères adultes |
| 2 | 2000 | Réputation 300 | Taxe -1% |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```text
createAuctionAdult(animal, startPrice, duration):
assert animal.isAdult && animal.health > 50
moveToTransit(animal)
publishListing()
onExpire():
markExpired()
startReclaimTimer(24h)
```
### Messages d'Infos / Alerte
N/A
| Type | Message | Condition | Priorité |
|---|---|---|---:|
| Info | "Enchère créée." | listing publié | 2 |
| Warn | "Enchère expirée : récupérez lanimal." | status expired | 4 |
| Error | "Impossible de vendre : animal indisponible." | malade/mort proche | 5 |
# 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)
### Mise en Vente (Action)
**Description UX** : Le joueur sélectionne un animal adulte sur la grille et choisit "Vendre".
@@ -98,15 +167,15 @@ N/A
**Événements** : `CREATE_AUCTION_ADULT`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_market_open.mp3` (jingle court).
- **Sons** : `cash_register_open.mp3`.
- **Graphiques** : N/A
- **Graphiques** : Icône bourse + badge “adulte”.
- **Images** : Portrait Animal.
- **Vidéos** : N/A
- **Vidéos** : `auction_sheet_intro.webm` (0.8s non loop, optionnel).
- **Animations** : Animal disparaît de la grille (part en zone de vente).
- **Couleurs** : N/A
- **Couleurs** : Or/Gris (adulte), Ambre (pending validation).
- **Textes** : "Mise à prix".
- **Formes** : N/A
- **Formes** : Bottom sheet + cartes.
### Retour Invendu (Action)
**Description UX** : L'enchère est finie sans acheteur. Le joueur doit récupérer l'animal.
@@ -117,12 +186,12 @@ N/A
**Événements** : `RECLAIM_ANIMAL`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_fail_soft.mp3` (jingle court).
- **Sons** : `sad_trombone.mp3` (échec).
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Graphiques** : Icône retour (flèche).
- **Images** : `icon_reclaim.png`.
- **Vidéos** : `reclaim_return.webm` (1.2s non loop, optionnel).
- **Animations** : Retour visuel de l'animal.
- **Couleurs** : Gris (Désactivé).
- **Textes** : "Invendu".
- **Formes** : N/A
- **Formes** : Bouton primary “Récupérer”.

View File

@@ -29,7 +29,10 @@ Processus de vente spécifique pour les bébés animaux nés dans le zoo.
"current_bid": "int",
"highest_bidder": "uuid | null",
"end_time": "timestamp",
"status": "active | sold | expired"
"status": "active | sold | expired",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -40,7 +43,11 @@ Processus de vente spécifique pour les bébés animaux nés dans le zoo.
| Délai Validation | 10 min (fixe) |
### Scores Initiaux
N/A
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Visibilité Listing | 50 | 0-100 | Poids de tri côté marché. |
| Stress (vente) | 10 | 0-100 | Monte avec le temps ; au-delà de 70, accélère le risque de mort. |
| Confiance vendeur | 0 | -100 à +100 | Influence la participation des bots (anti-spam). |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -50,46 +57,79 @@ Action joueur.
Vente ou Expiration.
### Hérédité
N/A
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---:|---|
| Parents (réels) | Rareté/Couleur | cf. `reproduction.md` | Oui |
| Vendeur | “Certificat de soin” | 100% | Non |
## 3. Impacts Environnementaux
### Impact Température
N/A
| Plage Température | Effet sur l'entité | Bonus/Malus |
|---|---|---|
| < 5°C | Stress +2/min | Risque mort + (si durée > 10 min) |
| 20°C (Idéal) | Stress -1/min | Stabilise |
| > 30°C | Stress +2/min | Risque mort + (si durée > 10 min) |
### Impact Milieu (Biome)
N/A
| Biome / Contexte | Compatibilité | Bonus/Malus |
|---|---:|---|
| Marché (UI) | 100% | Aucun |
| Transport long | 80% | Fatigue + |
### Impact Saisons
N/A
| Saison | Effet | Modificateur |
|---|---|---|
| Printemps | Demande bébés + | Bids +10% |
| Été | Chaleur | Stress +10% |
| Automne | Neutre | 0% |
| Hiver | Froid | Stress +10% |
### Impact Heure / Jour-Nuit
N/A
| Période | Activité marché | Impact |
|---|---|---|
| 18h22h | Prime time | +15% bids |
| Nuit | Faible | -20% bids |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Bébé rare vendu | +10 réputation | Si `status` devient `sold` puis finalisé |
### Impact Mort
**Risque** : Si `status == expired` et non récupéré sous 1h -> Mort du bébé.
### Impact Nourriture
N/A
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---:|---:|---:|
| Lait / soin | Stabilise | inclus | 5 |
### Impact Attractivité (Visiteurs/Animaux)
N/A
| Action/État | Gain Attractivité | Rayon d'action |
|---|---:|---:|
| Vente bébé rare conclue | +25 | Global |
| Bébé mort (invendu) | -50 | Global |
### Impact Valeur
**Dépréciation** : Aucune (c'est une enchère).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
| Paramètre | Valeur | Unité | Règle |
|---|---:|---|---|
| Délai validation | 10 | min | après acceptation |
| Fenêtre récupération invendu | 1 | h | sinon mort bébé |
### Dépenses (Boutiques/Visiteurs)
N/A
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Taxe marché | 10% | du prix final | prélevée à finalisation |
| Assurance transport | 5% | du prix final | optionnel |
### Trajet Visiteurs
N/A
| Trajet | Condition | Effet | Notes |
|---|---|---|---|
| Consultation acheteurs | ouverture marché | tri par visibilité | pas de visiteurs physiques |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
@@ -99,11 +139,28 @@ N/A
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---:|---|---|
| 1 | 0 | - | Accès enchères bébés |
| 2 | 1000 | Réputation 200 | Taxe -1% |
| 3 | 5000 | Réputation 1000 | Visibilité +10 |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```text
onAcceptBid(auction, bid):
auction.status = 'pending_validation'
auction.pending_until = now + 10min
onTick():
if auction.status == 'pending_validation' and now >= pending_until:
finalize(auction)
finalize(auction):
transferCoins(bidder, seller, amount - tax)
scheduleDelivery(truck, bidderZoo)
auction.status = 'sold'
```
### Messages d'Infos / Alerte
| ID | Niveau | Message |
@@ -113,6 +170,15 @@ N/A
# 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)
### Mise en Vente (Action)
**Description UX** : Le joueur glisse un bébé depuis la nurserie vers le camion.
@@ -123,12 +189,12 @@ N/A
**Événements** : `CREATE_AUCTION`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_market_open.mp3` (jingle court).
- **Sons** : `cash_register_open.mp3`.
- **Graphiques** : Icône Bourse/Pièce.
- **Images** : Portrait Bébé.
- **Vidéos** : N/A
- **Animations** : N/A
- **Vidéos** : `auction_sheet_intro.webm` (0.8s non loop, optionnel).
- **Animations** : Compteur “mise à prix” qui sincrémente, pulsation du bouton “Valider”.
- **Couleurs** : Or.
- **Textes** : "Prix de départ", "Durée".
- **Formes** : Champs de saisie.
@@ -142,12 +208,12 @@ N/A
**Événements** : `OPEN_MY_SALES`.
#### Assets
- **Musiques** : N/A
- **Musiques** : `ui_market_list.mp3` (jingle discret optionnel).
- **Sons** : `notification.mp3` (si offre reçue).
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Couleurs** : N/A
- **Graphiques** : Icône cloche + badge compteur.
- **Images** : `icon_hourglass.png`, `icon_bid.png`.
- **Vidéos** : `bid_badge_pulse.webm` (0.6s loop, optionnel).
- **Animations** : Badge qui pulse sur nouvelle offre.
- **Couleurs** : Ambre (#F39C12) en attente validation, Vert (#2ECC71) vendu.
- **Textes** : "Meilleure offre : X".
- **Formes** : N/A
- **Formes** : Pills (badges), cartes liste.

View File

@@ -23,7 +23,10 @@ Une ville est une entité sur la Carte du Monde qui génère le flux de visiteur
"type": "city",
"name": "string",
"population": "integer",
"wealth_factor": "float (0.5 - 2.0)"
"wealth_factor": "float (0.5 - 2.0)",
"iso_x": "integer",
"iso_y": "integer",
"z_index": "integer"
}
```
@@ -34,90 +37,118 @@ Une ville est une entité sur la Carte du Monde qui génère le flux de visiteur
| Richesse | 1.0 |
### Scores Initiaux
N/A
**Niveau de Bonheur** : 50% (Influence la fréquence des visites).
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
Génération carte.
### Conditions de Disparition
N/A
**Désastre** : Ville détruite (Event rare "Météorite" ou "Crise Éco").
### Hérédité
N/A
**Jumelage** : Bonus permanent de flux (+5%) si relation max atteinte avec une ville.
## 3. Impacts Environnementaux
### Impact Température
N/A
**Ilot de chaleur** : La ville est toujours +2°C par rapport à la campagne environnante.
### Impact Milieu (Biome)
N/A
**Architecture** : Adaptée au biome (Igloos en Toundra, Tentes en Désert, Gratte-ciels en Plaine).
### Impact Saisons
N/A
**Festivals** : Event saisonnier en ville (+Visiteurs pendant 24h).
- Été : Carnaval.
- Hiver : Marché de Noël.
### Impact Heure / Jour-Nuit
N/A
**Lumières** : La ville brille la nuit (Pollution lumineuse visible).
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
**Baby Boom** : Augmente la population de la ville (+Flux) pendant 1 semaine.
### Impact Mort
N/A
**Épidémie** : Baisse population temporaire (-Flux).
### Impact Nourriture
N/A
**Marché** : La ville vend de la nourriture au joueur (Source d'approvisionnement).
### Impact Attractivité (Visiteurs/Animaux)
Source du flux. `Flux = Pop * (AttractivitéZoo / Distance²)`.
### Impact Valeur
N/A
**PIB** : Influence le budget des visiteurs (Richesse). Une ville riche envoie des VIP.
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
**Trafic** : Ralentit les camions traversant la ville aux heures de pointe (8h-9h, 17h-18h).
### Dépenses (Boutiques/Visiteurs)
**Facteur Richesse** : Multiplie le budget des visiteurs issus de cette ville.
### Trajet Visiteurs
Point de départ.
Point de départ. Les visiteurs arrivent en bus/voiture depuis la ville.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
N/A
* **Fête Nationale** : Flux x2.
* **Grève** : Flux / 2.
## 7. Progression
### Tableau des Upgrades
N/A
*Note : Campagnes Marketing ciblées.*
| Niveau Campagne | Coût | Effet |
| :--- | :--- | :--- |
| 1 (Panneaux) | 500 | +5% Flux |
| 2 (Radio) | 1500 | +10% Flux |
| 3 (TV) | 5000 | +20% Flux |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function calculateVisitorFlow(city, zoo):
distance = getDistance(city, zoo)
baseFlow = city.population * (zoo.attractiveness / (distance * distance))
if isPeakHour(): baseFlow *= 1.5
if city.hasEvent(): baseFlow *= 2.0
return baseFlow
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `CITY_EVENT` | Info | "C'est la fête à [NomVille] ! Attendez-vous à du monde." |
# 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)
### Visualisation Taille (Passif)
**Description UX** : Distinguer les grandes villes des petites.
**Description UI** : Taille de l'icône proportionnelle à la population. Gratte-ciels vs Maisons.
**Emplacement** : Carte Monde.
**Intégration** : Sprite.
**Navigation** : N/A
**Événements** : N/A
**Navigation** : Zoom sur la carte.
**Événements** : `MAP_ZOOM`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Musiques** : Ambiance urbaine (klaxons lointains, vent).
- **Sons** : Bruit de trafic faible.
- **Graphiques** : Sprites Ville (Petit, Moyen, Grand).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Images** : Silhouette Skyline.
- **Vidéos** : Lumières des fenêtres qui s'allument la nuit (Pixel Art animé).
- **Animations** : Fumée des cheminées.
- **Couleurs** : Gris/Bleu.
- **Textes** : Nom Ville.
- **Formes** : N/A
- **Formes** : Cercle d'influence (zone de chalandise).

506
docs/specs/vip.md Normal file
View File

@@ -0,0 +1,506 @@
# VIP
## 1. Définition
Statut premium pour les joueurs, généralement obtenu par abonnement ou achat in-app. Le statut VIP confère des avantages de confort et de cosmétique, sans déséquilibrer le gameplay compétitif (Pay-to-Fast ou Pay-to-Cool, pas Pay-to-Win).
## 2. Fonctions
* **Conservation des Thèmes :** Avantage majeur permettant de garder définitivement les thèmes et skins des passes saisonniers, même après la fin de la saison.
* **Bonus Passifs :** Peut inclure des bonus légers d'XP ou de pièces.
* **Prestige :** Badge ou couleur de pseudo distinctif.
## 3. Icone
* **Représentation :** Couronne ou Diamant.
* **Couleur dominante :** Or scintillant ou Violet royal.
## 4. Interactions
* **Achat/Abonnement :** Via la boutique ou le menu profil.
* **Affichage :** Badge visible à côté de l'avatar et du pseudo.
## 5. Annexes Techniques
### Données (JSON)
```json
{
"status_id": "vip_subscription",
"is_active": true,
"expiry_date": "2026-12-31T23:59:59",
"benefits": {
"keep_seasonal_themes": true,
"xp_multiplier": 1.1,
"daily_coin_bonus": 50
}
}
```
### Règles Métier
* Si le statut VIP expire, le joueur perd l'accès aux thèmes saisonniers passés qu'il avait "sauvegardés", sauf s'il se réabonne (règle à définir : perte définitive ou suspension ? -> Suspension par défaut pour encourager le réabonnement).
* Le statut VIP s'applique à tout le compte joueur.
## 6. Annexes UX/UI
* **Badge VIP :** Petite icône couronne à côté du pseudo partout dans l'interface.
* **Interface Boutique :** Section dédiée "Devenir VIP" avec mise en avant des avantages (surtout la conservation des thèmes).
* **Feedback :** Effet visuel doré lors de la récupération de récompenses.
# 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.
## Définition
| Champ | Valeur |
|---|---|
| Concept | Statut premium (VIP) lié au compte joueur. |
| Rôle | Déverrouiller des avantages de confort + cosmétiques, notamment la conservation des thèmes/passes tant que VIP actif. |
| Portée | Compte (tous zoos / toutes sessions). |
| Contrainte | Pas de mécanisme de cache/mémorisation côté app : létat VIP est lu comme un état courant (source de vérité). |
## Fonctions (tableau détaillé)
| Fonction | Déclencheur | Entrées | Sorties | Règles | Observabilité |
|---|---|---|---|---|---|
| Activer VIP | achat/abonnement | moyen de paiement, plan | `is_active=true`, `expiry_date` | Activation atomique, idempotente sur transaction | Event `VIP_ACTIVATED` |
| Expirer VIP | temps | `expiry_date` | `is_active=false` | Expiration automatique au tick serveur / lazy update au login | Event `VIP_EXPIRED` |
| Conserver thèmes passés | check daccès contenu | `keep_seasonal_themes` | autorisation | Règle retenue : **suspension** des accès si VIP inactif (pas de perte définitive). | Event `VIP_CONTENT_ACCESS_CHECKED` |
| Bonus passifs | tick journalier | plan | coins/xp | Bonus plafonnés (anti P2W), visibles dans UI | Event `VIP_DAILY_BONUS_GRANTED` |
| Badge prestige | render UI | `is_active` | badge | Affiché partout pseudo/avatar | Event `VIP_BADGE_RENDER` |
## Icone de base
| Élément | Spécification |
|---|---|
| Représentation | Couronne / diamant |
| Couleur dominante | Or / violet |
| Variantes | `icon_vip_crown.png`, `icon_vip_diamond.png` |
| États | Badge “actif” (or), “expiré” (gris), “renouvellement” (horloge) |
## Interactions (tableau détaillé)
| Interaction | Type | Préconditions | Étapes UI | Résultat | Erreurs / Messages |
|---|---|---|---|---|---|
| Voir offre VIP | Consultation | - | Boutique/Profil → VIP | page détail | - |
| Acheter VIP | Action | paiement ok | Clic “Devenir VIP” → confirmer | VIP actif | `PAYMENT_FAILED`, `NETWORK_ERROR` |
| Renouveler | Action | VIP actif ou expiré | “Renouveler” | `expiry_date` prolongée | `PAYMENT_FAILED` |
| Voir contenu conservé | Consultation | VIP actif | Profil → “Mes thèmes” | liste | `VIP_REQUIRED` |
| Réactiver après expiration | Action | VIP expiré | “Réactiver” | accès restauré (suspension levée) | `PAYMENT_FAILED` |
## Annexes Techniques
### 1. Données et États (tableau détaillé)
| Donnée / État | Type | Exemple | Source | Contraintes |
|---|---|---|---|---|
| `status_id` | string | `vip_subscription` | DB | constant |
| `is_active` | boolean | true | DB | dérivé de `expiry_date` |
| `expiry_date` | timestamp | `2026-12-31T23:59:59Z` | DB | UTC |
| `plan_id` | string | `vip_monthly` | DB | enum plans |
| `benefits.keep_seasonal_themes` | boolean | true | config | gating contenu |
| `benefits.xp_multiplier` | float | 1.1 | config | cap 1.2 |
| `benefits.daily_coin_bonus` | int | 50 | config | cap 200 |
| `timestamps.created_at` | timestamp | - | DB | audit |
| `timestamps.updated_at` | timestamp | - | DB | audit |
#### Caractéristiques Initiales (tableau détaillé)
| Caractéristique | Valeur initiale | Unité | Notes |
|---|---:|---|---|
| VIP actif | false | bool | par défaut |
| Multiplicateur XP | 1.0 | coef | sans VIP |
| Bonus coins/jour | 0 | coins | sans VIP |
| Conservation thèmes | false | bool | gating |
#### Scores Initiaux (tableau détaillé)
| Score | Valeur initiale | Plage | Impact |
|---|---:|---|---|
| Jours VIP cumulés | 0 | 0..∞ | UI historique (pas danalytics) |
| Bonus total distribués | 0 | 0..∞ | transparence UI |
### 2. Cycles de Vie et Apparition (tableau détaillé)
| Phase | Déclencheur | Entrées | Sorties | Invariants |
|---|---|---|---|---|
| Apparition | création compte | - | VIP inactif | - |
| Activation | achat | plan | VIP actif | atomicité |
| Renouvellement | achat | plan | expiry prolongée | monotone |
| Expiration | temps | date | VIP inactif | suspension contenu |
#### Conditions d'Apparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Compte créé | true | est | entrée VIP créée (inactive) |
#### Conditions de Disparition (tableau détaillé)
| Condition | Seuil | Opérateur | Résultat |
|---|---:|---|---|
| Compte supprimé | true | est | VIP supprimé |
#### Hérédité (tableau détaillé)
| Élément | Hérité | Règle |
|---|---|---|
| Historique VIP | Oui | persiste |
| Contenu “conservé” | Oui | reste possédé mais **gated** si VIP off |
### 3. Impacts Environnementaux
#### Impact Température (tableau détaillé)
| Condition | Effet VIP | Notes |
|---|---|---|
| - | aucun | statut méta |
#### Impact Milieu (Biome) (tableau détaillé)
| Biome | Effet VIP | Notes |
|---|---|---|
| - | aucun | - |
#### Impact Saisons (tableau détaillé)
| Saison | Effet VIP | Notes |
|---|---|---|
| Saison active | contenu pass dispo | lié au passe |
#### Impact Heure / Jour-Nuit (tableau détaillé)
| Période | Effet VIP | Notes |
|---|---|---|
| Jour | bonus journalier | horaire fixe serveur |
### 4. Impacts Biologiques et Sociaux
#### Impact Reproduction (tableau détaillé)
| Facteur | Effet sur taux | Condition |
|---|---|---|
| - | aucun | VIP naffecte pas reproduction |
#### Impact Mort (tableau détaillé)
| Cas | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Nourriture (tableau détaillé)
| Ressource | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Impact Attractivité(Visiteurs (tableau détaillé)
| Action/État | Gain | Rayon | Notes |
|---|---:|---:|---|
| Thèmes conservés | + (cosmétique) | zoo | impact via esthétique |
#### Impact Attractivité Animaux) (tableau détaillé)
| Action/État | Effet animaux | Condition |
|---|---|---|
| - | aucun direct | - |
#### Impact Valeur (tableau détaillé)
| Facteur | Variation | Condition |
|---|---:|---|
| Prestige VIP | + | classement/présentation |
### 5. Impacts Logistiques et Économiques
#### Vitesse (Camion) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Nurserie) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Accueil) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Recherche) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| XP multiplier | xp × 1.1 | VIP actif |
#### Vitesse (Labo) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| - | aucun | - |
#### Vitesse (Visite) (tableau détaillé)
| Paramètre | Effet | Condition |
|---|---|---|
| Temps visite | + léger | confort (option) |
#### Dépenses (Billeterie) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Abonnement VIP | variable | coins/€ | boutique |
#### Dépenses (Visiteurs) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Employés) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Boutiques) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| Section dupliquée | 0 | - | conservée |
#### Dépenses (Nurseries) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Nourriture) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Acceuil des animaux) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Dépenses (Camion) (tableau détaillé)
| Poste | Coût | Unité | Condition |
|---|---:|---|---|
| - | 0 | - | - |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| Ville | Zoo | réputation | VIP indirect (via thèmes/esthétique) |
##### Trajet Visiteurs vers/depuis les animaux (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis les boutiques (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo) (tableau détaillé)
| Source | Destination | Déclencheur | Effet |
|---|---|---|---|
| - | - | - | - |
### 6. Événements
#### Événements du Jeu (tableau détaillé)
| Event | Déclencheur | Payload | Effet |
|---|---|---|---|
| `VIP_ACTIVATED` | paiement ok | plan_id | active |
| `VIP_EXPIRED` | date | - | suspend |
#### Événements du Carte (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VIP_BADGE_RENDER` | UI | badge |
#### Événements du Zoo (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VIP_CONTENT_ACCESS_CHECKED` | apply theme | allow/deny |
#### Événements du Ville / Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| - | - | - |
#### Événements du Visiteur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| - | - | - |
#### Événements du Joueur (tableau détaillé)
| Event | Déclencheur | Effet |
|---|---|---|
| `VIP_DAILY_BONUS_GRANTED` | reset journalier | coins/xp |
### 7. Progression
#### Tableau des Upgrades (tableau détaillé)
| Niveau | Coût | Effet | Débloque |
|---|---:|---|---|
| 1 | variable | VIP actif | badge + conservation gating |
### 8. Logique et Interfaces
#### Pseudo-code Impacts (tableau détaillé)
| Fonction | Entrées | Sorties | Notes |
|---|---|---|---|
| `isVipActive` | now, expiry_date | bool | source de vérité |
| `canUseTheme` | vip, theme | allow | suspension si VIP off |
#### Messages d'Infos / Alerte (tableau détaillé)
| ID | Niveau | Message | Condition |
|---|---|---|---|
| `VIP_REQUIRED` | Warning | "VIP requis." | accès contenu gated |
| `VIP_EXPIRED` | Info | "VIP expiré." | expiration |
## Annexes UX/UI
### 1. Expérience Utilisateur (UX)
#### Description UX (tableau détaillé)
| Parcours | But | Friction | Réduction clics |
|---|---|---|---|
| Devenir VIP | conserver thèmes | paiement | bouton direct profil + boutique |
| Réactiver | restaurer accès | paiement | deep-link depuis contenu locké |
#### Description UI (tableau détaillé)
| Composant | Contenu | États |
|---|---|---|
| Page VIP | bénéfices, prix, CTA | active/expired |
| Badge VIP | couronne | visible partout |
#### Emplacement (tableau détaillé)
| Zone UI | Position | Notes |
|---|---|---|
| Profil | en-tête | badge |
| Boutique | section VIP | CTA |
#### Intégration (tableau détaillé)
| Intégration | Contrat | Notes |
|---|---|---|
| Skins/thèmes | gating | suspension |
| Passe saisonnier | conservation | VIP |
#### Navigation (tableau détaillé)
| Action | Chemin | Résultat |
|---|---|---|
| Ouvrir VIP | profil/boutique | page |
| Acheter | CTA | paiement |
#### Événements (tableau détaillé)
| Event UI | Déclencheur | Effet |
|---|---|---|
| `OPEN_VIP_PAGE` | clic | page |
| `CLICK_BUY_VIP` | CTA | paiement |
#### Assets Skinables
##### Musiques (tableau détaillé)
| Asset | Usage | Durée | Notes |
|---|---|---:|---|
| `vip_page_loop.mp3` | page VIP | loop | discret |
##### Sons (tableau détaillé)
| Asset | Usage | Volume |
|---|---|---|
| `ui_purchase_success.mp3` | achat ok | moyen |
| `ui_purchase_fail.mp3` | achat fail | moyen |
##### Graphiques (tableau détaillé)
| Asset | Usage | Contraintes |
|---|---|---|
| `vip_badge_crown.png` | badge | scalable |
| `vip_gold_glow.png` | FX | overlay |
##### Images (tableau détaillé)
| Asset | Usage |
|---|---|
| `vip_banner.png` | hero |
| `vip_benefit_cards.png` | cartes |
##### Vidéos (tableau détaillé)
| Asset | Usage | Durée |
|---|---|---:|
| `vip_glow.webm` | succès | 1.0s |
##### Animations (tableau détaillé)
| Animation | Déclencheur | Notes |
|---|---|---|
| glow doré | activation | 0.8s |
| badge pulse | reward | 0.6s |
##### Couleurs (tableau détaillé)
| Token | Valeur | Usage |
|---|---|---|
| `vip_gold` | #D4AF37 | UI |
| `vip_purple` | #6A1B9A | accent |
##### Textes (tableau détaillé)
| Clé | FR | EN |
|---|---|---|
| `vip.become` | Devenir VIP | Become VIP |
| `vip.renew` | Renouveler | Renew |
##### Formes (tableau détaillé)
| Élément | Forme | Notes |
|---|---|---|
| Cartes bénéfices | rectangles arrondis | lisibles |
| Badge | rond | constant |

View File

@@ -1,228 +1,416 @@
# Spécifications : Visiteur
## Définition
Personnage non-joueur (PNJ) qui visite le zoo.
Personnage non-joueur (PNJ) qui visite le zoo. Il est la source principale de revenus (tickets, boutiques) et un indicateur vivant de la qualité du parc (satisfaction).
## Comportement
- **Apparition** : Arrive par la Billeterie (venant d'une Ville).
- **Déplacement** : Se promène sur la grille, attiré par les animaux et boutiques.
- **Durée** : Reste jusqu'à 1 journée (variable selon attractivité).
- **Dépense** : Paie l'entrée + achats en boutique.
## Fonctions
| Fonction | Description | Entrées | Sorties |
|---|---|---|---|
| Visite | Parcours le zoo pour observer les animaux. | Attractivité, Chemin | Satisfaction, Temps |
| Consommation | Achète des biens et services dans le zoo. | Argent, Besoins | Revenus (Joueur), Satisfaction |
| Jugement | Évalue la qualité du zoo et influence la réputation. | État Zoo, Prix | Score Réputation |
## Incidents et Exigences
- **Besoins** : Soif, Repos (banc), Propreté (poubelle), Envie de photo.
- **Feedback** : Bulle d'icône au-dessus du visiteur.
- **Résolution** : Clic du joueur sur la bulle.
- **Conséquence** :
- Résolu : Gain de pièces + Attractivité.
- Ignoré : Perte d'attractivité, départ anticipé.
- **Contexte** : Apparaissent plus souvent pendant les temps d'attente (camion/enchère).
## Icone de base
Silhouette humaine simplifiée, couleur variable selon le type (Standard, VIP, Enfant).
## Types
- **Standard**
- **Luxe** (8%) : Paie plus cher, plus exigeant.
## Interactions
| Acteur A | Action | Acteur B | Résultat |
|---|---|---|---|
| Visiteur | Regarder | Animal | Gain Satisfaction, Baisse Besoin Divertissement |
| Visiteur | Acheter | Boutique | Perte Argent, Gain Satisfaction, Baisse Besoin (Faim/Soif) |
| Joueur | Cliquer | Visiteur | Affiche la fenêtre d'état du visiteur (Pensées, Besoins) |
| Visiteur | Jeter | Poubelle | Propreté maintenue (si poubelle proche) |
# Annexes Techniques
## Annexes Techniques
## 1. Données et États
### Modèle de Données (JSON)
```json
{
"id": "uuid_v4",
"type": "enum ('standard', 'vip')",
"entry_time": "timestamp",
"max_duration": "integer (seconds)",
"budget": "integer",
"satisfaction": "float (0-100)",
"needs": {
"thirst": "float (0-100)",
"rest": "float (0-100)",
"toilet": "float (0-100)"
},
"current_target": { "x": "int", "y": "int" },
"position": { "x": "int", "y": "int" }
}
```
### 1. Données et États
### Caractéristiques Initiales
| Caractéristique | Standard | Luxe (VIP) |
| :--- | :--- | :--- |
| Budget | 50 | 200 |
| Durée Max | 300s (5 min) | 600s (10 min) |
| Satisfaction | 50 | 50 |
#### Caractéristiques Initiales
| Caractéristique | Valeur Initiale | Type | Description |
|---|---|---|---|
| Budget | 50 - 200 | Entier | Argent total disponible pour la visite. |
| Endurance | 100 | Entier | Capacité à marcher avant de devoir se reposer. |
| Vitesse Marche | 1.0 | Float | Vitesse de déplacement de base (cases/sec). |
### Scores Initiaux
N/A
#### Scores Initiaux
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---|---|---|
| Satisfaction | 50 | 0-100 | Détermine la durée de visite et la note finale. |
| Faim | 0 | 0-100 | Augmente avec le temps, déclenche la recherche de nourriture. |
| Soif | 0 | 0-100 | Augmente avec le temps, déclenche la recherche de boisson. |
| Vessie | 0 | 0-100 | Augmente avec le temps, déclenche la recherche de toilettes. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
| Facteur | Taux |
| :--- | :--- |
| Attractivité Zoo | `log(Attractivité) * FacteurVille` |
| Heure | Pic à 14h, Nul à 22h |
### 2. Cycles de Vie et Apparition
### Conditions de Disparition
| Cause | Seuil |
| :--- | :--- |
| Temps écoulé | Durée > Max Duration |
| Insatisfaction | Satisfaction <= 0 |
| Budget épuisé | Budget <= 0 (Départ normal) |
#### Conditions d'Apparition
| Condition | Seuil | Opérateur | Résultat |
|---|---|---|---|
| Zoo Ouvert | Vrai | Est | Le générateur de visiteurs est actif. |
| Attractivité | > 0 | Est | Probabilité d'apparition > 0. |
| Capacité Zoo | < Max | Est | Un nouveau visiteur peut entrer. |
### Hérédité
N/A
#### Conditions de Disparition
| Condition | Seuil | Opérateur | Résultat |
|---|---|---|---|
| Satisfaction | 0 | <= | Départ anticipé (Mécontent). |
| Budget | 0 | <= | Départ normal (Plus d'argent). |
| Heure | Fermeture | >= | Départ forcé (Expulsion). |
| Temps Visite | Max | >= | Départ normal (Fatigue). |
## 3. Impacts Environnementaux
### Impact Température
| Météo | Effet |
| :--- | :--- |
| Canicule | Soif augmente 2x plus vite |
| Pluie | Satisfaction baisse plus vite (sauf si abri) |
#### Hérédité
| Parent | Trait Transmis | Probabilité | Mutation Possible |
|---|---|---|---|
| Groupe (Famille) | Type (VIP/Standard) | 100% | Non (Le groupe est homogène) |
| Groupe (Famille) | Vitesse | Moyenne du groupe | Non |
### Impact Milieu (Biome)
N/A
### 3. Impacts Environnementaux
### Impact Saisons
| Saison | Affluence (Multiplicateur) |
| :--- | :--- |
| Printemps | x1.0 |
| Été | x1.5 (Vacances) |
| Automne | x0.8 |
| Hiver | x0.6 |
#### Impact Température
| Plage Température | Effet sur l'entité | Bonus/Malus |
|---|---|---|
| > 30°C (Chaud) | Soif augmente plus vite | +50% Vitesse Soif |
| < 5°C (Froid) | Endurance baisse plus vite | +20% Fatigue |
| 20°C (Idéal) | Satisfaction stable | Bonus passif +1/min |
### Impact Heure / Jour-Nuit
| Heure | Flux Entrant |
| :--- | :--- |
| 08h-10h | Faible |
| 10h-16h | Fort |
| 16h-18h | Décroissant |
| > 18h | Nul |
#### Impact Milieu (Biome)
| Biome | Compatibilité | Bonus/Malus |
|---|---|---|
| Asphalte (Allée) | 100% | Vitesse normale |
| Sable | 50% | Vitesse -30% (Marche difficile) |
| Herbe | 80% | Satisfaction +5% (Cadre agréable) |
| Boue | 20% | Satisfaction -10% (Salissant) |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
N/A
#### Impact Saisons
| Saison | Effet | Modificateur |
|---|---|---|
| Été | Affluence maximale, Vente Glaces | Flux x1.5, Vente Glaces +50% |
| Hiver | Affluence réduite, Vente Boissons Chaudes | Flux x0.6, Vente Café +50% |
| Printemps | Affluence moyenne | Flux x1.0 |
| Automne | Affluence moyenne, Vente Parapluies | Flux x0.9, Vente Parapluies +30% |
### Impact Mort
| Événement | Effet Satisfaction |
| :--- | :--- |
| Voir animal mort | -50 (Départ quasi immédiat) |
#### Impact Heure / Jour-Nuit
| Période | Activité | Visibilité |
|---|---|---|
| Matin (9h-12h) | Arrivée massive | Haute |
| Midi (12h-14h) | Pause déjeuner (Surcharge Restauration) | Haute |
| Après-midi (14h-17h) | Visite et Achats | Haute |
| Soir (17h-19h) | Départs massifs | Moyenne |
| Nuit | Zoo fermé (sauf événement nocturne) | Nulle |
### Impact Nourriture
N/A (Concerne les animaux, ici c'est "Soif/Faim visiteur" -> Boutiques)
### 4. Impacts Biologiques et Sociaux
### Impact Attractivité (Visiteurs/Animaux)
| Cible | Poids Attraction |
| :--- | :--- |
| Animal Légendaire | 100 |
| Animal Commun | 10 |
| Boutique | 50 (si besoin > 50) |
#### Impact Reproduction
| Facteur | Effet sur Taux | Condition |
|---|---|---|
| Saison des Amours (Animaux) | +10% Satisfaction | Si des bébés sont visibles |
| Présence Enfants | +20% Vente Ballons | Si le visiteur est accompagné d'enfants |
### Impact Valeur
N/A
#### Impact Mort
| Cause | Conséquence | Durée |
|---|---|---|
| Vue Animal Mort | Choc (-50 Satisfaction), Départ immédiat | Permanent pour cette visite |
| Accident (Chute) | Appel Secours, Zone bloquée | 30 min |
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
| Paramètre | Valeur |
| :--- | :--- |
| Vitesse Marche | 1 case / 2 sec |
#### Impact Nourriture
| Type Nourriture | Gain Santé | Coût | Préférence |
|---|---|---|---|
| Burger | Faim -50 | 12$ | 4/5 (Populaire) |
| Salade | Faim -30 | 10$ | 2/5 (Niche) |
| Glace | Soif -10, Satisfaction +5 | 5$ | 5/5 (Été) |
### Dépenses (Boutiques/Visiteurs)
| Action | Dépense |
| :--- | :--- |
| Ticket Entrée | 10 (Standard) / 50 (VIP) |
| Boutique Souvenir | 15-30 |
| Boisson | 5 |
#### Impact Attractivité Visiteurs
| Action/État | Gain Attractivité | Rayon d'action |
|---|---|---|
| Foule heureuse | +5 (Ambiance) | 10m |
| Foule en colère | -10 (Mauvaise ambiance) | 15m |
| Vomissement | -20 (Dégoût) | 5m |
### Trajet Visiteurs
**Algorithme** : `Weighted Random Walk` vers les points d'intérêt (POI) avec decay sur la distance.
#### Impact Attractivité Animaux
| Espèce | Interaction | Effet Stress |
|---|---|---|
| Lion | Rugissement | +10 Satisfaction (Frisson) |
| Singe | Grimace | +5 Satisfaction (Rire) |
| Animal Timide | Bruit Visiteurs | +20 Stress Animal |
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Incident (Bulle)** : Apparition aléatoire (probabilité augmentée si attente joueur).
* **Achat** : Interaction avec boutique.
#### Impact Valeur
| Facteur | Variation Prix | Condition |
|---|---|---|
| Visiteur VIP | Dépense x2 | Si satisfait |
| Visiteur Radin | Dépense x0.5 | Toujours |
## 7. Progression
### Tableau des Upgrades
N/A
### 5. Impacts Logistiques et Économiques
## 8. Logique et Interfaces
### Pseudo-code Impacts
```
function updateVisitor(visitor):
visitor.satisfaction -= decayRate
visitor.needs.thirst += 1
if visitor.needs.thirst > 80:
target = findNearestShop()
if not target:
visitor.satisfaction -= 5 (Frustration)
spawnIncident("Soif")
if visitor.satisfaction <= 0:
leaveZoo(visitor)
```
#### Vitesse (Camion)
| Type Route | Vitesse Max | Consommation |
|---|---|---|
| Navette Visiteurs | 40 km/h | 15 L/100 |
### Messages d'Infos / Alerte
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `VISITOR_ANGRY` | Info | "Un visiteur est parti mécontent." |
| `VISITOR_HAPPY` | Info | "Un visiteur a adoré le zoo !" |
#### Vitesse (Nurserie)
| Action | Durée de base | Réduction par Upgrade |
|---|---|---|
| Soin Visiteur (Infirmerie) | 15 min | -20% (Médecin expert) |
# Annexes UX/UI
#### Vitesse (Accueil)
| Flux | Visiteurs/Minute | Capacité Max |
|---|---|---|
| Guichet Manuel | 2 | 10 (File d'attente) |
| Portique Auto | 10 | 50 (File d'attente) |
## 1. Expérience Utilisateur (UX)
### Visite (Passif)
**Description UX** : Le visiteur entre, marche, regarde les animaux, achète, repart.
**Description UI** : Petit sprite humain. Vêtements colorés.
**Emplacement** : Grille Zoo.
**Intégration** : Foule.
**Navigation** : N/A
**Événements** : `VISITOR_WALK`.
#### Vitesse (Recherche)
| Projet | Durée (Jours) | Coût Accélération |
|---|---|---|
| Étude Comportementale | 5 jours | 2000$ |
#### Assets
- **Musiques** : N/A
- **Sons** : Pas sur l'herbe/béton.
- **Graphiques** : Sprites variés (H/F/Enfant).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Marche, Regarde (tourne la tête), Prend photo (flash).
- **Couleurs** : Aléatoires.
- **Textes** : N/A
- **Formes** : N/A
#### Vitesse (Labo)
| Analyse | Durée | Fiabilité |
|---|---|---|
| Sondage Satisfaction | 24h | +/- 5% Marge erreur |
### Incident / Besoin (Action)
**Description UX** : Une bulle apparaît au-dessus d'un visiteur (ex: Soif, Perdu, Envie pipi). Le joueur clique pour résoudre (ex: Indiquer toilettes, Donner eau).
**Description UI** : Bulle blanche avec icône noire. Clignote si urgent.
**Emplacement** : Au-dessus du sprite visiteur.
**Intégration** : Overlay World Space.
**Navigation** : Clic Bulle -> Résolution (Animation + Gain).
**Événements** : `INCIDENT_SPAWN`, `INCIDENT_SOLVE`.
#### Vitesse (Visite)
| Zone | Temps Moyen | Facteur Ralentissement |
|---|---|---|
| Enclos Grand | 10 min | Si animal visible |
| Enclos Petit | 2 min | Si animal caché |
| Boutique | 5 min | Si file d'attente |
#### Assets
- **Musiques** : N/A
- **Sons** : `bubble_pop.mp3` (apparition), `coin_collect.mp3` (résolution). **Design ASMR** : Son satisfaisant et tactile ("Pop" organique).
- **Graphiques** : Icônes (Goutte d'eau, Point interrogation, Appareil photo).
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Bulle qui pop. Visiteur qui sourit après résolution.
- **Couleurs** : Bulle Blanche/Rouge (Urgent).
- **Textes** : "Merci !" (flottant).
- **Formes** : Bulle BD.
#### Dépenses (Billeterie)
| Poste | Coût Hebdo | Maintenance |
|---|---|---|
| Impression Tickets | 100$ | 10$ |
### Départ (Passif)
**Description UX** : Le visiteur quitte le zoo.
**Description UI** : Marche vers la sortie et disparaît (Fade out).
**Emplacement** : Billeterie.
**Intégration** : Fin cycle.
**Navigation** : N/A
**Événements** : `VISITOR_EXIT`.
#### Dépenses (Boutiques)
| Article | Coût Achat | Marge |
|---|---|---|
| Souvenirs | 5$ | 300% (Vendu 20$) |
| Nourriture | 2$ | 400% (Vendu 10$) |
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Graphiques** : N/A
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : Fade out.
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
#### Dépenses (Visiteurs)
| Type Dépense | Montant Moyen | Fréquence |
|---|---|---|
| Entrée | 20$ | 1 fois |
| Restauration | 15$ | 1 fois |
| Cadeaux | 30$ | 0.5 fois (1 sur 2) |
#### Dépenses (Employés)
| Rôle | Salaire | Prime |
|---|---|---|
| Agent Accueil | 1500$ | Aucune |
| Animateur | 1800$ | +50$ par show réussi |
#### Dépenses (Nurseries)
| Soin | Coût Matériel | Coût Personnel |
|---|---|---|
| Pansement (Bobo) | 2$ | 10$ (Temps infirmier) |
#### Dépenses (Nourriture)
| Type | Prix/Kg | Fournisseur |
|---|---|---|
| Stock Restaurant | 500$ / palette | MetroZoo |
#### Dépenses (Acceuil des animaux)
| Installation | Coût Construction | Entretien |
|---|---|---|
| Banc | 100$ | 0$ |
| Toilettes | 2000$ | 100$ / semaine |
#### Dépenses (Camion)
| Trajet | Coût Essence | Usure |
|---|---|---|
| Bus Navette | 20$ / jour | 1% / jour |
#### Trajet Visiteurs
##### Trajet Visiteurs vers/depuis la ville
| Moyen Transport | Temps | Coût | Fréquence |
|---|---|---|---|
| Voiture | 20 min | 5$ (Parking) | 60% des visiteurs |
| Bus | 45 min | 2$ | 30% des visiteurs |
| Pied | 60 min | 0$ | 10% des visiteurs |
##### Trajet Visiteurs vers/depuis les animaux
| Chemin | Distance | Attrait |
|---|---|---|
| Allée Principale | 0m (Départ) | 10/10 |
| Sentier Boueux | +50% temps | 2/10 |
##### Trajet Visiteurs vers/depuis les boutiques
| Emplacement | Détour Moyen | Taux de Conversion |
|---|---|---|
| Sortie Enclos | 10m | 40% (Impulsion) |
| Zone Isolée | 100m | 5% (Besoin spécifique) |
##### Trajet Visiteurs vers/depuis la billeterie (entrées/sorties du zoo)
| Flux | Temps Attente | Saturation |
|---|---|---|
| Entrée Matin | 15 min | 90% |
| Sortie Soir | 5 min | 40% |
### 6. Événements
#### Événements du Jeu
| Event | Déclencheur | Effet Global | Durée |
|---|---|---|---|
| Vacances Scolaires | Date Calendrier | Affluence Enfants +50% | 2 semaines |
| Pluie Torrentielle | Météo | Affluence -40%, Vente Parapluies ++ | 1 jour |
#### Événements du Carte
| Event | Lieu | Impact Zone |
|---|---|---|
| Embouteillage | Route accès | Arrivées retardées | 2h |
#### Événements du Zoo
| Event | Cible | Conséquence |
|---|---|---|
| Évasion Animal | Zone Proche | Panique, Fuite des visiteurs | Immédiat |
#### Événements du Ville / Visiteur
| Event | Impact Affluence | Impact Budget |
|---|---|---|
| Festival Ville | -20% (Concurrence) | Dépense Moyenne -10% (les achats se déplacent en ville) |
| Bonus Économique | +10% | Dépense Moyenne +20% |
#### Événements du Visiteur
| Action | Satisfaction | Besoin |
|---|---|---|
| Vol à la tire | -80 | Sécurité |
| Trouve Objet Perdu | +20 | Aucun |
#### Événements du Joueur
| Action | Coût Action | Gain XP |
|---|---|---|
| Campagne Pub | 5000$ | +1000 Visiteurs |
### 7. Progression
#### Tableau des Upgrades
| Niveau | Coût | Prérequis | Bonus Débloqué |
|---|---|---|---|
| Carte Membre | 10,000$ | Réputation 200 | Fidélisation +10% |
| Bus Gratuit | 25,000$ | Parking Niv 2 | Affluence Pauvre +30% |
### 8. Logique et Interfaces
#### Pseudo-code Impacts
| Algorithme | Entrées | Logique Simplifiée | Sortie |
|---|---|---|---|
| Calcul Satisfaction | État Zoo, Besoins | `Sat = (AnimauxVu * 10) - (Faim + Soif + Fatigue)/3` | Score 0-100 |
| Décision Achat | Budget, Besoin, Prix | `Si Besoin > 50 ET Budget > Prix Alors Acheter` | Booléen |
#### Messages d'Infos / Alerte
| Type | Message | Condition | Priorité |
|---|---|---|---|
| Info | "Un visiteur VIP est arrivé." | Spawn VIP | 2 |
| Warn | "Les visiteurs se plaignent de la saleté." | Propreté < 30% | 4 |
| Error | "Un visiteur est blessé !" | Accident | 5 |
## 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 du personnage pour le sélectionner.
* **Feedback** : Surbrillance (outline blanc/jaune) au survol de la souris.
### 0. Direction Artistique & Vue (Existante)
* **Vue** : Isométrique (2.5D).
* **Grille** : Les déplacements se font sur une grille losange.
* **Sprites** : 4 directions (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest).
* **Profondeur** : Gestion du Z-index (les éléments "en bas" cachent ceux "en haut").
* **Style Visuel** : Inspiré de `IMG_20260303_170253.jpg`.
* Coloré, vivant, détails foisonnants.
* Aspect "dessiné à la main" ou "cartoon soigné".
* Couleurs vives et contours nets.
### 1. Expérience Utilisateur (UX)
#### Description UX
| Étape Utilisateur | Action Attendue | Feedback Système |
|---|---|---|
| Observation | Zoom sur visiteur | Affichage info-bulle nom/état |
| Plainte | Clic sur bulle rouge | Ouverture fenêtre résolution problème |
| Déplacement | Se déplace sur les chemins | Attraction forte pour les chemins |
#### Description UI
Style graphique inspiré de `IMG_20260303_170253.jpg` : Coloré, vivant, détails foisonnants, aspect 'dessiné à la main' ou 'cartoon soigné'.
| Élément | Type (Bouton/Panel) | Contenu | État par défaut |
|---|---|---|---|
| Bulle Pensée | Icône Flottante | Image (Burger, WC, Eau, Appareil photo, Cadeau, Banc) | Caché |
| Jauge Satisfaction | Barre Progression | Vert -> Rouge | Visible (si sélectionné) |
#### Emplacement
| Élément | Position | Ancrage | Z-Index |
|---|---|---|---|
| Bulle | Au-dessus tête | World Space | 50 |
| Panel Info | Bas Gauche | Bottom-Left | 100 |
#### Intégration
| Composant Parent | Contraintes | Responsive |
|---|---|---|
| World Canvas | Suis la caméra | Oui |
#### Navigation
| De l'écran | Vers l'écran | Transition | Trigger |
|---|---|---|---|
| Jeu Principal | Vue Visiteur | Focus Caméra | Double Clic |
#### Événements
| Input Utilisateur | Action Système | Son | Animation |
|---|---|---|---|
| Clic Visiteur | Sélectionne | `select_pop.mp3` | Highlight |
#### Assets Skinables
##### Musiques
| Piste | Contexte | Loop | Volume |
|---|---|---|---|
| `crowd_mumble.mp3` | Zoom éloigné | Oui | 30% |
| `park_ambience.mp3` | Zoom proche | Oui | 50% |
##### Sons
| SFX | Trigger | Priorité |
|---|---|---|
| `footsteps_gravel.mp3` | Marche | Basse |
| `cash_register.mp3` | Achat | Moyenne |
##### Graphiques
| Asset | Format | Résolution |
|---|---|---|
| `visitor_sheet.png` | Spritesheet | 1024x1024 |
| `bubble_icons.png` | Atlas | 512x512 |
##### Images
| Image | Usage | Alt Text |
|---|---|---|
| `face_happy.png` | UI Satisfaction | "Visage Souriant" |
| `face_angry.png` | UI Satisfaction | "Visage Colérique" |
##### Vidéos
| Clip | Usage | Durée |
|---|---|---|
| `visitor_card_preview.webm` | Aperçu animé dans le panneau de détails dun visiteur sélectionné (HUD) | 1.5s (loop) |
##### Animations
| Nom | Cible | Durée | Type (CSS/JS) |
|---|---|---|---|
| `walk_cycle` | Sprite Visiteur | 1s (boucle) | Sprite Anim |
| `eat_anim` | Sprite Visiteur | 2s | Sprite Anim |
##### Couleurs
| Code Hex | Usage | Sémantique |
|---|---|---|
| #00FF00 | Jauge Sat | Bon |
| #FF0000 | Jauge Sat | Mauvais |
##### Textes
| Clé i18n | Valeur FR | Valeur EN |
|---|---|---|
| `VISITOR_NAME_1` | Jean Dupont | John Doe |
| `STATE_HUNGRY` | A faim | Hungry |
##### Formes
| Forme | Usage | Style Bordure |
|---|---|---|
| Rond | Avatar | Solid White 2px |

View File

@@ -4,7 +4,10 @@
Représentation d'un zoo (joueur ou bot) sur la Carte du Monde.
## Affichage
- **Nom du zoo**
- **Nom du zoo** : Sur une banderole d'accueil personnalisable (poteaux bois).
- **Avatar Joueur** : Visible en coin de l'écran.
- **Vue** : Isométrique (2.5D). Le zoo est présenté comme un diorama vivant. La banderole flotte au vent.
- **Skins** : Le zoo peut avoir des thèmes visuels (Skins de Zoo).
- **Icône** : 🏠
- **Slot d'offre** :
- Pour les autres zoos : Affiche l'œuf/bébé/animal en vente (Type + Prix).
@@ -32,7 +35,12 @@ Représentation d'un zoo (joueur ou bot) sur la Carte du Monde.
"attractiveness": "int",
"reproduction": "int"
},
"current_offer": { "animal_id": "uuid", "price": "int" }
"current_offer": { "animal_id": "uuid", "price": "int" },
"customization": {
"banner_text": "Mon Zoo",
"active_skin_id": "skin_default",
"avatar_visible": true
}
}
```
@@ -43,7 +51,12 @@ Représentation d'un zoo (joueur ou bot) sur la Carte du Monde.
| Reproduction | 0 |
### Scores Initiaux
Voir ci-dessus.
| Score | Valeur Initiale | Plage (Min-Max) | Impact |
|---|---:|---|---|
| Attractivité | 0 | 0-100000 | Détermine le flux de visiteurs (via billeterie + attractivité ville→zoo). |
| Reproduction | 0 | 0-10000 | Modifie la chance de naissances et la qualité des bébés. |
| Réputation | 0 | 0-10000 | Modifie le rayonnement sur carte monde (ville→zoo). |
| Survie | 100 | 0-100 | Influence maladies, mortalité, et valeur des animaux. |
## 2. Cycles de Vie et Apparition
### Conditions d'Apparition
@@ -53,84 +66,144 @@ Création compte.
Suppression compte.
### Hérédité
N/A
**Bonus Héritage** : +5% Attractivité initiale si l'ancien zoo du joueur avait atteint > 1000 visiteurs (Réputation persistante).
## 3. Impacts Environnementaux
### Impact Température
N/A
| Condition | Effet |
| :--- | :--- |
| **Canicule (>30°C)** | -10% Visiteurs (sauf si Glaces en vente). |
| **Grand Froid (<0°C)** | -20% Visiteurs (sauf si Chocolat Chaud/Café en vente). |
| **Tempéré (15-25°C)** | Bonus +5% Satisfaction Visiteurs. |
### Impact Milieu (Biome)
N/A
| Biome | Effet Construction |
| :--- | :--- |
| **Plaine** | Coût standard. |
| **Désert** | Coût Eau x2 (Arrosage/Entretien). |
| **Montagne** | Coût Construction Bâtiments +50% (Fondations). |
| **Marais** | Risque Maladie +10%. |
### Impact Saisons
N/A
| Saison | Effet Global |
| :--- | :--- |
| **Printemps** | Naissances +10% (Saison des amours). |
| **Été** | Pic Visiteurs (+30%), Coût Eau +20%. |
| **Automne** | Déchets (Feuilles) +50% (Besoin nettoyage). |
| **Hiver** | Visiteurs -30%, Ventes Boutique Cadeaux +10% (Noël). |
### Impact Heure / Jour-Nuit
N/A
| Période | État |
| :--- | :--- |
| **Jour (08h-20h)** | Ouvert. Revenus actifs. |
| **Nuit (20h-08h)** | Fermé. Maintenance (Coûts réduits, pas de revenus). Animaux dorment (Santé récupère). |
## 4. Impacts Biologiques et Sociaux
### Impact Reproduction
Score visible publiquement.
### Impact Mort
N/A
**Négligence** : Un animal mort non ramassé dans un enclos visible cause -50 Attractivité/heure et fait fuir les visiteurs à proximité.
### Impact Nourriture
N/A
**Pénurie** : Si Stock Nourriture = 0 pendant > 24h, Santé Animaux baisse -> Mort -> Baisse Attractivité massive (-100/mort).
### Impact Attractivité (Visiteurs/Animaux)
Score visible publiquement.
Score visible publiquement. Détermine le flux d'entrée (voir Billeterie) et le classement mondial.
### Impact Valeur
N/A
**Valorisation** : La valeur de revente du zoo (si faillite/reset) est estimée à 50% des investissements totaux (Bâtiments + Animaux).
## 5. Impacts Logistiques et Économiques
### Vitesse (Camion/Nurserie/Accueil/Recherche/Labo/Visite)
N/A
- **Vitesse Visiteurs** : 1 case / 2 sec (Chemin), 1 case / 4 sec (Herbe).
- **Vitesse Staff** : 1 case / 1 sec (Optimisé).
### Dépenses (Boutiques/Visiteurs)
N/A
**Maintenance** : 10 pièces / jour par bâtiment construit (Coûts fixes).
### Trajet Visiteurs
Destination possible.
Destination possible. Algorithme de *Pathfinding* (A*) depuis l'entrée vers les Enclos et Boutiques.
## 6. Événements
### Événements du Jeu / Carte / Zoo / Ville / Visiteur
* **Nouvelle Offre** : Mise en vente.
* **Vente** : Offre achetée.
* **Inspection** : Contrôle sanitaire aléatoire (Bonus/Malus selon propreté).
* **Fête du Zoo** : Event annuel (Revenus x2 pendant 24h).
## 7. Progression
### Tableau des Upgrades
N/A
| Niveau | Nom | Effet | Coût |
| :--- | :--- | :--- | :--- |
| 1 | **Petit Parc** | Capacité 50 visiteurs. | 0 |
| 2 | **Zoo Local** | Capacité 100, Débloque Marketing Local. | 1000 |
| 3 | **Zoo Régional** | Capacité 250, Débloque Bus Touristique. | 5000 |
| 4 | **Zoo National** | Capacité 500, Débloque Hôtel (Séjour long). | 15000 |
| 5 | **Réserve** | Capacité 1000, Débloque Safari. | 50000 |
| 6 | **Monde Animal** | Capacité 2500, Débloque Aéroport. | 150000 |
| 7 | **Sanctuaire** | Capacité Illimitée, Prestige Max. | 500000 |
## 8. Logique et Interfaces
### Pseudo-code Impacts
N/A
```javascript
function updateZooState(zoo) {
// Cycle Jour/Nuit
if (isNight(zoo.time)) {
closeGates(zoo);
zoo.maintenanceCost += calculateUpkeep(zoo.buildings);
} else {
openGates(zoo);
zoo.revenue += processTicketSales(zoo);
}
// Impact Météo
if (zoo.weather == "HEATWAVE") {
zoo.visitorFlow *= 0.9;
zoo.shopSales["ice_cream"] *= 2.0;
}
}
```
### Messages d'Infos / Alerte
N/A
| ID | Niveau | Message |
| :--- | :--- | :--- |
| `ZOO_OPEN` | Info | "Le zoo ouvre ses portes ! Bonne journée." |
| `ZOO_CLOSE` | Info | "Fermeture du zoo. Les visiteurs sortent." |
| `MAINTENANCE_PAID` | Info | "Frais de maintenance journaliers payés : -{amount}." |
| `NO_FUNDS` | Alerte | "Fonds insuffisants pour la maintenance ! Risque de grève." |
# Annexes UX/UI
## 0. Direction Artistique & Vue
* **Vue** : Isométrique (2.5D).
* **Grille** : Les déplacements se font sur une grille losange.
* **Sprites** : 4 directions (Nord-Est, Sud-Est, Sud-Ouest, Nord-Ouest).
* **Profondeur** : Gestion du Z-index (les éléments "en bas" cachent ceux "en haut").
* **Style Visuel** : Inspiré de `IMG_20260303_170253.jpg`.
* Coloré, vivant, détails foisonnants.
* Aspect "dessiné à la main" ou "cartoon soigné".
* Couleurs vives et contours nets.
## 1. Expérience Utilisateur (UX)
### Visualisation Offre (Passif)
**Description UX** : Voir ce que vend un autre joueur.
**Description UI** : Une "bulle" ou un "panneau" accroché sous l'icône du zoo. Affiche l'animal (sprite) et le prix.
**Emplacement** : Carte Monde.
**Intégration** : World Space UI.
**Navigation** : N/A
**Navigation** : Clic sur Bulle -> Détails Offre.
**Événements** : `OFFER_UPDATE`.
#### Assets
- **Musiques** : N/A
- **Sons** : N/A
- **Graphiques** : Cadre Offre.
- **Musiques** : `ambience_zoo_busy.mp3` (bruit de fond léger).
- **Sons** : `ui_hover.mp3`.
- **Graphiques** : Cadre Offre (Bois/Or).
- **Images** : Sprite Animal.
- **Vidéos** : N/A
- **Vidéos** : Animal qui bouge (GIF/WebM).
- **Animations** : Prix qui clignote si bas.
- **Couleurs** : Or (Prix).
- **Couleurs** : Or (Prix), Vert (Rareté).
- **Textes** : "500".
- **Formes** : Bulle.
- **Formes** : Bulle BD.
### Interaction Achat (Action)
**Description UX** : Acheter l'animal.
@@ -142,12 +215,12 @@ N/A
**Événements** : `DRAG_OFFER`.
#### Assets
- **Musiques** : N/A
- **Sons** : `pickup.mp3`.
- **Musiques** : Jingle `purchase_success.mp3`.
- **Sons** : `pickup.mp3`, `coin_register.mp3`.
- **Graphiques** : Fantôme offre sous curseur.
- **Images** : N/A
- **Vidéos** : N/A
- **Animations** : N/A
- **Couleurs** : N/A
- **Textes** : N/A
- **Formes** : N/A
- **Images** : Icône Pièce animée.
- **Vidéos** : Effet de transaction (flux de données).
- **Animations** : Traînée d'étincelles lors du drag.
- **Couleurs** : Jaune brillant.
- **Textes** : "-500".
- **Formes** : Curseur Main fermée.

2
package-lock.json generated
View File

@@ -260,7 +260,6 @@
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -469,7 +468,6 @@
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",

View File

@@ -6,7 +6,8 @@
"scripts": {
"lint": "eslint web/js server --ignore-pattern '**/node_modules/**'",
"lint:web": "eslint web/js",
"lint:server": "eslint server --ignore-pattern 'server/node_modules/**'"
"lint:server": "eslint server --ignore-pattern 'server/node_modules/**'",
"type-check": "npm run lint"
},
"devDependencies": {
"eslint": "^9.15.0",

227
server/db-core.js Normal file
View File

@@ -0,0 +1,227 @@
import pg from "pg";
import parse from "pg-connection-string";
import { createInitialBotState } from "./bot-state.js";
const { Pool } = pg;
const connectionString = process.env.DATABASE_URL || "postgres://localhost/builazoo";
const parsed = parse(connectionString);
const poolConfig = {
host: parsed.host || "localhost",
port: Number(parsed.port) || 5432,
database: parsed.database || "builazoo",
user: parsed.user,
password: typeof parsed.password === "string" ? parsed.password : "",
};
if (process.env.PGPASSWORD !== undefined && process.env.PGPASSWORD !== null) poolConfig.password = String(process.env.PGPASSWORD);
const pool = new Pool(poolConfig);
/**
* @returns {Promise<{ mapWidth: number, mapHeight: number, minZoos: number }>}
*/
export async function getMapParams() {
const res = await pool.query(
"SELECT value FROM map_config WHERE key = 'params'"
);
const row = res.rows[0];
if (!row) {
return { mapWidth: 100, mapHeight: 100, minZoos: 5 };
}
const v = row.value;
return {
mapWidth: Number(v?.mapWidth) || 100,
mapHeight: Number(v?.mapHeight) || 100,
minZoos: Number(v?.minZoos) || 5,
};
}
/**
* @param {string} publicKey
* @returns {Promise<{ id: string, pseudo: string } | null>}
*/
export async function getAccountByPublicKey(publicKey) {
const res = await pool.query(
"SELECT id, pseudo FROM accounts WHERE public_key = $1",
[publicKey]
);
const row = res.rows[0];
if (!row) return null;
return { id: row.id, pseudo: row.pseudo };
}
/**
* @param {string} publicKey
* @param {string} pseudo
* @returns {Promise<{ id: string, pseudo: string }>}
*/
export async function createAccount(publicKey, pseudo) {
const res = await pool.query(
"INSERT INTO accounts (public_key, pseudo) VALUES ($1, $2) RETURNING id, pseudo",
[publicKey, pseudo]
);
const row = res.rows[0];
return { id: row.id, pseudo: row.pseudo };
}
/**
* @param {string} accountId
* @returns {Promise<void>}
*/
export async function updateLastSeen(accountId) {
await pool.query(
"UPDATE accounts SET last_seen_at = now() WHERE id = $1",
[accountId]
);
}
/**
* @param {string} accountId
* @returns {Promise<{ id: string, name: string, x: number, y: number, is_bot: boolean, animal_weights: object, game_state: object | null } | null>}
*/
export async function getZooByAccountId(accountId) {
const res = await pool.query(
"SELECT id, name, x, y, is_bot, animal_weights, game_state FROM zoos WHERE account_id = $1",
[accountId]
);
const row = res.rows[0];
if (!row) return null;
return {
id: row.id,
name: row.name,
x: Number(row.x),
y: Number(row.y),
is_bot: row.is_bot,
animal_weights: row.animal_weights || {},
game_state: row.game_state,
};
}
/**
* Common zoo row fields: id, name, x, y with numeric coords.
* @param {Record<string, unknown>} row
* @returns {{ id: string, name: string, x: number, y: number }}
*/
function mapZooRowBase(row) {
return {
id: row.id,
name: row.name,
x: Number(row.x),
y: Number(row.y),
};
}
/**
* @returns {Promise<Array<{ id: string, name: string, x: number, y: number, animal_weights: object, game_state: object | null }>>}
*/
export async function getAllZoos() {
const res = await pool.query(
"SELECT id, name, x, y, animal_weights, game_state FROM zoos ORDER BY is_bot, name"
);
return res.rows.map((row) => ({
...mapZooRowBase(row),
animal_weights: row.animal_weights || {},
game_state: row.game_state ?? null,
}));
}
/**
* @param {{ accountId: string, name: string, x: number, y: number, gameState: object }} opts
* @returns {Promise<{ id: string }>}
*/
export async function createZoo(opts) {
const { accountId, name, x, y, gameState } = opts;
const res = await pool.query(
"INSERT INTO zoos (account_id, name, x, y, is_bot, animal_weights, game_state) VALUES ($1, $2, $3, $4, false, $5, $6) RETURNING id",
[accountId, name, x, y, "{}", gameState]
);
return { id: res.rows[0].id };
}
/**
* @param {string} zooId
* @returns {Promise<{ id: string, name: string, x: number, y: number, is_bot: boolean, account_id: string | null, animal_weights: object, game_state: object | null } | null>}
*/
export async function getZooById(zooId) {
const res = await pool.query(
"SELECT id, name, x, y, is_bot, account_id, animal_weights, game_state FROM zoos WHERE id = $1",
[zooId]
);
const row = res.rows[0];
if (!row) return null;
return {
...mapZooRowBase(row),
is_bot: row.is_bot,
account_id: row.account_id,
animal_weights: row.animal_weights || {},
game_state: row.game_state,
};
}
/**
* @param {string} zooId
* @param {object} gameState
* @returns {Promise<void>}
*/
export async function updateZooGameState(zooId, gameState) {
await pool.query(
"UPDATE zoos SET game_state = $1, updated_at = now() WHERE id = $2",
[JSON.stringify(gameState), zooId]
);
}
/**
* @returns {Promise<number>}
*/
export async function countPlayerZoos() {
const res = await pool.query(
"SELECT COUNT(*) AS n FROM zoos WHERE is_bot = false"
);
return Number(res.rows[0]?.n) || 0;
}
/**
* @param {number} x
* @param {number} y
* @param {object} animalWeights
* @returns {Promise<string>} zoo id
*/
export async function createBotZoo(x, y, animalWeights) {
const gameState = createInitialBotState();
const res = await pool.query(
"INSERT INTO zoos (account_id, name, x, y, is_bot, animal_weights, game_state) VALUES (NULL, $1, $2, $3, true, $4, $5) RETURNING id",
[`Zoo bot ${x.toFixed(0)}-${y.toFixed(0)}`, x, y, JSON.stringify(animalWeights), JSON.stringify(gameState)]
);
return res.rows[0].id;
}
/**
* Load bot zoos for server-side tick (id, name, x, y, animal_weights, game_state).
* @returns {Promise<Array<{ id: string, name: string, x: number, y: number, animalWeights: object, botState: object }>>}
*/
export async function getBotZoosForTick() {
const res = await pool.query(
"SELECT id, name, x, y, animal_weights, game_state FROM zoos WHERE is_bot = true"
);
return res.rows.map((row) => ({
...mapZooRowBase(row),
animalWeights: row.animal_weights || {},
botState: row.game_state || createInitialBotState(),
}));
}
/**
* Persist bot zoo state after tick.
* @param {string} zooId
* @param {object} animalWeights
* @param {object} gameState
* @returns {Promise<void>}
*/
export async function updateBotZooState(zooId, animalWeights, gameState) {
await pool.query(
"UPDATE zoos SET animal_weights = $1, game_state = $2, updated_at = now() WHERE id = $3 AND is_bot = true",
[JSON.stringify(animalWeights), JSON.stringify(gameState), zooId]
);
}
export { pool };

267
server/db-sales.js Normal file
View File

@@ -0,0 +1,267 @@
import { pool, getZooById, updateZooGameState } from "./db-core.js";
const SALE_STATUS = { ACTIVE: "active", SOLD: "sold", EXPIRED: "expired", REJECTED: "rejected", VALIDATED: "validated" };
/** Deferred validation delay in seconds (10 minutes). */
const SALE_VALIDATION_DELAY_SECONDS = 10 * 60;
/**
* Map a sale_listings row to a listing object. Missing columns (e.g. sold_at on active-only SELECT) become undefined.
* @param {Record<string, unknown>} row
* @returns {{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, sold_at?: Date | null, validated_at?: Date | null, reproduction_score_at_sale: number | null, delivered_at?: Date | null, created_at?: Date }}
*/
function mapSaleListingRow(row) {
return {
id: row.id,
seller_zoo_id: row.seller_zoo_id,
animal_id: row.animal_id,
is_baby: Boolean(row.is_baby),
initial_price: Number(row.initial_price),
end_at: row.end_at,
status: String(row.status),
best_bid_amount: (row.best_bid_amount !== null && row.best_bid_amount !== undefined) ? Number(row.best_bid_amount) : null,
best_bidder_zoo_id: row.best_bidder_zoo_id ?? null,
sold_at: row.sold_at ?? undefined,
validated_at: row.validated_at ?? undefined,
reproduction_score_at_sale: (row.reproduction_score_at_sale !== null && row.reproduction_score_at_sale !== undefined) ? Number(row.reproduction_score_at_sale) : null,
delivered_at: row.delivered_at ?? undefined,
created_at: row.created_at ?? undefined,
};
}
/**
* @param {{ sellerZooId: string, animalId: string, isBaby: boolean, initialPrice: number, endAt: string, reproductionScoreAtSale?: number }} opts
* @returns {Promise<{ id: string }>}
*/
export async function createSaleListing(opts) {
const { sellerZooId, animalId, isBaby, initialPrice, endAt, reproductionScoreAtSale } = opts;
const res = await pool.query(
`INSERT INTO sale_listings (seller_zoo_id, animal_id, is_baby, initial_price, end_at, reproduction_score_at_sale)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`,
[sellerZooId, animalId, isBaby, initialPrice, endAt, reproductionScoreAtSale ?? null]
);
return { id: res.rows[0].id };
}
/**
* @param {string} listingId
* @returns {Promise<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, sold_at: Date | null, validated_at: Date | null, reproduction_score_at_sale: number | null, delivered_at: Date | null, created_at: Date } | null>}
*/
export async function getSaleListingById(listingId) {
const res = await pool.query(
"SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at FROM sale_listings WHERE id = $1",
[listingId]
);
const row = res.rows[0];
return row ? mapSaleListingRow(row) : null;
}
/**
* Active listings (for marketplace).
* @returns {Promise<Array<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, reproduction_score_at_sale: number | null }>>}
*/
export async function getActiveSaleListings() {
const res = await pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, reproduction_score_at_sale
FROM sale_listings WHERE status = $1 ORDER BY end_at ASC`,
[SALE_STATUS.ACTIVE]
);
return res.rows.map(mapSaleListingRow);
}
/**
* Listings relevant to a zoo: as seller (any status), as buyer (sold to me, not yet delivered), plus active for browsing.
* @param {string} zooId
* @returns {Promise<{ asSeller: Array<object>, asBuyerUndelivered: Array<object>, active: Array<object> }>}
*/
export async function getSalesForZoo(zooId) {
const [sellerRes, buyerRes, activeRes] = await Promise.all([
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at
FROM sale_listings WHERE seller_zoo_id = $1 ORDER BY created_at DESC`,
[zooId]
),
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at
FROM sale_listings WHERE best_bidder_zoo_id = $1 AND status = ANY($2::text[]) AND delivered_at IS NULL ORDER BY sold_at DESC`,
[zooId, [SALE_STATUS.SOLD, SALE_STATUS.VALIDATED]]
),
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, reproduction_score_at_sale
FROM sale_listings WHERE status = $1 ORDER BY end_at ASC`,
[SALE_STATUS.ACTIVE]
),
]);
return {
asSeller: sellerRes.rows.map(mapSaleListingRow),
asBuyerUndelivered: buyerRes.rows.map(mapSaleListingRow),
active: activeRes.rows.map(mapSaleListingRow),
};
}
/**
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: true, listing: object } | { ok: false, reason: string }>}
*/
async function validateListingForSeller(listingId, sellerZooId) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.ACTIVE) return { ok: false, reason: "ListingNotActive" };
if (listing.seller_zoo_id !== sellerZooId) return { ok: false, reason: "NotSeller" };
return { ok: true, listing };
}
/**
* @param {object} listing
* @returns {Promise<{ ok: true, buyerZoo: object, sellerZoo: object } | { ok: false, reason: string }>}
*/
async function validateBuyerAndSeller(listing) {
const buyerZooId = listing.best_bidder_zoo_id;
const amount = listing.best_bid_amount;
if (!buyerZooId || amount === null || amount === undefined) return { ok: false, reason: "NoBid" };
const buyerZoo = await getZooById(buyerZooId);
const sellerZoo = await getZooById(listing.seller_zoo_id);
if (!buyerZoo || !buyerZoo.game_state) return { ok: false, reason: "BuyerStateMissing" };
if (!sellerZoo || !sellerZoo.game_state) return { ok: false, reason: "SellerStateMissing" };
const buyerCoins = Number(buyerZoo.game_state.coins ?? 0);
if (buyerCoins < amount) return { ok: false, reason: "BuyerInsufficientCoins" };
return { ok: true, buyerZoo, sellerZoo };
}
/**
* Seller accepts the current best bid: mark sold, set validated_at = now() + 10 minutes. Coins are transferred later by processValidatedSales().
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function acceptSale(listingId, sellerZooId) {
const validated = await validateListingForSeller(listingId, sellerZooId);
if (!validated.ok) return { ok: false, reason: validated.reason };
const parties = await validateBuyerAndSeller(validated.listing);
if (!parties.ok) return { ok: false, reason: parties.reason };
await pool.query(
"UPDATE sale_listings SET status = $1, sold_at = now(), validated_at = now() + ($2::text || ' seconds')::interval WHERE id = $3",
[SALE_STATUS.SOLD, String(SALE_VALIDATION_DELAY_SECONDS), listingId]
);
return { ok: true };
}
/**
* Place or update bid for a listing. Only if listing is active and amount > current best_bid_amount (or initial_price).
* @param {string} listingId
* @param {string} bidderZooId
* @param {number} amount
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function placeBid(listingId, bidderZooId, amount) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.ACTIVE) return { ok: false, reason: "ListingNotActive" };
const minAmount = listing.best_bid_amount ?? listing.initial_price;
if (amount <= minAmount) return { ok: false, reason: "BidTooLow" };
await pool.query(
"INSERT INTO sale_bids (listing_id, bidder_zoo_id, amount) VALUES ($1, $2, $3) ON CONFLICT (listing_id, bidder_zoo_id) DO UPDATE SET amount = $3, created_at = now()",
[listingId, bidderZooId, amount]
);
await pool.query(
"UPDATE sale_listings SET best_bid_amount = $1, best_bidder_zoo_id = $2 WHERE id = $3",
[amount, bidderZooId, listingId]
);
return { ok: true };
}
/**
* Process sold listings whose validated_at <= now(): transfer coins (buyer -= amount, seller += amount), set status = 'validated'.
* @returns {Promise<number>} count of listings processed
*/
export async function processValidatedSales() {
const res = await pool.query(
`SELECT id, seller_zoo_id, best_bidder_zoo_id, best_bid_amount FROM sale_listings
WHERE status = $1 AND validated_at IS NOT NULL AND validated_at <= now()`,
[SALE_STATUS.SOLD]
);
let count = 0;
for (const row of res.rows) {
const buyerZooId = row.best_bidder_zoo_id;
const sellerZooId = row.seller_zoo_id;
const amount = Number(row.best_bid_amount);
if (buyerZooId && Number.isFinite(amount)) {
const buyerZoo = await getZooById(buyerZooId);
const sellerZoo = await getZooById(sellerZooId);
if (buyerZoo?.game_state && sellerZoo?.game_state) {
const buyerState = buyerZoo.game_state;
const sellerState = sellerZoo.game_state;
const buyerCoins = Number(buyerState.coins ?? 0);
const sellerCoins = Number(sellerState.coins ?? 0);
buyerState.coins = buyerCoins - amount;
sellerState.coins = sellerCoins + amount;
await updateZooGameState(buyerZooId, buyerState);
await updateZooGameState(sellerZooId, sellerState);
await pool.query(
"UPDATE sale_listings SET status = $1 WHERE id = $2",
[SALE_STATUS.VALIDATED, row.id]
);
count += 1;
}
}
}
return count;
}
/**
* Seller rejects the sale (listing stays active; best bid is cleared so seller can accept a different bid later if any).
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function rejectSale(listingId, sellerZooId) {
const validated = await validateListingForSeller(listingId, sellerZooId);
if (!validated.ok) return { ok: false, reason: validated.reason };
await pool.query(
"UPDATE sale_listings SET best_bid_amount = NULL, best_bidder_zoo_id = NULL WHERE id = $1",
[listingId]
);
return { ok: true };
}
/**
* Mark listing as delivered (buyer has applied it to their zoo).
* @param {string} listingId
* @param {string} buyerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function markSaleDelivered(listingId, buyerZooId) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.VALIDATED) return { ok: false, reason: "NotValidated" };
if (listing.best_bidder_zoo_id !== buyerZooId) return { ok: false, reason: "NotBuyer" };
if (listing.delivered_at) return { ok: true };
await pool.query("UPDATE sale_listings SET delivered_at = now() WHERE id = $1", [listingId]);
return { ok: true };
}
/**
* Expire active listings past end_at: set status=expired; if is_baby, increment seller's game_state.deathCountRecent.
* @returns {Promise<number>} count of expired listings
*/
export async function expireSaleListings() {
const res = await pool.query(
`SELECT id, seller_zoo_id, is_baby FROM sale_listings
WHERE status = $1 AND end_at < now()`,
[SALE_STATUS.ACTIVE]
);
let count = 0;
for (const row of res.rows) {
await pool.query("UPDATE sale_listings SET status = $1 WHERE id = $2", [SALE_STATUS.EXPIRED, row.id]);
if (row.is_baby) {
const zoo = await getZooById(row.seller_zoo_id);
if (zoo && zoo.game_state) {
const state = zoo.game_state;
state.deathCountRecent = (Number(state.deathCountRecent) || 0) + 1;
await updateZooGameState(row.seller_zoo_id, state);
}
}
count += 1;
}
return count;
}

View File

@@ -1,489 +1,29 @@
import pg from "pg";
import parse from "pg-connection-string";
import { createInitialBotState } from "./bot-state.js";
export {
pool,
getMapParams,
getAccountByPublicKey,
createAccount,
updateLastSeen,
getZooByAccountId,
getAllZoos,
createZoo,
getZooById,
updateZooGameState,
countPlayerZoos,
createBotZoo,
getBotZoosForTick,
updateBotZooState,
} from "./db-core.js";
const { Pool } = pg;
const connectionString = process.env.DATABASE_URL || "postgres://localhost/builazoo";
const parsed = parse(connectionString);
const poolConfig = {
host: parsed.host || "localhost",
port: Number(parsed.port) || 5432,
database: parsed.database || "builazoo",
user: parsed.user,
password: typeof parsed.password === "string" ? parsed.password : "",
};
if (process.env.PGPASSWORD !== undefined && process.env.PGPASSWORD !== null) poolConfig.password = String(process.env.PGPASSWORD);
const pool = new Pool(poolConfig);
/**
* @returns {Promise<{ mapWidth: number, mapHeight: number, minZoos: number }>}
*/
export async function getMapParams() {
const res = await pool.query(
"SELECT value FROM map_config WHERE key = 'params'"
);
const row = res.rows[0];
if (!row) {
return { mapWidth: 100, mapHeight: 100, minZoos: 5 };
}
const v = row.value;
return {
mapWidth: Number(v?.mapWidth) || 100,
mapHeight: Number(v?.mapHeight) || 100,
minZoos: Number(v?.minZoos) || 5,
};
}
/**
* @param {string} publicKey
* @returns {Promise<{ id: string, pseudo: string } | null>}
*/
export async function getAccountByPublicKey(publicKey) {
const res = await pool.query(
"SELECT id, pseudo FROM accounts WHERE public_key = $1",
[publicKey]
);
const row = res.rows[0];
if (!row) return null;
return { id: row.id, pseudo: row.pseudo };
}
/**
* @param {string} publicKey
* @param {string} pseudo
* @returns {Promise<{ id: string, pseudo: string }>}
*/
export async function createAccount(publicKey, pseudo) {
const res = await pool.query(
"INSERT INTO accounts (public_key, pseudo) VALUES ($1, $2) RETURNING id, pseudo",
[publicKey, pseudo]
);
const row = res.rows[0];
return { id: row.id, pseudo: row.pseudo };
}
/**
* @param {string} accountId
* @returns {Promise<void>}
*/
export async function updateLastSeen(accountId) {
await pool.query(
"UPDATE accounts SET last_seen_at = now() WHERE id = $1",
[accountId]
);
}
/**
* @param {string} accountId
* @returns {Promise<{ id: string, name: string, x: number, y: number, is_bot: boolean, animal_weights: object, game_state: object | null } | null>}
*/
export async function getZooByAccountId(accountId) {
const res = await pool.query(
"SELECT id, name, x, y, is_bot, animal_weights, game_state FROM zoos WHERE account_id = $1",
[accountId]
);
const row = res.rows[0];
if (!row) return null;
return {
id: row.id,
name: row.name,
x: Number(row.x),
y: Number(row.y),
is_bot: row.is_bot,
animal_weights: row.animal_weights || {},
game_state: row.game_state,
};
}
/**
* Common zoo row fields: id, name, x, y with numeric coords.
* @param {Record<string, unknown>} row
* @returns {{ id: string, name: string, x: number, y: number }}
*/
function mapZooRowBase(row) {
return {
id: row.id,
name: row.name,
x: Number(row.x),
y: Number(row.y),
};
}
/**
* @returns {Promise<Array<{ id: string, name: string, x: number, y: number, animal_weights: object, game_state: object | null }>>}
*/
export async function getAllZoos() {
const res = await pool.query(
"SELECT id, name, x, y, animal_weights, game_state FROM zoos ORDER BY is_bot, name"
);
return res.rows.map((row) => ({
...mapZooRowBase(row),
animal_weights: row.animal_weights || {},
game_state: row.game_state ?? null,
}));
}
/**
* @param {{ accountId: string, name: string, x: number, y: number, gameState: object }} opts
* @returns {Promise<{ id: string }>}
*/
export async function createZoo(opts) {
const { accountId, name, x, y, gameState } = opts;
const res = await pool.query(
"INSERT INTO zoos (account_id, name, x, y, is_bot, animal_weights, game_state) VALUES ($1, $2, $3, $4, false, $5, $6) RETURNING id",
[accountId, name, x, y, "{}", gameState]
);
return { id: res.rows[0].id };
}
/**
* @param {string} zooId
* @returns {Promise<{ id: string, name: string, x: number, y: number, is_bot: boolean, account_id: string | null, animal_weights: object, game_state: object | null } | null>}
*/
export async function getZooById(zooId) {
const res = await pool.query(
"SELECT id, name, x, y, is_bot, account_id, animal_weights, game_state FROM zoos WHERE id = $1",
[zooId]
);
const row = res.rows[0];
if (!row) return null;
return {
...mapZooRowBase(row),
is_bot: row.is_bot,
account_id: row.account_id,
animal_weights: row.animal_weights || {},
game_state: row.game_state,
};
}
/**
* @param {string} zooId
* @param {object} gameState
* @returns {Promise<void>}
*/
export async function updateZooGameState(zooId, gameState) {
await pool.query(
"UPDATE zoos SET game_state = $1, updated_at = now() WHERE id = $2",
[JSON.stringify(gameState), zooId]
);
}
/**
* @returns {Promise<number>}
*/
export async function countPlayerZoos() {
const res = await pool.query(
"SELECT COUNT(*) AS n FROM zoos WHERE is_bot = false"
);
return Number(res.rows[0]?.n) || 0;
}
/**
* @param {number} x
* @param {number} y
* @param {object} animalWeights
* @returns {Promise<string>} zoo id
*/
export async function createBotZoo(x, y, animalWeights) {
const gameState = createInitialBotState();
const res = await pool.query(
"INSERT INTO zoos (account_id, name, x, y, is_bot, animal_weights, game_state) VALUES (NULL, $1, $2, $3, true, $4, $5) RETURNING id",
[`Zoo bot ${x.toFixed(0)}-${y.toFixed(0)}`, x, y, JSON.stringify(animalWeights), JSON.stringify(gameState)]
);
return res.rows[0].id;
}
/**
* Load bot zoos for server-side tick (id, name, x, y, animal_weights, game_state).
* @returns {Promise<Array<{ id: string, name: string, x: number, y: number, animalWeights: object, botState: object }>>}
*/
export async function getBotZoosForTick() {
const res = await pool.query(
"SELECT id, name, x, y, animal_weights, game_state FROM zoos WHERE is_bot = true"
);
return res.rows.map((row) => ({
...mapZooRowBase(row),
animalWeights: row.animal_weights || {},
botState: row.game_state || createInitialBotState(),
}));
}
/**
* Persist bot zoo state after tick.
* @param {string} zooId
* @param {object} animalWeights
* @param {object} gameState
* @returns {Promise<void>}
*/
export async function updateBotZooState(zooId, animalWeights, gameState) {
await pool.query(
"UPDATE zoos SET animal_weights = $1, game_state = $2, updated_at = now() WHERE id = $3 AND is_bot = true",
[JSON.stringify(animalWeights), JSON.stringify(gameState), zooId]
);
}
// --- Sale listings (phase 10) ---
const SALE_STATUS = { ACTIVE: "active", SOLD: "sold", EXPIRED: "expired", REJECTED: "rejected", VALIDATED: "validated" };
/** Deferred validation delay in seconds (10 minutes). */
const SALE_VALIDATION_DELAY_SECONDS = 10 * 60;
/**
* Map a sale_listings row to a listing object. Missing columns (e.g. sold_at on active-only SELECT) become undefined.
* @param {Record<string, unknown>} row
* @returns {{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, sold_at?: Date | null, validated_at?: Date | null, reproduction_score_at_sale: number | null, delivered_at?: Date | null, created_at?: Date }}
*/
function mapSaleListingRow(row) {
return {
id: row.id,
seller_zoo_id: row.seller_zoo_id,
animal_id: row.animal_id,
is_baby: Boolean(row.is_baby),
initial_price: Number(row.initial_price),
end_at: row.end_at,
status: String(row.status),
best_bid_amount: (row.best_bid_amount !== null && row.best_bid_amount !== undefined) ? Number(row.best_bid_amount) : null,
best_bidder_zoo_id: row.best_bidder_zoo_id ?? null,
sold_at: row.sold_at ?? undefined,
validated_at: row.validated_at ?? undefined,
reproduction_score_at_sale: (row.reproduction_score_at_sale !== null && row.reproduction_score_at_sale !== undefined) ? Number(row.reproduction_score_at_sale) : null,
delivered_at: row.delivered_at ?? undefined,
created_at: row.created_at ?? undefined,
};
}
/**
* @param {{ sellerZooId: string, animalId: string, isBaby: boolean, initialPrice: number, endAt: string, reproductionScoreAtSale?: number }} opts
* @returns {Promise<{ id: string }>}
*/
export async function createSaleListing(opts) {
const { sellerZooId, animalId, isBaby, initialPrice, endAt, reproductionScoreAtSale } = opts;
const res = await pool.query(
`INSERT INTO sale_listings (seller_zoo_id, animal_id, is_baby, initial_price, end_at, reproduction_score_at_sale)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`,
[sellerZooId, animalId, isBaby, initialPrice, endAt, reproductionScoreAtSale ?? null]
);
return { id: res.rows[0].id };
}
/**
* @param {string} listingId
* @returns {Promise<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, sold_at: Date | null, validated_at: Date | null, reproduction_score_at_sale: number | null, delivered_at: Date | null, created_at: Date } | null>}
*/
export async function getSaleListingById(listingId) {
const res = await pool.query(
"SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at FROM sale_listings WHERE id = $1",
[listingId]
);
const row = res.rows[0];
return row ? mapSaleListingRow(row) : null;
}
/**
* Active listings (for marketplace).
* @returns {Promise<Array<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: Date, status: string, best_bid_amount: number | null, best_bidder_zoo_id: string | null, reproduction_score_at_sale: number | null }>>}
*/
export async function getActiveSaleListings() {
const res = await pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, reproduction_score_at_sale
FROM sale_listings WHERE status = $1 ORDER BY end_at ASC`,
[SALE_STATUS.ACTIVE]
);
return res.rows.map(mapSaleListingRow);
}
/**
* Listings relevant to a zoo: as seller (any status), as buyer (sold to me, not yet delivered), plus active for browsing.
* @param {string} zooId
* @returns {Promise<{ asSeller: Array<object>, asBuyerUndelivered: Array<object>, active: Array<object> }>}
*/
export async function getSalesForZoo(zooId) {
const [sellerRes, buyerRes, activeRes] = await Promise.all([
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at
FROM sale_listings WHERE seller_zoo_id = $1 ORDER BY created_at DESC`,
[zooId]
),
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, sold_at, validated_at, reproduction_score_at_sale, delivered_at, created_at
FROM sale_listings WHERE best_bidder_zoo_id = $1 AND status = ANY($2::text[]) AND delivered_at IS NULL ORDER BY sold_at DESC`,
[zooId, [SALE_STATUS.SOLD, SALE_STATUS.VALIDATED]]
),
pool.query(
`SELECT id, seller_zoo_id, animal_id, is_baby, initial_price, end_at, status, best_bid_amount, best_bidder_zoo_id, reproduction_score_at_sale
FROM sale_listings WHERE status = $1 ORDER BY end_at ASC`,
[SALE_STATUS.ACTIVE]
),
]);
return {
asSeller: sellerRes.rows.map(mapSaleListingRow),
asBuyerUndelivered: buyerRes.rows.map(mapSaleListingRow),
active: activeRes.rows.map(mapSaleListingRow),
};
}
/**
* Load listing and validate it is active and seller is the given zoo. Used by acceptSale and rejectSale.
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: true, listing: object } | { ok: false, reason: string }>}
*/
async function validateListingForSeller(listingId, sellerZooId) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.ACTIVE) return { ok: false, reason: "ListingNotActive" };
if (listing.seller_zoo_id !== sellerZooId) return { ok: false, reason: "NotSeller" };
return { ok: true, listing };
}
/**
* Place or update bid for a listing. Only if listing is active and amount > current best_bid_amount (or initial_price).
* @param {string} listingId
* @param {string} bidderZooId
* @param {number} amount
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function placeBid(listingId, bidderZooId, amount) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.ACTIVE) return { ok: false, reason: "ListingNotActive" };
const minAmount = listing.best_bid_amount ?? listing.initial_price;
if (amount <= minAmount) return { ok: false, reason: "BidTooLow" };
await pool.query(
"INSERT INTO sale_bids (listing_id, bidder_zoo_id, amount) VALUES ($1, $2, $3) ON CONFLICT (listing_id, bidder_zoo_id) DO UPDATE SET amount = $3, created_at = now()",
[listingId, bidderZooId, amount]
);
await pool.query(
"UPDATE sale_listings SET best_bid_amount = $1, best_bidder_zoo_id = $2 WHERE id = $3",
[amount, bidderZooId, listingId]
);
return { ok: true };
}
/**
* Seller accepts the current best bid: mark sold, set validated_at = now() + 10 minutes. Coins are transferred later by processValidatedSales().
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function acceptSale(listingId, sellerZooId) {
const validated = await validateListingForSeller(listingId, sellerZooId);
if (!validated.ok) return { ok: false, reason: validated.reason };
const { listing } = validated;
const buyerZooId = listing.best_bidder_zoo_id;
const amount = listing.best_bid_amount;
if (!buyerZooId || amount === null || amount === undefined) return { ok: false, reason: "NoBid" };
const buyerZoo = await getZooById(buyerZooId);
const sellerZoo = await getZooById(sellerZooId);
if (!buyerZoo || !buyerZoo.game_state) return { ok: false, reason: "BuyerStateMissing" };
if (!sellerZoo || !sellerZoo.game_state) return { ok: false, reason: "SellerStateMissing" };
const buyerState = buyerZoo.game_state;
const buyerCoins = Number(buyerState.coins ?? 0);
if (buyerCoins < amount) return { ok: false, reason: "BuyerInsufficientCoins" };
await pool.query(
"UPDATE sale_listings SET status = $1, sold_at = now(), validated_at = now() + ($2::text || ' seconds')::interval WHERE id = $3",
[SALE_STATUS.SOLD, String(SALE_VALIDATION_DELAY_SECONDS), listingId]
);
return { ok: true };
}
/**
* Process sold listings whose validated_at <= now(): transfer coins (buyer -= amount, seller += amount), set status = 'validated'.
* @returns {Promise<number>} count of listings processed
*/
export async function processValidatedSales() {
const res = await pool.query(
`SELECT id, seller_zoo_id, best_bidder_zoo_id, best_bid_amount FROM sale_listings
WHERE status = $1 AND validated_at IS NOT NULL AND validated_at <= now()`,
[SALE_STATUS.SOLD]
);
let count = 0;
for (const row of res.rows) {
const buyerZooId = row.best_bidder_zoo_id;
const sellerZooId = row.seller_zoo_id;
const amount = Number(row.best_bid_amount);
if (buyerZooId && Number.isFinite(amount)) {
const buyerZoo = await getZooById(buyerZooId);
const sellerZoo = await getZooById(sellerZooId);
if (buyerZoo?.game_state && sellerZoo?.game_state) {
const buyerState = buyerZoo.game_state;
const sellerState = sellerZoo.game_state;
const buyerCoins = Number(buyerState.coins ?? 0);
const sellerCoins = Number(sellerState.coins ?? 0);
buyerState.coins = buyerCoins - amount;
sellerState.coins = sellerCoins + amount;
await updateZooGameState(buyerZooId, buyerState);
await updateZooGameState(sellerZooId, sellerState);
await pool.query(
"UPDATE sale_listings SET status = $1 WHERE id = $2",
[SALE_STATUS.VALIDATED, row.id]
);
count += 1;
}
}
}
return count;
}
/**
* Seller rejects the sale (listing stays active; best bid is cleared so seller can accept a different bid later if any).
* @param {string} listingId
* @param {string} sellerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function rejectSale(listingId, sellerZooId) {
const validated = await validateListingForSeller(listingId, sellerZooId);
if (!validated.ok) return { ok: false, reason: validated.reason };
await pool.query(
"UPDATE sale_listings SET best_bid_amount = NULL, best_bidder_zoo_id = NULL WHERE id = $1",
[listingId]
);
return { ok: true };
}
/**
* Mark listing as delivered (buyer has applied it to their zoo).
* @param {string} listingId
* @param {string} buyerZooId
* @returns {Promise<{ ok: boolean, reason?: string }>}
*/
export async function markSaleDelivered(listingId, buyerZooId) {
const listing = await getSaleListingById(listingId);
if (!listing) return { ok: false, reason: "ListingNotFound" };
if (listing.status !== SALE_STATUS.VALIDATED) return { ok: false, reason: "NotValidated" };
if (listing.best_bidder_zoo_id !== buyerZooId) return { ok: false, reason: "NotBuyer" };
if (listing.delivered_at) return { ok: true };
await pool.query("UPDATE sale_listings SET delivered_at = now() WHERE id = $1", [listingId]);
return { ok: true };
}
/**
* Expire active listings past end_at: set status=expired; if is_baby, increment seller's game_state.deathCountRecent.
* @returns {Promise<number>} count of expired listings
*/
export async function expireSaleListings() {
const res = await pool.query(
`SELECT id, seller_zoo_id, is_baby FROM sale_listings
WHERE status = $1 AND end_at < now()`,
[SALE_STATUS.ACTIVE]
);
let count = 0;
for (const row of res.rows) {
await pool.query("UPDATE sale_listings SET status = $1 WHERE id = $2", [SALE_STATUS.EXPIRED, row.id]);
if (row.is_baby) {
const zoo = await getZooById(row.seller_zoo_id);
if (zoo && zoo.game_state) {
const state = zoo.game_state;
state.deathCountRecent = (Number(state.deathCountRecent) || 0) + 1;
await updateZooGameState(row.seller_zoo_id, state);
}
}
count += 1;
}
return count;
}
export { pool };
export {
createSaleListing,
getSaleListingById,
getActiveSaleListings,
getSalesForZoo,
placeBid,
acceptSale,
processValidatedSales,
rejectSale,
markSaleDelivered,
expireSaleListings,
} from "./db-sales.js";

View File

@@ -17,6 +17,35 @@ import { verifySignature, buildSignMessage, hashBody } from "../auth.js";
const router = express.Router();
const TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000;
/** @param {string} timestamp
* @returns {boolean}
*/
function isTimestampValid(timestamp) {
const now = Date.now();
const ts = new Date(timestamp).getTime();
return !Number.isNaN(ts) && Math.abs(now - ts) <= TIMESTAMP_TOLERANCE_MS;
}
/** @param {import("express").Request} req
* @returns {string}
*/
function getBodyForSignature(req) {
return req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
}
/** @param {import("express").Request} req
* @param {string} publicKey
* @param {string} signature
* @param {string} timestamp
* @returns {boolean}
*/
function isSignatureValid(req, publicKey, signature, timestamp) {
const bodyHash = hashBody(getBodyForSignature(req));
const path = req.originalUrl || req.baseUrl + req.path || req.path;
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
return verifySignature(publicKey, signature, message);
}
function requireSignature() {
return (req, res, next) => {
const publicKey = req.headers["x-public-key"];
@@ -26,17 +55,11 @@ function requireSignature() {
res.status(401).json({ error: "Missing X-Public-Key, X-Signature, or X-Timestamp" });
return;
}
const now = Date.now();
const ts = new Date(timestamp).getTime();
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
if (!isTimestampValid(timestamp)) {
res.status(401).json({ error: "Invalid or expired timestamp" });
return;
}
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
const bodyHash = hashBody(body);
const path = req.originalUrl || req.baseUrl + req.path || req.path;
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
if (!verifySignature(publicKey, signature, message)) {
if (!isSignatureValid(req, publicKey, signature, timestamp)) {
res.status(401).json({ error: "Invalid signature" });
return;
}
@@ -60,17 +83,7 @@ function optionalSignature() {
next();
return;
}
const now = Date.now();
const ts = new Date(timestamp).getTime();
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
next();
return;
}
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
const bodyHash = hashBody(body);
const path = req.originalUrl || req.baseUrl + req.path || req.path;
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
if (!verifySignature(publicKey, signature, message)) {
if (!isTimestampValid(timestamp) || !isSignatureValid(req, publicKey, signature, timestamp)) {
next();
return;
}
@@ -81,28 +94,62 @@ function optionalSignature() {
};
}
/** GET /api/sales — optional auth: with auth returns asSeller, asBuyerUndelivered, active; without auth returns active only. */
/** GET /api/sales — optional auth: with auth returns asSeller, asBuyerUndelivered, active; without auth returns active only.
* @param {import("express").Request} req
* @returns {Promise<{ active: Array<object> } | { asSeller: Array<object>, asBuyerUndelivered: Array<object>, active: Array<object> }>}
*/
async function getSalesResponse(req) {
await expireSaleListings();
if (!req.account) {
const active = await getActiveSaleListings();
return { active };
}
await processValidatedSales();
const zoo = await getZooByAccountId(req.account.id);
if (!zoo) {
return { asSeller: [], asBuyerUndelivered: [], active: await getActiveSaleListings() };
}
return getSalesForZoo(zoo.id);
}
router.get("/", optionalSignature(), async (req, res, next) => {
try {
await expireSaleListings();
if (req.account) {
await processValidatedSales();
const zoo = await getZooByAccountId(req.account.id);
if (!zoo) {
res.json({ asSeller: [], asBuyerUndelivered: [], active: await getActiveSaleListings() });
return;
}
const data = await getSalesForZoo(zoo.id);
res.json(data);
return;
}
const active = await getActiveSaleListings();
res.json({ active });
const data = await getSalesResponse(req);
res.json(data);
} catch (e) {
next(e);
}
});
/**
* @param {unknown} body
* @returns {{ status: number, error: string } | null}
*/
function validateCreateListingBody(body) {
const { animalId, isBaby, price, endAt } = body ?? {};
if (typeof animalId !== "string" || !animalId.trim()) return { status: 400, error: "animalId required" };
if (typeof isBaby !== "boolean") return { status: 400, error: "isBaby boolean required" };
const initialPrice = Number(price);
if (!Number.isFinite(initialPrice) || initialPrice < 0) return { status: 400, error: "price must be a non-negative number" };
const endAtDate = endAt ? new Date(endAt) : null;
if (!endAtDate || Number.isNaN(endAtDate.getTime())) return { status: 400, error: "endAt required (ISO date string)" };
return null;
}
/**
* @param {unknown} body
* @returns {{ ok: true, animalId: string, isBaby: boolean, initialPrice: number, endAtDate: Date, reproductionScoreAtSale?: number } | { ok: false, status: number, error: string }}
*/
function parseCreateListingBody(body) {
const err = validateCreateListingBody(body);
if (err) return { ok: false, status: err.status, error: err.error };
const { animalId, isBaby, price, endAt, reproductionScoreAtSale } = body ?? {};
const endAtDate = endAt ? new Date(endAt) : null;
const initialPrice = Number(price);
const repScore = reproductionScoreAtSale !== null && reproductionScoreAtSale !== undefined ? Number(reproductionScoreAtSale) : undefined;
return { ok: true, animalId: String(animalId).trim(), isBaby, initialPrice, endAtDate: /** @type {Date} */ (endAtDate), reproductionScoreAtSale: repScore };
}
/** POST /api/sales — create listing (auth). Body: { animalId, isBaby, price, endAt, reproductionScoreAtSale? }. */
router.post("/", requireSignature(), async (req, res, next) => {
try {
@@ -111,32 +158,18 @@ router.post("/", requireSignature(), async (req, res, next) => {
res.status(404).json({ error: "No zoo for this account" });
return;
}
const { animalId, isBaby, price, endAt, reproductionScoreAtSale } = req.body ?? {};
if (typeof animalId !== "string" || !animalId.trim()) {
res.status(400).json({ error: "animalId required" });
return;
}
if (typeof isBaby !== "boolean") {
res.status(400).json({ error: "isBaby boolean required" });
return;
}
const initialPrice = Number(price);
if (!Number.isFinite(initialPrice) || initialPrice < 0) {
res.status(400).json({ error: "price must be a non-negative number" });
return;
}
const endAtDate = endAt ? new Date(endAt) : null;
if (!endAtDate || Number.isNaN(endAtDate.getTime())) {
res.status(400).json({ error: "endAt required (ISO date string)" });
const parsed = parseCreateListingBody(req.body);
if (!parsed.ok) {
res.status(parsed.status).json({ error: parsed.error });
return;
}
const { id } = await createSaleListing({
sellerZooId: zoo.id,
animalId: animalId.trim(),
isBaby,
initialPrice,
endAt: endAtDate.toISOString(),
reproductionScoreAtSale: reproductionScoreAtSale != null ? Number(reproductionScoreAtSale) : undefined,
animalId: parsed.animalId,
isBaby: parsed.isBaby,
initialPrice: parsed.initialPrice,
endAt: parsed.endAtDate.toISOString(),
reproductionScoreAtSale: parsed.reproductionScoreAtSale,
});
res.status(201).json({ id });
} catch (e) {

View File

@@ -15,6 +15,23 @@ import { verifySignature, buildSignMessage, hashBody } from "../auth.js";
const router = express.Router();
const TIMESTAMP_TOLERANCE_MS = 5 * 60 * 1000;
function isTimestampValid(timestamp) {
const now = Date.now();
const ts = new Date(timestamp).getTime();
return !Number.isNaN(ts) && Math.abs(now - ts) <= TIMESTAMP_TOLERANCE_MS;
}
function getBodyForSignature(req) {
return req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
}
function isSignatureValid(req, publicKey, signature, timestamp) {
const bodyHash = hashBody(getBodyForSignature(req));
const path = req.originalUrl || req.baseUrl + req.path || req.path;
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
return verifySignature(publicKey, signature, message);
}
function requireSignature() {
return (req, res, next) => {
const publicKey = req.headers["x-public-key"];
@@ -24,17 +41,11 @@ function requireSignature() {
res.status(401).json({ error: "Missing X-Public-Key, X-Signature, or X-Timestamp" });
return;
}
const now = Date.now();
const ts = new Date(timestamp).getTime();
if (Number.isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_MS) {
if (!isTimestampValid(timestamp)) {
res.status(401).json({ error: "Invalid or expired timestamp" });
return;
}
const body = req.bodyRaw !== undefined && req.bodyRaw !== null ? req.bodyRaw : "";
const bodyHash = hashBody(body);
const path = req.originalUrl || req.baseUrl + req.path || req.path;
const message = buildSignMessage(req.method, path, timestamp, bodyHash);
if (!verifySignature(publicKey, signature, message)) {
if (!isSignatureValid(req, publicKey, signature, timestamp)) {
res.status(401).json({ error: "Invalid signature" });
return;
}
@@ -49,20 +60,31 @@ function requireSignature() {
};
}
/** @returns {Promise<{ zoos: Array<object>, mapWidth: number, mapHeight: number }>}
*/
async function getZoosForMap() {
const params = await getMapParams();
let zoos = await getAllZoos();
await countPlayerZoos();
const need = Math.max(0, params.minZoos - zoos.length);
for (let i = 0; i < need; i++) {
const x = 10 + Math.random() * 80;
const y = 10 + Math.random() * 80;
const weights = { Basic: 1 + Math.floor(Math.random() * 2), Ocean: Math.floor(Math.random() * 2), Mountain: Math.floor(Math.random() * 2) };
await createBotZoo(x, y, weights);
}
if (need > 0) zoos = await getAllZoos();
return {
zoos,
mapWidth: params.mapWidth,
mapHeight: params.mapHeight,
};
}
/** GET /api/zoos — list zoos for map (no auth). Ensures minZoos with bots. */
router.get("/", async (req, res, next) => {
try {
const params = await getMapParams();
let zoos = await getAllZoos();
await countPlayerZoos();
const need = Math.max(0, params.minZoos - zoos.length);
for (let i = 0; i < need; i++) {
const x = 10 + Math.random() * 80;
const y = 10 + Math.random() * 80;
const weights = { Basic: 1 + Math.floor(Math.random() * 2), Ocean: Math.floor(Math.random() * 2), Mountain: Math.floor(Math.random() * 2) };
await createBotZoo(x, y, weights);
}
if (need > 0) zoos = await getAllZoos();
const { zoos, mapWidth, mapHeight } = await getZoosForMap();
const worldZoos = zoos.map((z) => ({
id: z.id,
name: z.name,
@@ -71,7 +93,7 @@ router.get("/", async (req, res, next) => {
animalWeights: z.animal_weights,
game_state: z.game_state ?? null,
}));
res.json({ worldZoos, mapWidth: params.mapWidth, mapHeight: params.mapHeight });
res.json({ worldZoos, mapWidth, mapHeight });
} catch (e) {
next(e);
}

View File

@@ -1374,6 +1374,30 @@ body.bg-phase-night.bg-weather-rain { background: linear-gradient(160deg, #080a0
font-weight: 600;
}
.cell.animal.animal-cold {
filter: hue-rotate(-20deg) saturate(0.9) brightness(0.95);
box-shadow: inset 0 0 12px rgba(255, 255, 255, 0.25);
}
.cell.animal.animal-hot {
filter: hue-rotate(10deg) saturate(1.1) brightness(1.05);
box-shadow: inset 0 0 8px rgba(255, 100, 80, 0.3);
}
.cell.animal.animal-hungry {
opacity: 0.92;
}
.cell.animal.animal-hungry .cell-label::before {
content: "🍽️ ";
font-size: 0.5rem;
}
.cell.animal.animal-sick {
filter: saturate(0.6) brightness(0.85);
opacity: 0.9;
}
.cell.animal.animal-happy {
box-shadow: 0 0 12px rgba(255, 215, 0, 0.4);
filter: brightness(1.08) saturate(1.05);
}
.cell .cell-emoji {
font-size: 1.4rem;
display: block;
@@ -1445,6 +1469,18 @@ body.bg-phase-night.bg-weather-rain { background: linear-gradient(160deg, #080a0
min-height: 0;
}
.season-toast {
padding: 6px 10px;
font-size: 0.9rem;
background: rgba(63, 185, 80, 0.15);
color: #238636;
border-radius: 6px;
margin-top: 4px;
}
.season-toast[hidden] {
display: none;
}
/* Bulles d'aide */
.help-wrap {
position: relative;

View File

@@ -0,0 +1,101 @@
/**
* Visual state of an animal cell for feedback (no gauges). Used by UI to add CSS classes.
* Refs: docs/specs/animal_generique.md, temperature.md.
*/
import { LootTables } from "./loot-tables.js";
import { getDisplayTemperature } from "./biome-rules.js";
import { getCurrentSeason, getSeasonTemperatureModifier } from "./seasons.js";
import { GameConfig } from "./config.js";
/**
* @param {number} cellTemp
* @param {number} idealTemp
* @param {number} tolerance
* @returns {{ cold: boolean, hot: boolean }}
*/
function getTemperatureState(cellTemp, idealTemp, tolerance) {
return {
cold: cellTemp < idealTemp - tolerance,
hot: cellTemp > idealTemp + tolerance,
};
}
/**
* @param {{ fedAgo: number, visitAgo: number, maxFood: number, maxVisit: number, cold: boolean, hot: boolean }} opts
* @returns {{ hungry: boolean, sick: boolean, happy: boolean }}
*/
function getCareState(opts) {
const { fedAgo, visitAgo, maxFood, maxVisit, cold, hot } = opts;
const hungry = fedAgo > maxFood * 0.6;
const sick = cold || hot || hungry || visitAgo > maxVisit * 0.8;
const happy = !sick && fedAgo < maxFood * 0.3 && visitAgo < maxVisit * 0.3
&& !cold && !hot;
return { hungry, sick, happy };
}
const EMPTY_VISUAL = { cold: false, hot: false, hungry: false, sick: false, happy: false };
/**
* @param {import("./types.js").AnimalCell} cell
* @param {import("./types.js").GameState} state
* @param {{ width: number, height: number }} grid
* @param {string} originKey
* @returns {{ cellTemp: number, idealTemp: number, tolerance: number } | null}
*/
function getAnimalTempInputs(cell, state, grid, originKey) {
const def = LootTables.Animals[cell.id];
if (!def) return null;
const m = originKey.match(/^(\d+)_(\d+)$/);
if (!m) return null;
const ox = Number(m[1]);
const oy = Number(m[2]);
const baseTemp = getDisplayTemperature(ox, oy, grid);
const seasonMod = getSeasonTemperatureModifier(getCurrentSeason(state));
const cellTemp = baseTemp + seasonMod;
const idealTemp = def.idealTemperature ?? 18;
const tolerance = def.temperatureTolerance ?? 5;
return { cellTemp, idealTemp, tolerance };
}
/**
* @param {import("./types.js").AnimalCell} cell
* @returns {{ fedAgo: number, visitAgo: number, maxFood: number, maxVisit: number }}
*/
function getAnimalTimeInputs(cell) {
const nowUnix = Math.floor(Date.now() / 1000);
const lastFed = cell.lastFedAt ?? cell.placedAt ?? nowUnix;
const lastVisited = cell.lastVisitedAt ?? cell.placedAt ?? nowUnix;
const maxFood = GameConfig.Food?.MaxSecondsWithoutFood ?? 120;
const maxVisit = GameConfig.Visitor?.MaxSecondsWithoutVisit ?? 300;
return { fedAgo: nowUnix - lastFed, visitAgo: nowUnix - lastVisited, maxFood, maxVisit };
}
/**
* @param {import("./types.js").AnimalCell} cell
* @param {import("./types.js").GameState} state
* @param {{ width: number, height: number }} grid
* @param {string} originKey
* @returns {{ cellTemp: number, idealTemp: number, tolerance: number, fedAgo: number, visitAgo: number, maxFood: number, maxVisit: number } | null}
*/
function getAnimalVisualInputs(cell, state, grid, originKey) {
const temp = getAnimalTempInputs(cell, state, grid, originKey);
if (!temp) return null;
const time = getAnimalTimeInputs(cell);
return { ...temp, ...time };
}
/**
* @param {import("./types.js").AnimalCell} cell Origin animal cell.
* @param {import("./types.js").GameState} state
* @param {{ width: number, height: number }} grid
* @param {string} originKey "x_y" of origin cell.
* @returns {{ cold: boolean, hot: boolean, hungry: boolean, sick: boolean, happy: boolean }}
*/
export function getAnimalVisualState(cell, state, grid, originKey) {
const inputs = getAnimalVisualInputs(cell, state, grid, originKey);
if (!inputs) return EMPTY_VISUAL;
const { cold, hot } = getTemperatureState(inputs.cellTemp, inputs.idealTemp, inputs.tolerance);
const { hungry, sick, happy } = getCareState({ fedAgo: inputs.fedAgo, visitAgo: inputs.visitAgo, maxFood: inputs.maxFood, maxVisit: inputs.maxVisit, cold, hot });
return { cold, hot, hungry, sick, happy };
}

View File

@@ -8,16 +8,14 @@ export const BIOMES = ["Meadow", "Freshwater", "Ocean", "Forest", "Mountain"];
/**
* Base biome from grid position (5 zones by column).
* @param {number} width
* @param {number} height
* @param {number} _height
* @param {number} x 1-based column
* @param {number} y 1-based row
* @param {number} _y 1-based row
* @returns {string}
*/
export function getCellBiome(width, height, x, y) {
export function getCellBiome(width, _height, x, _y) {
const w = Math.max(1, width);
const h = Math.max(1, height);
const col = Math.max(1, Math.min(w, Math.floor(x)));
const _row = Math.max(1, Math.min(h, Math.floor(y)));
const t = Math.floor((col - 1) / (w / 5));
const index = Math.min(4, Math.max(0, t));
return BIOMES[index] ?? "Meadow";

Some files were not shown because too many files have changed in this diff Show More